diff --git a/README.md b/README.md index 5266e021c..0cdaa9e28 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,10 @@ The added elements of tech are designed to leave as many design choices to the p Check out the wiki and in-game Tool-tips for further info on how to use these features, and stay tuned for an ever-growing selection of possibilities for Creative and Survival Minecraft. -[](https://github.com/Creators-of-Create/Create/issues "Report Issues") -[](https://www.youtube.com/playlist?list=PLyADkcfPLU8ywCXZPaDbQ_JZJL0CGDN5Z "Watch Videos") -[](https://discord.gg/hmaD7Se "Feedback & Help") -[](https://www.patreon.com/simibubi "Support Us") +[](https://github.com/Creators-of-Create/Create/issues "Report Issues") +[](https://www.youtube.com/channel/UCrKV2QTuyGcv4E3eSJpBiYA/playlists "Watch Videos") +[](https://discord.gg/hmaD7Se "Feedback & Help") +[](https://www.patreon.com/simibubi "Support Us") - Support for Minecraft 1.12: Not planned - Support for Fabric: Not planned diff --git a/build.gradle b/build.gradle index 71e6be057..9a5dfeab0 100644 --- a/build.gradle +++ b/build.gradle @@ -29,10 +29,10 @@ version = "mc${minecraft_version}_v${mod_version}" + (dev ? "+${buildnumber}" : group = 'com.simibubi.create' archivesBaseName = 'create' -sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' +java.toolchain.languageVersion = JavaLanguageVersion.of(8) minecraft { - mappings channel: 'snapshot', version: '20200920-mixed-1.16.3' + mappings channel: 'official', version: "${minecraft_version}" accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') runs { @@ -42,7 +42,8 @@ minecraft { //jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling property 'forge.logging.console.level', 'info' property 'fml.earlyprogresswindow', 'false' - property 'mixin.env.disableRefMap', 'true' + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" mods { create { source sourceSets.main @@ -54,6 +55,8 @@ minecraft { workingDirectory project.file('run/server') arg '-mixin.config=create.mixins.json' property 'forge.logging.console.level', 'info' + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" mods { create { source sourceSets.main @@ -66,6 +69,8 @@ minecraft { property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP' property 'forge.logging.console.level', 'debug' property 'fml.earlyprogresswindow', 'false' + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" args '--mod', 'create', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources') mods { create { @@ -115,6 +120,10 @@ repositories { includeGroup "curse.maven" } } + maven { + //location of the maven for dynamic trees + url "http://harleyoconnor.com/maven" + } } configurations { @@ -140,6 +149,8 @@ dependencies { runtimeOnly fg.deobf("mezz.jei:jei-1.16.5:${jei_version}") // implementation fg.deobf("curse.maven:druidcraft-340991:3101903") + implementation fg.deobf("com.ferreusveritas.dynamictrees:DynamicTrees-1.16.5:0.10.0-Beta12.1") + // i'll leave this here commented for easier testing //runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69") diff --git a/gradle.properties b/gradle.properties index 9ffe8755b..6191927f8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,20 +4,20 @@ org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false # mod version info -mod_version = 0.3.2 +mod_version = 0.3.2c minecraft_version = 1.16.5 -forge_version = 36.1.32 +forge_version = 36.2.0 # build dependency versions -forgegradle_version = 3.+ +forgegradle_version = 4.1.+ mixingradle_version = 0.7-SNAPSHOT -shadow_version = 5.2.0 +shadow_version = 6.1.0 cursegradle_version = 1.4.0 # dependency versions registrate_version = 1.0.4 -flywheel_version = 1.16-0.0.3.15 -jei_version = 7.7.0.106 +flywheel_version = 1.16-0.2.0.28 +jei_version = 7.7.1.110 # curseforge information projectId = 328085 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 5c2d1cf01..e708b1c02 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5028f28f8..549d84424 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 83f2acfdc..4f906e0c8 100755 --- a/gradlew +++ b/gradlew @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -154,19 +156,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -175,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 9618d8d96..107acd32c 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -51,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -61,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index ac128f123..d47c0e738 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -23,10 +23,12 @@ e555e3c2b2d3f01440e48db4ba88f7e00fd99b6f assets/create/blockstates/basin.json f25693a9429f6337149ff24f27900dc4eb82a7c2 assets/create/blockstates/belt.json cf9045eb16e5299a1d917c4cb536289f49411276 assets/create/blockstates/birch_window.json 94a1a91403eb4b035fec48071e7fcae57a8a6abd assets/create/blockstates/birch_window_pane.json +8d257089491a1f6e87544242c9fe9af0127b4f88 assets/create/blockstates/black_nixie_tube.json e0f1e44c9bce4a7478592cf3a8ee7b91d9083d65 assets/create/blockstates/black_sail.json 58b07d2af6030342f0354f6d3fd0ee128d2d74b4 assets/create/blockstates/black_seat.json a71ddf3291bd13d7877f2fe32c42f50407f99afb assets/create/blockstates/black_valve_handle.json 923aeb2a556f67bc0526f237dd97af2d37b4c9f1 assets/create/blockstates/blaze_burner.json +b619f127c38e9ffdb4e45bb32e5cea35863622f3 assets/create/blockstates/blue_nixie_tube.json ec2ab87734acc209e6be3bc4898b1199f819bfd3 assets/create/blockstates/blue_sail.json 4854d1ef52130a7887aecc60bcaffbd66f0871a8 assets/create/blockstates/blue_seat.json 9d7341a5cae5d47788c595167946dfb6441cebd1 assets/create/blockstates/blue_valve_handle.json @@ -36,6 +38,7 @@ b8dd6e505943e06706d0718ece620ab3cf943650 assets/create/blockstates/brass_casing. 288bad07593a8a2c8efaf44bba0ffb0011d36cd3 assets/create/blockstates/brass_encased_shaft.json adfbd6cc5e44a0f431180aedbe65a19428299d8e assets/create/blockstates/brass_funnel.json 672eedcd3520c6d39603449165a23be9c612c620 assets/create/blockstates/brass_tunnel.json +9526a0758dcfda9fbbf75c01548e96bb5887a52f assets/create/blockstates/brown_nixie_tube.json 11ebdd9bd0815833e62ec1bea03a4cdd86ce00f3 assets/create/blockstates/brown_sail.json e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets/create/blockstates/brown_seat.json 322289524c058fac66bbe76b4924c3b0c0c33b84 assets/create/blockstates/brown_valve_handle.json @@ -68,7 +71,7 @@ f0031f5e970b3d5695472ed384950b8631b015ed assets/create/blockstates/creative_moto fe2f78b94c20944399101e7369e2d43324297fb6 assets/create/blockstates/crushing_wheel.json a1dd6cb3daa97ea871290ef7b178d28b564ee2a2 assets/create/blockstates/crushing_wheel_controller.json b1126c191877cff86b4e2de83e1fcbd151451cb7 assets/create/blockstates/cuckoo_clock.json -e8f1222b21e8e2e67d18252f7d3c9eefa650d3b9 assets/create/blockstates/cursed_bell.json +d986774dc41e5f01c6f3ffd10765df94f196922d assets/create/blockstates/cyan_nixie_tube.json b496452f2f7dbbba385e1fc10b560ec266e4b5e7 assets/create/blockstates/cyan_sail.json 4de72f65bff4e5d9c8153fa3adeee6b61d6f912b assets/create/blockstates/cyan_seat.json 2c04d57e56849f243aec8a1e769574d24daac1e9 assets/create/blockstates/cyan_valve_handle.json @@ -175,13 +178,16 @@ a4b0337149cb0617cc60061477c7178d37dbb831 assets/create/blockstates/granite_cobbl d97fdea02187e63f6b63913357c79a18660d676d assets/create/blockstates/granite_cobblestone_stairs.json 2f29568407970ea0e3807e0553e0584d127a9014 assets/create/blockstates/granite_cobblestone_wall.json f8659e81cd2a623475a6a9aca59149e82de56b1c assets/create/blockstates/granite_pillar.json +4478ee1b4c7a17deea77ee0d1234a19725889671 assets/create/blockstates/gray_nixie_tube.json 5c40c4a27e1dec747a467dd251700c72a6ceb07d assets/create/blockstates/gray_sail.json a5ec5401ba9f3e102a2e1b35837f643847afbca4 assets/create/blockstates/gray_seat.json 5f17a5868616b33eb157965a661046cab7a1427f assets/create/blockstates/gray_valve_handle.json +747579dd8e635533c15208cec25afe445ff4774a assets/create/blockstates/green_nixie_tube.json 52b849faef96b8ab9d9d64a1518c8f299af057b8 assets/create/blockstates/green_sail.json 13059309684db0cc7a0f1f4fce2407cf06cce80a assets/create/blockstates/green_seat.json f4a0fc68e8daaa0a47cdc951ced4310057a874b0 assets/create/blockstates/green_valve_handle.json 6ab675fa06317e6d07c0c1a453e7bb43e3f46b3b assets/create/blockstates/hand_crank.json +34076c9caafe48daa87cc783e96d4c81b0b164c0 assets/create/blockstates/haunted_bell.json 4572b90f5d6c586e145f2c7a55664c3cb734bd2b assets/create/blockstates/honey.json be3bef7e091d8b50bfc1c6b7275946d1f636aefd assets/create/blockstates/horizontal_framed_glass.json 18d9fdaa1352a7e2ec91135e46dae5c02ccd8f8f assets/create/blockstates/horizontal_framed_glass_pane.json @@ -200,12 +206,15 @@ a4cfcdc038af0f93a58d88ea8860b34d73632ff4 assets/create/blockstates/layered_dolom 8535d628f8834be62cdf62ef4b60c2ce3a7af99f assets/create/blockstates/layered_scoria.json 419d7fffc5cbd392f10211afa8d17e3eb8df8380 assets/create/blockstates/layered_weathered_limestone.json 6a3c81d62c7c5a5fa2f4a1e239319d83875bbe55 assets/create/blockstates/lectern_controller.json +e0c8fc35bfa28f025bdc14085b01b179e36c9f96 assets/create/blockstates/light_blue_nixie_tube.json 029904f21970947a4423a6e0c8c65c4e02f2e8e6 assets/create/blockstates/light_blue_sail.json 2a0a8b1715700bf1e284ee57ef9f7f163c12f3ee assets/create/blockstates/light_blue_seat.json 9bee040558a6b24e21f837fc808e17fae1883e71 assets/create/blockstates/light_blue_valve_handle.json +745b940c71575afbfac1786ffe1a23dcb62d5e70 assets/create/blockstates/light_gray_nixie_tube.json 93537c4e2ab86218a777e7b000c3fcd55a80b1cd assets/create/blockstates/light_gray_sail.json d9a2551e001bb315d071bb9f1f013323a66a5d09 assets/create/blockstates/light_gray_seat.json 8bea8c86de8c218c8932eef140f0ed439e173156 assets/create/blockstates/light_gray_valve_handle.json +3bee155fee49a9f85403f018a51e60c0e536d51c assets/create/blockstates/lime_nixie_tube.json ba2c4e3ddafa3c89a72cc243b14e8518fab369aa assets/create/blockstates/lime_sail.json 1de3a88c003df03f5006e1bbaa0236589aba08ad assets/create/blockstates/lime_seat.json 179a3e68b9f2e289eafe0e98e768befbbf91c5c2 assets/create/blockstates/lime_valve_handle.json @@ -221,7 +230,8 @@ e7c7b952137c4cb615988ea59b9f14303c9a4dfe assets/create/blockstates/limestone_bri 10513d55f7c621162a13d474d8f4eb54305d0f60 assets/create/blockstates/limestone_cobblestone_wall.json b7506b862d13b3f915c60d38bb7a20afc935f70a assets/create/blockstates/limestone_pillar.json 69790737767e06f000c7824749c46664a123160e assets/create/blockstates/linear_chassis.json -07bae932a163b81f8749f98287b4fb4949fe0b8b assets/create/blockstates/lit_blaze_burner.json +56b111c8a345627e9f37deac141138064271c2f1 assets/create/blockstates/lit_blaze_burner.json +e99e9c5cf03334a48d9d071e1590bc8f286d3cf6 assets/create/blockstates/magenta_nixie_tube.json 85a58ac539775f90903d9ce66374f3f2ffd4fecf assets/create/blockstates/magenta_sail.json 84c494d24cc58af274fdd054896c680e8095d2d0 assets/create/blockstates/magenta_seat.json 3bfce5016e5c929b74368dc2d734e62ae34587a4 assets/create/blockstates/magenta_valve_handle.json @@ -251,7 +261,7 @@ a3ae5fb61cb07ae6fcb78ba68435bda8c31d4430 assets/create/blockstates/mossy_granite 3feafb33a6ba03687a521c1b196536c0427fff77 assets/create/blockstates/mossy_weathered_limestone.json b1126c191877cff86b4e2de83e1fcbd151451cb7 assets/create/blockstates/mysterious_cuckoo_clock.json 8d56251190c94204fa238ff32734a0761273669f assets/create/blockstates/natural_scoria.json -0f7635a4fec6961ec09788b3c5e3992ed1fdfde7 assets/create/blockstates/nixie_tube.json +f090a023bebb8590ed609d0c624277703b4699a4 assets/create/blockstates/nixie_tube.json 36e46e65003a8d0b8555fe5e8f8dc980d6559bc5 assets/create/blockstates/nozzle.json cf60989f63f02067fc4e4ad25033ac83167cdeb0 assets/create/blockstates/oak_window.json 4a796509c3953171f04f957351282205840b3760 assets/create/blockstates/oak_window_pane.json @@ -305,7 +315,8 @@ c17d334e938dcb742550ba8307ca8266a1fc9b49 assets/create/blockstates/paved_weather cb23aef25f3106b06c8fa8f152c638bb0d2185d8 assets/create/blockstates/paved_weathered_limestone_slab.json d62b0992cec1de45dad1f2c273132225f4ef33a0 assets/create/blockstates/paved_weathered_limestone_stairs.json e29e245d06c46dac94fcd0e01a9bf7fa8e02fb87 assets/create/blockstates/paved_weathered_limestone_wall.json -7734d96271a199579e3ebb0bebf8bcd1cbec0992 assets/create/blockstates/peculiar_bell.json +005cc195712aca252326ae8239ed0caf9a69a314 assets/create/blockstates/peculiar_bell.json +06ad2ce2f1730488d51daf12b4a985c86d43bbb4 assets/create/blockstates/pink_nixie_tube.json 30971f2f76fe56f144178c33ad6bde5fc9fb61c3 assets/create/blockstates/pink_sail.json 919a79e4a4a5fab0aac3ef48e1c786017d6aa001 assets/create/blockstates/pink_seat.json 471a3bb474a0ae0453143888d561256cce894e3f assets/create/blockstates/pink_valve_handle.json @@ -340,10 +351,12 @@ ad721e3911f48c61c3639edac1896680a31451ff assets/create/blockstates/polished_weat e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggle_latch.json 3a739f9d4276828d83f2d2750bf3227c87bcd438 assets/create/blockstates/pulley_magnet.json 469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets/create/blockstates/pulse_repeater.json +83ad917bb7f528e68d64f3859b3bf1236080d454 assets/create/blockstates/purple_nixie_tube.json d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json 4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json +3735f396cf8e8bab0793ce2bfa281b29af73919e assets/create/blockstates/red_nixie_tube.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -388,7 +401,7 @@ a8094531617e27a545c4815ab2062bf0ffca3633 assets/create/blockstates/turntable.jso c4db76b9d36cfb098df0d158cb6f8b82768ebe14 assets/create/blockstates/vertical_framed_glass_pane.json 3a5da54d9763e9512cfaa47b25226b79738b25f3 assets/create/blockstates/warped_window.json 19ef7a16c82f07d304fb60d121845185d189aecf assets/create/blockstates/warped_window_pane.json -d995547bcd71603ba7378d8998098e462030bfd0 assets/create/blockstates/water_wheel.json +d31fce8315c8715521d66b5dcc166c84e949dd1d assets/create/blockstates/water_wheel.json f182669f7547964f9f2ef67916568556870def7b assets/create/blockstates/weathered_limestone.json 27e6740834c0f673acc3531371512daa6dcab025 assets/create/blockstates/weathered_limestone_bricks.json abb74e4f4c2b9851670cb6ad794281b0f7be0f5a assets/create/blockstates/weathered_limestone_bricks_slab.json @@ -400,31 +413,33 @@ fd7a9c7095372485081436c91489cadb2b0c514e assets/create/blockstates/weathered_lim dfa5662bfd5a70bcd87673b1c40bf9106d5e2365 assets/create/blockstates/weathered_limestone_cobblestone_wall.json c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets/create/blockstates/weathered_limestone_pillar.json c838c0792511ca2e14493b40032bb1370fac588a assets/create/blockstates/weighted_ejector.json +aef042718ae54973cbafdb4507c32944d722e99d assets/create/blockstates/white_nixie_tube.json 512bf17c9ea309b1f7da54440f923530d25e467c assets/create/blockstates/white_sail.json 4647010162eb4c350fad236d860317eaa1884c77 assets/create/blockstates/white_seat.json 89000903d0ab8139e919abea7aa0361b34c24e55 assets/create/blockstates/white_valve_handle.json c4cd1131113667da0180898b5db3ebad609db8ba assets/create/blockstates/windmill_bearing.json d4f804f2818376950ef28fc8d6250419f4e12218 assets/create/blockstates/wooden_bracket.json +de1557d79eebf1cd469d098639cd6b5518b52b61 assets/create/blockstates/yellow_nixie_tube.json e03c48512967845fce09d84b955d3bc7b480fedc assets/create/blockstates/yellow_sail.json a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.json 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -391e1552053f8fbb148b0bdf2e61f74ae4782100 assets/create/lang/en_ud.json -9d41edd2a78d074f0e80fbc95b6eb9f1303ef7f5 assets/create/lang/en_us.json -f05c04c9b1e79c446492af47a9bfcde73cefd138 assets/create/lang/unfinished/de_de.json -3b2ed3f1b4910e5cc03af089bf2ddfc1421cfc1f assets/create/lang/unfinished/es_es.json -e9ad51b0ad0e1088f121fb2444ef2019c11a2e80 assets/create/lang/unfinished/es_mx.json -f6f8a3f4b3bf685e324c9216b5bb0467c68da796 assets/create/lang/unfinished/fr_fr.json -d05b807ead4cc5dbae6444de5e91525a385d9b20 assets/create/lang/unfinished/it_it.json -055d6b4d130fedfe0232c351663bd9a1934d1a46 assets/create/lang/unfinished/ja_jp.json -064c4e1d5923dc5a75b178940cb36c42f764a6ad assets/create/lang/unfinished/ko_kr.json -762c1bdec8a3f2ecb4047fbb5b975ffbc1792374 assets/create/lang/unfinished/nl_nl.json -43c113585d98162f8cbe5ec02af06f6f8ae55cbc assets/create/lang/unfinished/pl_pl.json -3ab83a3d7d925821d73e9ab6064d3b479d7c21e6 assets/create/lang/unfinished/pt_br.json -51c20e7a0c4b2af9242ee31cf0cf1516b9f312a5 assets/create/lang/unfinished/ru_ru.json -95bf20119493721c3067319f165e2542295918c0 assets/create/lang/unfinished/zh_cn.json -9604bfe416e4f747efda84b419ec99f2b38bd544 assets/create/lang/unfinished/zh_tw.json +93fa3a5a99cdd3267534d4702b2346177be29885 assets/create/lang/en_ud.json +71d94e21f0c64725829f1c029592f2316fa1358e assets/create/lang/en_us.json +35439696e4d85eebce260874de685aedb5076a6a assets/create/lang/unfinished/de_de.json +36c5b894c038f2ff1c0ecef0391253bcd944ac22 assets/create/lang/unfinished/es_es.json +8d451362ebecd7552739a8212ca5534ee2b32421 assets/create/lang/unfinished/es_mx.json +b39592c64dd5d1ae29c8cf556e35b8bec0c10c63 assets/create/lang/unfinished/fr_fr.json +e7b5d73d5f53d1a7a288103e9198c40888b3a603 assets/create/lang/unfinished/it_it.json +68cdd7c617498c0dca12b9ec397b82904783f88b assets/create/lang/unfinished/ja_jp.json +d1dd7683a20814625cade0688ae0cd95e6d2ba50 assets/create/lang/unfinished/ko_kr.json +b56ea82f736da4cd067093e95e26597bf1d88b6b assets/create/lang/unfinished/nl_nl.json +9e3e5d6eb799fae27f03a3e47782134a85657f22 assets/create/lang/unfinished/pl_pl.json +8068aeedd8c8e5f041372512e9bd57ccef29f38c assets/create/lang/unfinished/pt_br.json +724c38f4375687907d1f416674d2122117fb34a6 assets/create/lang/unfinished/ru_ru.json +5522e68e3d3c14c17d6b038fc2a03acb73b76513 assets/create/lang/unfinished/zh_cn.json +4e464bc9052209b7e6a809519c2b816dbc956bbf assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -494,9 +509,11 @@ a5f0ed76e27d2ca706445f7f7c5f9270f98e34f9 assets/create/models/block/birch_window f40c4d4ea6c037158f4b9862a7c11e6024a261e6 assets/create/models/block/birch_window_pane_post.json dbfd2a996820d885d9741a3f168aa36c3538cfbd assets/create/models/block/birch_window_pane_side.json 557b35671ec417597259ba8d0239fe18c14c3d20 assets/create/models/block/birch_window_pane_side_alt.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/black_nixie_tube.json 2b59d6f937cd542eba670689c30fe16887dfd9a0 assets/create/models/block/black_sail.json 97d79ab99c0fb278a9b5dc54e1c6563868f87b76 assets/create/models/block/black_seat.json 02747ea1a0e5d4a1cd466bf26878885a89d347fa assets/create/models/block/black_valve_handle.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/blue_nixie_tube.json d876627b6e519c6f3f59c7c27cc7b0f903206f7c assets/create/models/block/blue_sail.json e58b00a7222152d7facbe0e82f00933b974df747 assets/create/models/block/blue_seat.json c7f91468b196fbda137e6b31764870b3bbfda6b6 assets/create/models/block/blue_valve_handle.json @@ -535,6 +552,7 @@ fd6f6607a4742fa87dfe1768927a29dc4975ce7a assets/create/models/block/brass_funnel a959e03ca339badb49fe58ba53d86a84352e91f3 assets/create/models/block/brass_tunnel/t_left.json 0585fbe58da3a8ed0dc98cc7ed79ac067312078d assets/create/models/block/brass_tunnel/t_right.json a0612a633756433e1b37ddc6d290aa1fc07839ef assets/create/models/block/brass_tunnel/window.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/brown_nixie_tube.json 8ab097caaa0db0915ae9254f7d65092d9171bc60 assets/create/models/block/brown_sail.json 4eed0ad902f5e84f2b6c160f3283e8028640e77d assets/create/models/block/brown_seat.json 6c39677f8c3a84280835c717ea1ef569b7c76a1b assets/create/models/block/brown_valve_handle.json @@ -588,6 +606,7 @@ a6eea01609266b757342984889af16234ecd5189 assets/create/models/block/creative_top 14a14ab7c1a812a5ac8e282747f125461bf6b1d5 assets/create/models/block/crimson_window_pane_post.json b9e6d8befe3f2281413288e0350425987256e238 assets/create/models/block/crimson_window_pane_side.json bcbfa40524cff0314d9e764a64f90f2095d14064 assets/create/models/block/crimson_window_pane_side_alt.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/cyan_nixie_tube.json 68843a02a32c156afad85830877b83f9b51c5147 assets/create/models/block/cyan_sail.json 6704782830b3d872321e895b6903709c18e3778f assets/create/models/block/cyan_seat.json f45ef4a5f0aa8482d493661673b1c0ab6d061157 assets/create/models/block/cyan_valve_handle.json @@ -815,12 +834,18 @@ ddc8bf8dc62464d424ab812f801dd7a1f68072d0 assets/create/models/block/granite_cobb 87f6b4e30f2cdd0ddb3b48e43f15317b386597e6 assets/create/models/block/granite_cobblestone_wall_side.json 5c7340740d822deae7aa32c15c36531476862fbb assets/create/models/block/granite_cobblestone_wall_side_tall.json f55c5825c63f345a95e822a2113e76b5a62d8f7c assets/create/models/block/granite_pillar.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/gray_nixie_tube.json a68cd40ffb769b195437107f4a2c2188b222b74a assets/create/models/block/gray_sail.json 6eb5e59e803e1055968b90f3099cd0a17a1d3fd5 assets/create/models/block/gray_seat.json 7e213be39cc928363bf2b096f055439211050b8d assets/create/models/block/gray_valve_handle.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/green_nixie_tube.json 17b651233c62b928f0228562a7f6e7a2b7b2d6b7 assets/create/models/block/green_sail.json 1438b8ce54ac5557b8f10dcef94f3525eae19461 assets/create/models/block/green_seat.json cc7ce9b6bc687ad5027a67c3bf22bdf5bcd71674 assets/create/models/block/green_valve_handle.json +29e09bf70184cc1d09fce31aea908a2ab56fa9e4 assets/create/models/block/haunted_bell_ceiling.json +942c2ae8a3546bd91f8489094f9e7516ff026e61 assets/create/models/block/haunted_bell_double_wall.json +44371c13450dd41d84769a3a50250de1d86e75c5 assets/create/models/block/haunted_bell_floor.json +57e48a613ce2c81992623a46792fca4bcafb33ce assets/create/models/block/haunted_bell_single_wall.json 5163171ed77af879fa06f290bf24b1bb99735c94 assets/create/models/block/honey.json b1e94d2858c3a8807def6c5131b6f63fe586fb91 assets/create/models/block/horizontal_framed_glass.json d13df8a5920c5778d98081fb0e97f045e2fd46a2 assets/create/models/block/horizontal_framed_glass_pane_noside.json @@ -843,12 +868,15 @@ e1add9f62cf886a7989f7ebb545906da16ad7a41 assets/create/models/block/layered_dolo cecf946818c65370b685dfeaade50819183acb41 assets/create/models/block/layered_limestone.json 258fb9644d396872719c56ae1ca89f50667a1077 assets/create/models/block/layered_scoria.json 60b05926e706d5dd27f3cb4997120c948797f2f4 assets/create/models/block/layered_weathered_limestone.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/light_blue_nixie_tube.json 19bd08ad6ac351e6eee2131f7b4c11a768bf8f08 assets/create/models/block/light_blue_sail.json 1a28b07da68d1461cd04c971ae548d94165e0cf3 assets/create/models/block/light_blue_seat.json 68e01f8d8a31f07f236383e19b49ae1be4cbe3f4 assets/create/models/block/light_blue_valve_handle.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/light_gray_nixie_tube.json 73f14b905d5fdb433751a33b963852de6491722a assets/create/models/block/light_gray_sail.json 292bec1b9f962b17b29147d982a9b177618b7eb9 assets/create/models/block/light_gray_seat.json 42338c4965da63962ea08077dc9e899aaf4c3c65 assets/create/models/block/light_gray_valve_handle.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/lime_nixie_tube.json 8292d043ebfe280340526a6a0f96d4160099e213 assets/create/models/block/lime_sail.json 31c9474210d8535c5417021fe042d4cc31e17328 assets/create/models/block/lime_seat.json 74008bd0d775b0e2e96b43be2e51d0f3c3abdf21 assets/create/models/block/lime_valve_handle.json @@ -877,6 +905,7 @@ c54e5a17495f88fa21b3488e8da32a365452c36c assets/create/models/block/limestone_co 7991d6620d2225b1a026e2b62dc076cf0a33613d assets/create/models/block/linear_chassis_bottom.json 56e585805c6235552ce5e15ff2f125ff8ec0fa2d assets/create/models/block/linear_chassis_top.json 12b35c916e3ee83ee4fd1e309c73403dec9a7297 assets/create/models/block/linear_chassis_top_bottom.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/magenta_nixie_tube.json ec6b5f636e163ff5e361d486cf628ca1af4849a1 assets/create/models/block/magenta_sail.json cbee001cd1bb1125a97d1bb2d1e6e5a68f129303 assets/create/models/block/magenta_seat.json bc5a03a5552eb4a518abefe5e8615f14ee13ca29 assets/create/models/block/magenta_valve_handle.json @@ -891,6 +920,7 @@ de9b0f933881cc735ae0acf2bd71e6eafa732ff8 assets/create/models/block/mossy_limest f88a9558a20033d4955e7b6de4f8aa23b1a11b9f assets/create/models/block/mossy_scoria.json 8c3296378aa7e5dc1bc7dfdde2f0a436b8bb8b78 assets/create/models/block/mossy_weathered_limestone.json 50f28bf7a7de95caf12b4f040994f0f3da72a55a assets/create/models/block/natural_scoria.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/nixie_tube.json e3cd8b33b8c5f0543e4f6728a5b3e05642f9efe1 assets/create/models/block/oak_window.json 54a3b3158f8c914788812aa44515b798b2a9e2f3 assets/create/models/block/oak_window_pane_noside.json b9c27f90d4d258e3fdcd713aaa42142f5d46a79e assets/create/models/block/oak_window_pane_noside_alt.json @@ -1037,6 +1067,11 @@ f924c6104378768a3a645f5e77f9ed80d2c31e5a assets/create/models/block/paved_weathe 46e3eeeefd47f7e6007e53bb1b22de2c6c2a5923 assets/create/models/block/paved_weathered_limestone_wall_post.json c7941c0bcbdf7ec7e2d34679afac744cf81b7489 assets/create/models/block/paved_weathered_limestone_wall_side.json 39aaea370e31fa032e471d3b8f0ebf0586ee1a03 assets/create/models/block/paved_weathered_limestone_wall_side_tall.json +29e09bf70184cc1d09fce31aea908a2ab56fa9e4 assets/create/models/block/peculiar_bell_ceiling.json +942c2ae8a3546bd91f8489094f9e7516ff026e61 assets/create/models/block/peculiar_bell_double_wall.json +44371c13450dd41d84769a3a50250de1d86e75c5 assets/create/models/block/peculiar_bell_floor.json +57e48a613ce2c81992623a46792fca4bcafb33ce assets/create/models/block/peculiar_bell_single_wall.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/pink_nixie_tube.json 1b5f9e819cd4b5f5fe6e8c24920b916e8d93c95e assets/create/models/block/pink_sail.json ecc60ce7ee6b753073a99c597db95d6d9df3d438 assets/create/models/block/pink_seat.json 7ada61878d3a3c1d3cc33bcf9a80c21b8f9aaff2 assets/create/models/block/pink_valve_handle.json @@ -1106,6 +1141,7 @@ f22d7d8263dcabd726aa04784031ae9062633579 assets/create/models/block/powered_togg e6097d9ab9dc9954cbc750020bc33c7a423b73c6 assets/create/models/block/powered_toggle_latch_on_powered.json 622239a3a09fcac7235b9670eb395a530839a59b assets/create/models/block/pulse_repeater_powered.json d469dce70d15759baed35025b8c7fa403c8b3b26 assets/create/models/block/pulse_repeater_pulsing.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/purple_nixie_tube.json b56fad63b82434564bc41ae9c01e3b427203fb5b assets/create/models/block/purple_sail.json 96adc7865ebe64b43865bc2fe914830c11258856 assets/create/models/block/purple_seat.json 062406aacf25e099f9b28a3bf7cacfcaa1da4ef6 assets/create/models/block/purple_valve_handle.json @@ -1115,6 +1151,7 @@ a9885a3f69e3e2a2812c33bafd9140fcc5cc7c25 assets/create/models/block/radial_chass 92a48c22cf2af0a3156844322f6bb469883608fb assets/create/models/block/radial_chassis_side_y_sticky.json 522f4733118d6fba172696e9478c8f9fe88b236e assets/create/models/block/radial_chassis_side_z.json bffca231a146a6ac49e028f3790cdcbf375e98b0 assets/create/models/block/radial_chassis_side_z_sticky.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/red_nixie_tube.json f0099576080a0f2bb09dd85e55777bad69f9f265 assets/create/models/block/red_sail.json 12d4f4119b994c5d71c96ab3aa09beb89dad1e10 assets/create/models/block/red_seat.json 0064825ee3c1702c524d34abb6adb66906586851 assets/create/models/block/red_valve_handle.json @@ -1195,9 +1232,11 @@ acf3900465101f9dd78d2301eab1063cdb461582 assets/create/models/block/weathered_li 7f1582fe36aa94be4352b8eda89c8ebf7a353333 assets/create/models/block/weathered_limestone_cobblestone_wall_side.json 3235d3148535283e9e9b4ee336b92055e7c6bf01 assets/create/models/block/weathered_limestone_cobblestone_wall_side_tall.json 8c6feec0411e95f9aae18f9f38b4e045156857e8 assets/create/models/block/weathered_limestone_pillar.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/white_nixie_tube.json 1377e12f56dce1466ce44078d7154870c5cf7b2a assets/create/models/block/white_seat.json 899f33d51cf36cb1c283bc7e6363f9d451e5736e assets/create/models/block/white_valve_handle.json f2bee22fe03ac047fbe73ca2c5c759f09bf646df assets/create/models/block/windmill_bearing.json +71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/yellow_nixie_tube.json 071ca07daceea4d0db7ed41e815d47589fdb14b7 assets/create/models/block/yellow_sail.json 0a0e2cc973e35586ae00ed17b919383868e992e8 assets/create/models/block/yellow_seat.json 55edee7b0833ab19b98694fab21ae0c8e91f76fd assets/create/models/block/yellow_valve_handle.json @@ -1261,7 +1300,6 @@ a47fbe5f2da79080d99ef0975bfa8da4d08f8be4 assets/create/models/item/chiseled_scor fe67c3f380d17735a9436a4579a8be1a02b8e4a0 assets/create/models/item/chute.json 6680a68526576ded5dac2aa3bc9fb9de3e744146 assets/create/models/item/cinder_flour.json c1da21be9f1af4f7a2ef4ec9cd92195d65ada316 assets/create/models/item/clockwork_bearing.json -47fb26e7a75c7bd521f46cdf9c11885769e1c94e assets/create/models/item/clockwork_component.json 0a2a0f0aafeab0088172f77afd40c1fa2cc1f2b8 assets/create/models/item/clutch.json dcb09deae110077bcddf090996b51cc66e9a7de3 assets/create/models/item/cogwheel.json 7717e3b21cff39f497f07687c70c1fa40eaa756d assets/create/models/item/content_observer.json @@ -1278,6 +1316,7 @@ f56bf22324faf8958eaef4d94b958f1108d52e5a assets/create/models/item/copper_tiles. 5583368909c319acfcf0f7a419bedf23272fe613 assets/create/models/item/copper_valve_handle.json 4e253e7c0626dfd76e2d39786ce1a34e0baaa62d assets/create/models/item/crafter_slot_cover.json 1f947dafff30da701b7675f5b026ccab3129b079 assets/create/models/item/crafting_blueprint.json +db68f1fcc5b91f3ee0cc023538d965d76dd13506 assets/create/models/item/creative_blaze_cake.json 7b333dea353afaa27b182aedc647c9e9e34e92ef assets/create/models/item/creative_crate.json f7d06c52c3ca8c22ad67f5741471f06ac22e7fcb assets/create/models/item/creative_fluid_tank.json 5b39403f6c81f05e566b621b62e267267de47c41 assets/create/models/item/creative_motor.json @@ -1299,7 +1338,6 @@ b359064405d189e2802969715cd5f682ddbf0bb1 assets/create/models/item/crushed_urani 2bb791db62dce6bf2e2227f9b607c131828471fd assets/create/models/item/crushed_zinc_ore.json 823c91f63565db54ec3944a1e90e7aee18e41062 assets/create/models/item/crushing_wheel.json dae5cffa4e1263d6a113469f79fba8695fa8232a assets/create/models/item/cuckoo_clock.json -9826c00050ba493f844e8812cc45153a156c5317 assets/create/models/item/cursed_bell.json 3e3edc9ccded444496d3336926b93bbf1234cd84 assets/create/models/item/cyan_seat.json 523cd531eadaadc45fb356ca58b99a8fe206c3a7 assets/create/models/item/cyan_valve_handle.json f786a43e296d9f10d7c302fe3ae9cddf4ba9984e assets/create/models/item/dark_oak_window.json @@ -1419,12 +1457,13 @@ e7daa31c1fc445d542bad476dfe1d6a8811f2070 assets/create/models/item/gray_seat.jso ecb9f32f62d3fa43fb226ab85adc2eb229fdfb77 assets/create/models/item/green_valve_handle.json 398b1a7c76c7bdb6a23b1248fdce98f6d835467f assets/create/models/item/hand_crank.json dee43bf1a9c211a752fac2c07aeba123f7f0c914 assets/create/models/item/handheld_worldshaper.json +e17d9c90e621e9a39f38bb2d90a122f09a5f169d assets/create/models/item/haunted_bell.json f0d5af58e23e2705b3ef675c30bdf85ed9567c57 assets/create/models/item/honey_bucket.json 068729724f5f7b276b9bc378e533898a92e8debe assets/create/models/item/honeyed_apple.json 955e8accadb47f9b360e5fd48cd959c507b00f2d assets/create/models/item/horizontal_framed_glass.json f0e3b2b8a553b6e61746c922c27302dabfff71b6 assets/create/models/item/horizontal_framed_glass_pane.json ff92f6a9dfb73a6ee1eaaed3279c89390ff04a80 assets/create/models/item/hose_pulley.json -94a09bbd2ca14a72f9f79ca9364a2c342c1637e3 assets/create/models/item/incomplete_clockwork_component.json +153a185852af79654f0fb216c4b1b8e69c85ee8a assets/create/models/item/incomplete_precision_mechanism.json 9d605ce0da83a73b535bce45c107e604364e2b20 assets/create/models/item/iron_sheet.json 52e435014cb03e93411666c4799ebff206e55fc9 assets/create/models/item/item_drain.json 83fa8699318e51f838b483b40b3e897c34ed53d1 assets/create/models/item/jungle_window.json @@ -1539,7 +1578,7 @@ d60c4fb6e0e68d8f6c137a0c601145c342236c18 assets/create/models/item/paved_limesto 5ec22c676e301a7004ff7d127d20b46f49063c64 assets/create/models/item/paved_weathered_limestone_slab.json d81f85aea5e683539a0f3c805c154b76a9d88a9d assets/create/models/item/paved_weathered_limestone_stairs.json 910eaf2f571bae883b888d13f305bd848d278577 assets/create/models/item/paved_weathered_limestone_wall.json -2c0c9e7b131d9eb87b595abcbd68d2c55c443e58 assets/create/models/item/peculiar_bell.json +477cf0b4dd4482353668f6307f3f94d0fd77dd62 assets/create/models/item/peculiar_bell.json 9664f171c7856661776c5c4ef0b6880a77db648e assets/create/models/item/pink_seat.json 7d12cc24b86fcb3f0ca6fee650d1dee683859c0d assets/create/models/item/pink_valve_handle.json 04ce23dc141bedccc75b4512263da8b498f13205 assets/create/models/item/piston_extension_pole.json @@ -1574,6 +1613,7 @@ b97c891ebe74e7850ef1f982e4cc043338baa30f assets/create/models/item/potato_cannon 417c301eb7e54f14c564975570f59d048cc88987 assets/create/models/item/powdered_obsidian.json 1e501c1f2e9250aaaadcf17db62646d08177d4e1 assets/create/models/item/powered_latch.json 3a6dfc7f36e31ebfcd650c3144a7f2210e8a4f9f assets/create/models/item/powered_toggle_latch.json +7459efc8f20d093a8b0ef987eaace8cb0ad0aaa8 assets/create/models/item/precision_mechanism.json 4a3c3d81097d56bbd3aefeeb9eb7db87f514b5b4 assets/create/models/item/propeller.json 4b8a27ff05ed5331889dfc4b0b4562f3e94b0dfe assets/create/models/item/pulse_repeater.json a598b2f5eb34b061e81efb8a55267a02f8e08a61 assets/create/models/item/purple_seat.json @@ -1659,8 +1699,8 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -f3231c27d43ff511b7d8532603111706ebcc155e assets/create/sounds.json -5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json +58880e397902f8ca5b3b59ed4423e626109ddc4c assets/create/sounds.json +0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 83c046bd200623933545c9e4326f782fb02c87fa data/create/advancements/arm_blaze_burner.json @@ -1680,8 +1720,7 @@ de13a091928d5ab539d567411dd5c522cdcdd668 data/create/advancements/brass_casing.j 9531baa67bb3aee5e2723b1ab0578ff87bcb42b0 data/create/advancements/chromatic_eob.json f37551a788dfb3ff3d65db97a03c0420edf2c041 data/create/advancements/chute.json 0ffacd497176afdb26670783b65d383ac6236c19 data/create/advancements/clockwork_bearing.json -18511a1a11f2b362438cfcd961750963a43b7155 data/create/advancements/clockwork_component.json -df4a08ee0bd8d26977fdf2e45cce1d3b2f972033 data/create/advancements/clockwork_component_eob.json +fcb3a56a40d245a2fc95799b4b4da90756b58bd6 data/create/advancements/clockwork_component_eob.json 870ca791c418a1bc24f7b12284f5788c84911b92 data/create/advancements/compact.json d1015e059a2f2008a364b6d045a011a6d671f20d data/create/advancements/copper_casing.json 8e2a12a26218a46665c46f350ef9c3418a901988 data/create/advancements/crafter.json @@ -1690,7 +1729,7 @@ e9e1789de5cd5577a801a09d489a13f2c98779dc data/create/advancements/cuckoo.json 2a96fad5b44b62f233c9af5b4a637faf32ce24af data/create/advancements/deployer.json 20e04d0ac916996efedc35ab80e2b4ac4001582c data/create/advancements/dual_extendo_grip.json 04eaf829696d735244c0e4798dd3bdeb26e13a32 data/create/advancements/electron_tube.json -23b99d6745120e5ee11bcf6e3f6d55beb1be64f6 data/create/advancements/extendo_grip.json +e15f8093da07cb2292de49620f2aa776f5a6099a data/create/advancements/extendo_grip.json b1699baaadaac7ebce642c09428519d156e21594 data/create/advancements/fan.json 5aa76cba3b40a1c234ffa84a89ecca630990fc0f data/create/advancements/fan_lava.json 716a9816558300a3652ed8d8d568517017813f5c data/create/advancements/fan_smoke.json @@ -1719,7 +1758,8 @@ c9c4060ed207226b69fada2d61e01a97d7077eae data/create/advancements/nixie_tube.jso 449eb8a9e6102bb342c96eb8b19e743eb6979bfa data/create/advancements/pipe_collision.json 4b621e5bb48fbb120853ec02c05c915d86bd6dd8 data/create/advancements/pipe_spill.json 72025d8bf73ab8096c29f12d0c8d9a346f09cd64 data/create/advancements/polished_rose_quartz.json -77421567ff8eb4bdbe6c16bc3f0ae0ed1cc29e5e data/create/advancements/potato_cannon.json +69c45c653458d3076313bba3483bf26fb3946292 data/create/advancements/potato_cannon.json +6378090ee972356a3b772aa3d140cf52d396e60d data/create/advancements/precision_mechanism.json 62d29ec01eff5d21968636a0479361ecdc11ae30 data/create/advancements/press.json f80479b50e248ee8d6d1abb7d08866cf711ac2b2 data/create/advancements/recipes/building_blocks/andesite.json 5012e9d559439d0d62d0b34c2e39de048e8c7699 data/create/advancements/recipes/building_blocks/blasting/aluminum_ingot_compat_silents_mechanisms.json @@ -2382,7 +2422,7 @@ e0b9edc5e59647e7dd99be17369b263dadf407d4 data/create/advancements/refined_radian fc12b590ab8f5ac901db21c67ba3850f157e1421 data/create/advancements/root.json c1f162e773518f6b1481221e3e63f9ba33fed647 data/create/advancements/shadow_steel.json 6c1a67e193a4c5af356b31a1d5b5e9d3faeca87e data/create/advancements/shifting_gears.json -17f0cf050d0024559d0100925e325117bf3b20e3 data/create/advancements/speed_controller.json +65132cb27041c848230781cca8020a2e5ae4365e data/create/advancements/speed_controller.json a203d509a6038f0bad707e232a425388e62e1ae1 data/create/advancements/speedometer.json f7bb8f08a08e22ec1e6bb098d65d06233e8fbcec data/create/advancements/splitter_tunnel.json b69d174d7a5e9eab8ca013b66bc9d02244d7f9a3 data/create/advancements/spout.json @@ -2419,10 +2459,12 @@ d3202a337c15c8b8ec41fa5879bb94327bb75057 data/create/loot_tables/blocks/andesite c7f81e30c31837a287d6d6040cdb02c7dec11441 data/create/loot_tables/blocks/belt.json 67a8e2513c3cb09e6fe80279fda94f79d5018c37 data/create/loot_tables/blocks/birch_window.json bf1d5843f93533f84bc4adec5b77da2114fa2025 data/create/loot_tables/blocks/birch_window_pane.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/black_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/black_sail.json cccc209d172cc7bac76f1b4ac79085ee90742ab2 data/create/loot_tables/blocks/black_seat.json f3573f47b8a914aa222633893e158f84fcd6f3d8 data/create/loot_tables/blocks/black_valve_handle.json a2313c9b7d114396fca3c86a740d23fce3873679 data/create/loot_tables/blocks/blaze_burner.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/blue_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/blue_sail.json 3834f7ac2bbc42cead02d4973842adb9ad97e6bf data/create/loot_tables/blocks/blue_seat.json fcddccd1bf45c2f4ad5f1520e209a4f04487274a data/create/loot_tables/blocks/blue_valve_handle.json @@ -2432,6 +2474,7 @@ fcddccd1bf45c2f4ad5f1520e209a4f04487274a data/create/loot_tables/blocks/blue_val b127cb6920e6d7d9c8b2402cb186402a9a8dd3fc data/create/loot_tables/blocks/brass_encased_shaft.json 1dbc446abe190b2832b2ce7d52c2f2d2bdd45949 data/create/loot_tables/blocks/brass_funnel.json 6c8e784677d1a843b6c707484c79751acdb46ebc data/create/loot_tables/blocks/brass_tunnel.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/brown_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/brown_sail.json d415862a0abe20e8c5c2c8125bb672065330a9bc data/create/loot_tables/blocks/brown_seat.json fedfe922f568c06adc2dfdd641b9abc90ba5af8a data/create/loot_tables/blocks/brown_valve_handle.json @@ -2448,7 +2491,7 @@ d76113310fc56eca6382d44df174096f2210d416 data/create/loot_tables/blocks/clutch.j 673ba3a5deae9133b917d16c9eb87fe4c2873c8a data/create/loot_tables/blocks/cogwheel.json 096af6b5df6e87d36cb936eea9b00982a554f4af data/create/loot_tables/blocks/content_observer.json 80c2cb21714651116a71f449368c06bb22e841ce data/create/loot_tables/blocks/controller_rail.json -662b8d41803ef166d20850653b36759de719206c data/create/loot_tables/blocks/copper_backtank.json +41992d0c81379e0693a1a5ec3e6ee4ada381df34 data/create/loot_tables/blocks/copper_backtank.json f38802b919c49f162f102d6e5d94113f05bf4ab1 data/create/loot_tables/blocks/copper_block.json 5a65a18ea787130ac7b8f5652bfa5ed187446649 data/create/loot_tables/blocks/copper_casing.json 31a51237763c374b7cdf39b9b62c14e965871047 data/create/loot_tables/blocks/copper_ore.json @@ -2463,7 +2506,7 @@ ba084fc3c680c9dea0d03fc664a831dfed18e52e data/create/loot_tables/blocks/crimson_ c28fa42746a4d5ca2f824001b67e58673810169e data/create/loot_tables/blocks/crushing_wheel.json 205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/crushing_wheel_controller.json d370ee874b5b6b98e9a8c368218fe61f644d956d data/create/loot_tables/blocks/cuckoo_clock.json -da983da67346f3dda63505a83f59db6f8131f69b data/create/loot_tables/blocks/cursed_bell.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/cyan_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/cyan_sail.json 49a14b9e93abdf02a7aef9c0c4085ac89617fae4 data/create/loot_tables/blocks/cyan_seat.json fe24fd296812fea3f838defa2ca6270523d9d48e data/create/loot_tables/blocks/cyan_valve_handle.json @@ -2570,13 +2613,16 @@ fa0ddf45d108f55550164113cb5cfd002586a9d4 data/create/loot_tables/blocks/granite_ feca8a1f62e0e13fcb2252d5f782d74938b84431 data/create/loot_tables/blocks/granite_cobblestone_stairs.json 1d225a68b09d6f389aa7ed48aa05979bdaa482a9 data/create/loot_tables/blocks/granite_cobblestone_wall.json 87a4ac3db5ec80613b940abccc72fc4b37cee0ba data/create/loot_tables/blocks/granite_pillar.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/gray_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/gray_sail.json d014357b3a467b23473c8223f32471a04a9ff94c data/create/loot_tables/blocks/gray_seat.json 35f916fd0f8465a070270615dbddd716ff68d5bb data/create/loot_tables/blocks/gray_valve_handle.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/green_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/green_sail.json a71599eecd3f1179e3d0367623460e798828aa6d data/create/loot_tables/blocks/green_seat.json 865ebead9601b29e6326dc9e1d4c1ca92f3b7a3b data/create/loot_tables/blocks/green_valve_handle.json 9bdc47ea3ffc52f037f12f40f387e6b72a352c4e data/create/loot_tables/blocks/hand_crank.json +c61b386376d19aaf89df3447a26b976a672efec5 data/create/loot_tables/blocks/haunted_bell.json 22012e7759f1dbccbb06bcaf0311a54190270825 data/create/loot_tables/blocks/horizontal_framed_glass.json 5d3f585539942f13bbc458a0a002849c1f034fc1 data/create/loot_tables/blocks/horizontal_framed_glass_pane.json 1b28cc5e1e535aa0c62d4a75ad76fcb40bf6232c data/create/loot_tables/blocks/hose_pulley.json @@ -2594,12 +2640,15 @@ fa8a5922f7346a15a80b5c7e5dfc26d24ea98728 data/create/loot_tables/blocks/layered_ 0ec9e366708637a01e600a2a12cc267d81b3f69b data/create/loot_tables/blocks/layered_scoria.json 54816065cd735dfe53b1eb551110ba18c6e3746a data/create/loot_tables/blocks/layered_weathered_limestone.json 4b34cda34416f58045b10e61a0c8ae2b29cb0794 data/create/loot_tables/blocks/lectern_controller.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/light_blue_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/light_blue_sail.json b403848d3a4b4ad7a048e70c21e200e40d0c67e3 data/create/loot_tables/blocks/light_blue_seat.json 32afe3fff74ccda4151567961fa6c0b8e3735358 data/create/loot_tables/blocks/light_blue_valve_handle.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/light_gray_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/light_gray_sail.json 0cc2b20cb6e2dae6cf9d759c85926663f6066c99 data/create/loot_tables/blocks/light_gray_seat.json 8cc64a1dfb7ce7be2c063248d912c68ad2fe999c data/create/loot_tables/blocks/light_gray_valve_handle.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/lime_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/lime_sail.json f7893090c6ecb4862c90c408b7f9ce8316f8b608 data/create/loot_tables/blocks/lime_seat.json cae6d16c8967164698efbce3b91018a8e79a81e9 data/create/loot_tables/blocks/lime_valve_handle.json @@ -2616,6 +2665,7 @@ ebb8f7a60d6d9debc53a1f16749d61b980dd1d18 data/create/loot_tables/blocks/limeston 371115e5ceb08c07a9ab2371509960c31e0baa8a data/create/loot_tables/blocks/limestone_pillar.json aa751d2e8a7889907c08c4bec6f6ca266230b6d7 data/create/loot_tables/blocks/linear_chassis.json 4005c244387ea824202c4c7cd44403e537d9766b data/create/loot_tables/blocks/lit_blaze_burner.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/magenta_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/magenta_sail.json 9e5e017cd3b4f544f487a5ca22ef610a4addc8ec data/create/loot_tables/blocks/magenta_seat.json 517e983d7387ec0d86845d4cf3deaa6d68c71170 data/create/loot_tables/blocks/magenta_valve_handle.json @@ -2700,6 +2750,7 @@ dfeba5c6de20e9ec0252e43b7c4046f017284d3d data/create/loot_tables/blocks/paved_we 67b9227237ed2a8c09c4183c0f2ab1b3bd07084b data/create/loot_tables/blocks/paved_weathered_limestone_stairs.json d3e4ab984aef19ee21a1c5b868eb3fde96c05afd data/create/loot_tables/blocks/paved_weathered_limestone_wall.json 3a54eca6d503c154a2235ad5b6be4653abd4b6e3 data/create/loot_tables/blocks/peculiar_bell.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/pink_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/pink_sail.json 6f32e1217986407e41358e9417de63602c78e810 data/create/loot_tables/blocks/pink_seat.json d85b09659f08a73513c57b1b2e5ec7fc4b6f340a data/create/loot_tables/blocks/pink_valve_handle.json @@ -2734,10 +2785,12 @@ fbe98efcb1a5970b6795fdbbb671fee704c0945f data/create/loot_tables/blocks/portable a3fb7d3e3bf9dc73ce754002f10c469d57db1f71 data/create/loot_tables/blocks/powered_toggle_latch.json 205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/pulley_magnet.json e8fb62c91226ac107dee45c5ebc54c8dd0aee224 data/create/loot_tables/blocks/pulse_repeater.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/purple_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/purple_sail.json d7f6caa568e6508177a644fb78dc18ce26c9b2c0 data/create/loot_tables/blocks/purple_seat.json 773e4dc856044dabfe9d2323cbda0460dfb626ee data/create/loot_tables/blocks/purple_valve_handle.json 768420dab8785909891e52c4d77a182d99ba11d3 data/create/loot_tables/blocks/radial_chassis.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/red_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/red_sail.json 71b0fa3b174efe94a2a735ab2426c376c0ef674a data/create/loot_tables/blocks/red_seat.json 59ee0fd35978068fbce0882e0b207db7eeb202c0 data/create/loot_tables/blocks/red_valve_handle.json @@ -2794,11 +2847,13 @@ a89f425c47c3831071b556697169a3124370aed7 data/create/loot_tables/blocks/weathere e8f3af61d9a2fd1ff5b32c9bb474ed005e6d70c4 data/create/loot_tables/blocks/weathered_limestone_cobblestone_wall.json 54358a64639957cc66ffa5296ff45723f7adf00e data/create/loot_tables/blocks/weathered_limestone_pillar.json e3969f1c5966c4992b3280a06e1d6c5000c37df5 data/create/loot_tables/blocks/weighted_ejector.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/white_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/white_sail.json 969eda31556feb5a68e350762848d17453275fee data/create/loot_tables/blocks/white_seat.json 79fe374f8e677088f928a3a49ff5eeed6128d165 data/create/loot_tables/blocks/white_valve_handle.json 941ea78ea7c0f0061c3d3569ecea333ae6a16bf1 data/create/loot_tables/blocks/windmill_bearing.json 728c8719e653825c030913df94ce845fdc6d79b7 data/create/loot_tables/blocks/wooden_bracket.json +d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/yellow_nixie_tube.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/yellow_sail.json 37ead431a278928a09b260ae06a448e2c791a73e data/create/loot_tables/blocks/yellow_seat.json 899bb208908a2f9bec5e544ff47526f3e24db720 data/create/loot_tables/blocks/yellow_valve_handle.json @@ -2950,7 +3005,7 @@ d214afbd44e580f5fd1ebb4f16f07ffe34d87cba data/create/recipes/crafting/kinetics/l d7d96071874a87edf7bbdcf7a462f95a130d2991 data/create/recipes/crafting/kinetics/magenta_seat.json 5836881feef8fa8b18e4cceb9c3a9a2748b8cf3a data/create/recipes/crafting/kinetics/magenta_seat_from_other_seat.json 2ea43d6527dcb734578067ff442ec20395b0093b data/create/recipes/crafting/kinetics/magenta_valve_handle_from_other_valve_handle.json -edf33830927a6b1583c77aa5faeed1e80ef3631f data/create/recipes/crafting/kinetics/mechanical_arm.json +659cd6acdd15511c4b0a396740118b99b76a619d data/create/recipes/crafting/kinetics/mechanical_arm.json 946389078db31de69a7dc4fec5feebddf48dcfc3 data/create/recipes/crafting/kinetics/mechanical_bearing.json a5c7aad0d86cbb66b8688d295e62547da4a2ce0f data/create/recipes/crafting/kinetics/mechanical_crafter.json 4372830100d39c4a89ff397a62b01940e1a28cb3 data/create/recipes/crafting/kinetics/mechanical_drill.json @@ -2985,7 +3040,7 @@ af84b939ced1c0254a27469f857f571afbadc4f6 data/create/recipes/crafting/kinetics/r 0827e86e4b5f9d7023ccc19922bcbbaefd5b42d8 data/create/recipes/crafting/kinetics/red_seat_from_other_seat.json 5a10019d23726940152e26af3239d55d16bc7880 data/create/recipes/crafting/kinetics/red_valve_handle_from_other_valve_handle.json af525e135eb927b64462120d201ecae7a7ec61ed data/create/recipes/crafting/kinetics/rope_pulley.json -eab3a50d3252106bb244c6662404ba51d647a641 data/create/recipes/crafting/kinetics/rotation_speed_controller.json +1b918eb77b3e0fb2234c4c2c0d52e730ae7f3ffa data/create/recipes/crafting/kinetics/rotation_speed_controller.json d0d7fb94621f6f02fa3137666f20e677022d9d5b data/create/recipes/crafting/kinetics/sail_frame.json 66922e18791c87fadb7629cdf32d3dd2f50ccd13 data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json a17db27e61baa45f8a6ecb46a6d2a5a464704f8b data/create/recipes/crafting/kinetics/sequenced_gearshift.json @@ -3326,10 +3381,10 @@ bbf64f7eb3868e354756e57348493e2b1ae6b0d9 data/create/recipes/limestone_cobblesto 327bb8a6535b60bb65d0dda9d5205e988bc82526 data/create/recipes/limestone_pillar.json c2e15ac0c9109bad3face6d13efc32d7116b4c25 data/create/recipes/limestone_pillar_from_limestone_stonecutting.json 88173753ceaf121c5430bbf928a40e3c046dbfe0 data/create/recipes/mechanical_crafting/crushing_wheel.json -5ad44ffe3befafba6ae45096cf77b80d00d8eca2 data/create/recipes/mechanical_crafting/extendo_grip.json +14e322d4de8fae35d952274376497740bb3d5962 data/create/recipes/mechanical_crafting/extendo_grip.json de7fea84434753873dfa2b929d9b5f5f86ac6a5c data/create/recipes/mechanical_crafting/flywheel.json e491fd8a8873308270f9dc2a57ac8f2c70431dcc data/create/recipes/mechanical_crafting/furnace_engine.json -06deb1679f4086e014e96fff40b6983365076a10 data/create/recipes/mechanical_crafting/potato_cannon.json +8e5224d22b228f69473ca48ca0d874b34660b573 data/create/recipes/mechanical_crafting/potato_cannon.json 98f877bf8f3f8a686fc6cf7479a0fba5744248ce data/create/recipes/milling/allium.json 8c7e1cbc87c7ca7df2bf949957e89422fef8ad94 data/create/recipes/milling/aluminum_ore.json bcff4d30ae09a0729bce8b2dbde4ddd6719a998b data/create/recipes/milling/andesite.json @@ -3553,7 +3608,9 @@ f7b7ff190929ae525297fecb3c116f32fc05fd88 data/create/recipes/scoria_cobblestone_ a9096822db9d12b6014d6d34e52de5821305c03f data/create/recipes/scoria_cobblestone_wall_from_scoria_cobblestone_stonecutting.json a513468ce4d55fe3b3919bd76ba2bd5b6fac4d4e data/create/recipes/scoria_pillar.json 2e0ecbd3619f080d0fc6fe48307c5a5bcc2e91b4 data/create/recipes/scoria_pillar_from_scoria_stonecutting.json -073b7c585b6733e6b984f34b9658566c47540968 data/create/recipes/sequenced_assembly/clockwork_component.json +1b6bec69b00c44e74951973d69caae53d85383cb data/create/recipes/sequenced_assembly/cogwheel.json +3bc3d13856f9ab8ccc47c3188cfd839f6db2359b data/create/recipes/sequenced_assembly/large_cogwheel.json +b49a0da57a179edc087eee224221ded22fd1be01 data/create/recipes/sequenced_assembly/precision_mechanism.json 4e817b521623966fa24186731a70f0e14c03168e data/create/recipes/smelting/aluminum_ingot_compat_silents_mechanisms.json ae90f50589bc06b44765ac8cbb9fbdc2b58fdb32 data/create/recipes/smelting/brass_ingot_from_crushed.json 64cbf425effba00ff2e31d95cffc2be2e0191932 data/create/recipes/smelting/bread.json @@ -3685,7 +3742,7 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data/create/recipes/weathered_limestone 0f3c993eb6dd3f37953f304b8fad15bf60469ef4 data/create/recipes/weathered_limestone_cobblestone_wall_from_weathered_limestone_cobblestone_stonecutting.json 6eceb25fabbb6b389ca35de3b829ad061c9c456a data/create/recipes/weathered_limestone_pillar.json 11667414f73bc2d00bda7c5c1a7d2934bf6e9165 data/create/recipes/weathered_limestone_pillar_from_weathered_limestone_stonecutting.json -558c1052ca384f1c014f9b404d21268764a493ee data/create/tags/blocks/brittle.json +6558ef43f28c92cc558fbfc572f38496f1ed479e data/create/tags/blocks/brittle.json 330bfb3850ba3964b10b1bccbc3cbb9b012cae54 data/create/tags/blocks/fan_heaters.json 57b942386a15c874d1ca9cd6a8032c11a5599fc2 data/create/tags/blocks/fan_transparent.json c81ea194e808985847159b201140d4aa4cbcca65 data/create/tags/blocks/safe_nbt.json @@ -3698,7 +3755,7 @@ eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails. 081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data/create/tags/items/create_ingots.json 94c62bf22678ef55b2b8a5398a7960e5b00682dc data/create/tags/items/crushed_ores.json 6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/items/seats.json -c7efc23c08d5e3602c84ff43dac18f72b1cfced3 data/create/tags/items/upright_on_belt.json +f1092005b5d01e1f29457e90f75e5750f7f0226b data/create/tags/items/upright_on_belt.json 50936b211d94167a35ec78c89954082a336b6269 data/create/tags/items/valve_handles.json 16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data/forge/tags/blocks/glass/colorless.json 81d3eb40b048160fcc2d6bb7ff12b49276297efd data/forge/tags/blocks/glass_panes.json diff --git a/src/generated/resources/assets/create/blockstates/black_nixie_tube.json b/src/generated/resources/assets/create/blockstates/black_nixie_tube.json new file mode 100644 index 000000000..6c876afd9 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/black_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/black_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/black_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/black_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/black_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/black_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/black_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/black_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/black_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/blue_nixie_tube.json b/src/generated/resources/assets/create/blockstates/blue_nixie_tube.json new file mode 100644 index 000000000..e0b3c3cbf --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/blue_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/blue_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/blue_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/blue_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/blue_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/blue_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/blue_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/blue_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/blue_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brown_nixie_tube.json b/src/generated/resources/assets/create/blockstates/brown_nixie_tube.json new file mode 100644 index 000000000..ac0598ea6 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brown_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/brown_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/brown_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/brown_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/brown_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/brown_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/brown_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/brown_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/brown_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/cyan_nixie_tube.json b/src/generated/resources/assets/create/blockstates/cyan_nixie_tube.json new file mode 100644 index 000000000..d86bae904 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/cyan_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/cyan_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/cyan_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/cyan_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/cyan_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/cyan_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/cyan_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/cyan_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/cyan_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/gray_nixie_tube.json b/src/generated/resources/assets/create/blockstates/gray_nixie_tube.json new file mode 100644 index 000000000..801e85e1e --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/gray_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/gray_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/gray_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/gray_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/gray_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/gray_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/gray_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/gray_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/gray_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/green_nixie_tube.json b/src/generated/resources/assets/create/blockstates/green_nixie_tube.json new file mode 100644 index 000000000..919f0f810 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/green_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/green_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/green_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/green_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/green_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/green_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/green_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/green_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/green_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/cursed_bell.json b/src/generated/resources/assets/create/blockstates/haunted_bell.json similarity index 56% rename from src/generated/resources/assets/create/blockstates/cursed_bell.json rename to src/generated/resources/assets/create/blockstates/haunted_bell.json index 707d3c41f..aff248286 100644 --- a/src/generated/resources/assets/create/blockstates/cursed_bell.json +++ b/src/generated/resources/assets/create/blockstates/haunted_bell.json @@ -1,123 +1,123 @@ { "variants": { "attachment=floor,facing=north,powered=false": { - "model": "create:block/cursed_bell/block_floor" + "model": "create:block/haunted_bell_floor" }, "attachment=ceiling,facing=north,powered=false": { - "model": "create:block/cursed_bell/block_ceiling" + "model": "create:block/haunted_bell_ceiling" }, "attachment=single_wall,facing=north,powered=false": { - "model": "create:block/cursed_bell/block_single_wall" + "model": "create:block/haunted_bell_single_wall" }, "attachment=double_wall,facing=north,powered=false": { - "model": "create:block/cursed_bell/block_double_wall" + "model": "create:block/haunted_bell_double_wall" }, "attachment=floor,facing=south,powered=false": { - "model": "create:block/cursed_bell/block_floor", + "model": "create:block/haunted_bell_floor", "y": 180 }, "attachment=ceiling,facing=south,powered=false": { - "model": "create:block/cursed_bell/block_ceiling", + "model": "create:block/haunted_bell_ceiling", "y": 180 }, "attachment=single_wall,facing=south,powered=false": { - "model": "create:block/cursed_bell/block_single_wall", + "model": "create:block/haunted_bell_single_wall", "y": 180 }, "attachment=double_wall,facing=south,powered=false": { - "model": "create:block/cursed_bell/block_double_wall", + "model": "create:block/haunted_bell_double_wall", "y": 180 }, "attachment=floor,facing=west,powered=false": { - "model": "create:block/cursed_bell/block_floor", + "model": "create:block/haunted_bell_floor", "y": 270 }, "attachment=ceiling,facing=west,powered=false": { - "model": "create:block/cursed_bell/block_ceiling", + "model": "create:block/haunted_bell_ceiling", "y": 270 }, "attachment=single_wall,facing=west,powered=false": { - "model": "create:block/cursed_bell/block_single_wall", + "model": "create:block/haunted_bell_single_wall", "y": 270 }, "attachment=double_wall,facing=west,powered=false": { - "model": "create:block/cursed_bell/block_double_wall", + "model": "create:block/haunted_bell_double_wall", "y": 270 }, "attachment=floor,facing=east,powered=false": { - "model": "create:block/cursed_bell/block_floor", + "model": "create:block/haunted_bell_floor", "y": 90 }, "attachment=ceiling,facing=east,powered=false": { - "model": "create:block/cursed_bell/block_ceiling", + "model": "create:block/haunted_bell_ceiling", "y": 90 }, "attachment=single_wall,facing=east,powered=false": { - "model": "create:block/cursed_bell/block_single_wall", + "model": "create:block/haunted_bell_single_wall", "y": 90 }, "attachment=double_wall,facing=east,powered=false": { - "model": "create:block/cursed_bell/block_double_wall", + "model": "create:block/haunted_bell_double_wall", "y": 90 }, "attachment=floor,facing=north,powered=true": { - "model": "create:block/cursed_bell/block_floor" + "model": "create:block/haunted_bell_floor" }, "attachment=ceiling,facing=north,powered=true": { - "model": "create:block/cursed_bell/block_ceiling" + "model": "create:block/haunted_bell_ceiling" }, "attachment=single_wall,facing=north,powered=true": { - "model": "create:block/cursed_bell/block_single_wall" + "model": "create:block/haunted_bell_single_wall" }, "attachment=double_wall,facing=north,powered=true": { - "model": "create:block/cursed_bell/block_double_wall" + "model": "create:block/haunted_bell_double_wall" }, "attachment=floor,facing=south,powered=true": { - "model": "create:block/cursed_bell/block_floor", + "model": "create:block/haunted_bell_floor", "y": 180 }, "attachment=ceiling,facing=south,powered=true": { - "model": "create:block/cursed_bell/block_ceiling", + "model": "create:block/haunted_bell_ceiling", "y": 180 }, "attachment=single_wall,facing=south,powered=true": { - "model": "create:block/cursed_bell/block_single_wall", + "model": "create:block/haunted_bell_single_wall", "y": 180 }, "attachment=double_wall,facing=south,powered=true": { - "model": "create:block/cursed_bell/block_double_wall", + "model": "create:block/haunted_bell_double_wall", "y": 180 }, "attachment=floor,facing=west,powered=true": { - "model": "create:block/cursed_bell/block_floor", + "model": "create:block/haunted_bell_floor", "y": 270 }, "attachment=ceiling,facing=west,powered=true": { - "model": "create:block/cursed_bell/block_ceiling", + "model": "create:block/haunted_bell_ceiling", "y": 270 }, "attachment=single_wall,facing=west,powered=true": { - "model": "create:block/cursed_bell/block_single_wall", + "model": "create:block/haunted_bell_single_wall", "y": 270 }, "attachment=double_wall,facing=west,powered=true": { - "model": "create:block/cursed_bell/block_double_wall", + "model": "create:block/haunted_bell_double_wall", "y": 270 }, "attachment=floor,facing=east,powered=true": { - "model": "create:block/cursed_bell/block_floor", + "model": "create:block/haunted_bell_floor", "y": 90 }, "attachment=ceiling,facing=east,powered=true": { - "model": "create:block/cursed_bell/block_ceiling", + "model": "create:block/haunted_bell_ceiling", "y": 90 }, "attachment=single_wall,facing=east,powered=true": { - "model": "create:block/cursed_bell/block_single_wall", + "model": "create:block/haunted_bell_single_wall", "y": 90 }, "attachment=double_wall,facing=east,powered=true": { - "model": "create:block/cursed_bell/block_double_wall", + "model": "create:block/haunted_bell_double_wall", "y": 90 } } diff --git a/src/generated/resources/assets/create/blockstates/light_blue_nixie_tube.json b/src/generated/resources/assets/create/blockstates/light_blue_nixie_tube.json new file mode 100644 index 000000000..ee587b332 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_blue_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/light_blue_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/light_blue_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/light_blue_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/light_blue_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/light_blue_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/light_blue_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/light_blue_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/light_blue_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_gray_nixie_tube.json b/src/generated/resources/assets/create/blockstates/light_gray_nixie_tube.json new file mode 100644 index 000000000..1243138f5 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_gray_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/light_gray_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/light_gray_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/light_gray_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/light_gray_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/light_gray_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/light_gray_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/light_gray_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/light_gray_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/lime_nixie_tube.json b/src/generated/resources/assets/create/blockstates/lime_nixie_tube.json new file mode 100644 index 000000000..76f298bf3 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/lime_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/lime_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/lime_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/lime_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/lime_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/lime_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/lime_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/lime_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/lime_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/lit_blaze_burner.json b/src/generated/resources/assets/create/blockstates/lit_blaze_burner.json index 5befc1351..041032bdf 100644 --- a/src/generated/resources/assets/create/blockstates/lit_blaze_burner.json +++ b/src/generated/resources/assets/create/blockstates/lit_blaze_burner.json @@ -1,7 +1,10 @@ { "variants": { - "": { + "flame_type=regular": { "model": "create:block/blaze_burner/block_with_fire" + }, + "flame_type=soul": { + "model": "create:block/blaze_burner/block_with_soul_fire" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/magenta_nixie_tube.json b/src/generated/resources/assets/create/blockstates/magenta_nixie_tube.json new file mode 100644 index 000000000..396bfcbea --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/magenta_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/magenta_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/magenta_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/magenta_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/magenta_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/magenta_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/magenta_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/magenta_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/magenta_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/nixie_tube.json b/src/generated/resources/assets/create/blockstates/nixie_tube.json index aa96a9615..8a59ef4bb 100644 --- a/src/generated/resources/assets/create/blockstates/nixie_tube.json +++ b/src/generated/resources/assets/create/blockstates/nixie_tube.json @@ -1,36 +1,36 @@ { "variants": { "ceiling=false,facing=north": { - "model": "create:block/nixie_tube/block", + "model": "create:block/nixie_tube", "y": 180 }, "ceiling=true,facing=north": { - "model": "create:block/nixie_tube/block", + "model": "create:block/nixie_tube", "x": 180, "y": 180 }, "ceiling=false,facing=south": { - "model": "create:block/nixie_tube/block" + "model": "create:block/nixie_tube" }, "ceiling=true,facing=south": { - "model": "create:block/nixie_tube/block", + "model": "create:block/nixie_tube", "x": 180 }, "ceiling=false,facing=west": { - "model": "create:block/nixie_tube/block", + "model": "create:block/nixie_tube", "y": 90 }, "ceiling=true,facing=west": { - "model": "create:block/nixie_tube/block", + "model": "create:block/nixie_tube", "x": 180, "y": 90 }, "ceiling=false,facing=east": { - "model": "create:block/nixie_tube/block", + "model": "create:block/nixie_tube", "y": 270 }, "ceiling=true,facing=east": { - "model": "create:block/nixie_tube/block", + "model": "create:block/nixie_tube", "x": 180, "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/peculiar_bell.json b/src/generated/resources/assets/create/blockstates/peculiar_bell.json index 1c4ad76a6..c688d01c7 100644 --- a/src/generated/resources/assets/create/blockstates/peculiar_bell.json +++ b/src/generated/resources/assets/create/blockstates/peculiar_bell.json @@ -1,123 +1,123 @@ { "variants": { "attachment=floor,facing=north,powered=false": { - "model": "create:block/peculiar_bell/block_floor" + "model": "create:block/peculiar_bell_floor" }, "attachment=ceiling,facing=north,powered=false": { - "model": "create:block/peculiar_bell/block_ceiling" + "model": "create:block/peculiar_bell_ceiling" }, "attachment=single_wall,facing=north,powered=false": { - "model": "create:block/peculiar_bell/block_single_wall" + "model": "create:block/peculiar_bell_single_wall" }, "attachment=double_wall,facing=north,powered=false": { - "model": "create:block/peculiar_bell/block_double_wall" + "model": "create:block/peculiar_bell_double_wall" }, "attachment=floor,facing=south,powered=false": { - "model": "create:block/peculiar_bell/block_floor", + "model": "create:block/peculiar_bell_floor", "y": 180 }, "attachment=ceiling,facing=south,powered=false": { - "model": "create:block/peculiar_bell/block_ceiling", + "model": "create:block/peculiar_bell_ceiling", "y": 180 }, "attachment=single_wall,facing=south,powered=false": { - "model": "create:block/peculiar_bell/block_single_wall", + "model": "create:block/peculiar_bell_single_wall", "y": 180 }, "attachment=double_wall,facing=south,powered=false": { - "model": "create:block/peculiar_bell/block_double_wall", + "model": "create:block/peculiar_bell_double_wall", "y": 180 }, "attachment=floor,facing=west,powered=false": { - "model": "create:block/peculiar_bell/block_floor", + "model": "create:block/peculiar_bell_floor", "y": 270 }, "attachment=ceiling,facing=west,powered=false": { - "model": "create:block/peculiar_bell/block_ceiling", + "model": "create:block/peculiar_bell_ceiling", "y": 270 }, "attachment=single_wall,facing=west,powered=false": { - "model": "create:block/peculiar_bell/block_single_wall", + "model": "create:block/peculiar_bell_single_wall", "y": 270 }, "attachment=double_wall,facing=west,powered=false": { - "model": "create:block/peculiar_bell/block_double_wall", + "model": "create:block/peculiar_bell_double_wall", "y": 270 }, "attachment=floor,facing=east,powered=false": { - "model": "create:block/peculiar_bell/block_floor", + "model": "create:block/peculiar_bell_floor", "y": 90 }, "attachment=ceiling,facing=east,powered=false": { - "model": "create:block/peculiar_bell/block_ceiling", + "model": "create:block/peculiar_bell_ceiling", "y": 90 }, "attachment=single_wall,facing=east,powered=false": { - "model": "create:block/peculiar_bell/block_single_wall", + "model": "create:block/peculiar_bell_single_wall", "y": 90 }, "attachment=double_wall,facing=east,powered=false": { - "model": "create:block/peculiar_bell/block_double_wall", + "model": "create:block/peculiar_bell_double_wall", "y": 90 }, "attachment=floor,facing=north,powered=true": { - "model": "create:block/peculiar_bell/block_floor" + "model": "create:block/peculiar_bell_floor" }, "attachment=ceiling,facing=north,powered=true": { - "model": "create:block/peculiar_bell/block_ceiling" + "model": "create:block/peculiar_bell_ceiling" }, "attachment=single_wall,facing=north,powered=true": { - "model": "create:block/peculiar_bell/block_single_wall" + "model": "create:block/peculiar_bell_single_wall" }, "attachment=double_wall,facing=north,powered=true": { - "model": "create:block/peculiar_bell/block_double_wall" + "model": "create:block/peculiar_bell_double_wall" }, "attachment=floor,facing=south,powered=true": { - "model": "create:block/peculiar_bell/block_floor", + "model": "create:block/peculiar_bell_floor", "y": 180 }, "attachment=ceiling,facing=south,powered=true": { - "model": "create:block/peculiar_bell/block_ceiling", + "model": "create:block/peculiar_bell_ceiling", "y": 180 }, "attachment=single_wall,facing=south,powered=true": { - "model": "create:block/peculiar_bell/block_single_wall", + "model": "create:block/peculiar_bell_single_wall", "y": 180 }, "attachment=double_wall,facing=south,powered=true": { - "model": "create:block/peculiar_bell/block_double_wall", + "model": "create:block/peculiar_bell_double_wall", "y": 180 }, "attachment=floor,facing=west,powered=true": { - "model": "create:block/peculiar_bell/block_floor", + "model": "create:block/peculiar_bell_floor", "y": 270 }, "attachment=ceiling,facing=west,powered=true": { - "model": "create:block/peculiar_bell/block_ceiling", + "model": "create:block/peculiar_bell_ceiling", "y": 270 }, "attachment=single_wall,facing=west,powered=true": { - "model": "create:block/peculiar_bell/block_single_wall", + "model": "create:block/peculiar_bell_single_wall", "y": 270 }, "attachment=double_wall,facing=west,powered=true": { - "model": "create:block/peculiar_bell/block_double_wall", + "model": "create:block/peculiar_bell_double_wall", "y": 270 }, "attachment=floor,facing=east,powered=true": { - "model": "create:block/peculiar_bell/block_floor", + "model": "create:block/peculiar_bell_floor", "y": 90 }, "attachment=ceiling,facing=east,powered=true": { - "model": "create:block/peculiar_bell/block_ceiling", + "model": "create:block/peculiar_bell_ceiling", "y": 90 }, "attachment=single_wall,facing=east,powered=true": { - "model": "create:block/peculiar_bell/block_single_wall", + "model": "create:block/peculiar_bell_single_wall", "y": 90 }, "attachment=double_wall,facing=east,powered=true": { - "model": "create:block/peculiar_bell/block_double_wall", + "model": "create:block/peculiar_bell_double_wall", "y": 90 } } diff --git a/src/generated/resources/assets/create/blockstates/pink_nixie_tube.json b/src/generated/resources/assets/create/blockstates/pink_nixie_tube.json new file mode 100644 index 000000000..582f2c3ef --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/pink_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/pink_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/pink_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/pink_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/pink_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/pink_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/pink_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/pink_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/pink_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/purple_nixie_tube.json b/src/generated/resources/assets/create/blockstates/purple_nixie_tube.json new file mode 100644 index 000000000..b08bd6e3c --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/purple_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/purple_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/purple_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/purple_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/purple_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/purple_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/purple_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/purple_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/purple_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/red_nixie_tube.json b/src/generated/resources/assets/create/blockstates/red_nixie_tube.json new file mode 100644 index 000000000..99ababb7c --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/red_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/red_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/red_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/red_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/red_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/red_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/red_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/red_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/red_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/water_wheel.json b/src/generated/resources/assets/create/blockstates/water_wheel.json index c9b0731b7..fe99163df 100644 --- a/src/generated/resources/assets/create/blockstates/water_wheel.json +++ b/src/generated/resources/assets/create/blockstates/water_wheel.json @@ -1,5 +1,12 @@ { "variants": { + "facing=down": { + "model": "create:block/water_wheel", + "x": 180 + }, + "facing=up": { + "model": "create:block/water_wheel" + }, "facing=north": { "model": "create:block/water_wheel", "x": 90 diff --git a/src/generated/resources/assets/create/blockstates/white_nixie_tube.json b/src/generated/resources/assets/create/blockstates/white_nixie_tube.json new file mode 100644 index 000000000..c1541c94d --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/white_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/white_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/white_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/white_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/white_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/white_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/white_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/white_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/white_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/yellow_nixie_tube.json b/src/generated/resources/assets/create/blockstates/yellow_nixie_tube.json new file mode 100644 index 000000000..370874c55 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/yellow_nixie_tube.json @@ -0,0 +1,38 @@ +{ + "variants": { + "ceiling=false,facing=north": { + "model": "create:block/yellow_nixie_tube", + "y": 180 + }, + "ceiling=true,facing=north": { + "model": "create:block/yellow_nixie_tube", + "x": 180, + "y": 180 + }, + "ceiling=false,facing=south": { + "model": "create:block/yellow_nixie_tube" + }, + "ceiling=true,facing=south": { + "model": "create:block/yellow_nixie_tube", + "x": 180 + }, + "ceiling=false,facing=west": { + "model": "create:block/yellow_nixie_tube", + "y": 90 + }, + "ceiling=true,facing=west": { + "model": "create:block/yellow_nixie_tube", + "x": 180, + "y": 90 + }, + "ceiling=false,facing=east": { + "model": "create:block/yellow_nixie_tube", + "y": 270 + }, + "ceiling=true,facing=east": { + "model": "create:block/yellow_nixie_tube", + "x": 180, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 42c97f237..1d0e41a93 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -24,10 +24,12 @@ "block.create.belt": "\u0287\u05DF\u01DD\u15FA", "block.create.birch_window": "\u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", "block.create.birch_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", + "block.create.black_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u029E\u0254\u0250\u05DF\u15FA", "block.create.black_sail": "\u05DF\u0131\u0250S \u029E\u0254\u0250\u05DF\u15FA", "block.create.black_seat": "\u0287\u0250\u01DDS \u029E\u0254\u0250\u05DF\u15FA", "block.create.black_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u029E\u0254\u0250\u05DF\u15FA", "block.create.blaze_burner": "\u0279\u01DDu\u0279n\u15FA \u01DDz\u0250\u05DF\u15FA", + "block.create.blue_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u01DDn\u05DF\u15FA", "block.create.blue_sail": "\u05DF\u0131\u0250S \u01DDn\u05DF\u15FA", "block.create.blue_seat": "\u0287\u0250\u01DDS \u01DDn\u05DF\u15FA", "block.create.blue_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DDn\u05DF\u15FA", @@ -37,6 +39,7 @@ "block.create.brass_encased_shaft": "\u0287\u025F\u0250\u0265S p\u01DDs\u0250\u0254u\u018E ss\u0250\u0279\u15FA", "block.create.brass_funnel": "\u05DF\u01DDuun\u2132 ss\u0250\u0279\u15FA", "block.create.brass_tunnel": "\u05DF\u01DDuun\u27D8 ss\u0250\u0279\u15FA", + "block.create.brown_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N u\u028Do\u0279\u15FA", "block.create.brown_sail": "\u05DF\u0131\u0250S u\u028Do\u0279\u15FA", "block.create.brown_seat": "\u0287\u0250\u01DDS u\u028Do\u0279\u15FA", "block.create.brown_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B u\u028Do\u0279\u15FA", @@ -69,7 +72,7 @@ "block.create.crushing_wheel": "\u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186", "block.create.crushing_wheel_controller": "\u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186 \u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186", "block.create.cuckoo_clock": "\u029E\u0254o\u05DF\u0186 oo\u029E\u0254n\u0186", - "block.create.cursed_bell": "\u05DF\u05DF\u01DD\u15FA p\u01DDs\u0279n\u0186", + "block.create.cyan_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N u\u0250\u028E\u0186", "block.create.cyan_sail": "\u05DF\u0131\u0250S u\u0250\u028E\u0186", "block.create.cyan_seat": "\u0287\u0250\u01DDS u\u0250\u028E\u0186", "block.create.cyan_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B u\u0250\u028E\u0186", @@ -176,13 +179,16 @@ "block.create.granite_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131u\u0250\u0279\u2141", "block.create.granite_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131u\u0250\u0279\u2141", "block.create.granite_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DD\u0287\u0131u\u0250\u0279\u2141", + "block.create.gray_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u028E\u0250\u0279\u2141", "block.create.gray_sail": "\u05DF\u0131\u0250S \u028E\u0250\u0279\u2141", "block.create.gray_seat": "\u0287\u0250\u01DDS \u028E\u0250\u0279\u2141", "block.create.gray_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028E\u0250\u0279\u2141", + "block.create.green_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N u\u01DD\u01DD\u0279\u2141", "block.create.green_sail": "\u05DF\u0131\u0250S u\u01DD\u01DD\u0279\u2141", "block.create.green_seat": "\u0287\u0250\u01DDS u\u01DD\u01DD\u0279\u2141", "block.create.green_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B u\u01DD\u01DD\u0279\u2141", "block.create.hand_crank": "\u029Eu\u0250\u0279\u0186 pu\u0250H", + "block.create.haunted_bell": "\u05DF\u05DF\u01DD\u15FA p\u01DD\u0287un\u0250H", "block.create.honey": "\u028E\u01DDuoH", "block.create.horizontal_framed_glass": "ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0287uoz\u0131\u0279oH", "block.create.horizontal_framed_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0287uoz\u0131\u0279oH", @@ -201,12 +207,15 @@ "block.create.layered_scoria": "\u0250\u0131\u0279o\u0254S p\u01DD\u0279\u01DD\u028E\u0250\uA780", "block.create.layered_weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u0279\u01DD\u028E\u0250\uA780", "block.create.lectern_controller": "\u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186 u\u0279\u01DD\u0287\u0254\u01DD\uA780", + "block.create.light_blue_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u01DDn\u05DF\u15FA \u0287\u0265b\u0131\uA780", "block.create.light_blue_sail": "\u05DF\u0131\u0250S \u01DDn\u05DF\u15FA \u0287\u0265b\u0131\uA780", "block.create.light_blue_seat": "\u0287\u0250\u01DDS \u01DDn\u05DF\u15FA \u0287\u0265b\u0131\uA780", "block.create.light_blue_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DDn\u05DF\u15FA \u0287\u0265b\u0131\uA780", + "block.create.light_gray_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u028E\u0250\u0279\u2141 \u0287\u0265b\u0131\uA780", "block.create.light_gray_sail": "\u05DF\u0131\u0250S \u028E\u0250\u0279\u2141 \u0287\u0265b\u0131\uA780", "block.create.light_gray_seat": "\u0287\u0250\u01DDS \u028E\u0250\u0279\u2141 \u0287\u0265b\u0131\uA780", "block.create.light_gray_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028E\u0250\u0279\u2141 \u0287\u0265b\u0131\uA780", + "block.create.lime_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u01DD\u026F\u0131\uA780", "block.create.lime_sail": "\u05DF\u0131\u0250S \u01DD\u026F\u0131\uA780", "block.create.lime_seat": "\u0287\u0250\u01DDS \u01DD\u026F\u0131\uA780", "block.create.lime_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u026F\u0131\uA780", @@ -223,6 +232,7 @@ "block.create.limestone_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780", "block.create.linear_chassis": "s\u0131ss\u0250\u0265\u0186 \u0279\u0250\u01DDu\u0131\uA780", "block.create.lit_blaze_burner": "\u0279\u01DDu\u0279n\u15FA \u01DDz\u0250\u05DF\u15FA \u0287\u0131\uA780", + "block.create.magenta_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u0250\u0287u\u01DDb\u0250W", "block.create.magenta_sail": "\u05DF\u0131\u0250S \u0250\u0287u\u01DDb\u0250W", "block.create.magenta_seat": "\u0287\u0250\u01DDS \u0250\u0287u\u01DDb\u0250W", "block.create.magenta_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u0250\u0287u\u01DDb\u0250W", @@ -307,6 +317,7 @@ "block.create.paved_weathered_limestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u028C\u0250\u0500", "block.create.paved_weathered_limestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u028C\u0250\u0500", "block.create.peculiar_bell": "\u05DF\u05DF\u01DD\u15FA \u0279\u0250\u0131\u05DFn\u0254\u01DD\u0500", + "block.create.pink_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u029Eu\u0131\u0500", "block.create.pink_sail": "\u05DF\u0131\u0250S \u029Eu\u0131\u0500", "block.create.pink_seat": "\u0287\u0250\u01DDS \u029Eu\u0131\u0500", "block.create.pink_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u029Eu\u0131\u0500", @@ -341,10 +352,12 @@ "block.create.powered_toggle_latch": "\u0265\u0254\u0287\u0250\uA780 \u01DD\u05DFbbo\u27D8 p\u01DD\u0279\u01DD\u028Do\u0500", "block.create.pulley_magnet": "\u0287\u01DDub\u0250W \u028E\u01DD\u05DF\u05DFn\u0500", "block.create.pulse_repeater": "\u0279\u01DD\u0287\u0250\u01DDd\u01DD\u1D1A \u01DDs\u05DFn\u0500", + "block.create.purple_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u01DD\u05DFd\u0279n\u0500", "block.create.purple_sail": "\u05DF\u0131\u0250S \u01DD\u05DFd\u0279n\u0500", "block.create.purple_seat": "\u0287\u0250\u01DDS \u01DD\u05DFd\u0279n\u0500", "block.create.purple_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u05DFd\u0279n\u0500", "block.create.radial_chassis": "s\u0131ss\u0250\u0265\u0186 \u05DF\u0250\u0131p\u0250\u1D1A", + "block.create.red_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N p\u01DD\u1D1A", "block.create.red_sail": "\u05DF\u0131\u0250S p\u01DD\u1D1A", "block.create.red_seat": "\u0287\u0250\u01DDS p\u01DD\u1D1A", "block.create.red_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B p\u01DD\u1D1A", @@ -401,16 +414,20 @@ "block.create.weathered_limestone_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM", "block.create.weathered_limestone_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM", "block.create.weighted_ejector": "\u0279o\u0287\u0254\u01DD\u0638\u018E p\u01DD\u0287\u0265b\u0131\u01DDM", + "block.create.white_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u01DD\u0287\u0131\u0265M", "block.create.white_sail": "\u05DF\u0131\u0250S \u01DD\u0287\u0131\u0265M", "block.create.white_seat": "\u0287\u0250\u01DDS \u01DD\u0287\u0131\u0265M", "block.create.white_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u0287\u0131\u0265M", "block.create.windmill_bearing": "bu\u0131\u0279\u0250\u01DD\u15FA \u05DF\u05DF\u0131\u026Fpu\u0131M", "block.create.wooden_bracket": "\u0287\u01DD\u029E\u0254\u0250\u0279\u15FA u\u01DDpooM", + "block.create.yellow_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.yellow_sail": "\u05DF\u0131\u0250S \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.yellow_seat": "\u0287\u0250\u01DDS \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.yellow_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.zinc_block": "\u0254u\u0131Z \u025Fo \u029E\u0254o\u05DF\u15FA", "block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z", + "enchantment.create.capacity": "\u028E\u0287\u0131\u0254\u0250d\u0250\u0186", + "enchantment.create.potato_recovery": "\u028E\u0279\u01DD\u028Co\u0254\u01DD\u1D1A o\u0287\u0250\u0287o\u0500", "entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186", "entity.create.crafting_blueprint": "\u0287u\u0131\u0279d\u01DDn\u05DF\u15FA bu\u0131\u0287\u025F\u0250\u0279\u0186", "entity.create.gantry_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0287u\u0250\u2141", @@ -437,13 +454,13 @@ "item.create.chocolate_glazed_berries": "s\u01DD\u0131\u0279\u0279\u01DD\u15FA p\u01DDz\u0250\u05DF\u2141 \u01DD\u0287\u0250\u05DFo\u0254o\u0265\u0186", "item.create.chromatic_compound": "punod\u026Fo\u0186 \u0254\u0131\u0287\u0250\u026Fo\u0279\u0265\u0186", "item.create.cinder_flour": "\u0279no\u05DF\u2132 \u0279\u01DDpu\u0131\u0186", - "item.create.clockwork_component": "\u0287u\u01DDuod\u026Fo\u0186 \u029E\u0279o\u028D\u029E\u0254o\u05DF\u0186", "item.create.copper_backtank": "\u029Eu\u0250\u0287\u029E\u0254\u0250\u15FA \u0279\u01DDddo\u0186", "item.create.copper_ingot": "\u0287obuI \u0279\u01DDddo\u0186", "item.create.copper_nugget": "\u0287\u01DDbbnN \u0279\u01DDddo\u0186", "item.create.copper_sheet": "\u0287\u01DD\u01DD\u0265S \u0279\u01DDddo\u0186", "item.create.crafter_slot_cover": "\u0279\u01DD\u028Co\u0186 \u0287o\u05DFS \u0279\u01DD\u0287\u025F\u0250\u0279\u0186", "item.create.crafting_blueprint": "\u0287u\u0131\u0279d\u01DDn\u05DF\u15FA bu\u0131\u0287\u025F\u0250\u0279\u0186", + "item.create.creative_blaze_cake": "\u01DD\u029E\u0250\u0186 \u01DDz\u0250\u05DF\u15FA \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186", "item.create.crushed_aluminum_ore": "\u01DD\u0279O \u026Fnu\u0131\u026Fn\u05DF\u2C6F p\u01DD\u0265sn\u0279\u0186", "item.create.crushed_brass": "ss\u0250\u0279\u15FA p\u01DD\u0265sn\u0279\u0186", "item.create.crushed_copper_ore": "\u01DD\u0279O \u0279\u01DDddo\u0186 p\u01DD\u0265sn\u0279\u0186", @@ -472,7 +489,9 @@ "item.create.handheld_worldshaper": "\u0279\u01DDd\u0250\u0265sp\u05DF\u0279oM \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186", "item.create.honey_bucket": "\u0287\u01DD\u029E\u0254n\u15FA \u028E\u01DDuoH", "item.create.honeyed_apple": "\u01DD\u05DFdd\u2C6F p\u01DD\u028E\u01DDuoH", - "item.create.incomplete_clockwork_component": "\u0287u\u01DDuod\u026Fo\u0186 \u029E\u0279o\u028D\u029E\u0254o\u05DF\u0186 \u01DD\u0287\u01DD\u05DFd\u026Fo\u0254uI", + "item.create.incomplete_cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186 \u01DD\u0287\u01DD\u05DFd\u026Fo\u0254uI", + "item.create.incomplete_large_cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186 \u01DDb\u0279\u0250\uA780 \u01DD\u0287\u01DD\u05DFd\u026Fo\u0254uI", + "item.create.incomplete_precision_mechanism": "\u026Fs\u0131u\u0250\u0265\u0254\u01DDW uo\u0131s\u0131\u0254\u01DD\u0279\u0500 \u01DD\u0287\u01DD\u05DFd\u026Fo\u0254uI", "item.create.iron_sheet": "\u0287\u01DD\u01DD\u0265S uo\u0279I", "item.create.linked_controller": "\u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186 p\u01DD\u029Eu\u0131\uA780", "item.create.minecart_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W", @@ -480,6 +499,7 @@ "item.create.polished_rose_quartz": "z\u0287\u0279\u0250n\u1F49 \u01DDso\u1D1A p\u01DD\u0265s\u0131\u05DFo\u0500", "item.create.potato_cannon": "uouu\u0250\u0186 o\u0287\u0250\u0287o\u0500", "item.create.powdered_obsidian": "u\u0250\u0131p\u0131sqO p\u01DD\u0279\u01DDp\u028Do\u0500", + "item.create.precision_mechanism": "\u026Fs\u0131u\u0250\u0265\u0254\u01DDW uo\u0131s\u0131\u0254\u01DD\u0279\u0500", "item.create.propeller": "\u0279\u01DD\u05DF\u05DF\u01DDdo\u0279\u0500", "item.create.red_sand_paper": "\u0279\u01DDd\u0250\u0500 pu\u0250S p\u01DD\u1D1A", "item.create.refined_radiance": "\u01DD\u0254u\u0250\u0131p\u0250\u1D1A p\u01DDu\u0131\u025F\u01DD\u1D1A", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 04be2bdfa..3dfa1aa83 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -27,10 +27,12 @@ "block.create.belt": "Belt", "block.create.birch_window": "Birch Window", "block.create.birch_window_pane": "Birch Window Pane", + "block.create.black_nixie_tube": "Black Nixie Tube", "block.create.black_sail": "Black Sail", "block.create.black_seat": "Black Seat", "block.create.black_valve_handle": "Black Valve Handle", "block.create.blaze_burner": "Blaze Burner", + "block.create.blue_nixie_tube": "Blue Nixie Tube", "block.create.blue_sail": "Blue Sail", "block.create.blue_seat": "Blue Seat", "block.create.blue_valve_handle": "Blue Valve Handle", @@ -40,6 +42,7 @@ "block.create.brass_encased_shaft": "Brass Encased Shaft", "block.create.brass_funnel": "Brass Funnel", "block.create.brass_tunnel": "Brass Tunnel", + "block.create.brown_nixie_tube": "Brown Nixie Tube", "block.create.brown_sail": "Brown Sail", "block.create.brown_seat": "Brown Seat", "block.create.brown_valve_handle": "Brown Valve Handle", @@ -72,7 +75,7 @@ "block.create.crushing_wheel": "Crushing Wheel", "block.create.crushing_wheel_controller": "Crushing Wheel Controller", "block.create.cuckoo_clock": "Cuckoo Clock", - "block.create.cursed_bell": "Cursed Bell", + "block.create.cyan_nixie_tube": "Cyan Nixie Tube", "block.create.cyan_sail": "Cyan Sail", "block.create.cyan_seat": "Cyan Seat", "block.create.cyan_valve_handle": "Cyan Valve Handle", @@ -179,13 +182,16 @@ "block.create.granite_cobblestone_stairs": "Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "Granite Cobblestone Wall", "block.create.granite_pillar": "Granite Pillar", + "block.create.gray_nixie_tube": "Gray Nixie Tube", "block.create.gray_sail": "Gray Sail", "block.create.gray_seat": "Gray Seat", "block.create.gray_valve_handle": "Gray Valve Handle", + "block.create.green_nixie_tube": "Green Nixie Tube", "block.create.green_sail": "Green Sail", "block.create.green_seat": "Green Seat", "block.create.green_valve_handle": "Green Valve Handle", "block.create.hand_crank": "Hand Crank", + "block.create.haunted_bell": "Haunted Bell", "block.create.honey": "Honey", "block.create.horizontal_framed_glass": "Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "Horizontal Framed Glass Pane", @@ -204,12 +210,15 @@ "block.create.layered_scoria": "Layered Scoria", "block.create.layered_weathered_limestone": "Layered Weathered Limestone", "block.create.lectern_controller": "Lectern Controller", + "block.create.light_blue_nixie_tube": "Light Blue Nixie Tube", "block.create.light_blue_sail": "Light Blue Sail", "block.create.light_blue_seat": "Light Blue Seat", "block.create.light_blue_valve_handle": "Light Blue Valve Handle", + "block.create.light_gray_nixie_tube": "Light Gray Nixie Tube", "block.create.light_gray_sail": "Light Gray Sail", "block.create.light_gray_seat": "Light Gray Seat", "block.create.light_gray_valve_handle": "Light Gray Valve Handle", + "block.create.lime_nixie_tube": "Lime Nixie Tube", "block.create.lime_sail": "Lime Sail", "block.create.lime_seat": "Lime Seat", "block.create.lime_valve_handle": "Lime Valve Handle", @@ -226,6 +235,7 @@ "block.create.limestone_pillar": "Limestone Pillar", "block.create.linear_chassis": "Linear Chassis", "block.create.lit_blaze_burner": "Lit Blaze Burner", + "block.create.magenta_nixie_tube": "Magenta Nixie Tube", "block.create.magenta_sail": "Magenta Sail", "block.create.magenta_seat": "Magenta Seat", "block.create.magenta_valve_handle": "Magenta Valve Handle", @@ -310,6 +320,7 @@ "block.create.paved_weathered_limestone_stairs": "Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "Paved Weathered Limestone Wall", "block.create.peculiar_bell": "Peculiar Bell", + "block.create.pink_nixie_tube": "Pink Nixie Tube", "block.create.pink_sail": "Pink Sail", "block.create.pink_seat": "Pink Seat", "block.create.pink_valve_handle": "Pink Valve Handle", @@ -344,10 +355,12 @@ "block.create.powered_toggle_latch": "Powered Toggle Latch", "block.create.pulley_magnet": "Pulley Magnet", "block.create.pulse_repeater": "Pulse Repeater", + "block.create.purple_nixie_tube": "Purple Nixie Tube", "block.create.purple_sail": "Purple Sail", "block.create.purple_seat": "Purple Seat", "block.create.purple_valve_handle": "Purple Valve Handle", "block.create.radial_chassis": "Radial Chassis", + "block.create.red_nixie_tube": "Red Nixie Tube", "block.create.red_sail": "Red Sail", "block.create.red_seat": "Red Seat", "block.create.red_valve_handle": "Red Valve Handle", @@ -404,17 +417,22 @@ "block.create.weathered_limestone_cobblestone_wall": "Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Weathered Limestone Pillar", "block.create.weighted_ejector": "Weighted Ejector", + "block.create.white_nixie_tube": "White Nixie Tube", "block.create.white_sail": "White Sail", "block.create.white_seat": "White Seat", "block.create.white_valve_handle": "White Valve Handle", "block.create.windmill_bearing": "Windmill Bearing", "block.create.wooden_bracket": "Wooden Bracket", + "block.create.yellow_nixie_tube": "Yellow Nixie Tube", "block.create.yellow_sail": "Yellow Sail", "block.create.yellow_seat": "Yellow Seat", "block.create.yellow_valve_handle": "Yellow Valve Handle", "block.create.zinc_block": "Block of Zinc", "block.create.zinc_ore": "Zinc Ore", + "enchantment.create.capacity": "Capacity", + "enchantment.create.potato_recovery": "Potato Recovery", + "entity.create.contraption": "Contraption", "entity.create.crafting_blueprint": "Crafting Blueprint", "entity.create.gantry_contraption": "Gantry Contraption", @@ -443,13 +461,13 @@ "item.create.chocolate_glazed_berries": "Chocolate Glazed Berries", "item.create.chromatic_compound": "Chromatic Compound", "item.create.cinder_flour": "Cinder Flour", - "item.create.clockwork_component": "Clockwork Component", "item.create.copper_backtank": "Copper Backtank", "item.create.copper_ingot": "Copper Ingot", "item.create.copper_nugget": "Copper Nugget", "item.create.copper_sheet": "Copper Sheet", "item.create.crafter_slot_cover": "Crafter Slot Cover", "item.create.crafting_blueprint": "Crafting Blueprint", + "item.create.creative_blaze_cake": "Creative Blaze Cake", "item.create.crushed_aluminum_ore": "Crushed Aluminum Ore", "item.create.crushed_brass": "Crushed Brass", "item.create.crushed_copper_ore": "Crushed Copper Ore", @@ -478,7 +496,9 @@ "item.create.handheld_worldshaper": "Creative Worldshaper", "item.create.honey_bucket": "Honey Bucket", "item.create.honeyed_apple": "Honeyed Apple", - "item.create.incomplete_clockwork_component": "Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "Incomplete Cogwheel", + "item.create.incomplete_large_cogwheel": "Incomplete Large Cogwheel", + "item.create.incomplete_precision_mechanism": "Incomplete Precision Mechanism", "item.create.iron_sheet": "Iron Sheet", "item.create.linked_controller": "Linked Controller", "item.create.minecart_contraption": "Minecart Contraption", @@ -486,6 +506,7 @@ "item.create.polished_rose_quartz": "Polished Rose Quartz", "item.create.potato_cannon": "Potato Cannon", "item.create.powdered_obsidian": "Powdered Obsidian", + "item.create.precision_mechanism": "Precision Mechanism", "item.create.propeller": "Propeller", "item.create.red_sand_paper": "Red Sand Paper", "item.create.refined_radiance": "Refined Radiance", @@ -630,8 +651,8 @@ "advancement.create.flywheel.desc": "Successfully connect an engine to the Flywheel.", "advancement.create.overstress_flywheel": "High levels of Stress", "advancement.create.overstress_flywheel.desc": "Overstress a Furnace Engine.", - "advancement.create.clockwork_component": "Complex Curiosities", - "advancement.create.clockwork_component.desc": "Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "Complex Curiosities", + "advancement.create.precision_mechanism.desc": "Assemble a Precision Mechanism.", "advancement.create.mechanical_arm": "Busy Hands!", "advancement.create.mechanical_arm.desc": "Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch as it does all the work for you.", "advancement.create.musical_arm": "Play Me My Theme Tune!", @@ -672,13 +693,19 @@ "itemGroup.create.palettes": "Create Palettes", "death.attack.create.crush": "%1$s was processed by Crushing Wheels", - "death.attack.create.fan_fire": "%1$s was burned to death by hot air", - "death.attack.create.fan_lava": "%1$s was burned to death by lava fan", + "death.attack.create.crush.player": "%1$s was thrown into Crushing Wheels by %2$s", + "death.attack.create.fan_fire": "%1$s got smoked by an Encased Fan", + "death.attack.create.fan_fire.player": "%1$s was thrown into a smoker by %2$s", + "death.attack.create.fan_lava": "%1$s was incinerated by an Encased Fan", + "death.attack.create.fan_lava.player": "%1$s was thrown into a smelter by %2$s", "death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill", + "death.attack.create.mechanical_drill.player": "%1$s was thrown in front of a Drill by %2$s", "death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw", + "death.attack.create.mechanical_saw.player": "%1$s was thrown into a Saw by %2$s", "death.attack.create.potato_cannon": "%1$s was shot by %2$s's Potato Cannon", "death.attack.create.potato_cannon.item": "%1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s was blown up by tampered cuckoo clock", + "death.attack.create.cuckoo_clock_explosion.player": "%1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "a rogue Deployer", "create.block.cart_assembler.invalid": "Place your Cart Assembler on a rail block", @@ -724,7 +751,7 @@ "create.recipe.assembly.deploying_item": "Deploy %1$s", "create.recipe.assembly.cutting": "Cut with Saw", "create.recipe.assembly.repeat": "Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "Random junk", + "create.recipe.assembly.junk": "Random salvage", "create.recipe.processing.chance": "%1$s%% Chance", "create.recipe.heat_requirement.none": "No Heating Required", "create.recipe.heat_requirement.heated": "Heated", @@ -1038,6 +1065,11 @@ "create.item_attributes.in_item_group.inverted": "is not in group '%1$s'", "create.item_attributes.added_by": "was added by %1$s", "create.item_attributes.added_by.inverted": "was not added by %1$s", + "create.item_attributes.shulker_level": "is shulker %1$s", + "create.item_attributes.shulker_level.inverted": "is shulker not %1$s", + "create.item_attributes.shulker_level.full": "full", + "create.item_attributes.shulker_level.empty": "empty", + "create.item_attributes.shulker_level.partial": "partially filled", "create.item_attributes.has_enchant": "is enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "is not enchanted with %1$s", "create.item_attributes.color": "is dyed %1$s", @@ -1133,6 +1165,9 @@ "create.tooltip.chute.fans_pull_up": "Fans pull from Above", "create.tooltip.chute.fans_pull_down": "Fans pull from Below", "create.tooltip.chute.contains": "Contains: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "Currently distributing:", + "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "Right-Click to retrieve", "create.linked_controller.bind_mode": "Bind mode active", "create.linked_controller.press_keybind": "Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", @@ -1148,6 +1183,10 @@ "create.crafting_blueprint.secondary_display_slot": "Secondary Display Slot", "create.crafting_blueprint.optional": "Optional", + "create.potato_cannon.ammo.attack_damage": "%1$s Attack Damage", + "create.potato_cannon.ammo.reload_ticks": "%1$s Reload Ticks", + "create.potato_cannon.ammo.knockback": "%1$s Knockback", + "create.hint.hose_pulley.title": "Bottomless Supply", "create.hint.hose_pulley": "The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "No Targets", @@ -1182,15 +1221,17 @@ "create.subtitle.contraption_disassemble": "Contraption stops", "create.subtitle.peculiar_bell_use": "Peculiar Bell tolls", - "create.subtitle.mixing": "Mixing Noises", + "create.subtitle.mixing": "Mixing noises", "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", "create.subtitle.fwoomp": "Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "Worldshaper zaps", + "create.subtitle.crushing_1": "Crushing noises", "create.subtitle.depot_slide": "Item slides", "create.subtitle.saw_activate_stone": "Mechanical Saw activates", "create.subtitle.blaze_munch": "Blaze Burner munches", - "create.subtitle.funnel_flap": "Funnel Flaps", + "create.subtitle.funnel_flap": "Funnel flaps", "create.subtitle.schematicannon_finish": "Schematicannon dings", + "create.subtitle.haunted_bell_use": "Haunted Bell tolls", "create.subtitle.scroll_value": "Scroll-input clicks", "create.subtitle.crafter_craft": "Crafter crafts", "create.subtitle.controller_put": "Controller thumps", @@ -1201,13 +1242,12 @@ "create.subtitle.wrench_rotate": "Wrench used", "create.subtitle.potato_hit": "Vegetable impacts", "create.subtitle.saw_activate_wood": "Mechanical Saw activates", + "create.subtitle.haunted_bell_convert": "Haunted Bell awakens", "create.subtitle.deployer_polish": "Deployer applies polish", "create.subtitle.deny": "Declining boop", "create.subtitle.controller_click": "Controller clicks", "create.subtitle.schematicannon_launch_block": "Schematicannon fires", "create.subtitle.copper_armor_equip": "Diving equipment clinks", - "create.subtitle.cursed_bell_use": "Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "Cursed Bell awakens", "create.subtitle.controller_take": "Lectern empties", "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", "create.subtitle.contraption_assemble": "Contraption moves", @@ -1372,6 +1412,11 @@ "block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot", "block.create.creative_crate.tooltip.behaviour1": "Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + "item.create.creative_blaze_cake.tooltip": "CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "_Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "CONTROLLER RAIL", "block.create.controller_rail.tooltip.summary": "A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", "block.create.controller_rail.tooltip.condition1": "When Powered by Redstone", @@ -1436,12 +1481,12 @@ "item.create.minecart_coupling.tooltip.behaviour1": "_Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.", "block.create.peculiar_bell.tooltip": "PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", - "block.create.cursed_bell.tooltip": "CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "A _Cursed Bell_ haunted by lost souls of the Nether.", + "block.create.haunted_bell.tooltip.condition1": "When Held or Rang", + "block.create.haunted_bell.tooltip.behaviour1": "Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1463,41 +1508,41 @@ "create.ponder.categories": "Available Categories in Create", "create.ponder.index_description": "Click one of the icons to learn about its associated Items and Blocks", "create.ponder.index_title": "Ponder Index", - "create.ponder.shared.movement_anchors": "With the help of Chassis or Super Glue, larger structures can be moved.", - "create.ponder.shared.rpm32": "32 RPM", - "create.ponder.shared.sneak_and": "Sneak +", - "create.ponder.shared.storage_on_contraption": "Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "This behaviour can be modified using a Wrench", + "create.ponder.shared.storage_on_contraption": "Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.rpm8": "8 RPM", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "Source: 16 RPM", - "create.ponder.shared.rpm16": "16 RPM", - "create.ponder.tag.kinetic_sources": "Kinetic Sources", - "create.ponder.tag.kinetic_sources.description": "Components which generate Rotational Force", - "create.ponder.tag.contraption_actor": "Contraption Actors", - "create.ponder.tag.contraption_actor.description": "Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "Targets for Mechanical Arms", - "create.ponder.tag.arm_targets.description": "Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.logistics": "Item Transportation", - "create.ponder.tag.logistics.description": "Components which help moving items around", - "create.ponder.tag.movement_anchor": "Movement Anchors", - "create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "Creative Mode", - "create.ponder.tag.creative.description": "Components not usually available for Survival Mode", - "create.ponder.tag.kinetic_relays": "Kinetic Blocks", - "create.ponder.tag.kinetic_relays.description": "Components which help relaying Rotational Force elsewhere", - "create.ponder.tag.windmill_sails": "Sails for Windmill Bearings", - "create.ponder.tag.windmill_sails.description": "Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", - "create.ponder.tag.contraption_assembly": "Block Attachment Utility", - "create.ponder.tag.contraption_assembly.description": "Tools and Components used to assemble structures moved as an animated Contraption", - "create.ponder.tag.decoration": "Aesthetics", - "create.ponder.tag.decoration.description": "Components used mostly for decorative purposes", - "create.ponder.tag.kinetic_appliances": "Kinetic Appliances", - "create.ponder.tag.kinetic_appliances.description": "Components which make use of Rotational Force", + "create.ponder.shared.movement_anchors": "With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.tag.redstone": "Logic Components", "create.ponder.tag.redstone.description": "Components which help with redstone engineering", + "create.ponder.tag.contraption_assembly": "Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "Tools and Components used to assemble structures moved as an animated Contraption", "create.ponder.tag.fluids": "Fluid Manipulators", "create.ponder.tag.fluids.description": "Components which help relaying and making use of Fluids", + "create.ponder.tag.decoration": "Aesthetics", + "create.ponder.tag.decoration.description": "Components used mostly for decorative purposes", + "create.ponder.tag.windmill_sails": "Sails for Windmill Bearings", + "create.ponder.tag.windmill_sails.description": "Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", + "create.ponder.tag.arm_targets": "Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetic_appliances": "Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "Components which make use of Rotational Force", + "create.ponder.tag.kinetic_sources": "Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "Components which generate Rotational Force", + "create.ponder.tag.movement_anchor": "Movement Anchors", + "create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_relays": "Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.contraption_actor": "Contraption Actors", + "create.ponder.tag.contraption_actor.description": "Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.creative": "Creative Mode", + "create.ponder.tag.creative.description": "Components not usually available for Survival Mode", + "create.ponder.tag.logistics": "Item Transportation", + "create.ponder.tag.logistics.description": "Components which help moving items around", "create.ponder.adjustable_pulse_repeater.header": "Controlling signals using Adjustable Pulse Repeaters", "create.ponder.adjustable_pulse_repeater.text_1": "Adjustable Pulse Repeaters emit a short pulse at a delay", @@ -1728,7 +1773,8 @@ "create.ponder.empty_blaze_burner.text_2": "Alternatively, Blazes can be collected from their Spawners directly", "create.ponder.empty_blaze_burner.text_3": "You now have an ideal heat source for various machines", "create.ponder.empty_blaze_burner.text_4": "For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "However, these are not suitable for industrial heating", + "create.ponder.empty_blaze_burner.text_5": "The flame can be transformed using a soul-infused item", + "create.ponder.empty_blaze_burner.text_6": "However, without a blaze they are not suitable for industrial heating", "create.ponder.encased_fluid_pipe.header": "Encasing Fluid Pipes", "create.ponder.encased_fluid_pipe.text_1": "Copper Casing can be used to decorate Fluid Pipes", @@ -2045,6 +2091,7 @@ "create.ponder.nixie_tube.header": "Using Nixie Tubes", "create.ponder.nixie_tube.text_1": "When powered by Redstone, Nixie Tubes will display the redstone signals' strength", "create.ponder.nixie_tube.text_2": "Using name tags edited with an anvil, custom text can be displayed", + "create.ponder.nixie_tube.text_3": "Right-Click with Dye to change their display colour", "create.ponder.piston_pole.header": "Piston Extension Poles", "create.ponder.piston_pole.text_1": "Without attached Poles, a Mechanical Piston cannot move", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index d041cb02d..3647fa4a8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1090", + "_": "Missing Localizations: 1134", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,10 +28,12 @@ "block.create.belt": "Mechanischer Riemen", "block.create.birch_window": "Birkenholzfenster", "block.create.birch_window_pane": "Birkenholzfensterscheibe", + "block.create.black_nixie_tube": "UNLOCALIZED: Black Nixie Tube", "block.create.black_sail": "Schwarzes Segel", "block.create.black_seat": "Schwarzer Sitz", "block.create.black_valve_handle": "Schwarzer Ventilgriff", "block.create.blaze_burner": "Lohenbrenner", + "block.create.blue_nixie_tube": "UNLOCALIZED: Blue Nixie Tube", "block.create.blue_sail": "Blaues Segel", "block.create.blue_seat": "Blauer Sitz", "block.create.blue_valve_handle": "Blauer Ventilgriff", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "Messingummantelte Welle", "block.create.brass_funnel": "Messingtrichter", "block.create.brass_tunnel": "Messingtunnel", + "block.create.brown_nixie_tube": "UNLOCALIZED: Brown Nixie Tube", "block.create.brown_sail": "Braunes Segel", "block.create.brown_seat": "Brauner Sitz", "block.create.brown_valve_handle": "Brauner Ventilgriff", @@ -73,7 +76,7 @@ "block.create.crushing_wheel": "Mahlwerkrad", "block.create.crushing_wheel_controller": "Mahlwerkrad Steurung", "block.create.cuckoo_clock": "Kuckucksuhr", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "UNLOCALIZED: Cyan Nixie Tube", "block.create.cyan_sail": "Türkises Segel", "block.create.cyan_seat": "Türkiser Sitz", "block.create.cyan_valve_handle": "Türkiser Ventilgriff", @@ -180,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "Granitbruchtreppe", "block.create.granite_cobblestone_wall": "Granitbruchsteinmauer", "block.create.granite_pillar": "Granitsäule", + "block.create.gray_nixie_tube": "UNLOCALIZED: Gray Nixie Tube", "block.create.gray_sail": "Graues Segel", "block.create.gray_seat": "Grauer Sitz", "block.create.gray_valve_handle": "Grauer Ventilgriff", + "block.create.green_nixie_tube": "UNLOCALIZED: Green Nixie Tube", "block.create.green_sail": "Grünes Segel", "block.create.green_seat": "Grüner Sitz", "block.create.green_valve_handle": "Grüner Ventilgriff", "block.create.hand_crank": "Handkurbel", + "block.create.haunted_bell": "UNLOCALIZED: Haunted Bell", "block.create.honey": "Honig", "block.create.horizontal_framed_glass": "Horizontal Gerahmtes Glas", "block.create.horizontal_framed_glass_pane": "Horizontal Gerahmte Glasscheibe", @@ -205,12 +211,15 @@ "block.create.layered_scoria": "Geschichtete Schlacke", "block.create.layered_weathered_limestone": "Geschichteter Verwitterter Kalkstein", "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.light_blue_nixie_tube": "UNLOCALIZED: Light Blue Nixie Tube", "block.create.light_blue_sail": "Hellblaues Segel", "block.create.light_blue_seat": "Hellblauer Sitz", "block.create.light_blue_valve_handle": "Hellblauer Ventilgriff", + "block.create.light_gray_nixie_tube": "UNLOCALIZED: Light Gray Nixie Tube", "block.create.light_gray_sail": "Hellgraues Segel", "block.create.light_gray_seat": "Hellgrauer Sitz", "block.create.light_gray_valve_handle": "Hellgrauer Ventilgriff", + "block.create.lime_nixie_tube": "UNLOCALIZED: Lime Nixie Tube", "block.create.lime_sail": "Hellgrünes Segel", "block.create.lime_seat": "Hellgrüner Sitz", "block.create.lime_valve_handle": "Hellgrüner Ventilgriff", @@ -227,6 +236,7 @@ "block.create.limestone_pillar": "Kalksteinsäule", "block.create.linear_chassis": "Schubgerüst", "block.create.lit_blaze_burner": "Aktiver Lohenbrenner", + "block.create.magenta_nixie_tube": "UNLOCALIZED: Magenta Nixie Tube", "block.create.magenta_sail": "Magenta Segel", "block.create.magenta_seat": "Magenta Sitz", "block.create.magenta_valve_handle": "Magenta Ventilgriff", @@ -311,6 +321,7 @@ "block.create.paved_weathered_limestone_stairs": "Gepflasterte Verwitterte Kalksteintreppe", "block.create.paved_weathered_limestone_wall": "Gepflasterte Verwitterte Kalksteinmauer", "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.pink_nixie_tube": "UNLOCALIZED: Pink Nixie Tube", "block.create.pink_sail": "Rosa Segel", "block.create.pink_seat": "Rosa Sitz", "block.create.pink_valve_handle": "Rosa Ventilgriff", @@ -345,10 +356,12 @@ "block.create.powered_toggle_latch": "T-Flipflop", "block.create.pulley_magnet": "Rollenmagnet", "block.create.pulse_repeater": "Pulsierender Verstärker", + "block.create.purple_nixie_tube": "UNLOCALIZED: Purple Nixie Tube", "block.create.purple_sail": "Lila Segel", "block.create.purple_seat": "Lila Sitz", "block.create.purple_valve_handle": "Lila Ventilgriff", "block.create.radial_chassis": "Drehgerüst", + "block.create.red_nixie_tube": "UNLOCALIZED: Red Nixie Tube", "block.create.red_sail": "Rote Segel", "block.create.red_seat": "Roter Sitz", "block.create.red_valve_handle": "Roter Ventilgriff", @@ -405,17 +418,22 @@ "block.create.weathered_limestone_cobblestone_wall": "Verwitterte Limestonepflastermauer", "block.create.weathered_limestone_pillar": "Verwitterte Kalksteinsäule", "block.create.weighted_ejector": "Gewichteter Werfer", + "block.create.white_nixie_tube": "UNLOCALIZED: White Nixie Tube", "block.create.white_sail": "Weiße Segel", "block.create.white_seat": "Weißer Sitz", "block.create.white_valve_handle": "Weißer Ventilgriff", "block.create.windmill_bearing": "Windmühlenlager", "block.create.wooden_bracket": "Holzhalterung", + "block.create.yellow_nixie_tube": "UNLOCALIZED: Yellow Nixie Tube", "block.create.yellow_sail": "Gelbes Segel", "block.create.yellow_seat": "Gelber Sitz", "block.create.yellow_valve_handle": "Gelber Ventilgriff", "block.create.zinc_block": "Zinkblock", "block.create.zinc_ore": "Zinkerz", + "enchantment.create.capacity": "UNLOCALIZED: Capacity", + "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.contraption": "Vorrichtung", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "Portalkran Vorrichtung", @@ -444,13 +462,13 @@ "item.create.chocolate_glazed_berries": "Schokoladenglasierte Beeren", "item.create.chromatic_compound": "Chromatische Verbindung", "item.create.cinder_flour": "Aschenmehl", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", "item.create.copper_ingot": "Kupferbarren", "item.create.copper_nugget": "Kupferklumpen", "item.create.copper_sheet": "Kupferblech", "item.create.crafter_slot_cover": "Handwerkseinheit Slot Abdeckung", "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "Zerkleinertes Aluminiumerz", "item.create.crushed_brass": "Zerkleinertes Messing", "item.create.crushed_copper_ore": "Zerkleinertes Kupfererz", @@ -479,7 +497,9 @@ "item.create.handheld_worldshaper": "Geländeformer", "item.create.honey_bucket": "Honigeimer", "item.create.honeyed_apple": "Honigapfel", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "UNLOCALIZED: Incomplete Cogwheel", + "item.create.incomplete_large_cogwheel": "UNLOCALIZED: Incomplete Large Cogwheel", + "item.create.incomplete_precision_mechanism": "UNLOCALIZED: Incomplete Precision Mechanism", "item.create.iron_sheet": "Eisenblech", "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Loren Vorrichtung", @@ -487,6 +507,7 @@ "item.create.polished_rose_quartz": "Polierter Rosenquarz", "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Pulverisierter Obsidian", + "item.create.precision_mechanism": "UNLOCALIZED: Precision Mechanism", "item.create.propeller": "Propeller", "item.create.red_sand_paper": "Rotes Schmirgelpapier", "item.create.refined_radiance": "Raffinierter Glanz", @@ -631,8 +652,8 @@ "advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect an engine to the Flywheel.", "advancement.create.overstress_flywheel": "UNLOCALIZED: High levels of Stress", "advancement.create.overstress_flywheel.desc": "UNLOCALIZED: Overstress a Furnace Engine.", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities", + "advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.", "advancement.create.mechanical_arm": "UNLOCALIZED: Busy Hands!", "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch as it does all the work for you.", "advancement.create.musical_arm": "UNLOCALIZED: Play Me My Theme Tune!", @@ -673,13 +694,19 @@ "itemGroup.create.palettes": "Create Paletten", "death.attack.create.crush": "%1$s stolperte in ein Mahlwerk", + "death.attack.create.crush.player": "UNLOCALIZED: %1$s was thrown into Crushing Wheels by %2$s", "death.attack.create.fan_fire": "%1$s hat heiße Luft eingeatmet", + "death.attack.create.fan_fire.player": "UNLOCALIZED: %1$s was thrown into a smoker by %2$s", "death.attack.create.fan_lava": "%1$s wurde von Lava verweht", + "death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s", "death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert", + "death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s", "death.attack.create.mechanical_saw": "%1$s wurde zersägt", + "death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s", "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt", + "death.attack.create.cuckoo_clock_explosion.player": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "einem Finger", "create.block.cart_assembler.invalid": "Platziere deinen Lorenmonteur auf einer Schiene.", @@ -725,7 +752,7 @@ "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.assembly.junk": "UNLOCALIZED: Random salvage", "create.recipe.processing.chance": "Chance: %1$s%%", "create.recipe.heat_requirement.none": "Keine Hitze benötigt", "create.recipe.heat_requirement.heated": "Wenig Hitze benötigt", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s", + "create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s", + "create.item_attributes.shulker_level.full": "UNLOCALIZED: full", + "create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty", + "create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled", "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", @@ -1134,6 +1166,9 @@ "create.tooltip.chute.fans_pull_up": "Propeller ziehen von oberhalb", "create.tooltip.chute.fans_pull_down": "Propeller ziehen von unterhalb", "create.tooltip.chute.contains": "Enthält: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "UNLOCALIZED: Currently distributing:", + "create.tooltip.brass_tunnel.contains_entry": "UNLOCALIZED: > %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "UNLOCALIZED: Right-Click to retrieve", "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", @@ -1149,6 +1184,10 @@ "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.potato_cannon.ammo.attack_damage": "UNLOCALIZED: %1$s Attack Damage", + "create.potato_cannon.ammo.reload_ticks": "UNLOCALIZED: %1$s Reload Ticks", + "create.potato_cannon.ammo.knockback": "UNLOCALIZED: %1$s Knockback", + "create.hint.hose_pulley.title": "Endlose Versorgung", "create.hint.hose_pulley": "Das angewählte Gewässer wird als unendlich betrachtet.", "create.hint.mechanical_arm_no_targets.title": "Keine Ziele", @@ -1183,15 +1222,17 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", + "create.subtitle.mixing": "UNLOCALIZED: Mixing noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.crushing_1": "UNLOCALIZED: Crushing noises", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "Lohe kaut glücklich", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel flaps", "create.subtitle.schematicannon_finish": "Bauplankanone endet", + "create.subtitle.haunted_bell_use": "UNLOCALIZED: Haunted Bell tolls", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", @@ -1202,13 +1243,12 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", @@ -1373,6 +1413,11 @@ "block.create.creative_crate.tooltip.condition1": "Wenn Gegenstand in Filter Slot", "block.create.creative_crate.tooltip.behaviour1": "Alles _extrahierende_ von diesem Container wird einen _endlosen Vorrat_ des angegebenen Gegenstands zur Verfügung stellen. In diese Kiste _eingefügte_ Gegenstände werden _entsorgt_.", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "UNLOCALIZED: CONTROLLER RAIL", "block.create.controller_rail.tooltip.summary": "UNLOCALIZED: A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", "block.create.controller_rail.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", @@ -1437,12 +1482,12 @@ "item.create.minecart_coupling.tooltip.behaviour1": "UNLOCALIZED: _Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.", "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "UNLOCALIZED: HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "UNLOCALIZED: A _Cursed Bell_ haunted by lost souls of the Nether.", + "block.create.haunted_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", + "block.create.haunted_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1464,41 +1509,41 @@ "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", - "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", - "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", + "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", - "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", - "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", - "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", - "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", - "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", - "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", - "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", - "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", - "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", - "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", - "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", - "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", - "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", - "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", - "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", - "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", - "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", - "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", + "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", + "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", @@ -1729,7 +1774,8 @@ "create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly", "create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines", "create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating", + "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: The flame can be transformed using a soul-infused item", + "create.ponder.empty_blaze_burner.text_6": "UNLOCALIZED: However, without a blaze they are not suitable for industrial heating", "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", @@ -2046,6 +2092,7 @@ "create.ponder.nixie_tube.header": "UNLOCALIZED: Using Nixie Tubes", "create.ponder.nixie_tube.text_1": "UNLOCALIZED: When powered by Redstone, Nixie Tubes will display the redstone signals' strength", "create.ponder.nixie_tube.text_2": "UNLOCALIZED: Using name tags edited with an anvil, custom text can be displayed", + "create.ponder.nixie_tube.text_3": "UNLOCALIZED: Right-Click with Dye to change their display colour", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 20b84538e..f307397c2 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 853", + "_": "Missing Localizations: 57", "_": "->------------------------] Game Elements [------------------------<-", @@ -14,7 +14,7 @@ "block.create.andesite_bricks": "Ladrillos de andesita", "block.create.andesite_bricks_slab": "Losa de ladrillos de andesita", "block.create.andesite_bricks_stairs": "Escaleras de ladrillos de andesita", - "block.create.andesite_bricks_wall": "Pared de ladrillos de andesita", + "block.create.andesite_bricks_wall": "Muro de ladrillos de andesita", "block.create.andesite_casing": "Revestidor de andesita", "block.create.andesite_cobblestone": "Adoquín de andesita", "block.create.andesite_cobblestone_slab": "Losa de adoquín de andesita", @@ -28,10 +28,12 @@ "block.create.belt": "Cinta", "block.create.birch_window": "Ventana de abedul", "block.create.birch_window_pane": "Panel de ventana de abedul", + "block.create.black_nixie_tube": "UNLOCALIZED: Black Nixie Tube", "block.create.black_sail": "Vela negra", "block.create.black_seat": "Asiento negro", "block.create.black_valve_handle": "Asa de válvula negra", "block.create.blaze_burner": "Quemador de Blaze", + "block.create.blue_nixie_tube": "UNLOCALIZED: Blue Nixie Tube", "block.create.blue_sail": "Vela azul", "block.create.blue_seat": "Asiento azul", "block.create.blue_valve_handle": "Asa de válvula azul", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "Eje revestido de latón", "block.create.brass_funnel": "Embudo de latón", "block.create.brass_tunnel": "Túnel de latón", + "block.create.brown_nixie_tube": "UNLOCALIZED: Brown Nixie Tube", "block.create.brown_sail": "Vela marrón", "block.create.brown_seat": "Asiento marrón", "block.create.brown_valve_handle": "Asa de válvula marrón", @@ -53,27 +56,27 @@ "block.create.chiseled_weathered_limestone": "Piedra caliza erosionada cincelada", "block.create.chocolate": "Chocolate", "block.create.chute": "Ducto", - "block.create.clockwork_bearing": "Rodamiento de reloj", + "block.create.clockwork_bearing": "Rodamiento tipo reloj", "block.create.clutch": "Embrague", - "block.create.cogwheel": "Rueda dentada", + "block.create.cogwheel": "Engranaje pequeño", "block.create.content_observer": "Observador de contenidos", "block.create.controller_rail": "Raíl de control", - "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "block.create.copper_backtank": "Depósito trasero de cobre", "block.create.copper_block": "Bloque de cobre", "block.create.copper_casing": "Revestidor de caliza", - "block.create.copper_ore": "Mineral de cobre", + "block.create.copper_ore": "Mena de cobre", "block.create.copper_shingles": "Bloque de tejas de cobre", "block.create.copper_tiles": "Bloque de baldosas de cobre", "block.create.copper_valve_handle": "Asa de válvula de cobre", "block.create.creative_crate": "Caja creativa", "block.create.creative_fluid_tank": "Tanque de fluidos creativo", "block.create.creative_motor": "Motor creativo", - "block.create.crimson_window": "UNLOCALIZED: Crimson Window", - "block.create.crimson_window_pane": "UNLOCALIZED: Crimson Window Pane", + "block.create.crimson_window": "Ventana carmesí", + "block.create.crimson_window_pane": "Panel de ventana carmesí", "block.create.crushing_wheel": "Rueda trituradora", "block.create.crushing_wheel_controller": "Controlador de Rueda trituradora", - "block.create.cuckoo_clock": "Reloj Cucú", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cuckoo_clock": "Reloj de cuco", + "block.create.cyan_nixie_tube": "UNLOCALIZED: Cyan Nixie Tube", "block.create.cyan_sail": "Vela cian", "block.create.cyan_seat": "Asiento cian", "block.create.cyan_valve_handle": "Asa de válvula cian", @@ -83,32 +86,32 @@ "block.create.dark_scoria_bricks": "Ladrillos de escoria oscura", "block.create.dark_scoria_bricks_slab": "Losa de ladrillos de escoria oscura", "block.create.dark_scoria_bricks_stairs": "Escaleras de ladrillos de escoria oscura", - "block.create.dark_scoria_bricks_wall": "Pared de ladrillos de escoria oscura", + "block.create.dark_scoria_bricks_wall": "Muro de ladrillos de escoria oscura", "block.create.dark_scoria_cobblestone": "Adoquines de escoria oscura", "block.create.dark_scoria_cobblestone_slab": "Losa de adoquines de escoria oscura", "block.create.dark_scoria_cobblestone_stairs": "Escaleras de adoquines de escoria oscura", - "block.create.dark_scoria_cobblestone_wall": "Pared de adoquines de escoria oscura", + "block.create.dark_scoria_cobblestone_wall": "Muro de adoquines de escoria oscura", "block.create.dark_scoria_pillar": "Pilar de escoria oscura", "block.create.deployer": "Desplegador", "block.create.depot": "Depósito", "block.create.diorite_bricks": "Ladrillos de diorita", "block.create.diorite_bricks_slab": "Losa de ladrillos de diorita", "block.create.diorite_bricks_stairs": "Escaleras de ladrillos de diorita", - "block.create.diorite_bricks_wall": "Pared de ladrillos de diorita", + "block.create.diorite_bricks_wall": "Muro de ladrillos de diorita", "block.create.diorite_cobblestone": "Adoquín de diorita", "block.create.diorite_cobblestone_slab": "Losa de adoquínes de diorita", "block.create.diorite_cobblestone_stairs": "Escaleras de adoquines de diorita", - "block.create.diorite_cobblestone_wall": "Pared de adoquines de diorita", + "block.create.diorite_cobblestone_wall": "Muro de adoquines de diorita", "block.create.diorite_pillar": "Pilar de diorita", "block.create.dolomite": "Dolomita", "block.create.dolomite_bricks": "Ladrillos de dolomita", "block.create.dolomite_bricks_slab": "Losa de ladrillos de dolomita", "block.create.dolomite_bricks_stairs": "Escaleras de ladrillos de dolomita", - "block.create.dolomite_bricks_wall": "Pared de ladrillos de dolomita", + "block.create.dolomite_bricks_wall": "Muro de ladrillos de dolomita", "block.create.dolomite_cobblestone": "Adoquín de dolomita", "block.create.dolomite_cobblestone_slab": "Losa de adoquín de dolomita", "block.create.dolomite_cobblestone_stairs": "Escaleras de adoquines de dolomita", - "block.create.dolomite_cobblestone_wall": "Pared de adoquines de dolomita", + "block.create.dolomite_cobblestone_wall": "Muro de adoquines de dolomita", "block.create.dolomite_pillar": "Pilar de dolomita", "block.create.encased_chain_drive": "Cadena de transmisión revestida", "block.create.encased_fan": "Ventilador revestido", @@ -116,39 +119,39 @@ "block.create.fancy_andesite_bricks": "Ladrillos de andesita elegantes", "block.create.fancy_andesite_bricks_slab": "Ladrillos de andesita elegantes", "block.create.fancy_andesite_bricks_stairs": "Escaleras de ladrillos de andesita elegantes", - "block.create.fancy_andesite_bricks_wall": "Pared de ladrillos de andesita elegantes", + "block.create.fancy_andesite_bricks_wall": "Muro de ladrillos de andesita elegantes", "block.create.fancy_dark_scoria_bricks": "Ladrillos de escoria oscura elegantes", "block.create.fancy_dark_scoria_bricks_slab": "Losa de ladrillos de escoria oscura elegantes", "block.create.fancy_dark_scoria_bricks_stairs": "Escalera de ladrillos de escoria oscura elegantes", - "block.create.fancy_dark_scoria_bricks_wall": "Pared de ladrillos de escoria oscura elegantes", + "block.create.fancy_dark_scoria_bricks_wall": "Muro de ladrillos de escoria oscura elegantes", "block.create.fancy_diorite_bricks": "Ladrillos de diorita elegantes", "block.create.fancy_diorite_bricks_slab": "Losa de ladrillos de diorita elegantes", "block.create.fancy_diorite_bricks_stairs": "Escaleras de ladrillos de diorita elegantes", - "block.create.fancy_diorite_bricks_wall": "Pared de ladrillos de diorita elegantes", + "block.create.fancy_diorite_bricks_wall": "Muro de ladrillos de diorita elegantes", "block.create.fancy_dolomite_bricks": "Ladrillos de dolomita elegantes", "block.create.fancy_dolomite_bricks_slab": "Losa de ladrillos de dolomita elegantes", "block.create.fancy_dolomite_bricks_stairs": "Escaleras de ladrillos de dolomita elegantes", - "block.create.fancy_dolomite_bricks_wall": "Pared de ladrillos de dolomita elegantes", + "block.create.fancy_dolomite_bricks_wall": "Muro de ladrillos de dolomita elegantes", "block.create.fancy_gabbro_bricks": "Ladrillos de gabro elegantes", "block.create.fancy_gabbro_bricks_slab": "Losa de ladrillos de gabro elegantes", "block.create.fancy_gabbro_bricks_stairs": "Escaleras de ladrillos de gabro elegantes", - "block.create.fancy_gabbro_bricks_wall": "Pared de ladrillos de gabro elegantes", + "block.create.fancy_gabbro_bricks_wall": "Muro de ladrillos de gabro elegantes", "block.create.fancy_granite_bricks": "Ladrillos de granito elegantes", "block.create.fancy_granite_bricks_slab": "Losa de ladrillos de granito elegantes", "block.create.fancy_granite_bricks_stairs": "Escaleras de ladrillos de granito elegantes", - "block.create.fancy_granite_bricks_wall": "Pared de ladrillos de granito elegantes", + "block.create.fancy_granite_bricks_wall": "Muro de ladrillos de granito elegantes", "block.create.fancy_limestone_bricks": "Ladrillos de piedra caliza elegantes", "block.create.fancy_limestone_bricks_slab": "Losa de ladrillos de piedra caliza elegantes", "block.create.fancy_limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza elegantes", - "block.create.fancy_limestone_bricks_wall": "Pared de ladrillos de piedra caliza elegantes", + "block.create.fancy_limestone_bricks_wall": "Muro de ladrillos de piedra caliza elegantes", "block.create.fancy_scoria_bricks": "Ladrillos de escoria elegantes", "block.create.fancy_scoria_bricks_slab": "Losa de ladrillos de escoria elegantes", "block.create.fancy_scoria_bricks_stairs": "Escaleras de ladrillos de escoria elegantes", - "block.create.fancy_scoria_bricks_wall": "Pared de ladrillos de escoria elegantes", + "block.create.fancy_scoria_bricks_wall": "Muro de ladrillos de escoria elegantes", "block.create.fancy_weathered_limestone_bricks": "Ladrillos de piedra de caliza erosionada elegantes", "block.create.fancy_weathered_limestone_bricks_slab": "Losa de ladrillos de caliza erosionada elegantes", "block.create.fancy_weathered_limestone_bricks_stairs": "Escaleras de ladrillos de caliza erosionada elegantes", - "block.create.fancy_weathered_limestone_bricks_wall": "Pared de ladrillos de caliza erosionada elegantes", + "block.create.fancy_weathered_limestone_bricks_wall": "Muro de ladrillos de caliza erosionada elegantes", "block.create.fluid_pipe": "Tubería de fluidos de cobre", "block.create.fluid_tank": "Depósito de fluidos", "block.create.fluid_valve": "Válvula de fluidos", @@ -160,13 +163,13 @@ "block.create.gabbro_bricks": "Ladrillos de gabro", "block.create.gabbro_bricks_slab": "Losa de ladrillos de gabro", "block.create.gabbro_bricks_stairs": "Escaleras de ladrillos de gabro", - "block.create.gabbro_bricks_wall": "Pared de ladrillos de gabro", + "block.create.gabbro_bricks_wall": "Muro de ladrillos de gabro", "block.create.gabbro_cobblestone": "Adoquín de gabro", "block.create.gabbro_cobblestone_slab": "Losa de adoquínes de gabro", "block.create.gabbro_cobblestone_stairs": "Escaleras de adoquínes de gabro", - "block.create.gabbro_cobblestone_wall": "Pared de adoquínes de gabro", + "block.create.gabbro_cobblestone_wall": "Muro de adoquínes de gabro", "block.create.gabbro_pillar": "Pilar de gabro", - "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", + "block.create.gantry_carriage": "Carro de grúa", "block.create.gantry_shaft": "Eje de grúa", "block.create.gearbox": "Caja de transmisión", "block.create.gearshift": "Caja de cambios", @@ -174,27 +177,30 @@ "block.create.granite_bricks": "Ladrillos de granito", "block.create.granite_bricks_slab": "Losa de ladrillos de granito", "block.create.granite_bricks_stairs": "Escaleras de ladrillos de granito", - "block.create.granite_bricks_wall": "Pared de ladrillos de granito", + "block.create.granite_bricks_wall": "Muro de ladrillos de granito", "block.create.granite_cobblestone": "Adoquín de granito", "block.create.granite_cobblestone_slab": "Losa de adoquínes de granito", "block.create.granite_cobblestone_stairs": "Escaleras de adoquínes de granito", - "block.create.granite_cobblestone_wall": "Pared de adoquínes de granito", + "block.create.granite_cobblestone_wall": "Muro de adoquínes de granito", "block.create.granite_pillar": "Pilar de granito", + "block.create.gray_nixie_tube": "UNLOCALIZED: Gray Nixie Tube", "block.create.gray_sail": "Vela gris", "block.create.gray_seat": "Asiento gris", "block.create.gray_valve_handle": "Asa de válvula gris", + "block.create.green_nixie_tube": "UNLOCALIZED: Green Nixie Tube", "block.create.green_sail": "Vela verde", "block.create.green_seat": "Asiento verde", "block.create.green_valve_handle": "Asa de válvula verde", "block.create.hand_crank": "Manivela", + "block.create.haunted_bell": "UNLOCALIZED: Haunted Bell", "block.create.honey": "Miel", "block.create.horizontal_framed_glass": "Cristal con marco horizontal", "block.create.horizontal_framed_glass_pane": "Panel de cristal con marco horizontal", "block.create.hose_pulley": "Polea de manguera", - "block.create.item_drain": "Drenador de elementos", + "block.create.item_drain": "Drenador de objetos", "block.create.jungle_window": "Ventana de jungla", "block.create.jungle_window_pane": "Panel de ventana de jungla", - "block.create.large_cogwheel": "Rueda dentada grande", + "block.create.large_cogwheel": "Engranaje grande", "block.create.layered_andesite": "Andesita estratificada", "block.create.layered_dark_scoria": "Escoria oscura estratificada", "block.create.layered_diorite": "Diorita estratificada", @@ -204,13 +210,16 @@ "block.create.layered_limestone": "Piedra caliza estratificada", "block.create.layered_scoria": "Escoria estratificada", "block.create.layered_weathered_limestone": "Caliza erosionada estratificada", - "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.lectern_controller": "Lectern Controller", + "block.create.light_blue_nixie_tube": "UNLOCALIZED: Light Blue Nixie Tube", "block.create.light_blue_sail": "Vela azul claro", "block.create.light_blue_seat": "Asiento azul claro", "block.create.light_blue_valve_handle": "Asa de válvula azul claro", + "block.create.light_gray_nixie_tube": "UNLOCALIZED: Light Gray Nixie Tube", "block.create.light_gray_sail": "Vela gris claro", "block.create.light_gray_seat": "Asiento gris claro", "block.create.light_gray_valve_handle": "Asa de válvula gris claro", + "block.create.lime_nixie_tube": "UNLOCALIZED: Lime Nixie Tube", "block.create.lime_sail": "Vela lima", "block.create.lime_seat": "Asiento lima", "block.create.lime_valve_handle": "Asa de válvula lima", @@ -219,20 +228,21 @@ "block.create.limestone_bricks": "Ladrillos de piedra caliza", "block.create.limestone_bricks_slab": "Losa de ladrillos de piedra caliza", "block.create.limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza", - "block.create.limestone_bricks_wall": "Pared de ladrillos de piedra caliza", + "block.create.limestone_bricks_wall": "Muro de ladrillos de piedra caliza", "block.create.limestone_cobblestone": "Adoquínes de piedra caliza", "block.create.limestone_cobblestone_slab": "Losa de adoquines de piedra caliza", "block.create.limestone_cobblestone_stairs": "Escaleras de adoquines de piedra caliza", - "block.create.limestone_cobblestone_wall": "Pared de adoquines de piedra caliza", + "block.create.limestone_cobblestone_wall": "Muro de adoquines de piedra caliza", "block.create.limestone_pillar": "Pilar de piedra caliza", "block.create.linear_chassis": "Chasis lineal", "block.create.lit_blaze_burner": "Quemador de Blaze encendido", + "block.create.magenta_nixie_tube": "UNLOCALIZED: Magenta Nixie Tube", "block.create.magenta_sail": "Vela magenta", "block.create.magenta_seat": "Asiento magenta", "block.create.magenta_valve_handle": "Asa de válvula magenta", "block.create.mechanical_arm": "Brazo mecánico", "block.create.mechanical_bearing": "Rodamiento mecánico", - "block.create.mechanical_crafter": "Autoensamblador mecánico", + "block.create.mechanical_crafter": "Ensamblador mecánico", "block.create.mechanical_drill": "Taladro mecánico", "block.create.mechanical_harvester": "Cosechadora mecánica", "block.create.mechanical_mixer": "Mezcladora mecánica", @@ -254,7 +264,7 @@ "block.create.mossy_limestone": "Caliza musgosa", "block.create.mossy_scoria": "Escoria musgosa", "block.create.mossy_weathered_limestone": "Caliza erosionada musgosa", - "block.create.mysterious_cuckoo_clock": "Reloj cucú", + "block.create.mysterious_cuckoo_clock": "Reloj de cuco", "block.create.natural_scoria": "Escoria natural", "block.create.nixie_tube": "Tubo Nixie", "block.create.nozzle": "Boquilla", @@ -277,40 +287,41 @@ "block.create.paved_andesite": "Andesita pavimentada", "block.create.paved_andesite_slab": "Losa de andesita pavimentada", "block.create.paved_andesite_stairs": "Escaleras de andesita pavimentada", - "block.create.paved_andesite_wall": "Pared de andesita pavimentada", + "block.create.paved_andesite_wall": "Muro de andesita pavimentada", "block.create.paved_dark_scoria": "Escoria oscura pavimentada", "block.create.paved_dark_scoria_slab": "Losa de escoria oscura pavimentada", "block.create.paved_dark_scoria_stairs": "Escaleras de escoria oscura pavimentada", - "block.create.paved_dark_scoria_wall": "Pared de escoria oscura pavimentad", + "block.create.paved_dark_scoria_wall": "Muro de escoria oscura pavimentad", "block.create.paved_diorite": "Diorita pavimentada", "block.create.paved_diorite_slab": "Losa de diorita pavimentada", "block.create.paved_diorite_stairs": "Escaleras de diorita pavimentada", - "block.create.paved_diorite_wall": "Pared de diorita pavimentad", + "block.create.paved_diorite_wall": "Muro de diorita pavimentad", "block.create.paved_dolomite": "Dolomita pavimentada", "block.create.paved_dolomite_slab": "Losa de dolomita pavimentada", "block.create.paved_dolomite_stairs": "Escaleras de dolomita pavimentada", - "block.create.paved_dolomite_wall": "Pared de dolomita pavimentada", + "block.create.paved_dolomite_wall": "Muro de dolomita pavimentada", "block.create.paved_gabbro": "Gabro pavimentado", "block.create.paved_gabbro_slab": "Losa de gabro pavimentado", "block.create.paved_gabbro_stairs": "Escaleras de gabro pavimentado", - "block.create.paved_gabbro_wall": "Pared de gabro pavimentado", + "block.create.paved_gabbro_wall": "Muro de gabro pavimentado", "block.create.paved_granite": "Granito pavimentado", "block.create.paved_granite_slab": "Losa de granito pavimentado", "block.create.paved_granite_stairs": "Escaleras de granito pavimentado", - "block.create.paved_granite_wall": "Pared de granito pavimentado", + "block.create.paved_granite_wall": "Muro de granito pavimentado", "block.create.paved_limestone": "Piedra caliza pavimentada", "block.create.paved_limestone_slab": "Losa de piedra caliza pavimentada", "block.create.paved_limestone_stairs": "Escaleras de piedra caliza pavimentada", - "block.create.paved_limestone_wall": "Pared de piedra caliza pavimentada", + "block.create.paved_limestone_wall": "Muro de piedra caliza pavimentada", "block.create.paved_scoria": "Escoria pavimentada", "block.create.paved_scoria_slab": "Losa de escoria pavimentada", "block.create.paved_scoria_stairs": "Escaleras de escoria pavimentada", - "block.create.paved_scoria_wall": "Pared de escoria pavimentada", + "block.create.paved_scoria_wall": "Muro de escoria pavimentada", "block.create.paved_weathered_limestone": "Piedra caliza erosionada pavimentada", "block.create.paved_weathered_limestone_slab": "Losa de piedra caliza erosionada pavimentada", "block.create.paved_weathered_limestone_stairs": "Escaleras de piedra caliza erosionada pavimentada", - "block.create.paved_weathered_limestone_wall": "Pared de piedra caliza erosionada pavimentada", - "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.paved_weathered_limestone_wall": "Muro de piedra caliza erosionada pavimentada", + "block.create.peculiar_bell": "Peculiar Bell", + "block.create.pink_nixie_tube": "UNLOCALIZED: Pink Nixie Tube", "block.create.pink_sail": "Vela rosa", "block.create.pink_seat": "Asiento rosa", "block.create.pink_valve_handle": "Asa de válvula rosa", @@ -318,62 +329,64 @@ "block.create.polished_dark_scoria": "Escoria oscura pulida", "block.create.polished_dark_scoria_slab": "Losa de escoria oscura pulida", "block.create.polished_dark_scoria_stairs": "Escaleras de escoria oscura pulida", - "block.create.polished_dark_scoria_wall": "Pared de escoria oscura pulida", + "block.create.polished_dark_scoria_wall": "Muro de escoria oscura pulida", "block.create.polished_dolomite": "Dolomita pulida", "block.create.polished_dolomite_slab": "Losa de dolomita pulida", "block.create.polished_dolomite_stairs": "Escaleras de dolomita pulidas", - "block.create.polished_dolomite_wall": "Pared de dolomita pulida", + "block.create.polished_dolomite_wall": "Muro de dolomita pulida", "block.create.polished_gabbro": "Gabro pulido", "block.create.polished_gabbro_slab": "Losa de gabro pulido", "block.create.polished_gabbro_stairs": "Escaleras de gabro pulido", - "block.create.polished_gabbro_wall": "Pared de gabro pulido", + "block.create.polished_gabbro_wall": "Muro de gabro pulido", "block.create.polished_limestone": "Piedra caliza pulida", "block.create.polished_limestone_slab": "Losa de piedra caliza pulida", "block.create.polished_limestone_stairs": "Escaleras de piedra caliza pulidas", - "block.create.polished_limestone_wall": "Pared de piedra caliza pulida", + "block.create.polished_limestone_wall": "Muro de piedra caliza pulida", "block.create.polished_scoria": "Escoria pulida", "block.create.polished_scoria_slab": "Losa de escoria pulida", "block.create.polished_scoria_stairs": "Escaleras de losa pulida", - "block.create.polished_scoria_wall": "Pared de escoria pulida", + "block.create.polished_scoria_wall": "Muro de escoria pulida", "block.create.polished_weathered_limestone": "Piedra caliza erosionada pulida", "block.create.polished_weathered_limestone_slab": "Losa de piedra caliza erosionada pulida", "block.create.polished_weathered_limestone_stairs": "Escaleras de piedra caliza erosionada pulida", - "block.create.polished_weathered_limestone_wall": "Pared de piedra caliza erosionada pulida", + "block.create.polished_weathered_limestone_wall": "Muro de piedra caliza erosionada pulida", "block.create.portable_fluid_interface": "Interfaz de fluidos portátil", "block.create.portable_storage_interface": "Interfaz de almacenamiento portátil", "block.create.powered_latch": "Palanca motorizada", "block.create.powered_toggle_latch": "Palanca de cierre motorizada", "block.create.pulley_magnet": "Imán de la polea", - "block.create.pulse_repeater": "Repetidor de pulsos de Redstone", + "block.create.pulse_repeater": "Repetidor de pulsos de redstone", + "block.create.purple_nixie_tube": "UNLOCALIZED: Purple Nixie Tube", "block.create.purple_sail": "Vela morada", "block.create.purple_seat": "Asiento morado", "block.create.purple_valve_handle": "Asa de válvula morada", "block.create.radial_chassis": "Chasis radial", + "block.create.red_nixie_tube": "UNLOCALIZED: Red Nixie Tube", "block.create.red_sail": "Vela roja", "block.create.red_seat": "Asiento rojo", "block.create.red_valve_handle": "Asa de válvula roja", - "block.create.redstone_contact": "Contacto de Redstone", - "block.create.redstone_link": "Enlace de Redstone", - "block.create.refined_radiance_casing": "Revestidor de radiante", + "block.create.redstone_contact": "Contacto de redstone", + "block.create.redstone_link": "Enlace de redstone", + "block.create.refined_radiance_casing": "Revestidor radiante", "block.create.reinforced_rail": "Raíl reforzado", "block.create.rope": "Cuerda", "block.create.rope_pulley": "Polea de cuerda", - "block.create.rotation_speed_controller": "Controlador de velocidad de rotación", + "block.create.rotation_speed_controller": "Controlador de velocidad rotacional", "block.create.sail_frame": "Marco de vela", "block.create.schematic_table": "Tabla de esquemas", - "block.create.schematicannon": "Schematicannon", + "block.create.schematicannon": "Cañón de esquemas", "block.create.scoria": "Escoria", "block.create.scoria_bricks": "Ladrillos de escoria", "block.create.scoria_bricks_slab": "Losa de ladrillos de escoria", "block.create.scoria_bricks_stairs": "Escaleras de ladrillos de escoria", - "block.create.scoria_bricks_wall": "Pared de ladrillos de escoria", + "block.create.scoria_bricks_wall": "Muro de ladrillos de escoria", "block.create.scoria_cobblestone": "Adoquín de escoria", "block.create.scoria_cobblestone_slab": "Losa de adoquínes de escoria", "block.create.scoria_cobblestone_stairs": "Escaleras de adoquines de escoria", - "block.create.scoria_cobblestone_wall": "Pared de adoquines de escoria", + "block.create.scoria_cobblestone_wall": "Muro de adoquines de escoria", "block.create.scoria_pillar": "Pilar de escoria", "block.create.secondary_linear_chassis": "Chasis lineal secundario", - "block.create.sequenced_gearshift": "Palanca de cambios secuencial", + "block.create.sequenced_gearshift": "Caja de cambios secuencial", "block.create.shadow_steel_casing": "Revestidor sombrío", "block.create.shaft": "Eje", "block.create.smart_chute": "Ducto inteligente", @@ -382,7 +395,7 @@ "block.create.spout": "Surtidor", "block.create.spruce_window": "Ventana de abeto", "block.create.spruce_window_pane": "Panel de ventana de abeto", - "block.create.sticker": "UNLOCALIZED: Sticker", + "block.create.sticker": "Sticker", "block.create.sticky_mechanical_piston": "Pistón mecánico pegajoso", "block.create.stockpile_switch": "Interruptor de acopio", "block.create.stressometer": "Estresómetro", @@ -391,38 +404,43 @@ "block.create.turntable": "Plataforma giratoria mecánica", "block.create.vertical_framed_glass": "Vidrio esmaltado vertical", "block.create.vertical_framed_glass_pane": "Panel de vidrio esmaltado vertical", - "block.create.warped_window": "UNLOCALIZED: Warped Window", - "block.create.warped_window_pane": "UNLOCALIZED: Warped Window Pane", + "block.create.warped_window": "Ventana distorsionada", + "block.create.warped_window_pane": "Panel de ventana distorsionada", "block.create.water_wheel": "Rueda hidráulica mecánica", "block.create.weathered_limestone": "Piedra caliza erosionada", "block.create.weathered_limestone_bricks": "Ladrillos de piedra caliza erosionada", "block.create.weathered_limestone_bricks_slab": "Losa de piedra caliza erosionada", "block.create.weathered_limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza erosionada", - "block.create.weathered_limestone_bricks_wall": "Pared de ladrillos de piedra caliza erosionada", + "block.create.weathered_limestone_bricks_wall": "Muro de ladrillos de piedra caliza erosionada", "block.create.weathered_limestone_cobblestone": "Adoquín de piedra caliza erosionada", "block.create.weathered_limestone_cobblestone_slab": "Losa de adoquín de piedra caliza erosionada", "block.create.weathered_limestone_cobblestone_stairs": "Escaleras de adoquín de piedra caliza erosionada", - "block.create.weathered_limestone_cobblestone_wall": "Pared de adoquínes de piedra caliza erosionada", + "block.create.weathered_limestone_cobblestone_wall": "Muro de adoquínes de piedra caliza erosionada", "block.create.weathered_limestone_pillar": "Pilar de piedra caliza erosionada", - "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", + "block.create.weighted_ejector": "Eyector de peso", + "block.create.white_nixie_tube": "UNLOCALIZED: White Nixie Tube", "block.create.white_sail": "Vela blanca", "block.create.white_seat": "Asiento blanco", "block.create.white_valve_handle": "Asa de válvula blanco", "block.create.windmill_bearing": "Rodamiento del molino de viento", "block.create.wooden_bracket": "Soporte de madera para ejes", + "block.create.yellow_nixie_tube": "UNLOCALIZED: Yellow Nixie Tube", "block.create.yellow_sail": "Vela amarilla", "block.create.yellow_seat": "Asiento amarillo", "block.create.yellow_valve_handle": "Asa de válvula amarillo", "block.create.zinc_block": "Bloque de zinc", - "block.create.zinc_ore": "Mineral de zinc", + "block.create.zinc_ore": "Mena de zinc", + + "enchantment.create.capacity": "UNLOCALIZED: Capacity", + "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", "entity.create.contraption": "Artilugio", - "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.crafting_blueprint": "Plano de elaboración", "entity.create.gantry_contraption": "Artilugio de grúa", - "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", + "entity.create.potato_projectile": "Potato Projectile", "entity.create.seat": "Asiento", "entity.create.stationary_contraption": "Artilugio estacionario", - "entity.create.super_glue": "Super Pegamento", + "entity.create.super_glue": "Pegamento", "fluid.create.milk": "Leche", "fluid.create.potion": "Poción", @@ -431,26 +449,26 @@ "item.create.andesite_alloy": "Aleación de andesita", "item.create.attribute_filter": "Filtro de atributos", "item.create.bar_of_chocolate": "Barra de chocolate", - "item.create.belt_connector": "Correa", - "item.create.blaze_cake": "Pastel de Blaze", - "item.create.blaze_cake_base": "Base de Pastel de Blaze", + "item.create.belt_connector": "Correa mecánica", + "item.create.blaze_cake": "Pastel de blaze", + "item.create.blaze_cake_base": "Base de pastel de blaze", "item.create.brass_hand": "Mano de latón", "item.create.brass_ingot": "Lingote de latón", "item.create.brass_nugget": "Pepita de latón", "item.create.brass_sheet": "Lámina de latón", "item.create.builders_tea": "Té del Constructor", "item.create.chest_minecart_contraption": "Artilugio de vagoneta con cofre", - "item.create.chocolate_bucket": "Cubo de chocolate", - "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", + "item.create.chocolate_bucket": "Cubo con chocolate", + "item.create.chocolate_glazed_berries": "Bayas glaseadas con chocolate", "item.create.chromatic_compound": "Compuesto cromático", - "item.create.cinder_flour": "Harina de ceniza", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.cinder_flour": "Harina del Nether", + "item.create.copper_backtank": "Depósito trasero de cobre", "item.create.copper_ingot": "Lingote de cobre", "item.create.copper_nugget": "Pepita de cobre", "item.create.copper_sheet": "Lámina de cobre", - "item.create.crafter_slot_cover": "Tapa de ranura del Autoensamblador mecánico", - "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crafter_slot_cover": "Tapa de ranura del ensamblador mecánico", + "item.create.crafting_blueprint": "Plano de elaboración", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "Mineral de aluminio molido", "item.create.crushed_brass": "Latón molido", "item.create.crushed_copper_ore": "Mineral de cobre molido", @@ -465,39 +483,42 @@ "item.create.crushed_tin_ore": "Mineral de estaño molido", "item.create.crushed_uranium_ore": "Mineral de uranio molido", "item.create.crushed_zinc_ore": "Mineral de zinc molido", - "item.create.diving_boots": "UNLOCALIZED: Diving Boots", - "item.create.diving_helmet": "UNLOCALIZED: Diving Helmet", + "item.create.diving_boots": "Botas de buceo", + "item.create.diving_helmet": "Casco de buceo", "item.create.dough": "Masilla", "item.create.electron_tube": "Tubo de electrones", - "item.create.empty_blaze_burner": "Quemador de Blaze vacío", + "item.create.empty_blaze_burner": "Quemador de blaze vacío", "item.create.empty_schematic": "Esquema vacío", "item.create.extendo_grip": "Agarre extendido", "item.create.filter": "Filtro", "item.create.furnace_minecart_contraption": "Artilugio de vagoneta de horno", - "item.create.goggles": "Gafas del Ingeniero", + "item.create.goggles": "Gafas del constructor", "item.create.golden_sheet": "Lámina de oro", - "item.create.handheld_worldshaper": "Worldshaper", - "item.create.honey_bucket": "Cubo de miel", - "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.handheld_worldshaper": "Worldshaper Creativo", + "item.create.honey_bucket": "Cubo con miel", + "item.create.honeyed_apple": "Manzana con miel", + "item.create.incomplete_cogwheel": "UNLOCALIZED: Incomplete Cogwheel", + "item.create.incomplete_large_cogwheel": "UNLOCALIZED: Incomplete Large Cogwheel", + "item.create.incomplete_precision_mechanism": "UNLOCALIZED: Incomplete Precision Mechanism", "item.create.iron_sheet": "Lámina de hierro", - "item.create.linked_controller": "UNLOCALIZED: Linked Controller", + "item.create.linked_controller": "Controlador enlazado", "item.create.minecart_contraption": "Artilugio de vagoneta", "item.create.minecart_coupling": "Acoplamiento de vagoneta", "item.create.polished_rose_quartz": "Cuarzo rosado pulido", - "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", - "item.create.powdered_obsidian": "Obsidiana en polvo", + "item.create.potato_cannon": "Potato Cannon", + "item.create.powdered_obsidian": "Polvo de obsidiana", + "item.create.precision_mechanism": "UNLOCALIZED: Precision Mechanism", "item.create.propeller": "Hélice", "item.create.red_sand_paper": "Papel de lija rojo", "item.create.refined_radiance": "Resplandor refinado", "item.create.rose_quartz": "Cuarzo rosado", "item.create.sand_paper": "Papel de lija", "item.create.schematic": "Esquema", - "item.create.schematic_and_quill": "Esquema y Pluma", + "item.create.schematic_and_quill": "Esquema y pluma", "item.create.shadow_steel": "Acero sombrío", - "item.create.super_glue": "Super Pegamento", - "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", - "item.create.tree_fertilizer": "Fertilizador de árboles", + "item.create.super_glue": "Pegamento", + "item.create.sweet_roll": "Pan dulce", + "item.create.tree_fertilizer": "Fertilizante para árboles", "item.create.vertical_gearbox": "Caja de transmisión vertical", "item.create.wand_of_symmetry": "Varita de simetría", "item.create.wheat_flour": "Harina de trigo", @@ -510,25 +531,25 @@ "_": "->------------------------] Advancements [------------------------<-", "advancement.create.root": "Bienvenido a Create", - "advancement.create.root.desc": "¡Es hora de empezar a construir increíbles Artilugios!", - "advancement.create.andesite_alloy": "Aliteraciones en abundancia", + "advancement.create.root.desc": "¡Es hora de empezar a construir increíbles artilugios!", + "advancement.create.andesite_alloy": "Aleaciones en abundancia", "advancement.create.andesite_alloy.desc": "Los materiales de Create tienen nombres extraños, la aleación de andesita es uno de ellos.", - "advancement.create.its_alive": "Está Vivo!", - "advancement.create.its_alive.desc": "Vea cómo gira su primer componente cinético.", + "advancement.create.its_alive": "¡Está vivo!", + "advancement.create.its_alive.desc": "Mira cómo gira tu primer componente cinético.", "advancement.create.shifting_gears": "Cambiando de marcha", - "advancement.create.shifting_gears.desc": "Conecta una rueda dentada grande a una pequeña, lo que te permitirá cambiar la velocidad de tu artilugio.", + "advancement.create.shifting_gears.desc": "Conecta un engranaje grande a uno pequeño, lo que te permitirá cambiar la velocidad de tu artilugio.", "advancement.create.overstressed": "Sobrecargado", "advancement.create.overstressed.desc": "Experimenta los límites del estrés.", "advancement.create.belt": "Paseo de algas", "advancement.create.belt.desc": "Conectar dos ejes con una correa.", - "advancement.create.tunnel": "Cúbrete!", - "advancement.create.tunnel.desc": "Embellece tu correa con un Túnel.", + "advancement.create.tunnel": "¡Cúbrete!", + "advancement.create.tunnel.desc": "Embellece tu correa con un túnel.", "advancement.create.splitter_tunnel": "Divide y vencerás", "advancement.create.splitter_tunnel.desc": "Crear un divisor con un grupo de túneles de latón.", "advancement.create.chute": "Caída en picado", "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical de la cinta.", "advancement.create.upward_chute": "Abducción aérea", - "advancement.create.upward_chute.desc": "Observe cómo un objeto lanzado vuela hacia un paracaídas impulsado por un ventilador.", + "advancement.create.upward_chute.desc": "Observe cómo un objeto lanzado vuela dentro de un ducto impulsado por un ventilador.", "advancement.create.belt_funnel": "Colgantes con forma de embudo", "advancement.create.belt_funnel.desc": "Coloca un embudo lateral encima de una cinta o depósito para crear un tipo especial.", "advancement.create.belt_funnel_kiss": "Los loros y las aletas", @@ -536,81 +557,81 @@ "advancement.create.fan": "Maestro mecánico del aire", "advancement.create.fan.desc": "Monta la corriente de aire proporcionada por un ventilador revestido.", "advancement.create.fan_lava": "Calentador geotérmico", - "advancement.create.fan_lava.desc": "Quedar atrapado en una corriente de aire que funde las cosas.", + "advancement.create.fan_lava.desc": "Queda atrapado en una corriente de aire que funde las cosas.", "advancement.create.fan_water": "Lavado de la ropa", - "advancement.create.fan_water.desc": "Quedar atrapado en una corriente de aire que lava las cosas.", + "advancement.create.fan_water.desc": "Queda atrapado en una corriente de aire que lava las cosas.", "advancement.create.fan_smoke": "Fuelle mecánico", - "advancement.create.fan_smoke.desc": "Quedar atrapado en una corriente de aire que humea los artículos.", + "advancement.create.fan_smoke.desc": "Queda atrapado en una corriente de aire que humea los objetos.", "advancement.create.wrench": "Configurar convenientemente", "advancement.create.wrench.desc": "Crea una llave inglesa para ayudarte a construir tus artilugios.", - "advancement.create.goggles": "Stress-O-Vision", - "advancement.create.goggles.desc": "Crea unas Gafas del Ingeniero para ayudarte a obtener más información cinética de los componentes.", - "advancement.create.speedometer": "Pero, ¿con qué rapidez exactamente??", - "advancement.create.speedometer.desc": "Coloca y alimenta un Velocímetro. Míralo a través de las gafas para leer su valor exacto.", + "advancement.create.goggles": "Estresóvisión", + "advancement.create.goggles.desc": "Crea unas gafas del constructor para ayudarte a obtener más información cinética de los componentes.", + "advancement.create.speedometer": "Pero, ¿con qué rapidez exactamente?", + "advancement.create.speedometer.desc": "Coloca y alimenta un velocímetro. Míralo a través de las gafas para leer su valor exacto.", "advancement.create.stressometer": "Pero, ¿cuán estresado exactamente??", - "advancement.create.stressometer.desc": "Coloca y alimenta un Estresómetro. Míralo a través de las gafas para leer su valor exacto.", - "advancement.create.aesthetics": "Boom, Estética!", - "advancement.create.aesthetics.desc": "Colocar los soportes en un eje, tubo y rueda dentada.", - "advancement.create.reinforced": "Boom, Reforzado!", - "advancement.create.reinforced.desc": "Utilizar bloques de revestimiento en un eje, un tubo y una cinta.", + "advancement.create.stressometer.desc": "Coloca y alimenta un estresómetro. Míralo a través de las gafas para leer su valor exacto.", + "advancement.create.aesthetics": "Boom, ¡Estética!", + "advancement.create.aesthetics.desc": "Coloca soportes en ejes, ductos y engranajes.", + "advancement.create.reinforced": "Boom, ¡Reforzado!", + "advancement.create.reinforced.desc": "Utiliza bloques de revestimiento en un eje, un ducto y una cinta.", "advancement.create.water_wheel": "Aprovechar la hidráulica", - "advancement.create.water_wheel.desc": "Coloca una Rueda hidráulica e intenta hacerla girar.", + "advancement.create.water_wheel.desc": "Coloca una rueda hidráulica e intenta hacerla girar.", "advancement.create.chocolate_wheel": "Potencia de buen gusto", - "advancement.create.chocolate_wheel.desc": "Hacer funcionar una rueda de agua con chocolate fundido.", - "advancement.create.lava_wheel": "Rueda de Magma", + "advancement.create.chocolate_wheel.desc": "Haz funcionar una rueda de agua con chocolate fundido.", + "advancement.create.lava_wheel": "Rueda de magma", "advancement.create.lava_wheel.desc": "Esto no debió haber funcionado.", "advancement.create.cuckoo": "¿Es el momento?", - "advancement.create.cuckoo.desc": "Presenciar cómo un Reloj de cucú anuncia la hora de acostarse.", + "advancement.create.cuckoo.desc": "Presencia cómo un reloj de cuco anuncia la hora de acostarse.", "advancement.create.millstone": "Triturador de bolsillo", - "advancement.create.millstone.desc": "Colocar y alimentar una Piedra de molino.", + "advancement.create.millstone.desc": "Coloca y alimenta una piedra de molino.", "advancement.create.windmill": "Una suave brisa", - "advancement.create.windmill.desc": "Montar un molino de viento.", + "advancement.create.windmill.desc": "Monta un molino de viento.", "advancement.create.maxed_windmill": "Una fuerte brisa", - "advancement.create.maxed_windmill.desc": "Montar un molino de viento de máxima intensidad.", + "advancement.create.maxed_windmill.desc": "Monta un molino de viento con máxima intensidad.", "advancement.create.andesite_casing": "La edad de la andesita", "advancement.create.andesite_casing.desc": "Utiliza un poco de aleación de andesita y madera para crear un revestimiento básico.", "advancement.create.mechanical_drill": "Interruptores fijos", - "advancement.create.mechanical_drill.desc": "Colocar y alimentar un taladro mecánico.", + "advancement.create.mechanical_drill.desc": "Coloca y alimenta un taladro mecánico.", "advancement.create.press": "¡La prensa se pone en marcha!", "advancement.create.press.desc": "Activa una prensa mecánica y utilízala para crear algunas láminas.", "advancement.create.polished_rose_quartz": "Diamantes rosas", "advancement.create.polished_rose_quartz.desc": "Utiliza un trozo de papel de lija para pulir el cuarzo rosa hasta que se vuelva transparente.", "advancement.create.electron_tube": "Beep Boop", - "advancement.create.electron_tube.desc": "Haz algunos Tubos de Electrones, útiles en la fabricación de maquinaria menos primitiva.", + "advancement.create.electron_tube.desc": "Haz algunos tubos de electrones, útiles en la fabricación de maquinaria menos primitiva.", "advancement.create.mechanical_saw": "Picado estacionario", - "advancement.create.mechanical_saw.desc": "Colocar y alimentar una sierra mecánica.", + "advancement.create.mechanical_saw.desc": "Coloca y alimenta una sierra mecánica.", "advancement.create.basin": "Funcionamiento de la cuenca", - "advancement.create.basin.desc": "Coloca una Cuenca e intenta arrojar objetos en ella.", + "advancement.create.basin.desc": "Coloca una cuenca e intenta arrojar objetos en ella.", "advancement.create.mixer": "Mezcla de colores", - "advancement.create.mixer.desc": "Coloque una batidora mecánica sobre el lavabo, enciéndala y empiece a mezclar algunos ingredientes.", + "advancement.create.mixer.desc": "Coloca una batidora mecánica sobre el lavabo, enciéndala y empiece a mezclar algunos ingredientes.", "advancement.create.blaze_burner": "Una chimenea viva", - "advancement.create.blaze_burner.desc": "Obtener un Quemador de Blaze.", + "advancement.create.blaze_burner.desc": "Obtiene un quemador de blaze.", "advancement.create.compact": "Compactación automática", - "advancement.create.compact.desc": "Utiliza una prensa y una palangana para compactar algunos elementos.", + "advancement.create.compact.desc": "Utiliza una prensa y una cuenca para compactar algunos objetos.", "advancement.create.brass": "Aleaciones reales", - "advancement.create.brass.desc": "Utiliza Cobre molido y Zinc molido para crear algo de latón.", + "advancement.create.brass.desc": "Utiliza cobre molido y zinc molido para crear algo de latón.", "advancement.create.brass_casing": "La Edad de Latón", "advancement.create.brass_casing.desc": "Utiliza el latón recién obtenido y algo de madera para crear un revestimiento más avanzado.", "advancement.create.copper_casing": "La Edad de Cobre", "advancement.create.copper_casing.desc": "Utiliza algunas láminas de cobre y madera para crear algunos revestimientos de cobre.", "advancement.create.spout": "Sploosh", - "advancement.create.spout.desc": "Observar el llenado de un elemento fluido usando una boquilla.", + "advancement.create.spout.desc": "Observa el llenado de un fluido usando una boquilla.", "advancement.create.spout_potion": "Cervecera global", "advancement.create.spout_potion.desc": "Mira cómo un pico llena una botella con líquido de poción.", "advancement.create.chocolate": "Un mundo de imaginación", - "advancement.create.chocolate.desc": "Obtener un cubo de chocolate fundido.", + "advancement.create.chocolate.desc": "Obtiene un cubo con chocolate fundido.", "advancement.create.item_drain": "Drenaje de la ropa", - "advancement.create.item_drain.desc": "Ver cómo se vacía un elemento fluido mediante una drenadora de elementos.", - "advancement.create.chained_item_drain": "Déjalo rodar!", - "advancement.create.chained_item_drain.desc": "Observa cómo un objeto rueda por varios drenadores de elementos encadenados.", + "advancement.create.item_drain.desc": "Ve cómo se vacía un fluido mediante un drenador de objetos.", + "advancement.create.chained_item_drain": "¡Déjalo rodar!", + "advancement.create.chained_item_drain.desc": "Observa cómo un objeto rueda por varios drenadores de objetos encadenados.", "advancement.create.glass_pipe": "Espía del flujo", - "advancement.create.glass_pipe.desc": "Observe cómo se propaga el fluido a través de una tubería de fluidos con ventanas. Las tuberías de fluido rectas se convierten en ventanas cuando se utiliza una llave en ellas.", + "advancement.create.glass_pipe.desc": "Observa cómo se propaga el fluido a través de un tubo de fluidos con ventanas. Los tubos de fluido rectos se convierten en ventanas cuando se utiliza una llave inglesa en ellas.", "advancement.create.pipe_collision": "No cruzar nunca los arroyos", "advancement.create.pipe_collision.desc": "Vea cómo se unen dos fluidos en su red de tuberías.", "advancement.create.pipe_spill": "¡Hay una fuga!", "advancement.create.pipe_spill.desc": "Observe cómo un extremo abierto de una tubería toma o deposita fluidos en el mundo.", "advancement.create.hose_pulley": "Vertidos industriales", - "advancement.create.hose_pulley.desc": "Bajar una polea de manguera y ver cómo se vacía o se llena un cuerpo de líquido.", + "advancement.create.hose_pulley.desc": "Baja una polea de manguera y ve cómo se vacía o se llena un cuerpo de líquido.", "advancement.create.infinite_water": "Drenando el océano", "advancement.create.infinite_water.desc": "Bombea de una masa de agua lo suficientemente grande como para ser considerada infinita.", "advancement.create.infinite_lava": "Drenaje del núcleo de los planetas", @@ -618,51 +639,51 @@ "advancement.create.infinite_chocolate": "Ahogándose en la imaginación", "advancement.create.infinite_chocolate.desc": "Bombea desde una masa de chocolate fundido lo suficientemente grande como para ser considerado infinito.", "advancement.create.crafter": "Montaje automatizado", - "advancement.create.crafter.desc": "Coloca y alimenta algunos autoensambladores.", + "advancement.create.crafter.desc": "Coloca y alimenta algunos ensambladores.", "advancement.create.clockwork_bearing": "Artilugio a la hora", - "advancement.create.clockwork_bearing.desc": "Ensamblar una estructura montada sobre un rodamiento de relojería.", + "advancement.create.clockwork_bearing.desc": "Ensamblar una estructura montada sobre un rodamiento tipo reloj.", "advancement.create.nixie_tube": "Signos de estilo", - "advancement.create.nixie_tube.desc": "Obtener y colocar un par de Tubos Nixie.", + "advancement.create.nixie_tube.desc": "Obtener y colocar un par de tubos nixie.", "advancement.create.deployer": "Picar, colocar y atacar", - "advancement.create.deployer.desc": "Coloca y potencia un Desplegador, el reflejo perfecto de ti mismo.", + "advancement.create.deployer.desc": "Coloca y potencia un desplegador, el reflejo perfecto de ti mismo.", "advancement.create.speed_controller": "Los ingenieros lo odian!", - "advancement.create.speed_controller.desc": "Coloque un regulador de velocidad de rotación, el dispositivo definitivo para cambiar de marcha.", + "advancement.create.speed_controller.desc": "Coloca un controlador de velocidad rotacional, el dispositivo definitivo para cambiar de marcha.", "advancement.create.flywheel": "El corazón de la fábrica", - "advancement.create.flywheel.desc": "Conectar con éxito un motor a la rueda de inercia.", + "advancement.create.flywheel.desc": "Conecta con éxito un motor a la rueda de inercia.", "advancement.create.overstress_flywheel": "Altos niveles de estrés", - "advancement.create.overstress_flywheel.desc": "Sobrecargar un Motor de Horno.", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", - "advancement.create.mechanical_arm": "Manos ocupadas!", + "advancement.create.overstress_flywheel.desc": "Sobrecarga un motor de horno.", + "advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities", + "advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.", + "advancement.create.mechanical_arm": "¡Manos ocupadas!", "advancement.create.mechanical_arm.desc": "Crea un brazo mecánico, selecciona las entradas y salidas, colócalo en el suelo y dale energía; luego observa cómo hace todo el trabajo por ti.", - "advancement.create.musical_arm": "Tócame la melodía!", + "advancement.create.musical_arm": "¡Tócame la melodía!", "advancement.create.musical_arm.desc": "Vea cómo un brazo mecánico maneja su Jukebox.", "advancement.create.arm_many_targets": "Organize-o-Tron", - "advancement.create.arm_many_targets.desc": "Programar un brazo mecánico con diez o más posiciones de salida.", + "advancement.create.arm_many_targets.desc": "Programa un brazo mecánico con diez o más posiciones de salida.", "advancement.create.arm_blaze_burner": "Combust-o-Tron", - "advancement.create.arm_blaze_burner.desc": "Instruya un brazo mecánico para alimentar su Quemador de Blaze.", + "advancement.create.arm_blaze_burner.desc": "Instruya un brazo mecánico para alimentar su quemador de blaze.", "advancement.create.fist_bump": "¡Pégale, hermano!", - "advancement.create.fist_bump.desc": "Hacer que dos Desplegadores se den un puñetazo.", + "advancement.create.fist_bump.desc": "Haz que dos desplegadores se den un puñetazo.", "advancement.create.crushing_wheel": "Un par de gigantes", - "advancement.create.crushing_wheel.desc": "Crea algunas Ruedas de trituración para descomponer más materiales de forma más eficaz.", + "advancement.create.crushing_wheel.desc": "Crea algunas ruedas de trituración para descomponer más materiales de forma más eficaz.", "advancement.create.blaze_cake": "Fiebre del azúcar", - "advancement.create.blaze_cake.desc": "Hornea en tu Quemador de Blaze un pastel especial.", - "advancement.create.chromatic_compound": "Minerales bipolares", - "advancement.create.chromatic_compound.desc": "Crea una Barra de Compuesto Cromático.", + "advancement.create.blaze_cake.desc": "Hornea en tu quemador de blaze un pastel especial.", + "advancement.create.chromatic_compound": "Mysterious Minerals", + "advancement.create.chromatic_compound.desc": "Crea una barra de compuesto cromático.", "advancement.create.shadow_steel": "Retorno del vacío", - "advancement.create.shadow_steel.desc": "Crea Acero Sombrío, una barra de metal de la nada.", + "advancement.create.shadow_steel.desc": "Crea acero sombrío, una barra de metal de la nada.", "advancement.create.refined_radiance": "Brillante e inspirador", - "advancement.create.refined_radiance.desc": "Crea un Resplandor refinado, una poderosa sustancia cromática.", + "advancement.create.refined_radiance.desc": "Crea un resplandor refinado, una poderosa sustancia cromática.", "advancement.create.chromatic_age": "La edad cromática", "advancement.create.chromatic_age.desc": "Crear bloques de revestimiento de la luz y la oscuridad.", "advancement.create.wand_of_symmetry": "Espejos radiantes", "advancement.create.wand_of_symmetry.desc": "Crear un bastón de simetría.", - "advancement.create.extendo_grip": "Boioioing!", - "advancement.create.extendo_grip.desc": "Hazte con un Agarre extentido.", - "advancement.create.potato_cannon": "UNLOCALIZED: Fwoomp!", - "advancement.create.potato_cannon.desc": "UNLOCALIZED: Defeat an enemy with your Potato Cannon.", + "advancement.create.extendo_grip": "¡Boioioing!", + "advancement.create.extendo_grip.desc": "Hazte con un agarre extentido.", + "advancement.create.potato_cannon": "Fwoomp!", + "advancement.create.potato_cannon.desc": "Defeat an enemy with your Potato Cannon.", "advancement.create.dual_extendo_grip": "La última edad del boing", - "advancement.create.dual_extendo_grip.desc": "Doble Empuñadura extendida para un alcance sobrehumano.", + "advancement.create.dual_extendo_grip.desc": "Doble empuñadura extendida para un alcance sobrehumano.", "advancement.create.eob": "Fin de la beta", "advancement.create.eob.desc": "Espere más contenido aquí en el futuro. <3", @@ -672,25 +693,31 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Paletas", - "death.attack.create.crush": "%1$s se procesó por las Ruedas de trituración", + "death.attack.create.crush": "%1$s se procesó en las ruedas de trituración", + "death.attack.create.crush.player": "UNLOCALIZED: %1$s was thrown into Crushing Wheels by %2$s", "death.attack.create.fan_fire": "%1$s murió quemado por el aire caliente", + "death.attack.create.fan_fire.player": "UNLOCALIZED: %1$s was thrown into a smoker by %2$s", "death.attack.create.fan_lava": "%1$s murió quemado por un abanico de lava", + "death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s", "death.attack.create.mechanical_drill": "%1$s fue empalado por un taladro mecánico", + "death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s", "death.attack.create.mechanical_saw": "%1$s fue cortado por la mitad por una sierra mecánica", - "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", - "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", - "death.attack.create.cuckoo_clock_explosion": "%1$s fue volado por los aires por un reloj cucú manipulado", + "death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s", + "death.attack.create.potato_cannon": "%1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "%1$s was shot by %2$s using %3$s", + "death.attack.create.cuckoo_clock_explosion": "%1$s fue volado por los aires por un reloj de cuco manipulado", + "death.attack.create.cuckoo_clock_explosion.player": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "un Desplegador rebelde", "create.block.cart_assembler.invalid": "Coloque su Ensamblador de vagonetas en un bloque de Raíles", - "create.menu.return": "UNLOCALIZED: Return to Menu", - "create.menu.configure": "UNLOCALIZED: Configure...", - "create.menu.ponder_index": "UNLOCALIZED: Ponder Index", - "create.menu.only_ingame": "UNLOCALIZED: Available in the Pause Menu", - "create.menu.project_page": "UNLOCALIZED: Project Page", - "create.menu.report_bugs": "UNLOCALIZED: Report Issues", - "create.menu.support": "UNLOCALIZED: Support Us", + "create.menu.return": "Regresar al menú", + "create.menu.configure": "Configurar...", + "create.menu.ponder_index": "Ponder Index", + "create.menu.only_ingame": "Available in the Pause Menu", + "create.menu.project_page": "Página del proyecto", + "create.menu.report_bugs": "Informar de problemas", + "create.menu.support": "Apóyenos", "create.recipe.crushing": "Trituración", "create.recipe.milling": "Fresado", @@ -702,7 +729,7 @@ "create.recipe.fan_blasting.fan": "Ventilador detrás de la lava", "create.recipe.pressing": "Prensando", "create.recipe.mixing": "Mezclando", - "create.recipe.deploying": "UNLOCALIZED: Deploying", + "create.recipe.deploying": "Desplegando", "create.recipe.automatic_shapeless": "Elaboración automatizada de productos sin forma", "create.recipe.automatic_brewing": "Elaboración de cerveza automatizada", "create.recipe.packing": "Compactando", @@ -715,17 +742,17 @@ "create.recipe.sandpaper_polishing": "Pulido con papel de lija", "create.recipe.mystery_conversion": "Conversión misteriosa", "create.recipe.spout_filling": "Llenar por el pico", - "create.recipe.draining": "Drenador de elementos", - "create.recipe.sequenced_assembly": "UNLOCALIZED: Sequenced Assembly", - "create.recipe.assembly.next": "UNLOCALIZED: Next: %1$s", - "create.recipe.assembly.step": "UNLOCALIZED: Step %1$s:", - "create.recipe.assembly.progress": "UNLOCALIZED: Progress: %1$s/%2$s", - "create.recipe.assembly.pressing": "UNLOCALIZED: Process in Press", - "create.recipe.assembly.spout_filling_fluid": "UNLOCALIZED: Spout %1$s", - "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", - "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", - "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.draining": "Drenador de objetos", + "create.recipe.sequenced_assembly": "Sequenced Assembly", + "create.recipe.assembly.next": "Next: %1$s", + "create.recipe.assembly.step": "Step %1$s:", + "create.recipe.assembly.progress": "Progress: %1$s/%2$s", + "create.recipe.assembly.pressing": "Process in Press", + "create.recipe.assembly.spout_filling_fluid": "Spout %1$s", + "create.recipe.assembly.deploying_item": "Deploy %1$s", + "create.recipe.assembly.cutting": "Cut with Saw", + "create.recipe.assembly.repeat": "Repeat Sequence %1$s Times", + "create.recipe.assembly.junk": "Random junk", "create.recipe.processing.chance": "%1$s%% Chance", "create.recipe.heat_requirement.none": "No es necesario calentar", "create.recipe.heat_requirement.heated": "Calentado", @@ -742,7 +769,7 @@ "create.generic.unit.seconds": "Segundos", "create.generic.unit.minutes": "Minutos", "create.generic.unit.rpm": "RPM", - "create.generic.unit.stress": "su", + "create.generic.unit.stress": "SU(unidades de estrés)", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "%1$smB", "create.generic.clockwise": "En el sentido de las agujas del reloj", @@ -759,11 +786,11 @@ "create.keyinfo.scrolldown": "Simular usar la rueda del ratón hacia abajo (en el mundo)", "create.gui.scrollInput.defaultTitle": "Seleccione una opción:", - "create.gui.scrollInput.scrollToModify": "Usa la rueda del ratón para Modificar", + "create.gui.scrollInput.scrollToModify": "Usa la rueda del ratón para modificar", "create.gui.scrollInput.scrollToAdjustAmount": "Usa la rueda del ratón para ajustar la cantidad", - "create.gui.scrollInput.scrollToSelect": "Usa la rueda del ratón para Seleccionar", - "create.gui.scrollInput.shiftScrollsFaster": "Shift para usar la rueda del ratón más rápido", - "create.gui.toolmenu.focusKey": "Mantenga [%1$s] para enfocar", + "create.gui.scrollInput.scrollToSelect": "Usa la rueda del ratón para seleccionar", + "create.gui.scrollInput.shiftScrollsFaster": "[Mayús izdo.] para usar la rueda del ratón más rápido", + "create.gui.toolmenu.focusKey": "Mantén [%1$s] para enfocar", "create.gui.toolmenu.cycle": "[RUEDA DEL RATÓN] para el ciclo", "create.gui.symmetryWand.mirrorType": "Espejado", "create.gui.symmetryWand.orientation": "Orientación", @@ -778,17 +805,17 @@ "create.orientation.alongZ": "A lo largo de Z", "create.orientation.alongX": "A lo largo de X", - "create.gui.terrainzapper.title": "Worldshaper", - "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", - "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", - "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", - "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", - "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", - "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", - "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", - "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", - "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", - "create.gui.terrainzapper.placement": "Colocación", + "create.gui.terrainzapper.title": "Blockzapper", + "create.gui.terrainzapper.searchDiagonal": "Seguir diagonales", + "create.gui.terrainzapper.searchFuzzy": "Ignorar los bordes del material", + "create.gui.terrainzapper.patternSection": "Patrón", + "create.gui.terrainzapper.pattern.solid": "Sólido", + "create.gui.terrainzapper.pattern.checkered": "Tablero de ajedrez", + "create.gui.terrainzapper.pattern.inversecheckered": "Tablero de ajedrez invertido", + "create.gui.terrainzapper.pattern.chance25": "25% Roll", + "create.gui.terrainzapper.pattern.chance50": "50% Roll", + "create.gui.terrainzapper.pattern.chance75": "75% Roll", + "create.gui.terrainzapper.placement": "Ubicación", "create.gui.terrainzapper.placement.merged": "Fusionado", "create.gui.terrainzapper.placement.attached": "Adjuntado", "create.gui.terrainzapper.placement.inserted": "Insertado", @@ -796,19 +823,19 @@ "create.gui.terrainzapper.brush.cuboid": "Cuboide", "create.gui.terrainzapper.brush.sphere": "Esfera", "create.gui.terrainzapper.brush.cylinder": "Cilindro", - "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", - "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", + "create.gui.terrainzapper.brush.surface": "Superficie", + "create.gui.terrainzapper.brush.cluster": "Grupo", "create.gui.terrainzapper.tool": "Herramienta", "create.gui.terrainzapper.tool.fill": "Llenar", - "create.gui.terrainzapper.tool.place": "Sitio", - "create.gui.terrainzapper.tool.replace": "Sustituir", - "create.gui.terrainzapper.tool.clear": "Borrar", - "create.gui.terrainzapper.tool.overlay": "Superposición", + "create.gui.terrainzapper.tool.place": "Ubicar", + "create.gui.terrainzapper.tool.replace": "Reemplazar", + "create.gui.terrainzapper.tool.clear": "Eliminar", + "create.gui.terrainzapper.tool.overlay": "Superponer", "create.gui.terrainzapper.tool.flatten": "Aplanar", - "create.terrainzapper.shiftRightClickToSet": "Shift+Clic con el botón derecho para seleccionar una forma", - "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", - "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", + "create.terrainzapper.shiftRightClickToSet": "[Mayús izdo.] + clic derecho para seleccionar una forma", + "create.terrainzapper.usingBlock": "Usando: %1$s", + "create.terrainzapper.leftClickToSet": "Clic izquierdo a un bloque para establecer el material", "create.minecart_coupling.two_couplings_max": "Las vagonetas no pueden tener más de dos enganches cada una", "create.minecart_coupling.unloaded": "Algunas partes de su tren parecen estar en chunks no cargados", @@ -834,8 +861,8 @@ "create.contraptions.clockwork.hour_first_24": "La manecilla del día primero", "create.logistics.filter": "Filtro", - "create.logistics.recipe_filter": "Filtro de recetas", - "create.logistics.fluid_filter": "Filtro de fluidos", + "create.logistics.recipe_filter": "Filtro para recetas", + "create.logistics.fluid_filter": "Filtro para fluidos", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", "create.logistics.filter.apply": "Filtro aplicado a %1$s.", @@ -846,14 +873,14 @@ "create.gui.goggles.kinetic_stats": "Estadísticas cinéticas:", "create.gui.goggles.at_current_speed": "con la velocidad actual", "create.gui.goggles.pole_length": "Longitud del poste:", - "create.gui.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", - "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", + "create.gui.goggles.fluid_container": "Información sobre el contenedor de fluidos:", + "create.gui.goggles.fluid_container.capacity": "Capacidad: ", "create.gui.assembly.exception": "Este artilugio no se pudo montar:", "create.gui.assembly.exception.unmovableBlock": "Bloque inamovible (%4$s) en [%1$s,%2$s,%3$s]", "create.gui.assembly.exception.chunkNotLoaded": "El bloque en [%1$s,%2$s,%3$s] no estaba en un chunk cargado", "create.gui.assembly.exception.structureTooLarge": "Hay demasiados bloques incluídos en el artilugio.\nEl máximo configurado es: %1$s", "create.gui.assembly.exception.tooManyPistonPoles": "Hay demasiadas Pértigas de extensión conectadas a este Pistón.\nEl máximo configurado es: %1$s", - "create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el Pistón", + "create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el pistón", "create.gui.assembly.exception.not_enough_sails": "La estructura adjunta no incluye suficientes bloques tipo vela: %1$s\nSe requiere un mínimo de %2$s", "create.gui.gauge.info_header": "Información sobre el medidor:", "create.gui.speedometer.title": "Velocidad de rotación", @@ -862,7 +889,7 @@ "create.gui.stressometer.overstressed": "Sobrecargado", "create.gui.stressometer.no_rotation": "Sin rotación", "create.gui.contraptions.not_fast_enough": "Parece que este %1$s no está girando con _suficiente_ velocidad_.", - "create.gui.contraptions.network_overstressed": "Parece que este artilugio está _sobrecargado_. Añade más fuentes o _desacelera_ los componentes con un _impacto_ de alto estrés.", + "create.gui.contraptions.network_overstressed": "Parece que este artilugio está _sobrecargado_. Añade más fuentes o _desacelera_ los componentes con un _impacto de estrés alto_.", "create.gui.adjustable_crate.title": "Caja ajustable", "create.gui.adjustable_crate.storageSpace": "Espacio de almacenamiento", "create.gui.stockpile_switch.title": "Interruptor de acopio", @@ -882,7 +909,7 @@ "create.gui.sequenced_gearshift.instruction.delay.duration": "Duración", "create.gui.sequenced_gearshift.instruction.end.descriptive": "Fin", "create.gui.sequenced_gearshift.instruction.end": "Fin", - "create.gui.sequenced_gearshift.instruction.await.descriptive": "En espera de un Pulso de Redstone", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "En espera de un pulso de redstone", "create.gui.sequenced_gearshift.instruction.await": "En espera", "create.gui.sequenced_gearshift.speed": "Velocidad, Dirección", "create.gui.sequenced_gearshift.speed.forward": "Velocidad de entrada, hacia adelante", @@ -893,7 +920,7 @@ "create.schematicAndQuill.dimensions": "Tamaño del esquema: %1$sx%2$sx%3$s", "create.schematicAndQuill.firstPos": "Primera posición fijada.", "create.schematicAndQuill.secondPos": "Segunda posición fijada.", - "create.schematicAndQuill.noTarget": "Mantenga [Ctrl] para seleccionar los bloques del aire.", + "create.schematicAndQuill.noTarget": "Mantén [Ctrl] para seleccionar los bloques del aire.", "create.schematicAndQuill.abort": "Selección eliminada.", "create.schematicAndQuill.title": "Nombre del esquema:", "create.schematicAndQuill.convert": "Guardar y desplegar inmediatamente", @@ -909,7 +936,7 @@ "create.schematic.rotation.cw270": "En el sentido de las agujas del reloj 270", "create.schematic.mirror": "Espejado", "create.schematic.mirror.none": "Ninguno", - "create.schematic.mirror.frontBack": "Delante-detrás", + "create.schematic.mirror.frontBack": "Delante-Detrás", "create.schematic.mirror.leftRight": "Izquierda-Derecha", "create.schematic.tool.deploy": "Despliegue", "create.schematic.tool.move": "Mover XZ", @@ -918,27 +945,27 @@ "create.schematic.tool.print": "Imprimir", "create.schematic.tool.flip": "Voltear", "create.schematic.tool.deploy.description.0": "Mueve la estructura a un lugar.", - "create.schematic.tool.deploy.description.1": "Haga clic con el botón derecho del ratón en el suelo para colocar.", - "create.schematic.tool.deploy.description.2": "Mantenga [Ctrl] para seleccionar a una distancia fija.", - "create.schematic.tool.deploy.description.3": "[Ctrl]-Rueda del ratón para cambiar la distancia.", + "create.schematic.tool.deploy.description.1": "Haz clic con el botón derecho del ratón en el suelo para colocarla.", + "create.schematic.tool.deploy.description.2": "Mantén [Ctrl] para seleccionar a una distancia fija.", + "create.schematic.tool.deploy.description.3": "[Ctrl] + [RUEDA DEL RATÓN] para cambiar la distancia.", "create.schematic.tool.move.description.0": "Desplaza el esquema horizontalmente.", - "create.schematic.tool.move.description.1": "Apunta al Esquema y [CTRL]-Rueda del ratón para ponerlo.", + "create.schematic.tool.move.description.1": "Apunta al esquema y [Ctrl] + [RUEDA DEL RATÓN] para ponerlo.", "create.schematic.tool.move.description.2": "", "create.schematic.tool.move.description.3": "", "create.schematic.tool.movey.description.0": "Desplaza el esquema verticalmente..", - "create.schematic.tool.movey.description.1": "[CTRL]-Rueda del ratón para moverlo hacia arriba/abajo.", + "create.schematic.tool.movey.description.1": "[Ctrl] + [RUEDA DEL RATÓN] para moverlo hacia arriba/abajo.", "create.schematic.tool.movey.description.2": "", "create.schematic.tool.movey.description.3": "", "create.schematic.tool.rotate.description.0": "Gira el esquema alrededor de su centro.", - "create.schematic.tool.rotate.description.1": "[CTRL]-Rueda del ratón para girar 90 grados.", + "create.schematic.tool.rotate.description.1": "[Ctrl] + [RUEDA DEL RATÓN] para girar 90 grados.", "create.schematic.tool.rotate.description.2": "", "create.schematic.tool.rotate.description.3": "", "create.schematic.tool.print.description.0": "Sitúa instantáneamente la estructura en el mundo.", "create.schematic.tool.print.description.1": "[Clic derecho] para confirmar la colocación en el lugar actual.", "create.schematic.tool.print.description.2": "Esta herramienta es sólo para el Modo Creativo.", "create.schematic.tool.print.description.3": "", - "create.schematic.tool.flip.description.0": "Voltea el Esquema a lo largo de la cara que seleccione.", - "create.schematic.tool.flip.description.1": "Apunta al esquema y [CTRL]-Rueda del ratón para voltearlo.", + "create.schematic.tool.flip.description.0": "Voltea el esquema a lo largo de la cara que seleccione.", + "create.schematic.tool.flip.description.1": "Apunta al esquema y [Ctrl] + [RUEDA DEL RATÓN] para voltearlo.", "create.schematic.tool.flip.description.2": "", "create.schematic.tool.flip.description.3": "", @@ -952,8 +979,8 @@ "create.gui.schematicTable.availableSchematics": "Esquemas disponibles", "create.gui.schematicTable.noSchematics": "No hay esquemas guardados", "create.gui.schematicTable.uploading": "Subiendo...", - "create.gui.schematicTable.finished": "Subida finalizada!", - "create.gui.schematicannon.title": "Schematicannon", + "create.gui.schematicTable.finished": "¡Subida finalizada!", + "create.gui.schematicannon.title": "Cañón de esquemas", "create.gui.schematicannon.listPrinter": "Lista de control de la impresora", "create.gui.schematicannon.gunpowderLevel": "Pólvora %1$s%%", "create.gui.schematicannon.shotsRemaining": "Disparos restantes: %1$s", @@ -971,16 +998,16 @@ "create.gui.schematicannon.slot.listPrinter": "Coloque los libros aquí para imprimir una lista de comprobación para su esquema", "create.gui.schematicannon.slot.schematic": "Añada su esquema aquí. Asegúrese de que se despliega en un lugar específico.", "create.gui.schematicannon.option.skipMissing.description": "Si el cañón no encuentra un bloque necesario para su colocación, continuará en la siguiente ubicación.", - "create.gui.schematicannon.option.skipTileEntities.description": "El cañón evitará reemplazar los bloques que contienen datos, como los Cofres.", + "create.gui.schematicannon.option.skipTileEntities.description": "El cañón evitará reemplazar los bloques que contienen datos, como los cofres.", "create.gui.schematicannon.option.dontReplaceSolid.description": "El cañón nunca sustituirá ningún bloque sólido en su zona de trabajo, sólo los no sólidos y el aire.", "create.gui.schematicannon.option.replaceWithSolid.description": "El cañón sólo reemplazará los bloques sólidos en su área de trabajo si el esquema contiene un bloque sólido en la ubicación.", "create.gui.schematicannon.option.replaceWithAny.description": "El cañón reemplazará los bloques sólidos en su área de trabajo si el esquema contiene algún bloque en la ubicación.", - "create.gui.schematicannon.option.replaceWithEmpty.description": "El cañón eliminará todos los bloques de su zona de trabajo, incluidos los sustituidos por Aire.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "El cañón eliminará todos los bloques de su zona de trabajo, incluidos los sustituidos por aire.", "create.schematicannon.status.idle": "Inactivo", "create.schematicannon.status.ready": "Listo", "create.schematicannon.status.running": "Funcionando", - "create.schematicannon.status.finished": "Finished", + "create.schematicannon.status.finished": "Finalizado", "create.schematicannon.status.paused": "Pausado", "create.schematicannon.status.stopped": "Detenido", "create.schematicannon.status.noGunpowder": "Sin pólvora", @@ -999,9 +1026,9 @@ "create.materialChecklist.blocksNotLoaded": "* Descargo de Responsabilidad *\n\nLa lista de materiales puede ser inexacta debido a que no se han cargado los chunks pertinentes.", "create.gui.filter.deny_list": "Lista de denegados", - "create.gui.filter.deny_list.description": "Los elementos pasan si NO coinciden con ninguno de los anteriores. Una lista de denegación vacía acepta todo.", + "create.gui.filter.deny_list.description": "Los objetos pasan si NO coinciden con ninguno de los anteriores. Una lista de denegación vacía acepta todo.", "create.gui.filter.allow_list": "Lista de permitidos", - "create.gui.filter.allow_list.description": "Los elementos pasan si coinciden con alguno de los anteriores. Una lista de permitidos vacía rechaza todo.", + "create.gui.filter.allow_list.description": "Los objetos pasan si coinciden con alguno de los anteriores. Una lista de permitidos vacía rechaza todo.", "create.gui.filter.respect_data": "Respetar datos", "create.gui.filter.respect_data.description": "Los objetos sólo coinciden si su durabilidad, encantos y otros atributos también coinciden.", "create.gui.filter.ignore_data": "Ignorar datos", @@ -1039,12 +1066,17 @@ "create.item_attributes.in_item_group.inverted": "no está en el grupo '%1$s'", "create.item_attributes.added_by": "fue añadido por %1$s", "create.item_attributes.added_by.inverted": "no fue añadida por %1$s", + "create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s", + "create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s", + "create.item_attributes.shulker_level.full": "UNLOCALIZED: full", + "create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty", + "create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled", "create.item_attributes.has_enchant": "está encantado con %1$s", "create.item_attributes.has_enchant.inverted": "no está encantado con %1$s", - "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", - "create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s", - "create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level", - "create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level", + "create.item_attributes.color": "Está teñido %1$s", + "create.item_attributes.color.inverted": "No está teñido %1$s", + "create.item_attributes.max_enchanted": "está encantado en el nivel máximo", + "create.item_attributes.max_enchanted.inverted": "no está encantado en el nivel máximo", "create.item_attributes.has_fluid": "contiene %1$s", "create.item_attributes.has_fluid.inverted": "no contiene %1$s", "create.item_attributes.has_name": "tiene el nombre personalizado %1$s", @@ -1073,16 +1105,16 @@ "create.gui.attribute_filter.add_attribute": "Añadir atributo a la lista", "create.gui.attribute_filter.add_inverted_attribute": "Añadir atributo invertido a la Lista", "create.gui.attribute_filter.allow_list_disjunctive": "Lista de permitidos (Cualquiera)", - "create.gui.attribute_filter.allow_list_disjunctive.description": "Los elementos pasan si tienen alguno de los atributos seleccionados", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Los objetos pasan si tienen alguno de los atributos seleccionados", "create.gui.attribute_filter.allow_list_conjunctive": "Lista de permitidos (Todos)", - "create.gui.attribute_filter.allow_list_conjunctive.description": "Los elementos pasan sólo si tienen TODOS los atributos seleccionados", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Los objetos pasan sólo si tienen TODOS los atributos seleccionados", "create.gui.attribute_filter.deny_list": "Lista de denegados", - "create.gui.attribute_filter.deny_list.description": "Los elementos pasan si NO tienen ninguno de los atributos seleccionados", + "create.gui.attribute_filter.deny_list.description": "Los objetos pasan si NO tienen ninguno de los atributos seleccionados", "create.gui.attribute_filter.add_reference_item": "Añadir elemento de referencia", - "create.tooltip.holdForDescription": "UNLOCALIZED: Hold [%1$s] for Summary", - "create.tooltip.holdForControls": "UNLOCALIZED: Hold [%1$s] for Controls", - "create.tooltip.keyShift": "Shift", + "create.tooltip.holdForDescription": "Mantén [%1$s] para mas información", + "create.tooltip.holdForControls": "Mantén [%1$s] para ver los controles", + "create.tooltip.keyShift": "Mayús izdo.", "create.tooltip.keyCtrl": "Ctrl", "create.tooltip.speedRequirement": "Requisitos de velocidad: %1$s", "create.tooltip.speedRequirement.none": "Ninguno", @@ -1097,25 +1129,25 @@ "create.tooltip.capacityProvided.low": "Pequeña", "create.tooltip.capacityProvided.medium": "Media", "create.tooltip.capacityProvided.high": "Grande", - "create.tooltip.generationSpeed": "Genera en %1$s %2$s", + "create.tooltip.generationSpeed": "Generada en %1$s %2$s", "create.tooltip.analogStrength": "Fuerza analógica: %1$s/15", - "create.mechanical_arm.extract_from": "Extraer elementos de %1$s", - "create.mechanical_arm.deposit_to": "Depositar elementos en %1$s", + "create.mechanical_arm.extract_from": "Extraer objetos de %1$s", + "create.mechanical_arm.deposit_to": "Depositar objetos en %1$s", "create.mechanical_arm.summary": "El brazo mecánico tiene %1$s entrada(s) y %2$s salida(s)", "create.mechanical_arm.points_outside_range": "%1$s punto(s) de interacción seleccionado(s) eliminado(s) debido a las limitaciones de rango", - "create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected", - "create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)", - "create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)", - "create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]", - "create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size", + "create.weighted_ejector.target_set": "Objetivo seleccionado", + "create.weighted_ejector.target_not_valid": "Expulsión al bloque adyacente (el objetivo no era válido)", + "create.weighted_ejector.no_target": "Expulsión al bloque adyacente (no se ha seleccionado ningún objetivo)", + "create.weighted_ejector.targeting": "Expulsión a [%1$s,%2$s,%3$s]", + "create.weighted_ejector.stack_size": "Tamaño de la pila expulsada", "create.logistics.when_multiple_outputs_available": "Cuando hay múltiples salidas disponibles", "create.mechanical_arm.selection_mode.round_robin": "Round Robin", "create.mechanical_arm.selection_mode.forced_round_robin": "Round Robin forzado", - "create.mechanical_arm.selection_mode.prefer_first": "Preferir el primer objetivo", + "create.mechanical_arm.selection_mode.prefer_first": "Preferir el primero", "create.tunnel.selection_mode.split": "División", "create.tunnel.selection_mode.forced_split": "División forzada", @@ -1126,37 +1158,44 @@ "create.tunnel.selection_mode.synchronize": "Sincronizar entradas", "create.tooltip.chute.header": "Información del ducto", - "create.tooltip.chute.items_move_down": "Los elementos se mueven hacia abajo", - "create.tooltip.chute.items_move_up": "Los elementos se mueven hacia arriba", + "create.tooltip.chute.items_move_down": "Los objetos se mueven hacia abajo", + "create.tooltip.chute.items_move_up": "Los objetos se mueven hacia arriba", "create.tooltip.chute.no_fans_attached": "No hay ventiladores adjuntos", "create.tooltip.chute.fans_push_up": "Los ventiladores empujan desde abajo", "create.tooltip.chute.fans_push_down": "Los ventiladores empujan desde arriba", "create.tooltip.chute.fans_pull_up": "Los ventiladores tiran desde arriba", "create.tooltip.chute.fans_pull_down": "Los ventiladores tiran desde abajo", "create.tooltip.chute.contains": "Contiene: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "UNLOCALIZED: Currently distributing:", + "create.tooltip.brass_tunnel.contains_entry": "UNLOCALIZED: > %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "UNLOCALIZED: Right-Click to retrieve", - "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", - "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", - "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", - "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", - "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.linked_controller.bind_mode": "Modo de enlace activo", + "create.linked_controller.press_keybind": "Presiona %1$s, %2$s, %3$s, %4$s, %5$s o %6$s, para vincular esta frecuencia a la tecla correspondiente", + "create.linked_controller.key_bound": "Frecuencia ligada a %1$s", + "create.linked_controller.frequency_slot_1": "Enlace de teclas: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "Enlace de teclas: %1$s, Freq. #2", - "create.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", - "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", - "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", - "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", - "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", - "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", - "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.crafting_blueprint.crafting_slot": "Ranura para ingredientes", + "create.crafting_blueprint.filter_items_viable": "Los objetos del filtro avanzado son viables", + "create.crafting_blueprint.display_slot": "Ranura de pantalla", + "create.crafting_blueprint.inferred": "A partir de la receta", + "create.crafting_blueprint.manually_assigned": "Asignado manualmente", + "create.crafting_blueprint.secondary_display_slot": "Ranura de pantalla secundaria", + "create.crafting_blueprint.optional": "Opcional", - "create.hint.hose_pulley.title": "Suministro sin fondo", - "create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita", - "create.hint.mechanical_arm_no_targets.title": "No hay objetivos", - "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona correas, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_.", - "create.hint.empty_bearing.title": "Rodamiento de reloj", - "create.hint.empty_bearing": "_Haz clic con el botón derecho del ratón_ en el rodamiento con la _mano vacía_ para _adherir_ la estructura que acabas de construir delante de él", - "create.hint.full_deployer.title": "Desbordamiento de elementos del desplegador", - "create.hint.full_deployer": "Parece que este _Desplegador_ contiene _elementos_ en exceso que necesitan ser _extraídos._ Usa un _tolva,_embudo_ u otro medio para liberarlo de su desbordamiento.", + "create.potato_cannon.ammo.attack_damage": "UNLOCALIZED: %1$s Attack Damage", + "create.potato_cannon.ammo.reload_ticks": "UNLOCALIZED: %1$s Reload Ticks", + "create.potato_cannon.ammo.knockback": "UNLOCALIZED: %1$s Knockback", + + "create.hint.hose_pulley.title": "Suministro ilimitado", + "create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita.", + "create.hint.mechanical_arm_no_targets.title": "Sin objetivos", + "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún objetivo. Selecciona _correas_, _depósitos_, _embudos_ y otros bloques haciendo clic derecho sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu mano..", + "create.hint.empty_bearing.title": "Actualización del rodamiento", + "create.hint.empty_bearing": "Haz clic derecho sobre el rodamiento con la _mano vacía_ para _adjuntar_ la estructura que acabas de construir delante de él.", + "create.hint.full_deployer.title": "Exceso de objetos en el desplegador", + "create.hint.full_deployer": "Parece que este _desplegador_ contiene _exceso_ de objetos que necesitan ser _extraídos._ Usa una _tolva_, _embudo_ u otro medio para liberarlo de su excedente.", "create.gui.config.overlay1": "Hola :)", "create.gui.config.overlay2": "Esta es una muestra de la superposición", @@ -1171,50 +1210,51 @@ "create.command.killTPSCommand.status.slowed_by.0": "[Crear]: El tick del servidor está actualmente ralentizado en %s ms :o", "create.command.killTPSCommand.status.slowed_by.1": "[Crear]: El tick del servidor está ralentizado en %s ms ahora >:)", "create.command.killTPSCommand.status.slowed_by.2": "[Create]: El tick del servidor ha vuelto a su velocidad normal :D", - "create.command.killTPSCommand.status.usage.0": "[Create]: usar /killtps stop para que el servidor vuelva a la velocidad normal", - "create.command.killTPSCommand.status.usage.1": "[Create]: usar /killtps start para ralentizar artificialmente el tick del servidor", + "create.command.killTPSCommand.status.usage.0": "[Create]: usa /killtps stop para que el servidor vuelva a la velocidad normal", + "create.command.killTPSCommand.status.usage.1": "[Create]: usa /killtps start para ralentizar artificialmente el tick del servidor", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", - "create.contraption.minecart_contraption_illegal_pickup": "UNLOCALIZED: A mystical force is binding this Cart Contraption to the world", + "create.contraption.minecart_contraption_too_big": "Este artilugio de vagoneta parece demasiado grande para recogerlo", + "create.contraption.minecart_contraption_illegal_pickup": "Una fuerza mística está atando este artilugio de vagoneta al mundo", "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", - "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", - "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", - "create.subtitle.blaze_munch": "Blaze mastica felizmente", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", - "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "Slime aplastado", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", - "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", - "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", - "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", - "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", - "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", - "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", - "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", - "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.contraption_disassemble": "", + "create.subtitle.peculiar_bell_use": "", + "create.subtitle.mixing": "", + "create.subtitle.mechanical_press_activation_belt": "", + "create.subtitle.fwoomp": "", + "create.subtitle.worldshaper_place": "", + "create.subtitle.crushing_1": "UNLOCALIZED: Crushing noises", + "create.subtitle.depot_slide": "", + "create.subtitle.saw_activate_stone": "", + "create.subtitle.blaze_munch": "", + "create.subtitle.funnel_flap": "", + "create.subtitle.schematicannon_finish": "", + "create.subtitle.haunted_bell_use": "UNLOCALIZED: Haunted Bell tolls", + "create.subtitle.scroll_value": "", + "create.subtitle.crafter_craft": "", + "create.subtitle.controller_put": "", + "create.subtitle.cranking": "", + "create.subtitle.wrench_remove": "", + "create.subtitle.cogs": "", + "create.subtitle.slime_added": "", + "create.subtitle.wrench_rotate": "", + "create.subtitle.potato_hit": "", + "create.subtitle.saw_activate_wood": "", + "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", + "create.subtitle.deployer_polish": "", + "create.subtitle.deny": "", + "create.subtitle.controller_click": "", + "create.subtitle.schematicannon_launch_block": "", + "create.subtitle.copper_armor_equip": "", + "create.subtitle.controller_take": "Lectern empties", + "create.subtitle.mechanical_press_activation": "", + "create.subtitle.contraption_assemble": "", + "create.subtitle.crafter_click": "", + "create.subtitle.depot_plop": "", + "create.subtitle.confirm": "", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1225,1035 +1265,1042 @@ "item.create.example_item.tooltip.behaviour1": "Entonces este elemento hace esto. (los comportamientos se muestran en el turno)", "item.create.example_item.tooltip.condition2": "Y cuando esto", "item.create.example_item.tooltip.behaviour2": "Puedes añadir tantos comportamientos como quieras", - "item.create.example_item.tooltip.control1": "Cuando se pulsa Ctrl", + "item.create.example_item.tooltip.control1": "Cuando se pulsa [Ctrl]", "item.create.example_item.tooltip.action1": "Se muestran estos controles", "block.create.wooden_bracket.tooltip": "SOPORTE DE MADERA PARA EJES", - "block.create.wooden_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un refuerzo acogedor y de madera.", + "block.create.wooden_bracket.tooltip.summary": "Decora tus _ejes_, _engranajes_ y _ductos_ con un acogedor refuerzo de madera.", "block.create.metal_bracket.tooltip": "SOPORTE DE METAL PARA EJES", - "block.create.metal_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un poco de refuerzo industrial robusto.", + "block.create.metal_bracket.tooltip.summary": "Decora tus _ejes_, _engranajes_ y _ductos_ con un poco de refuerzo industrial robusto.", "block.create.seat.tooltip": "ASIENTO", - "block.create.seat.tooltip.summary": "¡Siéntate y disfruta del viaje! Anclará a un jugador en un _contrafuerte_ en movimiento. También es ideal para los muebles estáticos. Viene en una variedad de colores.", - "block.create.seat.tooltip.condition1": "Click derecho en el asiento", - "block.create.seat.tooltip.behaviour1": "Sienta al jugador en el _Asiento_. Pulsa shift izquierdo para dejar el _Asiento_.", + "block.create.seat.tooltip.summary": "¡Siéntate y disfruta del viaje! Anclará a un jugador en un artilugio en movimiento. También es ideal para muebles estáticos. Viene en una variedad de colores.", + "block.create.seat.tooltip.condition1": "Cuando se hace clic derecho en el asiento", + "block.create.seat.tooltip.behaviour1": "Sienta al jugador en el _asiento_. Pulsa [Mayús izdo.] para dejar el asiento.", "item.create.blaze_cake.tooltip": "PASTEL DE BLAZE", - "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para sus esforzados _Quemadores de blaze_. Los pone en marcha!.", + "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para sus esforzados _quemadores de blaze_. ¡Los pone en marcha!.", "item.create.wand_of_symmetry.tooltip": "VARITA DE SIMETRÍA", - "item.create.wand_of_symmetry.tooltip.summary": "Refleja perfectamente la colocación de bloques en los planos configurados", + "item.create.wand_of_symmetry.tooltip.summary": "Refleja perfectamente la colocación de bloques en los planos configurados.", "item.create.wand_of_symmetry.tooltip.condition1": "Mientras está en el inventario rápido", - "item.create.wand_of_symmetry.tooltip.behaviour1": "Permanece activo", - "item.create.wand_of_symmetry.tooltip.control1": "Click derecho en el suelo", - "item.create.wand_of_symmetry.tooltip.action1": "_Crea_ o _Mueve_ el Espejo", - "item.create.wand_of_symmetry.tooltip.control2": "Click derecho en el aire", - "item.create.wand_of_symmetry.tooltip.action2": "_Quita_ el Espejo activo", - "item.create.wand_of_symmetry.tooltip.control3": "Click derecho mientras se agacha", - "item.create.wand_of_symmetry.tooltip.action3": "Abre la _Interfaz de Configuración_", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Permanece activo.", + "item.create.wand_of_symmetry.tooltip.control1": "Cuando se hace clic derecho en el suelo", + "item.create.wand_of_symmetry.tooltip.action1": "_Crea_ o _mueve_ el espejo.", + "item.create.wand_of_symmetry.tooltip.control2": "Cuando se hace clic derecho en el aire", + "item.create.wand_of_symmetry.tooltip.action2": "_Quita_ el espejo activo.", + "item.create.wand_of_symmetry.tooltip.control3": "[Mayús izdo.] + clic derecho", + "item.create.wand_of_symmetry.tooltip.action3": "Abre la interfaz de configuración.", "item.create.handheld_worldshaper.tooltip": "WORLDSHAPER", - "item.create.handheld_worldshaper.tooltip.summary": "Práctica herramienta para crear _paisajes_ y _características del terreno_", - "item.create.handheld_worldshaper.tooltip.control1": "Click izquierdo en un bloque", - "item.create.handheld_worldshaper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo", - "item.create.handheld_worldshaper.tooltip.control2": "Click derecho en un bloque", + "item.create.handheld_worldshaper.tooltip.summary": "Práctica herramienta para crear _paisajes_ y _características del terreno_.", + "item.create.handheld_worldshaper.tooltip.control1": "Cuando se hace clic izquierdo en un bloque", + "item.create.handheld_worldshaper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo.", + "item.create.handheld_worldshaper.tooltip.control2": "Cuando se hace clic derecho en un bloque", "item.create.handheld_worldshaper.tooltip.action2": "Aplica el _pincel_ y la _herramienta_ actualmente seleccionadas en el lugar deseado.", - "item.create.handheld_worldshaper.tooltip.control3": "Click derecho mientras se agacha", - "item.create.handheld_worldshaper.tooltip.action3": "Abre la _Interfaz de Configuración_", + "item.create.handheld_worldshaper.tooltip.control3": "[Mayús izdo.] + clic derecho", + "item.create.handheld_worldshaper.tooltip.action3": "Abre la interfaz de configuración.", "item.create.tree_fertilizer.tooltip": "FERTILIZANTE PARA ÁRBOLES", - "item.create.tree_fertilizer.tooltip.summary": "Una potente combinación de minerales adecuada para acelerar el crecimiento de los tipos de árboles más comunes", + "item.create.tree_fertilizer.tooltip.summary": "Una potente combinación de minerales adecuada para acelerar el crecimiento de los tipos de árboles más comunes.", "item.create.tree_fertilizer.tooltip.condition1": "Cuando se utiliza en un árbol joven", - "item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles _independientemente_ de sus condiciones de _espacio_", + "item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles _independientemente_ de sus condiciones de _espacio_.", "item.create.extendo_grip.tooltip": "AGARRE EXTENDIDO", - "item.create.extendo_grip.tooltip.summary": "¡Boioioing! Aumenta enormemente la _distancia de alcance_ del portador", + "item.create.extendo_grip.tooltip.summary": "¡Boioioing! Aumenta enormemente la _distancia de alcance_ del portador. Can be powered with Air Pressure from a _Copper_ _Backtank_", "item.create.extendo_grip.tooltip.condition1": "Cuando está fuera de la mano", - "item.create.extendo_grip.tooltip.behaviour1": "Aumenta la _distancia de alcance_ de los objetos usados en la _mano principal_", - "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.extendo_grip.tooltip.behaviour1": "Aumenta la _distancia de alcance_ de los objetos usados en la _mano principal_.", + "item.create.extendo_grip.tooltip.condition2": "While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", - "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", - "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", - "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", - "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.potato_cannon.tooltip": "POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "_Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTRO", - "item.create.filter.tooltip.summary": "Controla las salidas_ y _entradas_ de los dispositivos logísticos con más _precisión_, comparándolas con un _conjunto de elementos_ o varios _filtros anidados_", - "item.create.filter.tooltip.condition1": "Cuando está en la ranura del filtro", - "item.create.filter.tooltip.behaviour1": "Controla_ el flujo del elemento según su _configuración_", + "item.create.filter.tooltip.summary": "Controla las _salidas_ y _entradas_ de los _dispositivos logísticos_ con más precisión, comparándolas con un _conjunto de objetos_ o varios _filtros anidados_.", + "item.create.filter.tooltip.condition1": "Cuando está en la ranura de filtros", + "item.create.filter.tooltip.behaviour1": "Controla el flujo de objetos según su _configuración_.", "item.create.filter.tooltip.condition2": "Cuando se hace clic derecho", - "item.create.filter.tooltip.behaviour2": "Abre la interfaz de _configuración_", + "item.create.filter.tooltip.behaviour2": "Abre la interfaz de configuración.", "item.create.attribute_filter.tooltip": "FILTRO DE ATRIBUTOS", - "item.create.attribute_filter.tooltip.summary": "Controla las salidas_ y las _entradas_ de los dispositivos logísticos con más _precisión_, comparándolas con un _conjunto de _atributos_ y _categorías_ de artículos", - "item.create.attribute_filter.tooltip.condition1": "Cuando está en la ranura del filtro", - "item.create.attribute_filter.tooltip.behaviour1": "Controla el flujo del elemento según su _configuración_", + "item.create.attribute_filter.tooltip.summary": "Controla las _salidas_ y las _entradas_ de los _dispositivos logísticos_ con más precisión, comparándolas con un _conjunto de atributos_ y _categorías_ de objetos.", + "item.create.attribute_filter.tooltip.condition1": "Cuando está en la ranura de filtros", + "item.create.attribute_filter.tooltip.behaviour1": "Controla el flujo de objetos según su _configuración_.", "item.create.attribute_filter.tooltip.condition2": "Cuando se hace clic derecho", - "item.create.attribute_filter.tooltip.behaviour2": "Abre la interfaz de _configuración_", + "item.create.attribute_filter.tooltip.behaviour2": "Abre la interfaz de configuración.", "item.create.empty_schematic.tooltip": "ESQUEMA VACÍO", - "item.create.empty_schematic.tooltip.summary": "Se utiliza como ingrediente de las recetas y para escribir en la _tabla de esquemas_", + "item.create.empty_schematic.tooltip.summary": "Se utiliza como 'ingrediente' de las recetas y para escribir en la _tabla de esquemas_.", "item.create.schematic.tooltip": "ESQUEMA", - "item.create.schematic.tooltip.summary": "Contiene una estructura para ser posicionada y colocada en el mundo. Posiciona el holograma como se desee y utiliza un _Esquematicannon_ para construirlo", - "item.create.schematic.tooltip.condition1": "Cuando se mantiene", - "item.create.schematic.tooltip.behaviour1": "Se puede posicionar utilizando las herramientas en pantalla", - "item.create.schematic.tooltip.control1": "Click derecho mientras se agacha", - "item.create.schematic.tooltip.action1": "Abre una _Interfaz_ para introducir las _Coordenadas_ exactas", + "item.create.schematic.tooltip.summary": "Contiene una estructura para ser posicionada y colocada en el mundo. Posiciona el holograma como desees y utiliza un _cañón de esquemas_ para construirla.", + "item.create.schematic.tooltip.condition1": "Cuando se sostiene en la mano", + "item.create.schematic.tooltip.behaviour1": "Se puede posicionar utilizando las herramientas en pantalla.", + "item.create.schematic.tooltip.control1": "[Mayús izdo.] + clic derecho", + "item.create.schematic.tooltip.action1": "Abre una _interfaz_ para introducir las _coordenadas_ exactas.", "item.create.schematic_and_quill.tooltip": "ESQUEMA Y PLUMA", - "item.create.schematic_and_quill.tooltip.summary": "Se utiliza para guardar una estructura de tu mundo en un archivo .nbt", + "item.create.schematic_and_quill.tooltip.summary": "Se utiliza para guardar una estructura de tu mundo en un archivo .nbt.", "item.create.schematic_and_quill.tooltip.condition1": "Paso 1", - "item.create.schematic_and_quill.tooltip.behaviour1": "Selecciona dos puntos de esquina usando click derecho", + "item.create.schematic_and_quill.tooltip.behaviour1": "Selecciona dos puntos de esquina usando clic derecho.", "item.create.schematic_and_quill.tooltip.condition2": "Paso 2", - "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Rueda del ratón_ en las caras para ajustar el tamaño. Click derecho de nuevo para guardar", - "item.create.schematic_and_quill.tooltip.control1": "Click derecho", - "item.create.schematic_and_quill.tooltip.action1": "Seleccionar un punto de esquina / confirmar guardar", - "item.create.schematic_and_quill.tooltip.control2": "Al mantener Ctrl", - "item.create.schematic_and_quill.tooltip.action2": "Seleccionar puntos en _medio del aire_. Rueda del ratón para ajustar la distancia", - "item.create.schematic_and_quill.tooltip.control3": "Click derecho mientras se agacha", - "item.create.schematic_and_quill.tooltip.action3": "Reinicia_ y elimina la selección", + "item.create.schematic_and_quill.tooltip.behaviour2": "[Ctrl] + [RUEDA DEL RATÓN] en las caras para ajustar el tamaño. Clic derecho de nuevo para guardar.", + "item.create.schematic_and_quill.tooltip.control1": "Cuando se hace clic derecho", + "item.create.schematic_and_quill.tooltip.action1": "Selecciona un punto de esquina / confirmar guardar.", + "item.create.schematic_and_quill.tooltip.control2": "Cuando mantiene [Ctrl]", + "item.create.schematic_and_quill.tooltip.action2": "Selecciona puntos en _medio del aire_. Rueda del ratón para ajustar la distancia.", + "item.create.schematic_and_quill.tooltip.control3": "[Mayús izdo.] + clic derecho", + "item.create.schematic_and_quill.tooltip.action3": "_Reinicia_ y elimina la selección.", - "block.create.schematicannon.tooltip": "ESQUEMATICAÑÓN", - "block.create.schematicannon.tooltip.summary": "Dispara bloques para recrear un _Esquema_ desplegado en el Mundo. Utiliza elementos de los inventarios adyacentes y _Pólvora_ como combustible.", - "block.create.schematicannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "block.create.schematicannon.tooltip.behaviour1": "UNLOCALIZED: Opens the _Interface_", + "block.create.schematicannon.tooltip": "CAÑÓN DE ESQUEMAS", + "block.create.schematicannon.tooltip.summary": "Dispara bloques para recrear un _esquema_ desplegado en el mundo. Utiliza objetos de los inventarios adyacentes y _pólvora_ como combustible.", + "block.create.schematicannon.tooltip.condition1": "Cuando se hace clic derecho", + "block.create.schematicannon.tooltip.behaviour1": "Abre la interfaz.", "block.create.schematic_table.tooltip": "TABLA DE ESQUEMAS", - "block.create.schematic_table.tooltip.summary": "Escribe los esquemas guardados en un _esquema vacío_", + "block.create.schematic_table.tooltip.summary": "Escribe los esquemas guardados en un _esquema vacío_.", "block.create.schematic_table.tooltip.condition1": "Cuando se da un esquema vacío", - "block.create.schematic_table.tooltip.behaviour1": "Carga un archivo elegido de la carpeta de esquemas", + "block.create.schematic_table.tooltip.behaviour1": "Carga un archivo elegido de la carpeta de esquemas.", - "item.create.goggles.tooltip": "GAFAS DEL INGENIERO", - "item.create.goggles.tooltip.summary": "Un par de gafas para aumentar tu visión con útil información _cinética_", + "item.create.goggles.tooltip": "GAFAS DEL CONSTRUCTOR", + "item.create.goggles.tooltip.summary": "Un par de gafas para aumentar tu visión con útil información _cinética_.", "item.create.goggles.tooltip.condition1": "Cuando se llevan puestas", - "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores de color_ correspondientes al _Nivel de velocidad_ de un componente cinético colocado, así como el _Impacto de estrés_ y la _Capacidad_ de los componentes individuales.", - "item.create.goggles.tooltip.condition2": "Al mirar el medidor", - "item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre _Velocidad_ o _Estrés_ de la red a la que está conectado el medidor", - "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", - "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", + "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores de color_ correspondientes al _nivel de velocidad_ de un componente cinético colocado, así como el _impacto de estrés_ y la _carga_ de los componentes individuales.", + "item.create.goggles.tooltip.condition2": "Al mirar un medidor", + "item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre _velocidad_ o _estrés_ de la red a la que está conectado el medidor.", + "item.create.goggles.tooltip.condition3": "Al mirar un contenedor de fluidos", + "item.create.goggles.tooltip.behaviour3": "Muestra información detallada sobre la _carga_ del bloque y los _líquidos_ almacenados en su interior.", "item.create.wrench.tooltip": "LLAVE INGLESA", - "item.create.wrench.tooltip.summary": "Una herramienta útil para trabajar en artilugios cinéticos. Se puede utilizar para _Rotar_, _Desmantelar_ y para _Configurar_ componentes", - "item.create.wrench.tooltip.control1": "Click con el botón derecho en un bloque cinético", - "item.create.wrench.tooltip.action1": "_Rota los componentes_ hacia o desde la cara con la que ha interactuado", - "item.create.wrench.tooltip.control2": "Click derecho mientras te agachas", - "item.create.wrench.tooltip.action2": "Desmonta los componentes cinéticos_ y los devuelve a _tu inventario_", + "item.create.wrench.tooltip.summary": "Una herramienta útil para trabajar en artilugios cinéticos. Se puede utilizar para _rotar_, _desmantelar_ y para _configurar_ componentes.", + "item.create.wrench.tooltip.control1": "Cuando se hace clic derecho en un bloque cinético", + "item.create.wrench.tooltip.action1": "Rota los componentes hacia o desde la cara con la que ha interactuado.", + "item.create.wrench.tooltip.control2": "[Mayús izdo.] + clic derecho", + "item.create.wrench.tooltip.action2": "Desmonta los _componentes cinéticos_ y los devuelve a tu inventario_.", "block.create.nozzle.tooltip": "BOQUILLA", - "block.create.nozzle.tooltip.summary": "Se acopla a la parte delantera de un _ventilador revestido_ para distribuir su efecto sobre las entidades en _todas las direcciones_", + "block.create.nozzle.tooltip.summary": "Se acopla a la parte delantera de un _ventilador revestido_ para distribuir su efecto sobre las entidades en _todas las direcciones_.", "block.create.cuckoo_clock.tooltip": "RELOJ DE CUCO", - "block.create.cuckoo_clock.tooltip.summary": "Fina artesanía para _decorar_ un espacio y _contar el tiempo_", + "block.create.cuckoo_clock.tooltip.summary": "Fina artesanía para decorar un espacio y contar el tiempo.", "block.create.cuckoo_clock.tooltip.condition1": "Cuando es alimentado por cinética", - "block.create.cuckoo_clock.tooltip.behaviour1": "Muestra la _hora actual_ y toca una melodía dos veces al día. Se activa_ una vez al _mediodía_ y al anochecer, en cuanto _los jugadores pueden dormir_", + "block.create.cuckoo_clock.tooltip.behaviour1": "Muestra la _hora actual_ y toca una melodía dos veces al día. Se activa una vez al mediodía y al anochecer, _en cuanto los jugadores pueden dormir_.", "block.create.turntable.tooltip": "PLATAFORMA GIRATORIA", - "block.create.turntable.tooltip.summary": "Convierte la _fuerza de rotación_ en un refinado mareo", + "block.create.turntable.tooltip.summary": "Convierte la _fuerza rotacional_ en un refinado mareo.", "block.create.stockpile_switch.tooltip": "INTERRUPTOR DE ACOPIO", - "block.create.stockpile_switch.tooltip.summary": "Activa una señal de Redstone en función de la cantidad de _Artículos almacenados_ en el Contenedor adjunto. Viene con un práctico filtro. A diferencia de un _Comparador,_ el _Interruptor de acopio_ permite la configuración de _Umbrales,_ a partir de los cuales se invierten las señales", - "block.create.stockpile_switch.tooltip.condition1": "Cuando haces click derecho", - "block.create.stockpile_switch.tooltip.behaviour1": "Abre la _Interfaz de Configuración_", + "block.create.stockpile_switch.tooltip.summary": "Activa una señal de redstone en función de la cantidad de _objetos almacenados_ en el _contenedor_ adjunto. Viene con un práctico filtro. A diferencia de un _comparador, el _interruptor de acopio_ permite la configuración de _umbrales_, a partir de los cuales se invierten las señales.", + "block.create.stockpile_switch.tooltip.condition1": "Cuando se hace clic derecho", + "block.create.stockpile_switch.tooltip.behaviour1": "Abre la interfaz de configuración.", "block.create.content_observer.tooltip": "OBSERVADOR DE CONTENIDO", - "block.create.content_observer.tooltip.summary": "_Detecta artículos_ dentro de _contenedores_ y _transportadores_ que coinciden con un _filtro_ configurado. Mientras el _inventario_, la _cinta_ o la _canaleta_ observados contengan_ un artículo que coincida, este componente emitirá una _señal de Redstone_. Cuando un _túnel observado transfiere_ un artículo coincidente, este componente emitirá un _Pulso de Redstone_", + "block.create.content_observer.tooltip.summary": "_Detecta objetos_ dentro de _contenedores_ y _transportadores_ que coincidan con un _filtro_ configurado. Mientras el _inventario_, la _cinta_ o la _canaleta_ observados _contengan_ un objeto que coincida, este componente emitirá una _señal de redstone_. Cuando un embudo observado _transfiere_ un objeto coincidente, este componente emitirá un _pulso de redstone_.", "block.create.adjustable_crate.tooltip": "CAJA AJUSTABLE", - "block.create.adjustable_crate.tooltip.summary": "Este _Contenedor de Artículos_ permite el control manual de su capacidad. Puede contener hasta _16 pilas_ de cualquier objeto. Soporta _Comparadores de Redstone_", - "block.create.adjustable_crate.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "block.create.adjustable_crate.tooltip.behaviour1": "UNLOCALIZED: Opens the _Interface_.", + "block.create.adjustable_crate.tooltip.summary": "Este _contenedor de objetos_ permite el control manual de su capacidad. Puede contener hasta _16 pilas_ de cualquier objeto. Soporta _comparadores de redstone_.", + "block.create.adjustable_crate.tooltip.condition1": "Cuando se hace clic derecho", + "block.create.adjustable_crate.tooltip.behaviour1": "Abre la interfaz.", "block.create.creative_crate.tooltip": "CAJA CREATIVA", - "block.create.creative_crate.tooltip.summary": "Este _Contenedor de Almacenamiento_ permite la replicación infinita de cualquier elemento. Colócalo junto a un _Schematicannon_ para eliminar cualquier requisito de material", - "block.create.creative_crate.tooltip.condition1": "Cuando el artículo está en la ranura del filtro", - "block.create.creative_crate.tooltip.behaviour1": "Todo lo que se _extraiga_ de este contenedor proporcionará un _suministro ilimitado_ del elemento especificado. Los elementos _insertados_ en esta caja serán _evitados._", + "block.create.creative_crate.tooltip.summary": "Este _contenedor de objetos_ permite la replicación infinita de cualquier elemento. Colócalo junto a un _cañón de esquemas_ para eliminar cualquier requisito de material.", + "block.create.creative_crate.tooltip.condition1": "Cuando el elemento está en la ranura para filtros", + "block.create.creative_crate.tooltip.behaviour1": "Todo lo que se _extraiga_ de este contenedor proporcionará un suministro _ilimitado_ del elemento especificado. Los objetos _insertados_ en esta caja serán _evitados_.", + + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", "block.create.controller_rail.tooltip": "RAÍL DE CONTROL", - "block.create.controller_rail.tooltip.summary": "Un _raíl energizado unidireccional_ capaz de _controlar con precisión_ la _velocidad de movimiento_ de una vagoneta", - "block.create.controller_rail.tooltip.condition1": "Cuando es impulsado por Redstone", - "block.create.controller_rail.tooltip.behaviour1": "_Acelera_ o _Desacelera_ pasando _vagonetas_ correspondientes a la _fuerza de la señal_. Propaga la energía de Redstone a los Raíles de control adyacentes. Al alimentar dos Raíles de control con diferentes intensidades, los carriles entre ellos interpolarán su señal", + "block.create.controller_rail.tooltip.summary": "Un raíl energizado _unidireccional_ capaz de _controlar con precisión_ la _velocidad de movimiento_ de una vagoneta.", + "block.create.controller_rail.tooltip.condition1": "Cuando es alimentado con redstone", + "block.create.controller_rail.tooltip.behaviour1": "_Acelera_ o _desacelera_ pasando _vagonetas_ correspondientes a la _fuerza de la señal_. Propaga la energía de redstone a los raíles de control adyacentes. Al alimentar dos raíles de control con diferentes intensidades, los carriles entre ellos interpolarán su señal.", "item.create.sand_paper.tooltip": "PAPEL DE LIJA", - "item.create.sand_paper.tooltip.summary": "Un papel rugoso que se puede utilizar para _pulir materiales_. Se puede aplicar automáticamente con el Desplegador", + "item.create.sand_paper.tooltip.summary": "Un papel rugoso que se puede utilizar para _pulir materiales_. Se puede aplicar automáticamente con el _desplegador_.", "item.create.sand_paper.tooltip.condition1": "Cuando se usa", - "item.create.sand_paper.tooltip.behaviour1": "Aplica el pulido a los objetos sostenidos en la _mano libre_ o tirados en el _suelo_ cuando se _miran_", + "item.create.sand_paper.tooltip.behaviour1": "Aplica un pulido a los objetos sostenidos en la _mano libre_ o tirados en el _suelo_ cuando se _miran_.", "item.create.builders_tea.tooltip": "TÉ DEL CONSTRUCTOR", - "item.create.builders_tea.tooltip.summary": "La bebida perfecta para empezar el día- _Motivante_ y _Saturante._", + "item.create.builders_tea.tooltip.summary": "La bebida perfecta para empezar el día. Motivante y saturante.", "item.create.refined_radiance.tooltip": "RESPLANDOR REFINADO", - "item.create.refined_radiance.tooltip.summary": "Material cromático forjado a partir de _luz absorbida_", - "item.create.refined_radiance.tooltip.condition1": "UNLOCALIZED: Work In Progress", - "item.create.refined_radiance.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", + "item.create.refined_radiance.tooltip.summary": "Un material cromático forjado a partir de la _luz absorbida_.", + "item.create.refined_radiance.tooltip.condition1": "Trabajo en progreso", + "item.create.refined_radiance.tooltip.behaviour1": "Los usos para este material estarán disponibles en un próximo lanzamiento.", "item.create.shadow_steel.tooltip": "ACERO SOMBRÍO", - "item.create.shadow_steel.tooltip.summary": "Un material cromático forjado _en el vacío_", - "item.create.shadow_steel.tooltip.condition1": "UNLOCALIZED: Work In Progress", - "item.create.shadow_steel.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", + "item.create.shadow_steel.tooltip.summary": "Un material cromático forjado en el _vacío_.", + "item.create.shadow_steel.tooltip.condition1": "Work In Progress", + "item.create.shadow_steel.tooltip.behaviour1": "Usages for this material will be available in a future release.", - "item.create.linked_controller.tooltip": "UNLOCALIZED: LINKED CONTROLLER", - "item.create.linked_controller.tooltip.summary": "UNLOCALIZED: Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.", - "item.create.linked_controller.tooltip.condition1": "UNLOCALIZED: R-Click", - "item.create.linked_controller.tooltip.behaviour1": "UNLOCALIZED: _Toggles_ the controller. _Movement_ _controls_ are taken over while its active.", - "item.create.linked_controller.tooltip.condition2": "UNLOCALIZED: R-Click while Sneaking", - "item.create.linked_controller.tooltip.behaviour2": "UNLOCALIZED: Opens the manual _Configuration Interface_.", - "item.create.linked_controller.tooltip.condition3": "UNLOCALIZED: R-Click on Redstone Link Receiver", - "item.create.linked_controller.tooltip.behaviour3": "UNLOCALIZED: Enables _Bind Mode_, press one of the _six controls_ to bind it to the _Links' Frequency_.", + "item.create.linked_controller.tooltip": "CONTROLADOR ENLAZADO", + "item.create.linked_controller.tooltip.summary": "Permite el control manual de las frecuencias de _enlaces de redstone_ asignadas a sus seis botones..", + "item.create.linked_controller.tooltip.condition1": "Al hacer clic derecho", + "item.create.linked_controller.tooltip.behaviour1": "Activa el _controlador_. Los _controles de movimiento_ se adquieren mientras está activo.", + "item.create.linked_controller.tooltip.condition2": "Al usar [Mayús izdo.] + clic derecho", + "item.create.linked_controller.tooltip.behaviour2": "Abre la interfaz de configuración manual.", + "item.create.linked_controller.tooltip.condition3": "Al usar clic derecho en un receptor de enlaces de redstone", + "item.create.linked_controller.tooltip.behaviour3": "Activa el _modo de vinculación_, pulsa uno de los _seis controles_ para vincularlo a la _frecuencia de los enlaces_.", "item.create.linked_controller.tooltip.condition4": "UNLOCALIZED: R-Click on Lectern", "item.create.linked_controller.tooltip.behaviour4": "UNLOCALIZED: Places the Controller into the Lectern for easy activation. (R-Click while Sneaking to retrieve it)", - "item.create.diving_helmet.tooltip": "UNLOCALIZED: DIVING HELMET", - "item.create.diving_helmet.tooltip.summary": "UNLOCALIZED: Together with a _Copper_ _Backtank_, allows the wielder to _breathe_ _underwater_ for an extended amount of time.", - "item.create.diving_helmet.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_helmet.tooltip.behaviour1": "UNLOCALIZED: Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.", + "item.create.diving_helmet.tooltip": "CASCO DE BUCEO", + "item.create.diving_helmet.tooltip.summary": "Junto con un _depósito trasero de cobre_, permite que el usuario pueda respirar bajo el agua durante un tiempo prolongado.", + "item.create.diving_helmet.tooltip.condition1": "Cuando se lleva puesto", + "item.create.diving_helmet.tooltip.behaviour1": "Proporciona el efecto de _respiración acuática_, drenando lentamente la presión de aire del _depósito trasero_.", - "item.create.copper_backtank.tooltip": "UNLOCALIZED: COPPER BACKTANK", - "item.create.copper_backtank.tooltip.summary": "UNLOCALIZED: A _Wearable_ _Tank_ for carrying Pressurized Air.", - "item.create.copper_backtank.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.copper_backtank.tooltip.behaviour1": "UNLOCALIZED: Provides _Pressurized_ _Air_ to Equipment that requires it.", - "item.create.copper_backtank.tooltip.condition2": "UNLOCALIZED: When placed, Powered by Kinetics", - "item.create.copper_backtank.tooltip.behaviour2": "UNLOCALIZED: _Collects_ _Pressurized_ _Air_ at a rate depending on the Rotational Speed.", + "item.create.copper_backtank.tooltip": "DEPÓSITO TRASERO DE COBRE", + "item.create.copper_backtank.tooltip.summary": "Un tanque portátil para transportar _aire presurizado_.", + "item.create.copper_backtank.tooltip.condition1": "Cuando se lleva puesto", + "item.create.copper_backtank.tooltip.behaviour1": "Proporciona _aire presurizado_ a los equipos que lo requieran.", + "item.create.copper_backtank.tooltip.condition2": "Cuando se coloca y es alimentado por cinética", + "item.create.copper_backtank.tooltip.behaviour2": "Recoge _aire presurizado_ a un ritmo que depende de la velocidad rotacional.", - "item.create.diving_boots.tooltip": "UNLOCALIZED: DIVING BOOTS", - "item.create.diving_boots.tooltip.summary": "UNLOCALIZED: A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.", - "item.create.diving_boots.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_boots.tooltip.behaviour1": "UNLOCALIZED: Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.", + "item.create.diving_boots.tooltip": "BOTAS DE BUCEO", + "item.create.diving_boots.tooltip.summary": "Un par de _botas_ pesadas, que permiten atravesar mejor el suelo del océano.", + "item.create.diving_boots.tooltip.condition1": "Cuando se llevan puestas", + "item.create.diving_boots.tooltip.behaviour1": "El portador se hunde rápido y no puede nadar. Concede la capacidad de caminar y saltar bajo el agua. Al portador no le afectarán las _correas mecánicas.", - "item.create.crafting_blueprint.tooltip": "UNLOCALIZED: CRAFTING BLUEPRINT", - "item.create.crafting_blueprint.tooltip.summary": "UNLOCALIZED: _Placed_ on a wall, it can be used to _specify_ _ingredient_ _arrangements_ for easier manual crafting. Each slot represents a Recipe.", - "item.create.crafting_blueprint.condition1": "UNLOCALIZED: R-Click empty Slot", - "item.create.crafting_blueprint.behaviour1": "UNLOCALIZED: Opens a _Crafting_ _menu_ allowing you to _configure_ a _recipe_ and items to display.", - "item.create.crafting_blueprint.condition2": "UNLOCALIZED: R-Click configured Slot", - "item.create.crafting_blueprint.behaviour2": "UNLOCALIZED: _Applies_ the _configured_ _recipe_ with matching Ingredients found in your _Inventory_. _Sneak_ to craft up to a _Stack_ of items.", + "item.create.crafting_blueprint.tooltip": "PLANO DE ELABORACIÓN", + "item.create.crafting_blueprint.tooltip.summary": "Colocado en una pared, puede utilizarse para especificar la disposición de los ingredientes para facilitar la elaboración manual. Cada ranura representa una receta", + "item.create.crafting_blueprint.condition1": "Al hacer clic derecho en una ranura vacía", + "item.create.crafting_blueprint.behaviour1": "Abre un menú que permite configurar una receta y los objetos a mostrar.", + "item.create.crafting_blueprint.condition2": "Al hacer clic derecho en una ranura configurada", + "item.create.crafting_blueprint.behaviour2": "Aplica la receta configurada con los ingredientes que se encuentran en tu inventario. Se puede utilizar para fabricar hasta una pila de objetos.", "item.create.minecart_coupling.tooltip": "ENSAMBLADOR DE VAGONETAS", - "item.create.minecart_coupling.tooltip.summary": "_Encadena_ todas tus _Vagonetas_ o _Artilugios de vagoneta_ para formar un majestuoso Tren", - "item.create.minecart_coupling.tooltip.condition1": "Cuando se utiliza en Vagonetas", - "item.create.minecart_coupling.tooltip.behaviour1": "_Acopla_ dos Vagonetas, intentando mantenerlas a una _distancia constante_ mientras se mueven", + "item.create.minecart_coupling.tooltip.summary": "_Encadena_ todas tus _vagonetas_ o _artilugios de vagoneta_ para formar un majestuoso _tren_.", + "item.create.minecart_coupling.tooltip.condition1": "Cuando se utiliza en vagonetas", + "item.create.minecart_coupling.tooltip.behaviour1": "_Acopla_ dos vagonetas, intentando mantenerlas a una _distancia constante_ mientras se mueven.", - "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip": "PECULIAR BELL", + "block.create.peculiar_bell.tooltip.summary": "A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "UNLOCALIZED: HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "UNLOCALIZED: A _Cursed Bell_ haunted by lost souls of the Nether.", + "block.create.haunted_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", + "block.create.haunted_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.", "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", - "create.ponder.subject": "UNLOCALIZED: Subject of this scene", - "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", - "create.ponder.associated": "UNLOCALIZED: Associated Entries", - "create.ponder.close": "UNLOCALIZED: Close", - "create.ponder.identify": "UNLOCALIZED: Identify", - "create.ponder.next": "UNLOCALIZED: Next Scene", - "create.ponder.previous": "UNLOCALIZED: Previous Scene", - "create.ponder.replay": "UNLOCALIZED: Replay", - "create.ponder.think_back": "UNLOCALIZED: Think Back", - "create.ponder.slow_text": "UNLOCALIZED: Comfy Reading", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", - "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", - "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", - "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", - "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", - "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", - "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", - "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", - "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", - "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", - "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", - "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", - "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", - "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", - "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", - "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", - "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", - "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", - "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", - "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", - "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", - "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", - "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", - "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", - "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", - "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", - "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", - "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - - "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", - "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", - "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", - "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", - - "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", - "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", - "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", - "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", - "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", - "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", - - "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", - "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", - "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", - "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", - - "create.ponder.andesite_tunnel.header": "UNLOCALIZED: Using Andesite Tunnels", - "create.ponder.andesite_tunnel.text_1": "UNLOCALIZED: Andesite Tunnels can be used to cover up your belts", - "create.ponder.andesite_tunnel.text_2": "UNLOCALIZED: Whenever an Andesite Tunnel has connections to the sides...", - "create.ponder.andesite_tunnel.text_3": "UNLOCALIZED: ...they will split exactly one item off of any passing stacks", - "create.ponder.andesite_tunnel.text_4": "UNLOCALIZED: The remainder will continue on its path", - - "create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin", - "create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing", - "create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them", - "create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet", - "create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here", - "create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below", - "create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing", - "create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients", - "create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin", - "create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items", - - "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", - "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", - "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", - - "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", - - "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", - "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", - "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", - "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", - "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", - "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", - "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", - - "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", - "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", - "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", - "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", - "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", - "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", - "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks", - - "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", - "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", - "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", - - "create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners", - "create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin", - "create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items", - "create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat", - "create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms", - - "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.brass_tunnel.header": "UNLOCALIZED: Using Brass Tunnels", - "create.ponder.brass_tunnel.text_1": "UNLOCALIZED: Brass Tunnels can be used to cover up your belts", - "create.ponder.brass_tunnel.text_2": "UNLOCALIZED: Brass Tunnels have filter slots on each open side", - "create.ponder.brass_tunnel.text_3": "UNLOCALIZED: Filters on inbound connections simply block non-matching items", - "create.ponder.brass_tunnel.text_4": "UNLOCALIZED: Filters on outbound connections can be used to sort items by type", - "create.ponder.brass_tunnel.text_5": "UNLOCALIZED: Whenever a passing item has multiple valid exits, the distribution mode will decide how to handle it", - "create.ponder.brass_tunnel.text_6": "UNLOCALIZED: Brass Tunnels on parallel belts will form a group", - "create.ponder.brass_tunnel.text_7": "UNLOCALIZED: Incoming Items will now be distributed across all connected exits", - "create.ponder.brass_tunnel.text_8": "UNLOCALIZED: For this, items can also be inserted into the Tunnel block directly", - - "create.ponder.brass_tunnel_modes.header": "UNLOCALIZED: Distribution Modes of the Brass Tunnel", - "create.ponder.brass_tunnel_modes.text_1": "UNLOCALIZED: Using a Wrench, the distribution behaviour of Brass Tunnels can be configured", - "create.ponder.brass_tunnel_modes.text_10": "UNLOCALIZED: 'Synchronize Inputs' is a unique setting for Brass Tunnels", - "create.ponder.brass_tunnel_modes.text_11": "UNLOCALIZED: Items are only allowed past if every tunnel in the group has one waiting", - "create.ponder.brass_tunnel_modes.text_12": "UNLOCALIZED: This ensures that all affected belts supply items at the same rate", - "create.ponder.brass_tunnel_modes.text_2": "UNLOCALIZED: 'Split' will attempt to distribute the stack evenly between available outputs", - "create.ponder.brass_tunnel_modes.text_3": "UNLOCALIZED: If an output is unable to take more items, it will be skipped", - "create.ponder.brass_tunnel_modes.text_4": "UNLOCALIZED: 'Forced Split' will never skip outputs, and instead wait until they are free", - "create.ponder.brass_tunnel_modes.text_5": "UNLOCALIZED: 'Round Robin' keeps stacks whole, and cycles through outputs iteratively", - "create.ponder.brass_tunnel_modes.text_6": "UNLOCALIZED: Once Again, if an output is unable to take more items, it will be skipped", - "create.ponder.brass_tunnel_modes.text_7": "UNLOCALIZED: 'Forced Round Robin' never skips outputs", - "create.ponder.brass_tunnel_modes.text_8": "UNLOCALIZED: 'Prefer Nearest' prioritizes the outputs closest to the items' input location", - "create.ponder.brass_tunnel_modes.text_9": "UNLOCALIZED: 'Randomize' will distribute whole stacks to randomly picked outputs", - - "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", - "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", - "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", - "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", - - "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", - "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", - "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", - "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", - - "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", - "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", - "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: This Arrow indicates which side of the Structure will be considered the front", - "create.ponder.cart_assembler_modes.text_3": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", - - "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", - "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", - "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", - "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", - "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", - - "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", - "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", - "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", - "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - - "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", - "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exactly like Chain Drives", - "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", - "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", - "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", - "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", - "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - - "create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", - "create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories", - "create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created", - "create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal", - - "create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes", - "create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward", - "create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction", - "create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides", - - "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", - "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", - "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", - "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", - "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", - "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", - "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", - "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", - "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", - - "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - - "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - - "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - - "create.ponder.creative_fluid_tank.header": "UNLOCALIZED: Creative Fluid Tanks", - "create.ponder.creative_fluid_tank.text_1": "UNLOCALIZED: Creative Fluid Tanks can be used to provide a bottomless supply of fluid", - "create.ponder.creative_fluid_tank.text_2": "UNLOCALIZED: Right-Click with a fluid containing item to configure it", - "create.ponder.creative_fluid_tank.text_3": "UNLOCALIZED: Pipe Networks can now endlessly draw the assigned fluid from the tank", - "create.ponder.creative_fluid_tank.text_4": "UNLOCALIZED: Any Fluids pushed back into a Creative Fluid Tank will be voided", - - "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", - "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", - "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", - - "create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels", - "create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively", - "create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other", - "create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed", - "create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well", - - "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", - "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", - "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", - "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", - "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", - "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", - "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", - "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", - "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", - "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", - "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", - "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", - "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", - "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", - "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", - "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", - - "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", - "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", - "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", - "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", - - "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", - "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", - "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", - - "create.ponder.deployer_processing.header": "UNLOCALIZED: Processing Items using Deployers", - "create.ponder.deployer_processing.text_1": "UNLOCALIZED: With a fitting held item, Deployers can process items provided beneath them", - "create.ponder.deployer_processing.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Deployer", - "create.ponder.deployer_processing.text_3": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.deployer_processing.text_4": "UNLOCALIZED: The Deployer will hold and process them automatically", - - "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", - "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", - "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", - "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", - - "create.ponder.depot.header": "UNLOCALIZED: Using Depots", - "create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements", - "create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it", - "create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing", - "create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms", - - "create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners", - "create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it", - "create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly", - "create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines", - "create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating", - - "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", - "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", - "create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state", - "create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed", - - "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", - "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", - "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", - - "create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans", - "create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated", - "create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted", - "create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated", - "create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them", - "create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup", - "create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it", - "create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range", - "create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts", - - "create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans", - "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", - "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", - - "create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes", - "create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets", - "create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window", - "create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments", - "create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids", - "create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first", - "create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents", - "create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid", - - "create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers", - "create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks", - "create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained", - "create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...", - "create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources", - "create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly", - - "create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank", - "create.ponder.fluid_tank_sizes.text_1": "UNLOCALIZED: Fluid Tanks can be combined to increase the total capacity", - "create.ponder.fluid_tank_sizes.text_2": "UNLOCALIZED: Their base square can be up to 3 blocks wide...", - "create.ponder.fluid_tank_sizes.text_3": "UNLOCALIZED: ...and grow in height by more than 30 additional layers", - "create.ponder.fluid_tank_sizes.text_4": "UNLOCALIZED: Using a Wrench, a tanks' window can be toggled", - - "create.ponder.fluid_tank_storage.header": "UNLOCALIZED: Storing Fluids in Fluid Tanks", - "create.ponder.fluid_tank_storage.text_1": "UNLOCALIZED: Fluid Tanks can be used to store large amounts of fluid", - "create.ponder.fluid_tank_storage.text_2": "UNLOCALIZED: Pipe networks can push and pull fluids from any side", - "create.ponder.fluid_tank_storage.text_3": "UNLOCALIZED: The contained fluid can be measured by a Comparator", - "create.ponder.fluid_tank_storage.text_4": "UNLOCALIZED: However, in Survival Mode Fluids cannot be added or taken manually", - "create.ponder.fluid_tank_storage.text_5": "UNLOCALIZED: You can use Basins, Item Drains and Spouts to drain or fill fluid containing items", - - "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", - "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", - "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", - "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", - - "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", - "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", - "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", - "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting", - - "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", - "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement. A mechanical belt should help here.", - - "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", - "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", - "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", - "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", - - "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - - "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - - "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", - "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", - "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", - "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", - "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", - - "create.ponder.hose_pulley.header": "UNLOCALIZED: Source Filling and Draining using Hose Pulleys", - "create.ponder.hose_pulley.text_1": "UNLOCALIZED: Hose Pulleys can be used to fill or drain large bodies of Fluid", - "create.ponder.hose_pulley.text_2": "UNLOCALIZED: With the Kinetic Input, the height of the pulleys' hose can be controlled", - "create.ponder.hose_pulley.text_3": "UNLOCALIZED: The Pulley retracts while the input rotation is inverted", - "create.ponder.hose_pulley.text_4": "UNLOCALIZED: On the opposite side, pipes can be connected", - "create.ponder.hose_pulley.text_5": "UNLOCALIZED: Attached pipe networks can either provide fluid to the hose...", - "create.ponder.hose_pulley.text_6": "UNLOCALIZED: ...or pull from it, draining the pool instead", - "create.ponder.hose_pulley.text_7": "UNLOCALIZED: Fill and Drain speed of the pulley depends entirely on the fluid networks' throughput", - - "create.ponder.hose_pulley_infinite.header": "UNLOCALIZED: Passively Filling and Draining large bodies of Fluid", - "create.ponder.hose_pulley_infinite.text_1": "UNLOCALIZED: When deploying the Hose Pulley into a large enough ocean...", - "create.ponder.hose_pulley_infinite.text_2": "UNLOCALIZED: It will provide/dispose fluids without affecting the source", - "create.ponder.hose_pulley_infinite.text_3": "UNLOCALIZED: Pipe networks can limitlessly take fluids from/to such pulleys", - - "create.ponder.hose_pulley_level.header": "UNLOCALIZED: Fill and Drain level of Hose Pulleys", - "create.ponder.hose_pulley_level.text_1": "UNLOCALIZED: While fully retracted, the Hose Pulley cannot operate", - "create.ponder.hose_pulley_level.text_2": "UNLOCALIZED: Draining runs from top to bottom", - "create.ponder.hose_pulley_level.text_3": "UNLOCALIZED: The surface level will end up just below where the hose ends", - "create.ponder.hose_pulley_level.text_4": "UNLOCALIZED: Filling runs from bottom to top", - "create.ponder.hose_pulley_level.text_5": "UNLOCALIZED: The filled pool will not grow beyond the layer above the hose end", - - "create.ponder.item_drain.header": "UNLOCALIZED: Emptying Fluid Containers using Item Drains", - "create.ponder.item_drain.text_1": "UNLOCALIZED: Item Drains can extract fluids from items", - "create.ponder.item_drain.text_2": "UNLOCALIZED: Right-click it to pour fluids from your held item into it", - "create.ponder.item_drain.text_3": "UNLOCALIZED: When items are inserted from the side...", - "create.ponder.item_drain.text_4": "UNLOCALIZED: ...they roll across, emptying out their contained fluid", - "create.ponder.item_drain.text_5": "UNLOCALIZED: Pipe Networks can now pull the fluid from the drains' internal buffer", - - "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - - "create.ponder.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", - "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", - "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", - "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", - "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", - "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", - "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", - "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", - "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", - - "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", - "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", - "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", - "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", - - "create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms", - "create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed", - "create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets", - "create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)", - "create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection", - "create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously", - "create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range", - "create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly", - "create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap", - - "create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm", - "create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs", - "create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs", - "create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter", - "create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering", - "create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm", - "create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute", - - "create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm", - "create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input", - "create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs", - "create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...", - "create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting", - "create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it", - "create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available", - "create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped", - "create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free", - "create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm", - - "create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone", - "create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate", - "create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles", - "create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", - - "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", - "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", - "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", - - "create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters", - "create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe", - "create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged", - "create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side", - "create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit", - "create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate", - "create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually", - "create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin", - "create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse", - - "create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters", - "create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically", - "create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined", - "create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location", - - "create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters", - "create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path", - "create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement", - "create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters", - - "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", - "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", - "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", - - "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", - "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", - "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", - - "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", - "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", - "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", - - "create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer", - "create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated", - "create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones", - "create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner", - "create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.", - - "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", - "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", - "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", - "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", - - "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", - "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", - "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", - - "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", - "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", - "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", - "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", - "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", - - "create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press", - "create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it", - "create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press", - "create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically", - - "create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press", - "create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted", - "create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones", - "create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner", - "create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.", - - "create.ponder.mechanical_pump_flow.header": "UNLOCALIZED: Fluid Transportation using Mechanical Pumps", - "create.ponder.mechanical_pump_flow.text_1": "UNLOCALIZED: Mechanical Pumps govern the flow of their attached pipe networks", - "create.ponder.mechanical_pump_flow.text_2": "UNLOCALIZED: When powered, their arrow indicates the direction of flow", - "create.ponder.mechanical_pump_flow.text_3": "UNLOCALIZED: The network behind is now pulling fluids...", - "create.ponder.mechanical_pump_flow.text_4": "UNLOCALIZED: ...while the network in front is transferring it outward", - "create.ponder.mechanical_pump_flow.text_5": "UNLOCALIZED: Reversing the input rotation reverses the direction of flow", - "create.ponder.mechanical_pump_flow.text_6": "UNLOCALIZED: Use a Wrench to reverse the orientation of pumps manually", - - "create.ponder.mechanical_pump_speed.header": "UNLOCALIZED: Throughput of Mechanical Pumps", - "create.ponder.mechanical_pump_speed.text_1": "UNLOCALIZED: Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away", - "create.ponder.mechanical_pump_speed.text_2": "UNLOCALIZED: Speeding up the input rotation changes the speed of flow propagation...", - "create.ponder.mechanical_pump_speed.text_3": "UNLOCALIZED: ...aswell as how quickly fluids are transferred", - "create.ponder.mechanical_pump_speed.text_4": "UNLOCALIZED: Pumps can combine their throughputs within shared pipe networks", - "create.ponder.mechanical_pump_speed.text_5": "UNLOCALIZED: Alternating their orientation can help align their flow directions", - - "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", - "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", - "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", - - "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", - "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", - "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", - - "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", - "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", - "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", - "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", - "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", - "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", - - "create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone", - "create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them", - "create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels", - "create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top", - "create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click", - "create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation", - - "create.ponder.nixie_tube.header": "UNLOCALIZED: Using Nixie Tubes", - "create.ponder.nixie_tube.text_1": "UNLOCALIZED: When powered by Redstone, Nixie Tubes will display the redstone signals' strength", - "create.ponder.nixie_tube.text_2": "UNLOCALIZED: Using name tags edited with an anvil, custom text can be displayed", - - "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", - "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", - "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", - - "create.ponder.portable_fluid_interface.header": "UNLOCALIZED: Contraption Fluid Exchange", - "create.ponder.portable_fluid_interface.text_1": "UNLOCALIZED: Fluid Tanks on moving contraptions cannot be accessed by any pipes", - "create.ponder.portable_fluid_interface.text_2": "UNLOCALIZED: This component can interact with fluid tanks without the need to stop the contraption", - "create.ponder.portable_fluid_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_fluid_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_fluid_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL Tanks on the contraption", - "create.ponder.portable_fluid_interface.text_6": "UNLOCALIZED: Fluid can now be inserted...", - "create.ponder.portable_fluid_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_fluid_interface.text_8": "UNLOCALIZED: After no contents have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - - "create.ponder.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", - "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", - "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", - "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", - "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", - - "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", - "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", - "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", - "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", - "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", - - "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", - "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", - - "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", - "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", - "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", - "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", - "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", - "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", - "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", - "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", - "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", - "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", - - "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", - "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", - "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", - - "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", - "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", - "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", - "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", - "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", - - "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", - "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", - "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", - - "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", - "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", - "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", - "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", - - "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", - "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", - "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", - - "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", - "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", - "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", - - "create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails", - "create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with", - "create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks", - "create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them", - "create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames", - - "create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames", - "create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with", - "create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks", - - "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", - "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", - "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", - "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", - "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", - "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", - - "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes", - "create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control", - "create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer", - "create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size", - "create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.", - - "create.ponder.smart_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Smart Pipes", - "create.ponder.smart_pipe.text_1": "UNLOCALIZED: Smart pipes can help control flows by fluid type", - "create.ponder.smart_pipe.text_2": "UNLOCALIZED: When placed directly at the source, they can specify the type of fluid to extract", - "create.ponder.smart_pipe.text_3": "UNLOCALIZED: Simply Right-Click their filter slot with any item containing the desired fluid", - "create.ponder.smart_pipe.text_4": "UNLOCALIZED: When placed further down a pipe network, smart pipes will only let matching fluids continue", - - "create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer", - "create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components", - "create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge", - "create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements", - - "create.ponder.spout_filling.header": "UNLOCALIZED: Filling Items using a Spout", - "create.ponder.spout_filling.text_1": "UNLOCALIZED: The Spout can fill fluid holding items provided beneath it", - "create.ponder.spout_filling.text_2": "UNLOCALIZED: The content of a Spout cannot be accessed manually", - "create.ponder.spout_filling.text_3": "UNLOCALIZED: Instead, Pipes can be used to supply it with fluids", - "create.ponder.spout_filling.text_4": "UNLOCALIZED: The Input items can be placed on a Depot under the Spout", - "create.ponder.spout_filling.text_5": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.spout_filling.text_6": "UNLOCALIZED: The Spout will hold and process them automatically", - - "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", - "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", - "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", - "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", - "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", - - "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", - "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", - "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", - "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", - "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", - - "create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer", - "create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network", - "create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge", - "create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements", - - "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", - "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", - "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", - "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", - "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", - "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", - - "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", - "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", - "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", - "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", - "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", - "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", - - "create.ponder.valve_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Valves", - "create.ponder.valve_pipe.text_1": "UNLOCALIZED: Valve pipes help control fluids propagating through pipe networks", - "create.ponder.valve_pipe.text_2": "UNLOCALIZED: Their shaft input controls whether fluid is currently allowed through", - "create.ponder.valve_pipe.text_3": "UNLOCALIZED: Given Rotational Force in the opening direction, the valve will open up", - "create.ponder.valve_pipe.text_4": "UNLOCALIZED: It can be closed again by reversing the input rotation", - - "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", - "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", - "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", - "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", - "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", - - "create.ponder.weighted_ejector.header": "UNLOCALIZED: Using Weighted Ejectors", - "create.ponder.weighted_ejector.text_1": "UNLOCALIZED: Sneak and Right-Click holding an Ejector to select its target location", - "create.ponder.weighted_ejector.text_10": "UNLOCALIZED: It is now limited to this stack size, and only activates when its held stack reaches this amount", - "create.ponder.weighted_ejector.text_11": "UNLOCALIZED: Other Entities will always trigger an Ejector when stepping on it", - "create.ponder.weighted_ejector.text_2": "UNLOCALIZED: The placed ejector will now launch objects to the marked location", - "create.ponder.weighted_ejector.text_3": "UNLOCALIZED: A valid target can be at any height or distance within range", - "create.ponder.weighted_ejector.text_4": "UNLOCALIZED: They cannot however be off to a side", - "create.ponder.weighted_ejector.text_5": "UNLOCALIZED: If no valid Target was selected, it will simply target the block directly in front", - "create.ponder.weighted_ejector.text_6": "UNLOCALIZED: Supply Rotational Force in order to charge it up", - "create.ponder.weighted_ejector.text_7": "UNLOCALIZED: Items placed on the ejector cause it to trigger", - "create.ponder.weighted_ejector.text_8": "UNLOCALIZED: If Inventories are targeted, the ejector will wait until there is space", - "create.ponder.weighted_ejector.text_9": "UNLOCALIZED: Using the Wrench, a required Stack Size can be configured", - - "create.ponder.weighted_ejector_redstone.header": "UNLOCALIZED: Controlling Weighted Ejectors with Redstone", - "create.ponder.weighted_ejector_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Ejectors will not activate", - "create.ponder.weighted_ejector_redstone.text_2": "UNLOCALIZED: Furthermore, Observers can detect when Ejectors activate", - - "create.ponder.weighted_ejector_tunnel.header": "UNLOCALIZED: Splitting item stacks using Weighted Ejectors", - "create.ponder.weighted_ejector_tunnel.text_1": "UNLOCALIZED: Combined with Brass Tunnels, Ejectors can split item stacks by specific amounts", - "create.ponder.weighted_ejector_tunnel.text_2": "UNLOCALIZED: First, configure the Brass Tunnel to 'Prefer Nearest', in order to prioritize its side output", - "create.ponder.weighted_ejector_tunnel.text_3": "UNLOCALIZED: The Stack Size set on the Ejector now determines the amount to be split off", - "create.ponder.weighted_ejector_tunnel.text_4": "UNLOCALIZED: While a new stack of the configured size exits the side output...", - "create.ponder.weighted_ejector_tunnel.text_5": "UNLOCALIZED: ...the remainder will continue on its path", - - "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", - "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", - "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", - "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", - "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", - "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", - "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", - - "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", - "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "create.ponder.hold_to_ponder": "Mantén [%1$s] para considerar", + "create.ponder.subject": "Tema de esta escena", + "create.ponder.pondering": "Considerando sobre...", + "create.ponder.identify_mode": "Identificando modo activo.\nDespausea con [%1$s]", + "create.ponder.associated": "Entradas asociadas", + "create.ponder.close": "Cerrar", + "create.ponder.identify": "Identificar", + "create.ponder.next": "Escena siguiente", + "create.ponder.previous": "Escena previa", + "create.ponder.replay": "Repetición", + "create.ponder.think_back": "Volver atrás", + "create.ponder.slow_text": "Lectura cómoda", + "create.ponder.exit": "Exit", + "create.ponder.welcome": "Welcome to Ponder", + "create.ponder.categories": "Available Categories in Create", + "create.ponder.index_description": "Click one of the icons to learn about its associated Items and Blocks", + "create.ponder.index_title": "Ponder Index", + "create.ponder.shared.rpm16": "16 RPM", + "create.ponder.shared.behaviour_modify_wrench": "Este comportamiento puede modificarse mediante una llave inglesa", + "create.ponder.shared.storage_on_contraption": "Los inventarios unidos al artilugio recogerán sus producciones automáticamente", + "create.ponder.shared.sneak_and": "Mayús izdo. +", + "create.ponder.shared.rpm8": "8 RPM", + "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm32": "32 RPM", + "create.ponder.shared.rpm16_source": "Fuente: 16 RPM", + "create.ponder.shared.movement_anchors": "Con la ayuda de un chasis o pegamento, se pueden mover estructuras más grandes.", + "create.ponder.tag.redstone": "Componentes lógicos", + "create.ponder.tag.redstone.description": "Componentes que ayudan a la ingeniería de redstone", + "create.ponder.tag.contraption_assembly": "Utilidades para adjuntar bloques", + "create.ponder.tag.contraption_assembly.description": "Herramientas y componentes utilizados para montar estructuras con movimiento, como un artilugio animado", + "create.ponder.tag.fluids": "Manipuladores de fluidos", + "create.ponder.tag.fluids.description": "Componentes que ayudan a transportar y utilizar fluidos", + "create.ponder.tag.decoration": "Estética", + "create.ponder.tag.decoration.description": "Componentes utilizados principalmente con fines decorativos", + "create.ponder.tag.windmill_sails": "Velas para los rodamientos de los molinos de viento", + "create.ponder.tag.windmill_sails.description": "Bloques que cuentan para la fuerza de un artefacto de molino de viento cuando se ensamblan. Cada uno de ellos tiene la misma eficacia al hacerlo.", + "create.ponder.tag.arm_targets": "Objetivos para los brazos mecánicos", + "create.ponder.tag.arm_targets.description": "Componentes que pueden seleccionarse como entradas o salidas del brazo mecánico", + "create.ponder.tag.kinetic_appliances": "Dispositivos cinéticos", + "create.ponder.tag.kinetic_appliances.description": "Componentes que utilizan la fuerza rotacional", + "create.ponder.tag.kinetic_sources": "Fuentes cinéticas", + "create.ponder.tag.kinetic_sources.description": "Componentes que generan fuerza rotacional", + "create.ponder.tag.movement_anchor": "Anclas de movimiento", + "create.ponder.tag.movement_anchor.description": "Componentes que permiten crear artilugios en movimiento, animando una estructura anexa de diversas maneras", + "create.ponder.tag.kinetic_relays": "Transmisores cinéticos", + "create.ponder.tag.kinetic_relays.description": "Componentes que ayudan a transmitir la fuerza rotacional en otro lugar", + "create.ponder.tag.contraption_actor": "Actores del artilugio", + "create.ponder.tag.contraption_actor.description": "Componentes que exponen un comportamiento especial cuando están unidos a un artilugio en movimiento", + "create.ponder.tag.creative": "Modo creativo", + "create.ponder.tag.creative.description": "Componentes que no suelen estar disponibles para el Modo Supervivencia", + "create.ponder.tag.logistics": "Transporte de objetos", + "create.ponder.tag.logistics.description": "Componentes que ayudan a desplazar los objetos", + + "create.ponder.adjustable_pulse_repeater.header": "Controlar señales mediante repetidores de pulsos ajustables", + "create.ponder.adjustable_pulse_repeater.text_1": "Los repetidores de pulsos ajustables emiten un pulso corto con un retardo", + "create.ponder.adjustable_pulse_repeater.text_2": "Con la rueda del ratón se puede configurar el tiempo de carga", + "create.ponder.adjustable_pulse_repeater.text_3": "Los retrasos configurados pueden ser de hasta 30 minutos", + + "create.ponder.adjustable_repeater.header": "Controlar señales mediante repetidores ajustables", + "create.ponder.adjustable_repeater.text_1": "Los repetidores ajustables se comportan de forma similar a los repetidores normales", + "create.ponder.adjustable_repeater.text_2": "Se cargan durante un tiempo determinado...", + "create.ponder.adjustable_repeater.text_3": "...y se enfrían durante el mismo tiempo", + "create.ponder.adjustable_repeater.text_4": "Con la rueda del ratón se puede configurar el tiempo de carga", + "create.ponder.adjustable_repeater.text_5": "Los retrasos configurados pueden variar hasta 30 minutos", + + "create.ponder.analog_lever.header": "Controlar señales mediante la palanca analógica", + "create.ponder.analog_lever.text_1": "Las palancas analógicas son una fuente compacta y precisa de energía de redstone", + "create.ponder.analog_lever.text_2": "Haz clic derecho para aumentar su potencia analógica", + "create.ponder.analog_lever.text_3": "Usa [Mayús izdo.] + clic derecho para volver a disminuir su potencia", + + "create.ponder.andesite_tunnel.header": "Usar túneles de andesita", + "create.ponder.andesite_tunnel.text_1": "Los túneles de andesita se pueden utilizar para tapar las correas", + "create.ponder.andesite_tunnel.text_2": "Siempre que un túnel de andesita tenga conexiones a los lados...", + "create.ponder.andesite_tunnel.text_3": "...dividirá exactamente un elemento de cualquier pila que pase", + "create.ponder.andesite_tunnel.text_4": "El resto continuará su camino", + + "create.ponder.basin.header": "Procesar objetos en la cuenca", + "create.ponder.basin.text_1": "Una cuenca puede contener objetos y fluidos para su procesamiento", + "create.ponder.basin.text_2": "Después de un paso de procesamamiento, las cuencas intentan descargar por debajo a un lado de ellas", + "create.ponder.basin.text_3": "Cuando un ingrediente válido está presente, la cuenca mostrará un conducto de salida", + "create.ponder.basin.text_4": "Aquí se pueden aplicar varias opciones", + "create.ponder.basin.text_5": "Las salidas serán capturadas por el inventario que está por debajo", + "create.ponder.basin.text_6": "Sin conducto de salida, la cuenca retendrá los objetos creados en su procesamiento", + "create.ponder.basin.text_7": "Esto puede ser útil si las salidas deben ser reutilizadas como ingredientes", + "create.ponder.basin.text_8": "Las salidas deseadas tendrán que ser extraídas de la cuenca", + "create.ponder.basin.text_9": "Podría ser necesario un filtro para evitar sacar los objetos no procesados", + + "create.ponder.bearing_modes.header": "Modos de movimiento del rodamiento mecánico", + "create.ponder.bearing_modes.text_1": "Cuando se detenga, el rodamiento mecánico colocará la estructura en el ángulo más cercano alineado con la cuadrícula", + "create.ponder.bearing_modes.text_2": "Se puede configurar para que nunca vuelva a los bloques sólidos, o sólo cerca del ángulo en el que comenzó", + + "create.ponder.belt_casing.header": "Correas revestidas", + "create.ponder.belt_casing.text_1": "Se puede utilizar revestidor de latón o andesita para decorar las correas", + "create.ponder.belt_casing.text_2": "Se puede utilizar una llave inglesa para quitar el revestimiento", + + "create.ponder.belt_connector.header": "El uso de las correas mecánicas", + "create.ponder.belt_connector.text_1": "Al hacer clic derecho en dos ejes con una correa mecánica se conectarán entre sí", + "create.ponder.belt_connector.text_2": "Las selecciones accidentales pueden ser canceladas con [Mayús izdo.] + clic derecho", + "create.ponder.belt_connector.text_3": "Se pueden añadir ejes adicionales en toda la correa", + "create.ponder.belt_connector.text_4": "Los ejes conectados a través de correas girarán con velocidad y dirección idénticas", + "create.ponder.belt_connector.text_5": "Los ejes añadidos se pueden quitar con la llave inglesa", + "create.ponder.belt_connector.text_6": "Las correas mecánicas se pueden teñir con fines estéticos", + + "create.ponder.belt_directions.header": "Orientaciones válidas para las correas mecánicas", + "create.ponder.belt_directions.text_1": "Las correas mecánicas no pueden conectarse en direcciones arbitrarias", + "create.ponder.belt_directions.text_2": "1. Pueden conectarse horizontalmente", + "create.ponder.belt_directions.text_3": "2. Pueden conectarse en diagonal", + "create.ponder.belt_directions.text_4": "3. Pueden conectarse verticalmente", + "create.ponder.belt_directions.text_5": "4. Y pueden conectar ejes verticales horizontalmente", + "create.ponder.belt_directions.text_6": "Estas son todas las direcciones posibles. Pueden abarcar cualquier longitud entre 2 y 20 bloques", + + "create.ponder.belt_transport.header": "El uso de las correas mecánicas para la logística", + "create.ponder.belt_transport.text_1": "Las correas mecánicas transportan objetos y otras entidades", + "create.ponder.belt_transport.text_2": "Haz clic derecho con la mano vacía para sacar objetos de una 'cinta'", + + "create.ponder.blaze_burner.header": "Alimentar quemadores de blaze", + "create.ponder.blaze_burner.text_1": "Los quemadores de blaze pueden proporcionar calor a los objetos procesados en una cuenca", + "create.ponder.blaze_burner.text_2": "Para ello, el blaze tiene que ser alimentado con objetos inflamables", + "create.ponder.blaze_burner.text_3": "Con un pastel de blaze, el quemador puede alcanzar un mayor nivel de calor", + "create.ponder.blaze_burner.text_4": "El proceso de alimentación puede automatizarse utilizando desplegadores o brazos mecánicos", + + "create.ponder.brass_funnel.header": "El embudo de latón", + "create.ponder.brass_funnel.text_1": "Los embudos de andesita sólo pueden extraer objetos individuales", + "create.ponder.brass_funnel.text_2": "Los embudos de latón pueden extraer hasta una pila completa", + "create.ponder.brass_funnel.text_3": "Usar la rueda de desplazamiento del ratón en la ranura para filtros permite un control preciso del tamaño de la pila extraída.", + "create.ponder.brass_funnel.text_4": "El uso de objetos en la ranura de filtrado restringirá el embudo para transferir sólo las pilas que coincidan.", + + "create.ponder.brass_tunnel.header": "Usar túneles de latón", + "create.ponder.brass_tunnel.text_1": "Los túneles de latón pueden utilizarse para tapar las correas", + "create.ponder.brass_tunnel.text_2": "Tienen ranuras de filtro en cada lado abierto", + "create.ponder.brass_tunnel.text_3": "Los filtros en las conexiones de entrada simplemente bloquean los objetos que no coincidan", + "create.ponder.brass_tunnel.text_4": "Los filtros en las conexiones de salida pueden utilizarse para ordenar los objetos por tipo", + "create.ponder.brass_tunnel.text_5": "Siempre que un objeto de paso tenga múltiples salidas válidas, el modo de distribución decidirá cómo manejarlo", + "create.ponder.brass_tunnel.text_6": "Los túneles de latón en bandas paralelas formarán un grupo", + "create.ponder.brass_tunnel.text_7": "Los objetos entrantes se distribuirán ahora por todas las salidas conectadas", + "create.ponder.brass_tunnel.text_8": "Para ello, los objetos también pueden insertarse en el bloque del túnel directamente", + + "create.ponder.brass_tunnel_modes.header": "Modos de distribución del túnel de latón", + "create.ponder.brass_tunnel_modes.text_1": "Mediante una llave inglesa se puede configurar el comportamiento de distribución de los túneles de latón", + "create.ponder.brass_tunnel_modes.text_10": "'Sincronizar entradas' es una configuración única de los túneles de latón", + "create.ponder.brass_tunnel_modes.text_11": "Las entradas sólo pueden pasar si cada túnel del grupo tiene una en espera", + "create.ponder.brass_tunnel_modes.text_12": "Esto asegura que todas las correas afectadas suministren objetos al mismo tiempo", + "create.ponder.brass_tunnel_modes.text_2": "El modo División intentará distribuir la pila uniformemente entre las salidas disponibles", + "create.ponder.brass_tunnel_modes.text_3": "Si una salida no puede tomar más objetos, se saltará", + "create.ponder.brass_tunnel_modes.text_4": "El modo División forzada nunca saltará las salidas, y en su lugar esperará hasta que estén libres", + "create.ponder.brass_tunnel_modes.text_5": "El modo Round Robin mantiene las pilas enteras, y recorre las salidas de forma iterativa", + "create.ponder.brass_tunnel_modes.text_6": "Una vez más, si una salida no puede aceptar más objetos, se saltará", + "create.ponder.brass_tunnel_modes.text_7": "El modo Round Robin forzado nunca omite salidas", + "create.ponder.brass_tunnel_modes.text_8": "El modo Preferir el más cercano prioriza las salidas más cercanas a la ubicación de entrada de los objetos", + "create.ponder.brass_tunnel_modes.text_9": "El modo Aleatorizar distribuirá pilas enteras a salidas elegidas al azar", + + "create.ponder.cart_assembler.header": "Mover estructuras usando ensambladores de vagonetas", + "create.ponder.cart_assembler.text_1": "Los ensambladores de vagonetas montan estructuras adjuntas a las vagonetas que pasan", + "create.ponder.cart_assembler.text_2": "Sin una señal de redstone, desmonta los artilugios de vagoneta que pasan de nuevo en bloques", + "create.ponder.cart_assembler.text_3": "El uso de una llave inglesa en una vagoneta te permitirá llevar el artilugio a otro lugar", + + "create.ponder.cart_assembler_dual.header": "Ensamblajes de artilugios de vagoneta", + "create.ponder.cart_assembler_dual.text_1": "Siempre que dos ensambladores de vagoneta compartan una estructura adjunta...", + "create.ponder.cart_assembler_dual.text_2": "...al alimentar a cualquiera de ellos se creará un artilugio de vagoneta", + "create.ponder.cart_assembler_dual.text_3": "Las vagonetas se comportarán como las conectadas a través del acoplamiento de vagoneta", + + "create.ponder.cart_assembler_modes.header": "Configurar la orientación de los artilugios de vagonetas", + "create.ponder.cart_assembler_modes.text_1": "Los artilugios de vagonetas girarán para orientarse hacia el movimiento de sus vagonetas", + "create.ponder.cart_assembler_modes.text_2": "This Arrow indicates which side of the Structure will be considered the front", + "create.ponder.cart_assembler_modes.text_3": "If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "Otros tipos de vagonetas y raíles", + "create.ponder.cart_assembler_rails.text_1": "Los ensambladores de vagonetas en raíles normales no afectarán el movimiento de las vagonetas que pasen", + "create.ponder.cart_assembler_rails.text_2": "Cuando se encuentre en un raíl motorizado o en un raíl de control, las vagonetas se mantendrán en su sitio hasta que sea motorizado", + "create.ponder.cart_assembler_rails.text_3": "Se pueden utilizar otros tipos de vagonetas como anclaje", + "create.ponder.cart_assembler_rails.text_4": "Los artilugios de vagonetas de horno se mantendrán alimentados a sí mismos, sacando combustible de cualquier inventario adjunto", + + "create.ponder.chain_drive.header": "Transmitir fuerza rotacional con las cadenas de transmisión", + "create.ponder.chain_drive.text_1": "Las cadenas de transmisión transmiten la rotación entre sí en fila", + "create.ponder.chain_drive.text_2": "Todos los ejes conectados así girarán en la misma dirección", + "create.ponder.chain_drive.text_3": "Cualquier parte de la fila puede girar 90 grados usando una llave inglesa", + + "create.ponder.chain_gearshift.header": "Controlar la velocidad de rotación con la cadena de transmisión ajustable", + "create.ponder.chain_gearshift.text_1": "Las cadenas de transmisión ajustables sin alimentación se comportan exactamente como las cadenas de transmisión", + "create.ponder.chain_gearshift.text_2": "Cuando están alimentadas, la velocidad transmitida a las demás cadenas de transmisión de la fila se duplica", + "create.ponder.chain_gearshift.text_3": "Siempre que la cadena de transmisión alimentada no esté en el origen, su velocidad se reducirá a la mitad", + "create.ponder.chain_gearshift.text_4": "En ambos casos, las cadenas de transmisión de la fila siempre funcionan a 2 veces la velocidad de la cadena de transmisión alimentada", + "create.ponder.chain_gearshift.text_5": "Utilizando señales analógicas, la relación puede ajustarse con mayor precisión, entre 1 y 2", + "create.ponder.chain_gearshift.text_6": "12 RPM", + + "create.ponder.chute.header": "Transportar objetos hacia abajo a través de ductos", + "create.ponder.chute.text_1": "Los ductos pueden transportar objetos verticalmente desde y hacia los inventarios", + "create.ponder.chute.text_2": "Usando la llave inglesa, se puede crear una ventana", + "create.ponder.chute.text_3": "Colocar ductos apuntando a las caras laterales de otro lo hará en diagonal", + + "create.ponder.chute_upward.header": "Transportar objetos hacia arriba mediante ductos", + "create.ponder.chute_upward.text_1": "Usando ventiladores revestidos en la parte superior o inferior, un ducto puede transportar objetos hacia arriba", + "create.ponder.chute_upward.text_2": "Al inspeccionar los ductos con las gafas del constructor, se revela información sobre la dirección del movimiento", + "create.ponder.chute_upward.text_3": "En el extremo 'bloqueado', los objetos tendrán que ser insertados/tomados de los lados", + + "create.ponder.clockwork_bearing.header": "Animar estructuras con rodamientos tipo reloj", + "create.ponder.clockwork_bearing.text_1": "Los rodamientos tipo reloj se fijan a los bloques que tienen delante", + "create.ponder.clockwork_bearing.text_2": "Al recibir fuerza rotacional, la estructura girará según la hora del día", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "Haz clic derecho en el rodamiento para iniciar o detener la animación de la estructura", + "create.ponder.clockwork_bearing.text_6": "Delante de la manecilla de las horas se puede añadir una segunda estructura", + "create.ponder.clockwork_bearing.text_7": "Asegúrese de que las dos estructuras no están unidas entre sí con pegamento o algo similar", + "create.ponder.clockwork_bearing.text_8": "La segunda estructura ahora girará como el minutero", + + "create.ponder.clutch.header": "Controlar la fuerza rotacional mediante un embrague", + "create.ponder.clutch.text_1": "Los embragues transmitirán la rotación en línea recta", + "create.ponder.clutch.text_2": "Cuando se alimentan con redstone, rompen la conexión", + + "create.ponder.cog_speedup.header": "Cambiar de marchas con engranajes", + "create.ponder.cog_speedup.text_1": "Los engranajes grandes y pequeños pueden conectarse en diagonal", + "create.ponder.cog_speedup.text_2": "Al cambiar de engranajes grandes a pequeños, la velocidad rotacional se duplicará", + "create.ponder.cog_speedup.text_3": "Inversamente, la velocidad rotacional se reducirá a la mitad", + + "create.ponder.cogwheel.header": "Transmitir fuerza rotacional mediante engranajes", + "create.ponder.cogwheel.text_1": "Los engranajes transmitirán la rotación a otros engranajes adyacentes", + "create.ponder.cogwheel.text_2": "Los ejes adyacentes conectados así, girarán en direcciones opuestas", + + "create.ponder.creative_fluid_tank.header": "Tanque de fluídos creativo", + "create.ponder.creative_fluid_tank.text_1": "Creative Fluid Tanks can be used to provide a bottomless supply of fluid", + "create.ponder.creative_fluid_tank.text_2": "Right-Click with a fluid containing item to configure it", + "create.ponder.creative_fluid_tank.text_3": "Pipe Networks can now endlessly draw the assigned fluid from the tank", + "create.ponder.creative_fluid_tank.text_4": "Any Fluids pushed back into a Creative Fluid Tank will be voided", + + "create.ponder.creative_motor.header": "Generar fuerza rotacional con motores creativos", + "create.ponder.creative_motor.text_1": "Los motores creativos son una fuente compacta y configurable de fuerza rotacional", + "create.ponder.creative_motor.text_2": "Usar la rueda de desplazamiento del ratón en su parte trasera cambia las RPM de la salida rotacional", + + "create.ponder.crushing_wheels.header": "Procesar objetos con las ruedas trituradoras", + "create.ponder.crushing_wheels.text_1": "Un par de ruedas trituradoras pueden moler objetos de forma muy eficaz", + "create.ponder.crushing_wheels.text_2": "Su fuerza rotacional tiene que hacerlas girar una contra otra", + "create.ponder.crushing_wheels.text_3": "Los objetos lanzados o insertados en la parte superior serán procesados", + "create.ponder.crushing_wheels.text_4": "Los objetos también pueden ser insertados y recogidos a través de medios automatizados", + + "create.ponder.deployer.header": "Usar el desplegador", + "create.ponder.deployer.text_1": "Dada la fuerza rotacional, un desplegador puede imitar las interacciones de los jugadores", + "create.ponder.deployer.text_10": "Haz clic derecho en el frente para darle un objeto a utilizar", + "create.ponder.deployer.text_11": "Los objetos también pueden ser insertados automáticamente", + "create.ponder.deployer.text_12": "Los desplegadores llevan una ranura de filtro", + "create.ponder.deployer.text_13": "Cuando se establece un filtro, sólo se activa mientras se mantiene un elemento coincidente", + "create.ponder.deployer.text_14": "Ahora sólo se pueden insertar los objetos que coincidan con el filtro...", + "create.ponder.deployer.text_15": "...y sólo se extraerán los objetos que no coincidan", + "create.ponder.deployer.text_2": "Siempre interactuará con la posición 2 bloques delante de sí mismo", + "create.ponder.deployer.text_3": "Los bloques situados directamente delante no lo obstruirán", + "create.ponder.deployer.text_4": "Los desplegadores pueden:", + "create.ponder.deployer.text_5": "Colocar bloques,", + "create.ponder.deployer.text_6": "Usar objetos,", + "create.ponder.deployer.text_7": "Activar bloques,", + "create.ponder.deployer.text_8": "Cosechar bloques", + "create.ponder.deployer.text_9": "Y atacar criaturas", + + "create.ponder.deployer_contraption.header": "Usar desplegadores en artilugios", + "create.ponder.deployer_contraption.text_1": "Siempre que los desplegadores se muevan como parte de un artilugio animado...", + "create.ponder.deployer_contraption.text_2": "Se activan en cada ubicación visitada, utilizando objetos de los inventarios de cualquier parte del artilugio", + "create.ponder.deployer_contraption.text_3": "La ranura para filtros se puede utilizar para especificar qué objetos tirar", + + "create.ponder.deployer_modes.header": "Modos del desplegador", + "create.ponder.deployer_modes.text_1": "Por defecto, un desplegador imita la interacción del clic derecho del ratón", + "create.ponder.deployer_modes.text_2": "Usando una llave inglesa, se puede configurar para imitar un clic izquierdo en su lugar", + + "create.ponder.deployer_processing.header": "Procesar objetos mediante desplegadores", + "create.ponder.deployer_processing.text_1": "Con un objeto de sujeción ajustado, los desplegadores pueden procesar los objetos proporcionados por debajo de ellos", + "create.ponder.deployer_processing.text_2": "Los objetos de entrada pueden soltarse o colocarse en un depósito bajo el desplegador", + "create.ponder.deployer_processing.text_3": "Cuando los objetos se proporcionan en una 'cinta'...", + "create.ponder.deployer_processing.text_4": "El desplegador los retendrá y procesará automáticamente", + + "create.ponder.deployer_redstone.header": "Controlar desplegadores con redstone", + "create.ponder.deployer_redstone.text_1": "Al controlar los desplegadores con redstone, éstos no se activarán", + "create.ponder.deployer_redstone.text_2": "Antes de detenerse, el desplegador terminará cualquier ciclo iniciado", + "create.ponder.deployer_redstone.text_3": "Por lo tanto, un pulso negativo puede ser utilizado para desencadenar exactamente un ciclo de activación", + + "create.ponder.depot.header": "Usar depósitos", + "create.ponder.depot.text_1": "Los depósitos pueden servir como objetos 'fijos' de la correa", + "create.ponder.depot.text_2": "Haz clic derecho para colocar o eliminar manualmente objetos del mismo", + "create.ponder.depot.text_3": "Al igual que las correas mecánicas, pueden proporcionar objetos para su procesamiento", + "create.ponder.depot.text_4": "...así como proporcionar objetos a los brazos mecánicos", + + "create.ponder.empty_blaze_burner.header": "Usar quemadores de blaze vacíos", + "create.ponder.empty_blaze_burner.text_1": "Haz clic derecho en un blaze con el quemador vacío para capturarlo", + "create.ponder.empty_blaze_burner.text_2": "Alternativamente, los blaze pueden ser recogidos de sus spawners directamente", + "create.ponder.empty_blaze_burner.text_3": "Ahora tienes una fuente de calor ideal para varias máquinas", + "create.ponder.empty_blaze_burner.text_4": "Por motivos estéticos, los quemadores de blaze vacíos también se pueden encender con pedernal y acero", + "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: The flame can be transformed using a soul-infused item", + "create.ponder.empty_blaze_burner.text_6": "Sin embargo, no son adecuados para la calefacción industrial", + + "create.ponder.encased_fluid_pipe.header": "Revestir tuberías de fluídos", + "create.ponder.encased_fluid_pipe.text_1": "Copper Casing can be used to decorate Fluid Pipes", + "create.ponder.encased_fluid_pipe.text_2": "Aside from being conceiled, Encased Pipes are locked into their connectivity state", + "create.ponder.encased_fluid_pipe.text_3": "It will no longer react to any neighbouring blocks being added or removed", + + "create.ponder.fan_direction.header": "El flujo de aire de los ventiladores revestidos", + "create.ponder.fan_direction.text_1": "Los ventiladores revestidos utilizan la fuerza rotacional para crear una corriente de aire", + "create.ponder.fan_direction.text_2": "La fuerza y la dirección del flujo dependen de la fuerza rotacional suministrada", + + "create.ponder.fan_processing.header": "Procesar objetos mediante ventiladores revestidos", + "create.ponder.fan_processing.text_1": "Al pasar por lava, el flujo de aire se calienta", + "create.ponder.fan_processing.text_2": "Los objetos capturados en la zona serán fundidos", + "create.ponder.fan_processing.text_3": "Los artículos de comida arrojados aquí serán incinerados", + "create.ponder.fan_processing.text_4": "En su lugar, se debería utilizar una instalación de ahumado, usando fuego", + "create.ponder.fan_processing.text_5": "Los flujos de aire que pasan por el agua crean una instalación de lavado", + "create.ponder.fan_processing.text_6": "Se puede hacer un nuevo e interesante procesamiento con él", + "create.ponder.fan_processing.text_7": "La velocidad del ventilador NO afecta a la velocidad de procesamiento, sólo a su rango", + "create.ponder.fan_processing.text_8": "El procesamiento del ventilador también puede aplicarse a los objetos de los depósitos y las correas", + + "create.ponder.fan_source.header": "Generar fuerza rotacional mediante ventiladores revestidos", + "create.ponder.fan_source.text_1": "Los ventiladores orientados hacia una fuente de calor pueden proporcionar fuerza rotacional", + "create.ponder.fan_source.text_2": "Cuando se les da una señal de redstone, los ventiladores comenzarán a proporcionar fuerza", + + "create.ponder.fluid_pipe_flow.header": "Transportar fluidos mediante tuberías de cobre", + "create.ponder.fluid_pipe_flow.text_1": "Fluid Pipes can connect two or more fluid sources and targets", + "create.ponder.fluid_pipe_flow.text_2": "Using a wrench, a straight pipe segment can be given a window", + "create.ponder.fluid_pipe_flow.text_3": "Windowed pipes will not connect to any other adjacent pipe segments", + "create.ponder.fluid_pipe_flow.text_4": "Powered by Mechanical Pumps, the Pipes can transport Fluids", + "create.ponder.fluid_pipe_flow.text_5": "No fluid is being extracted at first", + "create.ponder.fluid_pipe_flow.text_6": "Once the flow connects them, the endpoints gradually transfer their contents", + "create.ponder.fluid_pipe_flow.text_7": "Thus, the Pipe blocks themselves never 'physically' contain any fluid", + + "create.ponder.fluid_pipe_interaction.header": "Drenaje y llenado de contenedores de fluidos", + "create.ponder.fluid_pipe_interaction.text_1": "Endpoints of a pipe network can interact with a variety of blocks", + "create.ponder.fluid_pipe_interaction.text_2": "Any block with fluid storage capabilities can be filled or drained", + "create.ponder.fluid_pipe_interaction.text_3": "Source blocks right in front of an open end can be picked up...", + "create.ponder.fluid_pipe_interaction.text_4": "...while spilling into empty spaces can create fluid sources", + "create.ponder.fluid_pipe_interaction.text_5": "Pipes can also extract fluids from a handful of other blocks directly", + + "create.ponder.fluid_tank_sizes.header": "Dimensiones de un depósito de fluidos", + "create.ponder.fluid_tank_sizes.text_1": "Fluid Tanks can be combined to increase the total capacity", + "create.ponder.fluid_tank_sizes.text_2": "Their base square can be up to 3 blocks wide...", + "create.ponder.fluid_tank_sizes.text_3": "...and grow in height by more than 30 additional layers", + "create.ponder.fluid_tank_sizes.text_4": "Using a Wrench, a tanks' window can be toggled", + + "create.ponder.fluid_tank_storage.header": "Almacenar fluidos en depósitos de fluidos", + "create.ponder.fluid_tank_storage.text_1": "Fluid Tanks can be used to store large amounts of fluid", + "create.ponder.fluid_tank_storage.text_2": "Pipe networks can push and pull fluids from any side", + "create.ponder.fluid_tank_storage.text_3": "The contained fluid can be measured by a Comparator", + "create.ponder.fluid_tank_storage.text_4": "However, in Survival Mode Fluids cannot be added or taken manually", + "create.ponder.fluid_tank_storage.text_5": "You can use Basins, Item Drains and Spouts to drain or fill fluid containing items", + + "create.ponder.flywheel.header": "Generar fuerza rotacional con la rueda de inercia", + "create.ponder.flywheel.text_1": "Las ruedas de inercia son necesarias para generar fuerza rotacional con el motor de horno", + "create.ponder.flywheel.text_2": "La fuerza rotacional proporcionada tiene una capacidad de estrés muy grande", + "create.ponder.flywheel.text_3": "El uso de un alto horno duplicará la eficiencia del motor", + + "create.ponder.funnel_compat.header": "Compatibilidades con el embudo", + "create.ponder.funnel_compat.text_1": "Los embudos deberían interactuar bien con un puñado de otros componentes", + "create.ponder.funnel_compat.text_2": "Sierras verticales", + "create.ponder.funnel_compat.text_3": "Depósitos", + "create.ponder.funnel_compat.text_4": "Drenadores de objetos", + + "create.ponder.funnel_direction.header": "Dirección de la transferencia", + "create.ponder.funnel_direction.text_1": "Colocado normalmente, extrae objetos del inventario", + "create.ponder.funnel_direction.text_2": "Colocado mientras pulsa [Mayús izdo.], pone objetos en el inventario", + "create.ponder.funnel_direction.text_3": "Usando una llave inglesa, el embudo puede ser volteado después de su colocación", + "create.ponder.funnel_direction.text_4": "Se aplicarán las mismas reglas para la mayoría de las orientaciones", + "create.ponder.funnel_direction.text_5": "Los embudos en las correas extraerán/insertarán dependiendo de su dirección de movimiento", + + "create.ponder.funnel_intro.header": "Usar embudos", + "create.ponder.funnel_intro.text_1": "Los embudos son ideales para transferir objetos desde y hacia los inventarios", + + "create.ponder.funnel_redstone.header": "Embudos alimentados con redstone", + "create.ponder.funnel_redstone.text_1": "La energía de redstone impedirá la actuación de cualquier embudo", + + "create.ponder.funnel_transfer.header": "Transferencia directa", + "create.ponder.funnel_transfer.text_1": "Los embudos no pueden transferir nunca entre inventarios cerrados directamente", + "create.ponder.funnel_transfer.text_2": "Los ductos o los ductos inteligentes podrían ser más adecuados para estos fines", + "create.ponder.funnel_transfer.text_3": "Lo mismo se aplica para el movimiento horizontal. Una correa mecánica debería ayudar aquí", + + "create.ponder.furnace_engine.header": "Generar fuerza rotacional con el motor de horno", + "create.ponder.furnace_engine.text_1": "Los motores de horno generan fuerza rotacional mientras su horno adjunto está funcionando", + "create.ponder.furnace_engine.text_2": "La fuerza rotacional proporcionada tiene una capacidad de estrés muy grande", + "create.ponder.furnace_engine.text_3": "El uso de un alto horno duplicará la eficiencia del motor", + + "create.ponder.gantry_carriage.header": "Usar carros de grúa", + "create.ponder.gantry_carriage.text_1": "Los carros de grúa pueden montarse y deslizarse a lo largo de un eje de grúa", + "create.ponder.gantry_carriage.text_2": "Las instalaciones de grúa pueden mover bloques adjuntos", + + "create.ponder.gantry_cascaded.header": "Grúas en cascada", + "create.ponder.gantry_cascaded.text_1": "Los ejes de grúas se unen a un carro de grúa sin necesidad de pegamento", + "create.ponder.gantry_cascaded.text_2": "Lo mismo se aplica a los carros de grúa en los ejes de grúas desplazados", + "create.ponder.gantry_cascaded.text_3": "Así, un sistema de grúas puede estar en cascada para cubrir múltiples ejes de movimiento", + + "create.ponder.gantry_direction.header": "Dirección del movimiento de la grúa", + "create.ponder.gantry_direction.text_1": "Los ejes de grúa pueden tener orientaciones opuestas", + "create.ponder.gantry_direction.text_2": "La dirección de movimiento de los carros de grúa depende de la orientación de sus ejes", + "create.ponder.gantry_direction.text_3": "...así como de su sentido de rotación", + "create.ponder.gantry_direction.text_4": "Se aplican las mismas reglas para la rotación propagada", + + "create.ponder.gantry_redstone.header": "Propagación de la potencia de la grúa", + "create.ponder.gantry_redstone.text_1": "Los ejes de grúa alimentados con redstone dejan de mover sus carros", + "create.ponder.gantry_redstone.text_2": "En su lugar, su fuerza rotacional se transmite al eje de salida de los carros", + + "create.ponder.gantry_shaft.header": "Usar ejes de grúa", + "create.ponder.gantry_shaft.text_1": "Los ejes de grúa forman la base de una instalación de grúas. Los carros adjuntos se moverán a lo largo de ellos", + "create.ponder.gantry_shaft.text_2": "Las instalaciones de grúas pueden mover los bloques adjuntos", + + "create.ponder.gearbox.header": "Transmitir fuerza rotacional mediante cajas de transmisión", + "create.ponder.gearbox.text_1": "Saltar entre ejes de rotación puede volverse voluminoso rápidamente", + "create.ponder.gearbox.text_2": "Una caja de transmisión es el equivalente más compacto de esta configuración", + "create.ponder.gearbox.text_3": "Los ejes giran en las direcciones reflejadas...", + "create.ponder.gearbox.text_4": "...esto quiere decir que las conexiones rectas se invierten", + + "create.ponder.gearshift.header": "Controlar la dirección rotacional mediante una caja de cambios", + "create.ponder.gearshift.text_1": "La caja de cambios transmitirá la rotación en línea recta", + "create.ponder.gearshift.text_2": "Cuando es alimentada con redstone, invierte la transmisión", + + "create.ponder.hand_crank.header": "Generar fuerza rotacional mediante manivelas", + "create.ponder.hand_crank.text_1": "Las manivelas pueden ser utilizadas para aplicar fuerza rotacional manualmente", + "create.ponder.hand_crank.text_2": "Mantén pulsado clic derecho para girar en sentido antihorario", + "create.ponder.hand_crank.text_3": "Su velocidad de transmisión es relativamente alta", + "create.ponder.hand_crank.text_4": "[Mayús izdo.] + clic derecho pulsado para girar en sentido horario", + + "create.ponder.hose_pulley.header": "Llenado y vaciado de fuentes mediante poleas de manguera", + "create.ponder.hose_pulley.text_1": "Hose Pulleys can be used to fill or drain large bodies of Fluid", + "create.ponder.hose_pulley.text_2": "With the Kinetic Input, the height of the pulleys' hose can be controlled", + "create.ponder.hose_pulley.text_3": "The Pulley retracts while the input rotation is inverted", + "create.ponder.hose_pulley.text_4": "On the opposite side, pipes can be connected", + "create.ponder.hose_pulley.text_5": "Attached pipe networks can either provide fluid to the hose...", + "create.ponder.hose_pulley.text_6": "...or pull from it, draining the pool instead", + "create.ponder.hose_pulley.text_7": "Fill and Drain speed of the pulley depends entirely on the fluid networks' throughput", + + "create.ponder.hose_pulley_infinite.header": "Llenado y drenaje pasivo de grandes masas de fluido", + "create.ponder.hose_pulley_infinite.text_1": "When deploying the Hose Pulley into a large enough ocean...", + "create.ponder.hose_pulley_infinite.text_2": "It will provide/dispose fluids without affecting the source", + "create.ponder.hose_pulley_infinite.text_3": "Pipe networks can limitlessly take fluids from/to such pulleys", + + "create.ponder.hose_pulley_level.header": "Nivel de llenado y vaciado de las poleas de las mangueras", + "create.ponder.hose_pulley_level.text_1": "While fully retracted, the Hose Pulley cannot operate", + "create.ponder.hose_pulley_level.text_2": "Draining runs from top to bottom", + "create.ponder.hose_pulley_level.text_3": "The surface level will end up just below where the hose ends", + "create.ponder.hose_pulley_level.text_4": "Filling runs from bottom to top", + "create.ponder.hose_pulley_level.text_5": "The filled pool will not grow beyond the layer above the hose end", + + "create.ponder.item_drain.header": "Vaciar contenedores de fluidos mediante drenajes de objetos", + "create.ponder.item_drain.text_1": "Item Drains can extract fluids from items", + "create.ponder.item_drain.text_2": "Right-click it to pour fluids from your held item into it", + "create.ponder.item_drain.text_3": "When items are inserted from the side...", + "create.ponder.item_drain.text_4": "...they roll across, emptying out their contained fluid", + "create.ponder.item_drain.text_5": "Pipe Networks can now pull the fluid from the drains' internal buffer", + + "create.ponder.large_cogwheel.header": "Transmitir fuerza rotacional mediante engranajes grandes", + "create.ponder.large_cogwheel.text_1": "Los engranajes grandes pueden conectarse entre sí en ángulo recto", + "create.ponder.large_cogwheel.text_2": "Ayudarán a transmitir la velocidad transportada a otros ejes de rotación.", + + "create.ponder.linear_chassis_attachment.header": "Fijar bloques mediante el chasis lineal", + "create.ponder.linear_chassis_attachment.text_1": "Las caras abiertas de un chasis lineal pueden hacerse pegajosas", + "create.ponder.linear_chassis_attachment.text_2": "Haz clic de nuevo para que se pegue el lado opuesto", + "create.ponder.linear_chassis_attachment.text_3": "[Mayús izdo.] + clic derecho con la mano vacía para eliminar el pegamento", + "create.ponder.linear_chassis_attachment.text_4": "Las caras pegadas del chasis lineal fijarán una línea de bloques delante de él", + "create.ponder.linear_chassis_attachment.text_5": "Utilizando una llave inglesa, se puede especificar un rango preciso", + "create.ponder.linear_chassis_attachment.text_6": "Manteniendo pulsada la tecla [Ctrl] y usando la rueda central del ratón, se ajusta el rango de todos los bloques de chasis adjuntos", + "create.ponder.linear_chassis_attachment.text_7": "Para fijar los bloques a cualquier otro lado es necesario utilizar pegamento", + "create.ponder.linear_chassis_attachment.text_8": "Utilizando esta mecánica, las estructuras de cualquier forma pueden moverse como un artilugio", + + "create.ponder.linear_chassis_group.header": "Mover chasis lineales en grupos", + "create.ponder.linear_chassis_group.text_1": "Los chasis lineales se conectan a los bloques de chasis idénticos que se encuentren a su lado", + "create.ponder.linear_chassis_group.text_2": "Cuando uno es movido por un artilugio, los otros son arrastrados con él", + "create.ponder.linear_chassis_group.text_3": "Los chasis de otro tipo u orientados en otra dirección no se fijan", + + "create.ponder.mechanical_arm.header": "Configurar los brazos mecánicos", + "create.ponder.mechanical_arm.text_1": "A los brazos mecánicos hay que asignarles sus entradas y salidas antes de colocarlos", + "create.ponder.mechanical_arm.text_2": "Clic derecho en los inventarios mientras mantiene el brazo mecánico para asignarlos como objetivos", + "create.ponder.mechanical_arm.text_3": "Clic derecho denuevo para alternar entre la entrada (azul) y la salida (naranja)", + "create.ponder.mechanical_arm.text_4": "Clic izquierdo en los componentes para eliminar su selección", + "create.ponder.mechanical_arm.text_5": "Una vez colocado, el brazo mecánico apuntará a los bloques seleccionados previamente", + "create.ponder.mechanical_arm.text_6": "Pueden tener cualquier cantidad de entradas y salidas dentro de su rango", + "create.ponder.mechanical_arm.text_7": "Sin embargo, no se puede interactuar directamente con todos los tipos de inventario", + "create.ponder.mechanical_arm.text_8": "Los embudos y depósitos pueden ayudar a salvar esa distancia", + + "create.ponder.mechanical_arm_filtering.header": "Filtrar salidas del brazo mecánico", + "create.ponder.mechanical_arm_filtering.text_1": "Entradas", + "create.ponder.mechanical_arm_filtering.text_2": "Salidas", + "create.ponder.mechanical_arm_filtering.text_3": "A veces es conveniente restringir los objetivos del brazo mecánico haciendo coincidir un filtro", + "create.ponder.mechanical_arm_filtering.text_4": "Por sí mismos no ofrecen ninguna opción de filtrado", + "create.ponder.mechanical_arm_filtering.text_5": "Sin embargo, los embudos de latón como objetivos comunican su propio filtro al brazo", + "create.ponder.mechanical_arm_filtering.text_6": "El brazo mecánico es lo suficientemente inteligente como para no recoger objetos que no podría distribuir", + + "create.ponder.mechanical_arm_modes.header": "Modos de distribución del brazo mecánico", + "create.ponder.mechanical_arm_modes.text_1": "Entradas", + "create.ponder.mechanical_arm_modes.text_2": "Salidas", + "create.ponder.mechanical_arm_modes.text_3": "Siempre que un brazo tenga que elegir entre varias salidas válidas...", + "create.ponder.mechanical_arm_modes.text_4": "...funcionará según su configuración", + "create.ponder.mechanical_arm_modes.text_5": "Usando la rueda del ratón con una llave inglesa te permitirá configurarlo", + "create.ponder.mechanical_arm_modes.text_6": "El modo Round Robin simplemente hace un ciclo a través de todas las salidas que están disponibles", + "create.ponder.mechanical_arm_modes.text_7": "Si una salida no puede admitir más objetos, se omitirá", + "create.ponder.mechanical_arm_modes.text_8": "El modo Round Robin forzado nunca omitirá las salidas, sino que esperará a que estén libres", + "create.ponder.mechanical_arm_modes.text_9": "Preferir el primero da prioridad a las salidas seleccionadas anteriormente al configurar este brazo", + + "create.ponder.mechanical_arm_redstone.header": "Controlar brazos mecánicos con redstone", + "create.ponder.mechanical_arm_redstone.text_1": "Cuando se alimentan con redstone, los brazos mecánicos no se activan", + "create.ponder.mechanical_arm_redstone.text_2": "Antes de detenerse, terminará los ciclos iniciados", + "create.ponder.mechanical_arm_redstone.text_3": "Así, un pulso negativo puede utilizarse para activar exactamente un ciclo de activación", + + "create.ponder.mechanical_bearing.header": "Mover estructuras mediante el rodamiento mecánico", + "create.ponder.mechanical_bearing.text_1": "Los rodamientos mecánicos se fijan al bloque que tienen delante", + "create.ponder.mechanical_bearing.text_2": "Al recibir fuerza rotacional, la ensamblará en un artilugio giratorio", + + "create.ponder.mechanical_crafter.header": "Configurar ensambladores mecánicos", + "create.ponder.mechanical_crafter.text_1": "Se puede utilizar una serie de ensambladores mecánicos para automatizar cualquier receta de elaboración.", + "create.ponder.mechanical_crafter.text_2": "Usando una llave inglesa, puedes establecer los caminos de los ensambladores ", + "create.ponder.mechanical_crafter.text_3": "Para que la configuración sea válida, todos los caminos tienen que converger en una salida, en cualquiera de los lados", + "create.ponder.mechanical_crafter.text_4": "Los puertos de salida de objetos se colocarán en un inventario a la salida", + "create.ponder.mechanical_crafter.text_5": "Los ensambladores mecánicos requieren fuerza rotacional para funcionar", + "create.ponder.mechanical_crafter.text_6": "Haga clic derecho en la parte delantera para insertar objetos manualmente", + "create.ponder.mechanical_crafter.text_7": "Una vez que cada ranura de una ruta contenga un objeto, comenzará el proceso de elaboración", + "create.ponder.mechanical_crafter.text_8": "Para las recetas que no ocupen totalmente la instalación del ensamblador, se puede forzar el arranque utilizando un pulso de redstone", + + "create.ponder.mechanical_crafter_connect.header": "Conectar inventarios a los ensambladores mecánicos", + "create.ponder.mechanical_crafter_connect.text_1": "Los objetos pueden ser insertados a los ensambladores mecánicos automáticamente", + "create.ponder.mechanical_crafter_connect.text_2": "Utilizando la llave inglesa a sus espaldas, las entradas pueden combinarse", + "create.ponder.mechanical_crafter_connect.text_3": "Ahora se puede acceder a todos los ensambladores mecánicos conectados por la misma ubicación de entrada", + + "create.ponder.mechanical_crafter_covers.header": "Cubrir las ranuras de los ensambladores mecánicos", + "create.ponder.mechanical_crafter_covers.text_1": "Algunas recetas requerirán ensambladores mecánicos adicionales para salvar las brechas en el camino", + "create.ponder.mechanical_crafter_covers.text_2": "Utilizando las tapas de ranuras del ensamblador mecánico, pueden actuar como una ranura vacía a su disposición", + "create.ponder.mechanical_crafter_covers.text_3": "Las entradas compartidas creadas con la llave inglesa en la parte posterior también pueden llegar a través de los ensambladores revestidos", + + "create.ponder.mechanical_drill.header": "Romper bloques con el taladro mecánico", + "create.ponder.mechanical_drill.text_1": "Cuando se le aplica fuerza rotacional, el taladro mecánico rompe los bloques que tiene delante.", + "create.ponder.mechanical_drill.text_2": "Su velocidad de trabajo depende de la fuerza rotacional suministrada", + + "create.ponder.mechanical_drill_contraption.header": "Usar taladros mecánicos en artilugios", + "create.ponder.mechanical_drill_contraption.text_1": "Siempre que los taladros mecánicos se muevan como parte de un artilugio animado...", + "create.ponder.mechanical_drill_contraption.text_2": "...romperán los bloques por los que artilugio los hace pasar", + + "create.ponder.mechanical_harvester.header": "Utilizar cosechadoras mecánicas en artilugios", + "create.ponder.mechanical_harvester.text_1": "Siempre que las cosechadoras mecánicas se muevan como parte de un artilugio animado...", + "create.ponder.mechanical_harvester.text_2": "...recogerán y repondrán los cultivos maduros en su camino", + + "create.ponder.mechanical_mixer.header": "Procesar objetos con la mezcladora mecánica", + "create.ponder.mechanical_mixer.text_1": "Con una mezcladora mecánica y una cuenca, se pueden automatizar algunas recetas", + "create.ponder.mechanical_mixer.text_2": "Las recetas disponibles incluyen cualquier receta de elaboración amorfa, además de un par de recetas adicionales", + "create.ponder.mechanical_mixer.text_3": "Algunas de esas recetas pueden requerir el calor de un quemador de blaze", + "create.ponder.mechanical_mixer.text_4": "La ranura para filtros se puede utilizar en caso de que dos recetas sean conflictivas.", + + "create.ponder.mechanical_piston.header": "Mover estructuras mediante pistones mecánicos", + "create.ponder.mechanical_piston.text_1": "Los pistones mecánicos pueden mover los bloques que tienen delante", + "create.ponder.mechanical_piston.text_2": "La velocidad y la dirección del movimiento dependen de la fuerza rotacional suministrada", + "create.ponder.mechanical_piston.text_3": "Los pistones mecánicos pegajosos pueden tirar de los bloques unidos hacia atrás", + + "create.ponder.mechanical_piston_modes.header": "Modos de movimiento del pistón mecánico", + "create.ponder.mechanical_piston_modes.text_1": "Cuando los pistones mecánicos dejan de moverse, la estructura movida vuelve a los bloques", + "create.ponder.mechanical_piston_modes.text_2": "Puede configurarse para que no vuelva nunca a los bloques sólidos, o sólo en la ubicación en la que comenzó", + + "create.ponder.mechanical_plough.header": "Utilizar arados mecánicos en los artilugios", + "create.ponder.mechanical_plough.text_1": "Cuando los arados mecánicos se mueven como parte de un artilugio animado...", + "create.ponder.mechanical_plough.text_2": "...romperán los bloques sin un hitbox de colisión sólido", + "create.ponder.mechanical_plough.text_3": "Además, pueden crear tierras de cultivo", + "create.ponder.mechanical_plough.text_4": "...también pueden lanzar entidades sin dañarlas", + + "create.ponder.mechanical_press.header": "Procesar objetos con la prensa mecánica", + "create.ponder.mechanical_press.text_1": "La prensa mecánica puede procesar los objetos proporcionados por debajo de ella", + "create.ponder.mechanical_press.text_2": "Los objetos de entrada pueden soltarse o colocarse en un depósito bajo la prensa", + "create.ponder.mechanical_press.text_3": "Cuando los objetos se proporcionan en una 'cinta'...", + "create.ponder.mechanical_press.text_4": "...la prensa mecánica los retendrá y procesará automáticamente", + + "create.ponder.mechanical_press_compacting.header": "Compactar objetos con la prensa mecánica", + "create.ponder.mechanical_press_compacting.text_1": "Al presionar los objetos que se encuentran en una cuenca, éstos se compactan.", + "create.ponder.mechanical_press_compacting.text_2": "La compactación incluye cualquier receta de elaboración de 2x2 o 3x3 rellena, además de un par extra", + "create.ponder.mechanical_press_compacting.text_3": "Algunas de esas recetas pueden requerir el calor de un quemador de blaze", + "create.ponder.mechanical_press_compacting.text_4": "La ranura para filtros se puede utilizar en caso de que dos recetas sean conflictivas.", + + "create.ponder.mechanical_pump_flow.header": "Transportar fluidos mediante bombas mecánicas", + "create.ponder.mechanical_pump_flow.text_1": "Mechanical Pumps govern the flow of their attached pipe networks", + "create.ponder.mechanical_pump_flow.text_2": "When powered, their arrow indicates the direction of flow", + "create.ponder.mechanical_pump_flow.text_3": "The network behind is now pulling fluids...", + "create.ponder.mechanical_pump_flow.text_4": "...while the network in front is transferring it outward", + "create.ponder.mechanical_pump_flow.text_5": "Reversing the input rotation reverses the direction of flow", + "create.ponder.mechanical_pump_flow.text_6": "Use a Wrench to reverse the orientation of pumps manually", + + "create.ponder.mechanical_pump_speed.header": "Rendimiento de las bombas mecánicas", + "create.ponder.mechanical_pump_speed.text_1": "Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away", + "create.ponder.mechanical_pump_speed.text_2": "Speeding up the input rotation changes the speed of flow propagation...", + "create.ponder.mechanical_pump_speed.text_3": "...aswell as how quickly fluids are transferred", + "create.ponder.mechanical_pump_speed.text_4": "Pumps can combine their throughputs within shared pipe networks", + "create.ponder.mechanical_pump_speed.text_5": "Alternating their orientation can help align their flow directions", + + "create.ponder.mechanical_saw_breaker.header": "Cortar árboles con la sierra mecánica", + "create.ponder.mechanical_saw_breaker.text_1": "Cuando se le da una fuerza rotacional, la sierra mecánica cortará los árboles que estén directamente frente a ella", + "create.ponder.mechanical_saw_breaker.text_2": "Para poder cortar el árbol por completo, la sierra tiene que romper el último bloque que lo une al suelo", + + "create.ponder.mechanical_saw_contraption.header": "Utilizar sierras mecánicas en artilugios", + "create.ponder.mechanical_saw_contraption.text_1": "Cuando las sierras mecánicas se mueven como parte de un artilugio animado...", + "create.ponder.mechanical_saw_contraption.text_2": "...cortarán cualquier árbol con el que el artilugio se tope", + + "create.ponder.mechanical_saw_processing.header": "Procesar objetos en la sierra mecánica", + "create.ponder.mechanical_saw_processing.text_1": "Las sierras mecánicas orientadas hacia arriba pueden procesar una variedad de objetos", + "create.ponder.mechanical_saw_processing.text_2": "El objeto procesado siempre se mueve en contra de la fuerza rotacional de la sierra", + "create.ponder.mechanical_saw_processing.text_3": "Las sierras mecánicas pueden trabajar en línea con las correas mecánicas", + "create.ponder.mechanical_saw_processing.text_4": "Cuando un ingrediente tiene varios resultados posibles, la ranura para filtros puede especificarlo", + "create.ponder.mechanical_saw_processing.text_5": "Sin filtro, al contrario, la sierra mecánica pasaría por todos los resultados", + + "create.ponder.millstone.header": "Procesar objetos en la piedra de molino", + "create.ponder.millstone.text_1": "Las piedras de molino procesan los objetos mediante la molienda", + "create.ponder.millstone.text_2": "Se pueden accionar lateralmente mediante engranajes...", + "create.ponder.millstone.text_3": "... y tirar o insertar objetos en la parte superior", + "create.ponder.millstone.text_4": "Después de un tiempo, el resultado se puede obtener usando el clic derecho del ratón", + "create.ponder.millstone.text_5": "Las salidas también pueden extraerse mediante la automatización", + + "create.ponder.nixie_tube.header": "Usar los tubos Nixie", + "create.ponder.nixie_tube.text_1": "Cuando son alimentados con redstone, los tubos nixie mostrarán la fuerza de las señales de redstone", + "create.ponder.nixie_tube.text_2": "Con las etiquetas editadas en un yunque, pueden mostar un texto personalizado", + "create.ponder.nixie_tube.text_3": "UNLOCALIZED: Right-Click with Dye to change their display colour", + + "create.ponder.piston_pole.header": "Pértigas de extensión de pistones", + "create.ponder.piston_pole.text_1": "Sin las pértigas de extensión unidas, un pistón mecánico no puede moverse", + "create.ponder.piston_pole.text_2": "La longitud de la pértiga añadida en su parte posterior determina el rango de alcance", + + "create.ponder.portable_fluid_interface.header": "Interfaz de fluidos portátil", + "create.ponder.portable_fluid_interface.text_1": "Fluid Tanks on moving contraptions cannot be accessed by any pipes", + "create.ponder.portable_fluid_interface.text_2": "This component can interact with fluid tanks without the need to stop the contraption", + "create.ponder.portable_fluid_interface.text_3": "Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_fluid_interface.text_4": "Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_fluid_interface.text_5": "While engaged, the stationary interface will represent ALL Tanks on the contraption", + "create.ponder.portable_fluid_interface.text_6": "Fluid can now be inserted...", + "create.ponder.portable_fluid_interface.text_7": "...or extracted from the contraption", + "create.ponder.portable_fluid_interface.text_8": "After no contents have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.header": "Interfaz de almacenamiento portátil", + "create.ponder.portable_storage_interface.text_1": "Los jugadores no pueden acceder a los inventarios de los artilugios en movimiento.", + "create.ponder.portable_storage_interface.text_2": "Este componente puede interactuar con el almacenamiento sin necesidad de detener el artilugio.", + "create.ponder.portable_storage_interface.text_3": "Coloca una segunda unidad con un espacio de 1 o 2 bloques entre ellas", + "create.ponder.portable_storage_interface.text_4": "Cada vez que pasen por delante del otro, entablarán una conexión", + "create.ponder.portable_storage_interface.text_5": "Mientras esté conectada, la interfaz fija representará TODOS los inventarios del artilugio", + "create.ponder.portable_storage_interface.text_6": "Ahora pueden insertarse objetos...", + "create.ponder.portable_storage_interface.text_7": "...o extraerse", + "create.ponder.portable_storage_interface.text_8": "Cuando no se hayan intercambiado objetos durante un tiempo, el artilugio seguirá su camino", + + "create.ponder.portable_storage_interface_redstone.header": "Interfaz de almacenamiento portátil controlada por redstone", + "create.ponder.portable_storage_interface_redstone.text_1": "La energía de redstone impedirá que las interfaces de almacenamiento portátil se conecten", + + "create.ponder.powered_latch.header": "Controlar señales mediante la palanca motorizada", + "create.ponder.powered_latch.text_1": "Las palancas motorizadas son palancas controlables por redstone", + "create.ponder.powered_latch.text_2": "Las señales en la parte trasera la encienden", + "create.ponder.powered_latch.text_3": "Las señales sobre un lateral la vuelven a apagar", + "create.ponder.powered_latch.text_4": "Las palancas motorizadas también se pueden accionar manualmente", + + "create.ponder.powered_toggle_latch.header": "Controlar señales mediante la palanca de cierre motorizada", + "create.ponder.powered_toggle_latch.text_1": "Las palancas de cierre motorizadas son palancas controlables por redstone", + "create.ponder.powered_toggle_latch.text_2": "Las señales en la parte trasera cambiarán su estado...", + "create.ponder.powered_toggle_latch.text_3": "...encender y apagar", + "create.ponder.powered_toggle_latch.text_4": "Las palancas de cierre motorizadas también se pueden accionar manualmente", + + "create.ponder.pulse_repeater.header": "Controlar señales mediante repetidores de pulsos", + "create.ponder.pulse_repeater.text_1": "Los repetidores de pulsos acortan cualquier señal de redstone a un solo pulso", + + "create.ponder.radial_chassis.header": "Fijar bloques mediante chasis radiales", + "create.ponder.radial_chassis.text_1": "Los chasis radiales se conectan a bloques de chasis idénticos en una fila", + "create.ponder.radial_chassis.text_2": "Cuando uno es movido por un artilugio, los otros son arrastrados con él", + "create.ponder.radial_chassis.text_3": "Las caras laterales de un chasis radial pueden hacerse adhesivas", + "create.ponder.radial_chassis.text_4": "Haga clic de nuevo para que todos los demás lados sean pegajosos", + "create.ponder.radial_chassis.text_5": "[Mayús izdo.] + clic derecho con la mano vacía para eliminar el pegamento", + "create.ponder.radial_chassis.text_6": "Cada vez que un bloque está junto a una cara pegajosa...", + "create.ponder.radial_chassis.text_7": "...adjuntará todos los bloques alcanzables dentro de un radio en esa capa", + "create.ponder.radial_chassis.text_8": "Con una llave inglesa y usando la rueda de desplazamiento del ratón se puede especificar un radio preciso", + "create.ponder.radial_chassis.text_9": "Los bloques no alcanzables por ninguna cara adhesiva no se fijarán", + + "create.ponder.redstone_contact.header": "Contactos de redstone", + "create.ponder.redstone_contact.text_1": "Los contactos de redstone enfrentados emitirán una señal de redstone", + "create.ponder.redstone_contact.text_2": "Esto sigue siendo válido cuando uno de ellos forma parte de un artilugio en movimiento", + + "create.ponder.redstone_link.header": "Usar los enlaces de redstone", + "create.ponder.redstone_link.text_1": "Los enlaces de redstone pueden transmitir señales redstone de forma inalámbrica", + "create.ponder.redstone_link.text_2": "[Mayús izdo.] + clic derecho para cambiar el modo de recepción", + "create.ponder.redstone_link.text_3": "Un simple clic derecho con una llave inglesa puede hacer lo mismo", + "create.ponder.redstone_link.text_4": "Los receptores emiten la potencia de redstone de los transmisores en 128 bloques", + "create.ponder.redstone_link.text_5": "Colocando objetos en las dos ranuras puede especificar una frecuencia", + "create.ponder.redstone_link.text_6": "Sólo se comunicarán los enlaces con frecuencias coincidentes", + + "create.ponder.rope_pulley.header": "Mover estructuras con poleas de cuerda", + "create.ponder.rope_pulley.text_1": "Las poleas de cuerda pueden mover los bloques verticalmente cuando se les aplica una fuerza rotacional", + "create.ponder.rope_pulley.text_2": "La dirección y la velocidad del movimiento dependen de la fuerza rotacional suministrada", + + "create.ponder.rope_pulley_attachment.header": "Mover poleas como parte de un artilugio", + "create.ponder.rope_pulley_attachment.text_1": "Siempre que las poleas de cuerda sean movidas por un artilugio...", + "create.ponder.rope_pulley_attachment.text_2": "...su estructura adjunta será arrastrada con ella", + "create.ponder.rope_pulley_attachment.text_3": "Tenga en cuenta que las poleas de cuerda sólo se mueven cuando están paradas", + + "create.ponder.rope_pulley_modes.header": "Modos de movimiento de la polea de cuerda", + "create.ponder.rope_pulley_modes.text_1": "Cuando las poleas de cuerda dejan de moverse, la estructura movida vuelve a los bloques", + "create.ponder.rope_pulley_modes.text_2": "Puede configurarse para que no vuelva nunca a los bloques sólidos, o sólo en la ubicación en la que comenzó", + + "create.ponder.rotation_speed_controller.header": "Usar el controlador de velocidad rotacional", + "create.ponder.rotation_speed_controller.text_1": "Los controladores de velocidad rotacional transmiten la rotación de su eje a un engranaje grande situado encima.", + "create.ponder.rotation_speed_controller.text_2": "Utilizando la rueda de desplazamiento del ratón, puede configurarse la velocidad rotacional", + + "create.ponder.sail.header": "Montar molinos de viento usando velas", + "create.ponder.sail.text_1": "Las velas son bloques muy útiles para crear molinos de viento", + "create.ponder.sail.text_2": "Se fijarán a los bloques y entre sí sin necesidad de pegamento o bloques de chasis", + "create.ponder.sail.text_3": "Clic derecho con un tinte para pintarlas", + "create.ponder.sail.text_4": "Clic derecho con una tijera para volver a convertirlas en marcos", + + "create.ponder.sail_frame.header": "Montar molinos de viento con marcos de vela", + "create.ponder.sail_frame.text_1": "Los marcos de vela son prácticos bloques para crear molinos de viento", + "create.ponder.sail_frame.text_2": "Se fijarán a los bloques y entre sí sin necesidad de pegamento o bloques de chasis", + + "create.ponder.sequenced_gearshift.header": "Controlar la velocidad de rotación mediante la caja de cambios secuenciales", + "create.ponder.sequenced_gearshift.text_1": "La caja de cambios secuencial retransmite la rotación siguiendo una lista cronometrada de instrucciones", + "create.ponder.sequenced_gearshift.text_2": "Haga clic con el botón derecho para abrir la interfaz de configuración", + "create.ponder.sequenced_gearshift.text_3": "Al recibir una señal de redstone, comenzará a ejecutar su secuencia configurada", + "create.ponder.sequenced_gearshift.text_4": "Una vez terminado, espera la siguiente señal de redstone y vuelve a empezar", + "create.ponder.sequenced_gearshift.text_5": "Se puede utilizar un comparador de redstone para leer el progreso actual", + + "create.ponder.shaft.header": "Transmitir fuerza rotacional mediante ejes", + "create.ponder.shaft.text_1": "Los ejes transmiten la rotación en línea recta.", + + "create.ponder.shaft_casing.header": "Ejes revestidos", + "create.ponder.shaft_casing.text_1": "Puedes utilizar el revestidor de latón o de andesita para decorar tus ejes", + + "create.ponder.smart_chute.header": "Filtrar objetos mediante ductos inteligentes", + "create.ponder.smart_chute.text_1": "Los ductos inteligentes son ductos verticales con control adicional", + "create.ponder.smart_chute.text_2": "Los objetos en la ranura para filtros especifican lo que pueden extraer y transferir exactamente", + "create.ponder.smart_chute.text_3": "Usa la rueda del ratón para especificar el tamaño de la pila extraída", + "create.ponder.smart_chute.text_4": "La energía de redstone impedirá que funcionen.", + + "create.ponder.smart_pipe.header": "Controlar el flujo de fluidos mediante tuberías inteligentes", + "create.ponder.smart_pipe.text_1": "Smart pipes can help control flows by fluid type", + "create.ponder.smart_pipe.text_2": "When placed directly at the source, they can specify the type of fluid to extract", + "create.ponder.smart_pipe.text_3": "Simply Right-Click their filter slot with any item containing the desired fluid", + "create.ponder.smart_pipe.text_4": "When placed further down a pipe network, smart pipes will only let matching fluids continue", + + "create.ponder.speedometer.header": "Controlar la información cinética mediante el velocímetro", + "create.ponder.speedometer.text_1": "El velocímetro muestra la velocidad actual de los componentes conectados", + "create.ponder.speedometer.text_2": "Cuando se usan las gafas del constructor, el jugador puede obtener información más detallada del medidor", + "create.ponder.speedometer.text_3": "Los comparadores pueden emitir señales analógicas de redstone en relación con las mediciones del velocímetro", + + "create.ponder.spout_filling.header": "Llenar objetos con un surtidor", + "create.ponder.spout_filling.text_1": "The Spout can fill fluid holding items provided beneath it", + "create.ponder.spout_filling.text_2": "The content of a Spout cannot be accessed manually", + "create.ponder.spout_filling.text_3": "Instead, Pipes can be used to supply it with fluids", + "create.ponder.spout_filling.text_4": "The Input items can be placed on a Depot under the Spout", + "create.ponder.spout_filling.text_5": "When items are provided on a belt...", + "create.ponder.spout_filling.text_6": "The Spout will hold and process them automatically", + + "create.ponder.stabilized_bearings.header": "Estabilizar artilugios", + "create.ponder.stabilized_bearings.text_1": "Siempre que los rodamientos mecánicos formen parte de una estructura móvil...", + "create.ponder.stabilized_bearings.text_2": "...intentarán mantenerse derechos", + "create.ponder.stabilized_bearings.text_3": "Una vez más, el rodamiento se unirá al bloque de enfrente", + "create.ponder.stabilized_bearings.text_4": "Como resultado, todo el sub-artilugio se mantendrá en posición vertical", + + "create.ponder.sticker.header": "Fijar bloques con stickers", + "create.ponder.sticker.text_1": "Los stickers son ideales para la fijación de bloques controlados por redstone", + "create.ponder.sticker.text_2": "Al recibir una señal, cambiarán su estado", + "create.ponder.sticker.text_3": "Si ahora se mueve en un artilugio, el bloque se moverá con él", + "create.ponder.sticker.text_4": "Si se vuelve a activar, el bloque dejará de estar fijado", + + "create.ponder.stressometer.header": "Supervisar la información cinética con el estresómetro", + "create.ponder.stressometer.text_1": "El estresómetro muestra la capacidad de estrés actual de la red cinética conectada", + "create.ponder.stressometer.text_2": "Cuando se usan las gafas del constructor, el jugador puede obtener información más detallada del medidor", + "create.ponder.stressometer.text_3": "Los comparadores pueden emitir señales analógicas de redstone en relación con las mediciones del estresómetro", + + "create.ponder.super_glue.header": "Fijar bloques con pegamento", + "create.ponder.super_glue.text_1": "Se puede utilizar pegamento entre dos bloques cualquiera", + "create.ponder.super_glue.text_2": "Los bloques fijados se moverán juntos cuando se ensamblen en un artilugio", + "create.ponder.super_glue.text_3": "Cada vez que el pegamento es sostenido en la mano...", + "create.ponder.super_glue.text_4": "...los bloques añadidos se pegarán a la cara en la que fueron colocados automáticamente", + "create.ponder.super_glue.text_5": "El pegamento se puede quitar con un clic izquierdo", + + "create.ponder.valve_handle.header": "Generar fuerza rotacional mediante asas de válvula", + "create.ponder.valve_handle.text_1": "Los jugadores pueden utilizar las asas de válvulas para aplicar fuerza rotacional manualmente", + "create.ponder.valve_handle.text_2": "Mantén pulsado el clic derecho para rotar en sentido contrario a las agujas del reloj", + "create.ponder.valve_handle.text_3": "Su velocidad de transmisión es lenta y precisa", + "create.ponder.valve_handle.text_4": "[Mayús izdo.] + clic derecho para rotar en el sentido de las agujas del reloj", + "create.ponder.valve_handle.text_5": "Las asas de las válvulas pueden teñirse con fines estéticos", + + "create.ponder.valve_pipe.header": "Controlar el flujo de fluidos mediante válvulas", + "create.ponder.valve_pipe.text_1": "Valve pipes help control fluids propagating through pipe networks", + "create.ponder.valve_pipe.text_2": "Their shaft input controls whether fluid is currently allowed through", + "create.ponder.valve_pipe.text_3": "Given Rotational Force in the opening direction, the valve will open up", + "create.ponder.valve_pipe.text_4": "It can be closed again by reversing the input rotation", + + "create.ponder.water_wheel.header": "Generar fuerza rotacional mediante ruedas hidráulicas", + "create.ponder.water_wheel.text_1": "Las ruedas hidráulicas extraen la fuerza de las corrientes de agua adyacentes", + "create.ponder.water_wheel.text_2": "Cuantas más caras se alimenten, más rápido girará", + "create.ponder.water_wheel.text_3": "Las paletas de las ruedas deben estar orientadas en contra del flujo", + "create.ponder.water_wheel.text_4": "Orientadas hacia el lado contrario, no serán tan eficaces", + + "create.ponder.weighted_ejector.header": "Usar eyectores de peso", + "create.ponder.weighted_ejector.text_1": "[Mayús izdo.] + clic derecho sosteniendo un eyector de peso para seleccionar la ubicación de destino", + "create.ponder.weighted_ejector.text_10": "Ahora estára limitado a este tamaño de pila, y sólo se activara cuando su pila retenida alcance esta cantidad", + "create.ponder.weighted_ejector.text_11": "Otras entidades activarán el eyector al pisarlos", + "create.ponder.weighted_ejector.text_2": "El eyector colocado lanzará ahora los objetos al lugar marcado", + "create.ponder.weighted_ejector.text_3": "Un objetivo válido puede estar a cualquier altura o distancia dentro del alcance", + "create.ponder.weighted_ejector.text_4": "Sin embargo, no pueden estar a un costado", + "create.ponder.weighted_ejector.text_5": "Si no se ha seleccionado ningún objetivo válido, simplemente se dirigirá al bloque que se encuentra justo delante", + "create.ponder.weighted_ejector.text_6": "Suministrale fuerza rotacional para cargarlo", + "create.ponder.weighted_ejector.text_7": "Los objetos colocados en el eyector hacen que se dispare", + "create.ponder.weighted_ejector.text_8": "Si se dirigen a un inventario, el eyector esperará hasta que haya espacio", + "create.ponder.weighted_ejector.text_9": "Con la llave inglesa se puede configurar el tamaño de pila requerido", + + "create.ponder.weighted_ejector_redstone.header": "Controlar los eyectores de peso con redstone", + "create.ponder.weighted_ejector_redstone.text_1": "Cuando se alimentan con redstone, los eyectores no se activan", + "create.ponder.weighted_ejector_redstone.text_2": "Además, los observadores de contenido pueden detectar cuando los eyectores se activan", + + "create.ponder.weighted_ejector_tunnel.header": "Dividir pilas de objetos mediante eyectores de peso", + "create.ponder.weighted_ejector_tunnel.text_1": "En combinación con los túneles de latón, los eyectores de peso pueden dividir las pilas de objetos en cantidades específicas", + "create.ponder.weighted_ejector_tunnel.text_2": "En primer lugar, configure el túnel de latón en 'Preferir lo más cercano', para dar prioridad a su salida lateral", + "create.ponder.weighted_ejector_tunnel.text_3": "El tamaño de la pila fijado en el eyector determina ahora la cantidad que se va a dividir", + "create.ponder.weighted_ejector_tunnel.text_4": "Mientras una nueva pila del tamaño configurado se expulse por la salida lateral...", + "create.ponder.weighted_ejector_tunnel.text_5": "...el resto seguirá su camino", + + "create.ponder.windmill_source.header": "Generar fuerza rotacional mediante rodamientos del molino de viento", + "create.ponder.windmill_source.text_1": "Los rodamientos del molino de viento se fijan al bloque que tienen delante", + "create.ponder.windmill_source.text_2": "Si se unen suficientes bloques tipo vela al bloque, éste puede actuar como un molino de viento", + "create.ponder.windmill_source.text_3": "Activado con un clic derecho, el rodamiento del molino de viento comenzará a proporcionar fuerza rotacional", + "create.ponder.windmill_source.text_4": "La cantidad de bloques de vela determina su velocidad de rotación", + "create.ponder.windmill_source.text_5": "Utiliza una llave inglesa para configurar su sentido de rotación", + "create.ponder.windmill_source.text_6": "Haga clic derecho sobre el rodamiento del molino en cualquier momento para detener y editar la estructura de nuevo", + + "create.ponder.windmill_structure.header": "Artilugios para molinos de viento", + "create.ponder.windmill_structure.text_1": "Cualquier estructura puede contar como un molino de viento válido, siempre que contenga al menos 8 bloques tipo vela.", "_": "Thank you for translating Create!" diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index d72d4c061..4f1034e38 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1457", + "_": "Missing Localizations: 1501", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,10 +28,12 @@ "block.create.belt": "Correa", "block.create.birch_window": "Ventana de Abedul", "block.create.birch_window_pane": "Panel de Ventana de Abedul", + "block.create.black_nixie_tube": "UNLOCALIZED: Black Nixie Tube", "block.create.black_sail": "Vela Negra", "block.create.black_seat": "Asiento Negro", "block.create.black_valve_handle": "Manija de Válvula Negra", "block.create.blaze_burner": "Quemador de Blaze", + "block.create.blue_nixie_tube": "UNLOCALIZED: Blue Nixie Tube", "block.create.blue_sail": "Vela Azul", "block.create.blue_seat": "Asiento Azul", "block.create.blue_valve_handle": "Manija de Válvula Azul", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "Eje empotrado de Latón", "block.create.brass_funnel": "Embudo de Latón", "block.create.brass_tunnel": "Túnel de Latón", + "block.create.brown_nixie_tube": "UNLOCALIZED: Brown Nixie Tube", "block.create.brown_sail": "Vela Café", "block.create.brown_seat": "Asiento Café ", "block.create.brown_valve_handle": "Manija de Válvula Café", @@ -73,7 +76,7 @@ "block.create.crushing_wheel": "Rueda Trituradora", "block.create.crushing_wheel_controller": "UNLOCALIZED:Crushing Wheel Controller", "block.create.cuckoo_clock": "Reloj Cuco", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "UNLOCALIZED: Cyan Nixie Tube", "block.create.cyan_sail": "Vela Cian", "block.create.cyan_seat": "Asiento Cian", "block.create.cyan_valve_handle": "Manija de Válvula Cian", @@ -180,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "Escaleras de Piedra Labrada de Granito", "block.create.granite_cobblestone_wall": "Pared de Piedra Labrada de Granito", "block.create.granite_pillar": "Pilar de Granito", + "block.create.gray_nixie_tube": "UNLOCALIZED: Gray Nixie Tube", "block.create.gray_sail": "Vela Gris", "block.create.gray_seat": "Asiento Gris", "block.create.gray_valve_handle": "Manija de Válvula Gris", + "block.create.green_nixie_tube": "UNLOCALIZED: Green Nixie Tube", "block.create.green_sail": "Vela Verde", "block.create.green_seat": "Asiento Verde", "block.create.green_valve_handle": "Manija de Válvula Verde", "block.create.hand_crank": "Manivela", + "block.create.haunted_bell": "UNLOCALIZED: Haunted Bell", "block.create.honey": "Miel", "block.create.horizontal_framed_glass": "Vidrio Enmarcado Horizontal", "block.create.horizontal_framed_glass_pane": "Panel de Vidrio Enmarcado Horizontal", @@ -205,12 +211,15 @@ "block.create.layered_scoria": "Escoria en Capas", "block.create.layered_weathered_limestone": "Caliza Meteorizada en Capas", "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.light_blue_nixie_tube": "UNLOCALIZED: Light Blue Nixie Tube", "block.create.light_blue_sail": "Vela Azul Claro", "block.create.light_blue_seat": "Asiento Azul Claro", "block.create.light_blue_valve_handle": "Manija de Válvula Azul Claro", + "block.create.light_gray_nixie_tube": "UNLOCALIZED: Light Gray Nixie Tube", "block.create.light_gray_sail": "Vela Gris Claro", "block.create.light_gray_seat": "Asiento Gris Claro", "block.create.light_gray_valve_handle": "Manija de Válvula Gris Claro", + "block.create.lime_nixie_tube": "UNLOCALIZED: Lime Nixie Tube", "block.create.lime_sail": "Vela Verde Lima", "block.create.lime_seat": "Asiento Verde Lima", "block.create.lime_valve_handle": "Manija de Válvula Verde Lima", @@ -227,6 +236,7 @@ "block.create.limestone_pillar": "Pilar de Caliza", "block.create.linear_chassis": "Chasis Lineal", "block.create.lit_blaze_burner": "Quemador de Blaze Iluminado", + "block.create.magenta_nixie_tube": "UNLOCALIZED: Magenta Nixie Tube", "block.create.magenta_sail": "Vela Magenta", "block.create.magenta_seat": "Asiento Magenta", "block.create.magenta_valve_handle": "Manija de Válvula Magenta", @@ -311,6 +321,7 @@ "block.create.paved_weathered_limestone_stairs": "Escaleras de Caliza Meteorizada Pavimentada", "block.create.paved_weathered_limestone_wall": "Pared de Caliza Meteorizada Pavimentada", "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.pink_nixie_tube": "UNLOCALIZED: Pink Nixie Tube", "block.create.pink_sail": "Vela Rosa", "block.create.pink_seat": "Asiento Rosa", "block.create.pink_valve_handle": "Manija de Válvula Rosa", @@ -345,10 +356,12 @@ "block.create.powered_toggle_latch": "Cerradura Electrica de Palanca", "block.create.pulley_magnet": "Polea con Imán", "block.create.pulse_repeater": "Repetidor de Pulso", + "block.create.purple_nixie_tube": "UNLOCALIZED: Purple Nixie Tube", "block.create.purple_sail": "Vela Morada", "block.create.purple_seat": "Asiento Morado", "block.create.purple_valve_handle": "Manija de Válvula Morada", "block.create.radial_chassis": "Chasis Radial", + "block.create.red_nixie_tube": "UNLOCALIZED: Red Nixie Tube", "block.create.red_sail": "Vela Roja", "block.create.red_seat": "Asiento Rojo", "block.create.red_valve_handle": "Manija de Válvula Roja", @@ -405,17 +418,22 @@ "block.create.weathered_limestone_cobblestone_wall": "Pared de Piedra Labrada de Caliza Meteorizada", "block.create.weathered_limestone_pillar": "Pilar de Caliza Meteorizada", "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", + "block.create.white_nixie_tube": "UNLOCALIZED: White Nixie Tube", "block.create.white_sail": "Vela Blanca", "block.create.white_seat": "Asiento Blanco", "block.create.white_valve_handle": "Manija de Válvula Blanca", "block.create.windmill_bearing": "Rodamiento de Molino de Viento", "block.create.wooden_bracket": "Soporte de Madera", + "block.create.yellow_nixie_tube": "UNLOCALIZED: Yellow Nixie Tube", "block.create.yellow_sail": "Vela Amarilla", "block.create.yellow_seat": "Asiento Amarillo", "block.create.yellow_valve_handle": "Manija de Válvula Amarilla", "block.create.zinc_block": "Bloque de Zinc", "block.create.zinc_ore": "Mineral de Zinc", + "enchantment.create.capacity": "UNLOCALIZED: Capacity", + "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.contraption": "Artefacto", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", @@ -444,13 +462,13 @@ "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "Compuesto Cromático", "item.create.cinder_flour": "Ceniza Molida", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", "item.create.copper_ingot": "Lingote de Cobre", "item.create.copper_nugget": "Pepita de Cobre", "item.create.copper_sheet": "Lámina de Cobre", "item.create.crafter_slot_cover": "Cubierta de Ranura del Crafter", "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "Mineral de Aluminio Molido", "item.create.crushed_brass": "Latón Molido", "item.create.crushed_copper_ore": "Mineral de Cobre Molido", @@ -479,7 +497,9 @@ "item.create.handheld_worldshaper": "Pistola de Manipulación de Mundo", "item.create.honey_bucket": "Cubeta de Miel", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "UNLOCALIZED: Incomplete Cogwheel", + "item.create.incomplete_large_cogwheel": "UNLOCALIZED: Incomplete Large Cogwheel", + "item.create.incomplete_precision_mechanism": "UNLOCALIZED: Incomplete Precision Mechanism", "item.create.iron_sheet": "Lámina de Hierro", "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Artefacto de Vagón", @@ -487,6 +507,7 @@ "item.create.polished_rose_quartz": "Cuarzo Rosa Pulido", "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Polvo de Obsidiana", + "item.create.precision_mechanism": "UNLOCALIZED: Precision Mechanism", "item.create.propeller": "Hélice", "item.create.red_sand_paper": "Papel de Arena Roja", "item.create.refined_radiance": "Radiancia Refinada", @@ -631,8 +652,8 @@ "advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect an engine to the Flywheel.", "advancement.create.overstress_flywheel": "UNLOCALIZED: High levels of Stress", "advancement.create.overstress_flywheel.desc": "UNLOCALIZED: Overstress a Furnace Engine.", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities", + "advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.", "advancement.create.mechanical_arm": "UNLOCALIZED: Busy Hands!", "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch as it does all the work for you.", "advancement.create.musical_arm": "UNLOCALIZED: Play Me My Theme Tune!", @@ -673,13 +694,19 @@ "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", "death.attack.create.crush": "UNLOCALIZED: %1$s was processed by Crushing Wheels", - "death.attack.create.fan_fire": "UNLOCALIZED: %1$s was burned to death by hot air", - "death.attack.create.fan_lava": "UNLOCALIZED: %1$s was burned to death by lava fan", + "death.attack.create.crush.player": "UNLOCALIZED: %1$s was thrown into Crushing Wheels by %2$s", + "death.attack.create.fan_fire": "UNLOCALIZED: %1$s got smoked by an Encased Fan", + "death.attack.create.fan_fire.player": "UNLOCALIZED: %1$s was thrown into a smoker by %2$s", + "death.attack.create.fan_lava": "UNLOCALIZED: %1$s was incinerated by an Encased Fan", + "death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s", "death.attack.create.mechanical_drill": "UNLOCALIZED: %1$s was impaled by a Mechanical Drill", + "death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s", "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", + "death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s", "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + "death.attack.create.cuckoo_clock_explosion.player": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", @@ -725,7 +752,7 @@ "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.assembly.junk": "UNLOCALIZED: Random salvage", "create.recipe.processing.chance": "UNLOCALIZED: %1$s%% Chance", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s", + "create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s", + "create.item_attributes.shulker_level.full": "UNLOCALIZED: full", + "create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty", + "create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled", "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", @@ -1134,6 +1166,9 @@ "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "UNLOCALIZED: Currently distributing:", + "create.tooltip.brass_tunnel.contains_entry": "UNLOCALIZED: > %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "UNLOCALIZED: Right-Click to retrieve", "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", @@ -1149,6 +1184,10 @@ "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.potato_cannon.ammo.attack_damage": "UNLOCALIZED: %1$s Attack Damage", + "create.potato_cannon.ammo.reload_ticks": "UNLOCALIZED: %1$s Reload Ticks", + "create.potato_cannon.ammo.knockback": "UNLOCALIZED: %1$s Knockback", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", @@ -1183,15 +1222,17 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", + "create.subtitle.mixing": "UNLOCALIZED: Mixing noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.crushing_1": "UNLOCALIZED: Crushing noises", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel flaps", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.haunted_bell_use": "UNLOCALIZED: Haunted Bell tolls", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", @@ -1202,13 +1243,12 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", @@ -1373,6 +1413,11 @@ "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "UNLOCALIZED: CONTROLLER RAIL", "block.create.controller_rail.tooltip.summary": "UNLOCALIZED: A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", "block.create.controller_rail.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", @@ -1437,12 +1482,12 @@ "item.create.minecart_coupling.tooltip.behaviour1": "UNLOCALIZED: _Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.", "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "UNLOCALIZED: HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "UNLOCALIZED: A _Cursed Bell_ haunted by lost souls of the Nether.", + "block.create.haunted_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", + "block.create.haunted_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1464,41 +1509,41 @@ "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", - "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", - "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", + "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", - "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", - "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", - "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", - "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", - "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", - "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", - "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", - "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", - "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", - "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", - "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", - "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", - "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", - "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", - "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", - "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", - "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", - "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", + "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", + "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", @@ -1729,7 +1774,8 @@ "create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly", "create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines", "create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating", + "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: The flame can be transformed using a soul-infused item", + "create.ponder.empty_blaze_burner.text_6": "UNLOCALIZED: However, without a blaze they are not suitable for industrial heating", "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", @@ -2046,6 +2092,7 @@ "create.ponder.nixie_tube.header": "UNLOCALIZED: Using Nixie Tubes", "create.ponder.nixie_tube.text_1": "UNLOCALIZED: When powered by Redstone, Nixie Tubes will display the redstone signals' strength", "create.ponder.nixie_tube.text_2": "UNLOCALIZED: Using name tags edited with an anvil, custom text can be displayed", + "create.ponder.nixie_tube.text_3": "UNLOCALIZED: Right-Click with Dye to change their display colour", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 17f930584..545004277 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1342", + "_": "Missing Localizations: 1386", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,10 +28,12 @@ "block.create.belt": "Tapis roulant", "block.create.birch_window": "Fenêtre en bouleau", "block.create.birch_window_pane": "Vitre en bouleau", + "block.create.black_nixie_tube": "UNLOCALIZED: Black Nixie Tube", "block.create.black_sail": "Voile noire", "block.create.black_seat": "Siège noir", "block.create.black_valve_handle": "Vanne noire", "block.create.blaze_burner": "Brûleur à blaze", + "block.create.blue_nixie_tube": "UNLOCALIZED: Blue Nixie Tube", "block.create.blue_sail": "Voile bleue", "block.create.blue_seat": "Siège bleu", "block.create.blue_valve_handle": "Vanne bleue", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "Rotor dans un revêtement en laiton", "block.create.brass_funnel": "Entonnoir en laiton", "block.create.brass_tunnel": "Tunnel en laiton", + "block.create.brown_nixie_tube": "UNLOCALIZED: Brown Nixie Tube", "block.create.brown_sail": "Voile brune", "block.create.brown_seat": "Siège brun", "block.create.brown_valve_handle": "Vanne brune", @@ -73,7 +76,7 @@ "block.create.crushing_wheel": "Roue de concassage", "block.create.crushing_wheel_controller": "Contrôleur de roue de concassage", "block.create.cuckoo_clock": "Horloge à coucou", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "UNLOCALIZED: Cyan Nixie Tube", "block.create.cyan_sail": "Voile cyan", "block.create.cyan_seat": "Siège cyan", "block.create.cyan_valve_handle": "Vanne cyan", @@ -180,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.gray_nixie_tube": "UNLOCALIZED: Gray Nixie Tube", "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_nixie_tube": "UNLOCALIZED: Green Nixie Tube", "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "Manivelle", + "block.create.haunted_bell": "UNLOCALIZED: Haunted Bell", "block.create.honey": "UNLOCALIZED: Honey", "block.create.horizontal_framed_glass": "Fenêtre en verre horizontale", "block.create.horizontal_framed_glass_pane": "Vitre encadrée horizontale", @@ -205,12 +211,15 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.light_blue_nixie_tube": "UNLOCALIZED: Light Blue Nixie Tube", "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_nixie_tube": "UNLOCALIZED: Light Gray Nixie Tube", "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_nixie_tube": "UNLOCALIZED: Lime Nixie Tube", "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", @@ -227,6 +236,7 @@ "block.create.limestone_pillar": "Pillier de calcaire", "block.create.linear_chassis": "Châssis linéaire", "block.create.lit_blaze_burner": "UNLOCALIZED: Lit Blaze Burner", + "block.create.magenta_nixie_tube": "UNLOCALIZED: Magenta Nixie Tube", "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", @@ -311,6 +321,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.pink_nixie_tube": "UNLOCALIZED: Pink Nixie Tube", "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", @@ -345,10 +356,12 @@ "block.create.powered_toggle_latch": "Verrou alimenté à bascule", "block.create.pulley_magnet": "Aimant de poulie", "block.create.pulse_repeater": "Répéteur d'impulsions", + "block.create.purple_nixie_tube": "UNLOCALIZED: Purple Nixie Tube", "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Châssis radial", + "block.create.red_nixie_tube": "UNLOCALIZED: Red Nixie Tube", "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", @@ -405,17 +418,22 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Pillier de Calcaire altéré", "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", + "block.create.white_nixie_tube": "UNLOCALIZED: White Nixie Tube", "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", + "block.create.yellow_nixie_tube": "UNLOCALIZED: Yellow Nixie Tube", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "Bloc de zinc", "block.create.zinc_ore": "Minerai de zinc", + "enchantment.create.capacity": "UNLOCALIZED: Capacity", + "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.contraption": "Engin", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", @@ -444,13 +462,13 @@ "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "Composé chromatique", "item.create.cinder_flour": "Farine de braise", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", "item.create.copper_ingot": "Lingot de cuivre", "item.create.copper_nugget": "Pépite de cuivre", "item.create.copper_sheet": "Plaques de cuivre", "item.create.crafter_slot_cover": "Couvercle", "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "Aluminium concassé", "item.create.crushed_brass": "Laiton concassé", "item.create.crushed_copper_ore": "Cuivre concassé", @@ -479,7 +497,9 @@ "item.create.handheld_worldshaper": "Térraformeur portable", "item.create.honey_bucket": "Seau de miel", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "UNLOCALIZED: Incomplete Cogwheel", + "item.create.incomplete_large_cogwheel": "UNLOCALIZED: Incomplete Large Cogwheel", + "item.create.incomplete_precision_mechanism": "UNLOCALIZED: Incomplete Precision Mechanism", "item.create.iron_sheet": "Plaque de Fer", "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Engin de wagonnet", @@ -487,6 +507,7 @@ "item.create.polished_rose_quartz": "Quartz rose poli", "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Obsidienne concassée", + "item.create.precision_mechanism": "UNLOCALIZED: Precision Mechanism", "item.create.propeller": "Hélice", "item.create.red_sand_paper": "Papier de verre rouge", "item.create.refined_radiance": "Éclat raffiné", @@ -631,8 +652,8 @@ "advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect an engine to the Flywheel.", "advancement.create.overstress_flywheel": "UNLOCALIZED: High levels of Stress", "advancement.create.overstress_flywheel.desc": "UNLOCALIZED: Overstress a Furnace Engine.", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities", + "advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.", "advancement.create.mechanical_arm": "UNLOCALIZED: Busy Hands!", "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch as it does all the work for you.", "advancement.create.musical_arm": "UNLOCALIZED: Play Me My Theme Tune!", @@ -673,13 +694,19 @@ "itemGroup.create.palettes": "Create Palettes", "death.attack.create.crush": "%1$s a été concassé.e", + "death.attack.create.crush.player": "UNLOCALIZED: %1$s was thrown into Crushing Wheels by %2$s", "death.attack.create.fan_fire": "%1$s a été brûlé à mort par l'air chaud", + "death.attack.create.fan_fire.player": "UNLOCALIZED: %1$s was thrown into a smoker by %2$s", "death.attack.create.fan_lava": "%1$s a été brûlé à mort par un ventilateur de lave", + "death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s", "death.attack.create.mechanical_drill": "%1$s a été empalé par une perceuse mécanique", + "death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s", "death.attack.create.mechanical_saw": "%1$s a été coupé en deux par une scie mécanique", + "death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s", "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s a été explosé par un coucou trafiquée", + "death.attack.create.cuckoo_clock_explosion.player": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "un déployeur voyou", "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", @@ -725,7 +752,7 @@ "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.assembly.junk": "UNLOCALIZED: Random salvage", "create.recipe.processing.chance": "%1$s%% de chance", "create.recipe.heat_requirement.none": "Pas de chauffage requis", "create.recipe.heat_requirement.heated": "Chauffé", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "n'appartient pas à %1$s'", "create.item_attributes.added_by": "a été ajouté par %1$s", "create.item_attributes.added_by.inverted": "n'a pas été ajouté par %1$s", + "create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s", + "create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s", + "create.item_attributes.shulker_level.full": "UNLOCALIZED: full", + "create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty", + "create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled", "create.item_attributes.has_enchant": "est enchanté %1$s", "create.item_attributes.has_enchant.inverted": "n'est pas enchenté %1$s", "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", @@ -1134,6 +1166,9 @@ "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "UNLOCALIZED: Currently distributing:", + "create.tooltip.brass_tunnel.contains_entry": "UNLOCALIZED: > %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "UNLOCALIZED: Right-Click to retrieve", "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", @@ -1149,6 +1184,10 @@ "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.potato_cannon.ammo.attack_damage": "UNLOCALIZED: %1$s Attack Damage", + "create.potato_cannon.ammo.reload_ticks": "UNLOCALIZED: %1$s Reload Ticks", + "create.potato_cannon.ammo.knockback": "UNLOCALIZED: %1$s Knockback", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", @@ -1183,15 +1222,17 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", + "create.subtitle.mixing": "UNLOCALIZED: Mixing noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.crushing_1": "UNLOCALIZED: Crushing noises", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel flaps", "create.subtitle.schematicannon_finish": "Fin de schémacanon", + "create.subtitle.haunted_bell_use": "UNLOCALIZED: Haunted Bell tolls", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", @@ -1202,13 +1243,12 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", @@ -1373,6 +1413,11 @@ "block.create.creative_crate.tooltip.condition1": "Quand un objet se trouve dans l'emplacement de filtrage", "block.create.creative_crate.tooltip.behaviour1": "Tout ce qui _extrait_ de ce conteneur aura une _alimentation illimitée_ de l'objet spécifié. Les objets _insérés_ dans cette caisse seront _éliminés_.", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "UNLOCALIZED: CONTROLLER RAIL", "block.create.controller_rail.tooltip.summary": "UNLOCALIZED: A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", "block.create.controller_rail.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", @@ -1437,12 +1482,12 @@ "item.create.minecart_coupling.tooltip.behaviour1": "UNLOCALIZED: _Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.", "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "UNLOCALIZED: HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "UNLOCALIZED: A _Cursed Bell_ haunted by lost souls of the Nether.", + "block.create.haunted_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", + "block.create.haunted_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1464,41 +1509,41 @@ "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", - "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", - "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", + "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", - "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", - "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", - "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", - "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", - "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", - "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", - "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", - "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", - "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", - "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", - "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", - "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", - "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", - "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", - "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", - "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", - "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", - "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", + "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", + "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", @@ -1729,7 +1774,8 @@ "create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly", "create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines", "create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating", + "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: The flame can be transformed using a soul-infused item", + "create.ponder.empty_blaze_burner.text_6": "UNLOCALIZED: However, without a blaze they are not suitable for industrial heating", "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", @@ -2046,6 +2092,7 @@ "create.ponder.nixie_tube.header": "UNLOCALIZED: Using Nixie Tubes", "create.ponder.nixie_tube.text_1": "UNLOCALIZED: When powered by Redstone, Nixie Tubes will display the redstone signals' strength", "create.ponder.nixie_tube.text_2": "UNLOCALIZED: Using name tags edited with an anvil, custom text can be displayed", + "create.ponder.nixie_tube.text_3": "UNLOCALIZED: Right-Click with Dye to change their display colour", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 8bab297b1..29147fd8a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 870", + "_": "Missing Localizations: 914", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,10 +28,12 @@ "block.create.belt": "Nastro meccanico", "block.create.birch_window": "Finestra di betulla", "block.create.birch_window_pane": "Pannello di finestra di betulla", + "block.create.black_nixie_tube": "UNLOCALIZED: Black Nixie Tube", "block.create.black_sail": "Vela nera", "block.create.black_seat": "Sedile nero", "block.create.black_valve_handle": "Maniglia per valvola nera", "block.create.blaze_burner": "Inceneritore di blaze", + "block.create.blue_nixie_tube": "UNLOCALIZED: Blue Nixie Tube", "block.create.blue_sail": "Vela blu", "block.create.blue_seat": "Sedile blu", "block.create.blue_valve_handle": "Maniglia per valvola blu", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "Albero incassato di ottone", "block.create.brass_funnel": "Imbuto di ottone", "block.create.brass_tunnel": "Tunnel di ottone", + "block.create.brown_nixie_tube": "UNLOCALIZED: Brown Nixie Tube", "block.create.brown_sail": "Vela marrone", "block.create.brown_seat": "Sedile marrone", "block.create.brown_valve_handle": "Maniglia per valvola marrone", @@ -73,7 +76,7 @@ "block.create.crushing_wheel": "Ruota di frantumazione", "block.create.crushing_wheel_controller": "Telecomando per ruota di frantumazione", "block.create.cuckoo_clock": "Orologio a cucù", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "UNLOCALIZED: Cyan Nixie Tube", "block.create.cyan_sail": "Vela ciano", "block.create.cyan_seat": "Sedile ciano", "block.create.cyan_valve_handle": "Maniglia per valvola ciano", @@ -180,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "Scalini di pietrisco di granito", "block.create.granite_cobblestone_wall": "Muretto di pietrisco di granito", "block.create.granite_pillar": "Pilastro di granito", + "block.create.gray_nixie_tube": "UNLOCALIZED: Gray Nixie Tube", "block.create.gray_sail": "Vela grigia", "block.create.gray_seat": "Sedile grigio", "block.create.gray_valve_handle": "Maniglia per valvola grigia", + "block.create.green_nixie_tube": "UNLOCALIZED: Green Nixie Tube", "block.create.green_sail": "Vela verde", "block.create.green_seat": "Sedile verde", "block.create.green_valve_handle": "Maniglia per valvola verde", "block.create.hand_crank": "Manovella", + "block.create.haunted_bell": "UNLOCALIZED: Haunted Bell", "block.create.honey": "Miele", "block.create.horizontal_framed_glass": "Finestra di vetro orizzontale", "block.create.horizontal_framed_glass_pane": "Pannello di finestra di vetro orizzontale", @@ -205,12 +211,15 @@ "block.create.layered_scoria": "Scoria stratificata", "block.create.layered_weathered_limestone": "Calcare consumato stratificato", "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.light_blue_nixie_tube": "UNLOCALIZED: Light Blue Nixie Tube", "block.create.light_blue_sail": "Vela azzurra", "block.create.light_blue_seat": "Sedile azzurro", "block.create.light_blue_valve_handle": "Maniglia per valvola azzurra", + "block.create.light_gray_nixie_tube": "UNLOCALIZED: Light Gray Nixie Tube", "block.create.light_gray_sail": "Vela grigio chiaro", "block.create.light_gray_seat": "Sedile grigio chiaro", "block.create.light_gray_valve_handle": "Maniglia per valvola grigio chiaro", + "block.create.lime_nixie_tube": "UNLOCALIZED: Lime Nixie Tube", "block.create.lime_sail": "Vela lime", "block.create.lime_seat": "Sedile lime", "block.create.lime_valve_handle": "Maniglia per valvola lime", @@ -227,6 +236,7 @@ "block.create.limestone_pillar": "Pilastro di calcare", "block.create.linear_chassis": "Telaio lineare", "block.create.lit_blaze_burner": "Inceneritore di blaze acceso", + "block.create.magenta_nixie_tube": "UNLOCALIZED: Magenta Nixie Tube", "block.create.magenta_sail": "Vela magenta", "block.create.magenta_seat": "Sedile magenta", "block.create.magenta_valve_handle": "Maniglia per valvola magenta", @@ -311,6 +321,7 @@ "block.create.paved_weathered_limestone_stairs": "Scalini di calcare consumato lastricato", "block.create.paved_weathered_limestone_wall": "Muretto di calcare consumato lastricato", "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.pink_nixie_tube": "UNLOCALIZED: Pink Nixie Tube", "block.create.pink_sail": "Vela rosa", "block.create.pink_seat": "Sedile rosa", "block.create.pink_valve_handle": "Maniglia per valvola rosa", @@ -345,10 +356,12 @@ "block.create.powered_toggle_latch": "Leva alimentata alterata", "block.create.pulley_magnet": "Magnete della carrucola", "block.create.pulse_repeater": "Ripetitore di impulsi", + "block.create.purple_nixie_tube": "UNLOCALIZED: Purple Nixie Tube", "block.create.purple_sail": "Vela viola", "block.create.purple_seat": "Sedile viola", "block.create.purple_valve_handle": "Maniglia per valvola viola", "block.create.radial_chassis": "Telaio radiale", + "block.create.red_nixie_tube": "UNLOCALIZED: Red Nixie Tube", "block.create.red_sail": "Vela rossa", "block.create.red_seat": "Sedile rosso", "block.create.red_valve_handle": "Maniglia per valvola rossa", @@ -405,17 +418,22 @@ "block.create.weathered_limestone_cobblestone_wall": "Muretto di pietrisco di calcare consumato", "block.create.weathered_limestone_pillar": "Pilastro di calcare consumato", "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", + "block.create.white_nixie_tube": "UNLOCALIZED: White Nixie Tube", "block.create.white_sail": "Vela bianca", "block.create.white_seat": "Sedile bianco", "block.create.white_valve_handle": "Maniglia per valvola bianca", "block.create.windmill_bearing": "Supporto per mulino a vento", "block.create.wooden_bracket": "Supporto di legno", + "block.create.yellow_nixie_tube": "UNLOCALIZED: Yellow Nixie Tube", "block.create.yellow_sail": "Vela gialla", "block.create.yellow_seat": "Sedile giallo", "block.create.yellow_valve_handle": "Maniglia per valvola gialla", "block.create.zinc_block": "Blocco di zinco", "block.create.zinc_ore": "Zinco grezzo", + "enchantment.create.capacity": "UNLOCALIZED: Capacity", + "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.contraption": "Contrazione", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", @@ -444,13 +462,13 @@ "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "Composto cromatico", "item.create.cinder_flour": "Cenere farinosa", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", "item.create.copper_ingot": "Lingotto di rame", "item.create.copper_nugget": "Pepita di rame", "item.create.copper_sheet": "Lamiera di rame", "item.create.crafter_slot_cover": "Rivestimento per slot da costruzione", "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "Alluminio grezzo frantumato", "item.create.crushed_brass": "Ottone frantumato", "item.create.crushed_copper_ore": "Rame grezzo frantumato", @@ -479,7 +497,9 @@ "item.create.handheld_worldshaper": "Plasmatore del mondo portatile", "item.create.honey_bucket": "Secchio di miele", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "UNLOCALIZED: Incomplete Cogwheel", + "item.create.incomplete_large_cogwheel": "UNLOCALIZED: Incomplete Large Cogwheel", + "item.create.incomplete_precision_mechanism": "UNLOCALIZED: Incomplete Precision Mechanism", "item.create.iron_sheet": "Lamiera di ferro", "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Contrazione per carrello da miniera", @@ -487,6 +507,7 @@ "item.create.polished_rose_quartz": "Quarzo rosa levigato", "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Ossidiana in polvere", + "item.create.precision_mechanism": "UNLOCALIZED: Precision Mechanism", "item.create.propeller": "Elica", "item.create.red_sand_paper": "Carta vetrata rossa", "item.create.refined_radiance": "Radiance raffinata", @@ -631,8 +652,8 @@ "advancement.create.flywheel.desc": "Collega un motore ad un volano.", "advancement.create.overstress_flywheel": "Alti livelli di stress", "advancement.create.overstress_flywheel.desc": "Sovrastressa un motore fornace.", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities", + "advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.", "advancement.create.mechanical_arm": "Mani occupate!", "advancement.create.mechanical_arm.desc": "Costruisci un braccio meccanico, seleziona gli input e gli output, piazzalo e alimentalo; poi guardalo mentre fa il lavoro sporco al tuo posto.", "advancement.create.musical_arm": "DJ, metti su la musica!", @@ -673,13 +694,19 @@ "itemGroup.create.palettes": "Create: Blocchi", "death.attack.create.crush": "%1$s è stato frantumato", + "death.attack.create.crush.player": "UNLOCALIZED: %1$s was thrown into Crushing Wheels by %2$s", "death.attack.create.fan_fire": "%1$s è stato bruciato dall'aria calda", + "death.attack.create.fan_fire.player": "UNLOCALIZED: %1$s was thrown into a smoker by %2$s", "death.attack.create.fan_lava": "%1$s è stato bruciato dal ventilatore di lava", + "death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s", "death.attack.create.mechanical_drill": "%1$s è stato trafitto dal trapano meccanico", + "death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s", "death.attack.create.mechanical_saw": "%1$s è stato tagliato a metà dalla sega meccanica", + "death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s", "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s è saltato in aria da un orologio a cucù manomesso", + "death.attack.create.cuckoo_clock_explosion.player": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "un disadattato", "create.block.cart_assembler.invalid": "Piazza il tuo assemblatore di carrelli da miniera su un binario", @@ -725,7 +752,7 @@ "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.assembly.junk": "UNLOCALIZED: Random salvage", "create.recipe.processing.chance": "%1$s%% di probabilità", "create.recipe.heat_requirement.none": "Nessun riscaldamento", "create.recipe.heat_requirement.heated": "Riscaldamento", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "non appartiene a '%1$s'", "create.item_attributes.added_by": "è stato aggiunto da %1$s", "create.item_attributes.added_by.inverted": "non è stato aggiunto da %1$s", + "create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s", + "create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s", + "create.item_attributes.shulker_level.full": "UNLOCALIZED: full", + "create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty", + "create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled", "create.item_attributes.has_enchant": "è stato incantato con %1$s", "create.item_attributes.has_enchant.inverted": "non è stato incantato con %1$s", "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", @@ -1134,6 +1166,9 @@ "create.tooltip.chute.fans_pull_up": "I ventilatori tirano da sopra", "create.tooltip.chute.fans_pull_down": "I ventilatori tirano da sotto", "create.tooltip.chute.contains": "Contiene: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "UNLOCALIZED: Currently distributing:", + "create.tooltip.brass_tunnel.contains_entry": "UNLOCALIZED: > %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "UNLOCALIZED: Right-Click to retrieve", "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", @@ -1149,6 +1184,10 @@ "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.potato_cannon.ammo.attack_damage": "UNLOCALIZED: %1$s Attack Damage", + "create.potato_cannon.ammo.reload_ticks": "UNLOCALIZED: %1$s Reload Ticks", + "create.potato_cannon.ammo.knockback": "UNLOCALIZED: %1$s Knockback", + "create.hint.hose_pulley.title": "Buco senza fondo", "create.hint.hose_pulley": "Il corpo fluido selezionato è considerato infinito.", "create.hint.mechanical_arm_no_targets.title": "Nessun bersaglio", @@ -1183,15 +1222,17 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", + "create.subtitle.mixing": "UNLOCALIZED: Mixing noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.crushing_1": "UNLOCALIZED: Crushing noises", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "Il blaze lo gusta felicemente", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel flaps", "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", + "create.subtitle.haunted_bell_use": "UNLOCALIZED: Haunted Bell tolls", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", @@ -1202,13 +1243,12 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", @@ -1373,6 +1413,11 @@ "block.create.creative_crate.tooltip.condition1": "Quando un oggetto è nel filtro", "block.create.creative_crate.tooltip.behaviour1": "Qualsiasi _estrazione_ da questo contenitore fornisce _provviste infinite_ dell'oggetto in questione. Gli oggetti _inseriti_ in questo baule verranno _svuotati_.", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "BINARIO DI CONTROLLO", "block.create.controller_rail.tooltip.summary": "Un _binario alimentato unidirezionale_ capace di _controllare precisamente_ la _velocità di movimento_ di un carrello da miniera.", "block.create.controller_rail.tooltip.condition1": "Quando alimentato da redstone", @@ -1437,12 +1482,12 @@ "item.create.minecart_coupling.tooltip.behaviour1": "_Concatena_ due carrelli insieme, provando a tenerli uniti a una _distanza costante_ mentre si muovono.", "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "UNLOCALIZED: HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "UNLOCALIZED: A _Cursed Bell_ haunted by lost souls of the Nether.", + "block.create.haunted_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", + "block.create.haunted_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1464,41 +1509,41 @@ "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", - "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", - "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", + "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", - "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", - "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", - "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", - "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", - "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", - "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", - "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", - "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", - "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", - "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", - "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", - "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", - "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", - "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", - "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", - "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", - "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", - "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", + "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", + "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", @@ -1729,7 +1774,8 @@ "create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly", "create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines", "create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating", + "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: The flame can be transformed using a soul-infused item", + "create.ponder.empty_blaze_burner.text_6": "UNLOCALIZED: However, without a blaze they are not suitable for industrial heating", "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", @@ -2046,6 +2092,7 @@ "create.ponder.nixie_tube.header": "UNLOCALIZED: Using Nixie Tubes", "create.ponder.nixie_tube.text_1": "UNLOCALIZED: When powered by Redstone, Nixie Tubes will display the redstone signals' strength", "create.ponder.nixie_tube.text_2": "UNLOCALIZED: Using name tags edited with an anvil, custom text can be displayed", + "create.ponder.nixie_tube.text_3": "UNLOCALIZED: Right-Click with Dye to change their display colour", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index dfd0616e8..84f7c6799 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,10 +1,10 @@ { - "_": "Missing Localizations: 236", + "_": "Missing Localizations: 9", "_": "->------------------------] Game Elements [------------------------<-", "block.create.acacia_window": "アカシアの窓", - "block.create.acacia_window_pane": "アカシアの窓パネル", + "block.create.acacia_window_pane": "アカシアの窓板", "block.create.adjustable_chain_gearshift": "可変チェーンギアシフト", "block.create.adjustable_crate": "可変クレート", "block.create.adjustable_pulse_repeater": "可変パルスリピーター", @@ -14,12 +14,12 @@ "block.create.andesite_bricks": "安山岩レンガ", "block.create.andesite_bricks_slab": "安山岩レンガのハーフブロック", "block.create.andesite_bricks_stairs": "安山岩レンガの階段", - "block.create.andesite_bricks_wall": "安山岩レンガの壁", + "block.create.andesite_bricks_wall": "安山岩レンガの塀", "block.create.andesite_casing": "安山岩ケーシング", "block.create.andesite_cobblestone": "安山岩の丸石", "block.create.andesite_cobblestone_slab": "安山岩の丸石のハーフブロック", "block.create.andesite_cobblestone_stairs": "安山岩の丸石の階段", - "block.create.andesite_cobblestone_wall": "安山岩の丸石の壁", + "block.create.andesite_cobblestone_wall": "安山岩の丸石の塀", "block.create.andesite_encased_shaft": "安山岩のケース入りシャフト", "block.create.andesite_funnel": "安山岩ファンネル", "block.create.andesite_pillar": "安山岩の柱", @@ -27,11 +27,13 @@ "block.create.basin": "鉢", "block.create.belt": "メカニカルベルト", "block.create.birch_window": "シラカバの窓", - "block.create.birch_window_pane": "シラカバの窓パネル", + "block.create.birch_window_pane": "シラカバの窓板", + "block.create.black_nixie_tube": "黒色のニキシー管", "block.create.black_sail": "黒色の帆", "block.create.black_seat": "黒色のシート", "block.create.black_valve_handle": "黒色のバルブハンドル", "block.create.blaze_burner": "ブレイズバーナー", + "block.create.blue_nixie_tube": "青色のニキシー管", "block.create.blue_sail": "青色の帆", "block.create.blue_seat": "青色のシート", "block.create.blue_valve_handle": "青色のバルブハンドル", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "真鍮のケース入りシャフト", "block.create.brass_funnel": "真鍮ファンネル", "block.create.brass_tunnel": "真鍮トンネル", + "block.create.brown_nixie_tube": "茶色のニキシー管", "block.create.brown_sail": "茶色の帆", "block.create.brown_seat": "茶色のシート", "block.create.brown_valve_handle": "茶色のバルブハンドル", @@ -58,7 +61,7 @@ "block.create.cogwheel": "歯車", "block.create.content_observer": "コンテンツオブザーバー", "block.create.controller_rail": "コントローラーレール", - "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "block.create.copper_backtank": "銅のバックタンク", "block.create.copper_block": "銅ブロック", "block.create.copper_casing": "銅ケーシング", "block.create.copper_ore": "銅鉱石", @@ -69,46 +72,46 @@ "block.create.creative_fluid_tank": "クリエイティブ液体タンク", "block.create.creative_motor": "クリエイティブモーター", "block.create.crimson_window": "真紅の窓", - "block.create.crimson_window_pane": "真紅の窓パネル", + "block.create.crimson_window_pane": "真紅の窓板", "block.create.crushing_wheel": "破砕ホイール", "block.create.crushing_wheel_controller": "破砕ホイールコントローラー", "block.create.cuckoo_clock": "鳩時計", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "水色のニキシー管", "block.create.cyan_sail": "水色の帆", "block.create.cyan_seat": "水色のシート", "block.create.cyan_valve_handle": "水色のバルブハンドル", "block.create.dark_oak_window": "ダークオークの窓", - "block.create.dark_oak_window_pane": "ダークオークの窓パネル", + "block.create.dark_oak_window_pane": "ダークオークの窓板", "block.create.dark_scoria": "ダークスコリア", "block.create.dark_scoria_bricks": "ダークスコリアレンガ", "block.create.dark_scoria_bricks_slab": "ダークスコリアレンガのハーフブロック", "block.create.dark_scoria_bricks_stairs": "ダークスコリアレンガの階段", - "block.create.dark_scoria_bricks_wall": "ダークスコリアレンガの壁", + "block.create.dark_scoria_bricks_wall": "ダークスコリアレンガの塀", "block.create.dark_scoria_cobblestone": "ダークスコリアの丸石", "block.create.dark_scoria_cobblestone_slab": "ダークスコリアの丸石のハーフブロック", "block.create.dark_scoria_cobblestone_stairs": "ダークスコリアの丸石の階段", - "block.create.dark_scoria_cobblestone_wall": "ダークスコリアの丸石の壁", + "block.create.dark_scoria_cobblestone_wall": "ダークスコリアの丸石の塀", "block.create.dark_scoria_pillar": "ダークスコリアの柱", "block.create.deployer": "デプロイヤー", "block.create.depot": "デポ", "block.create.diorite_bricks": "閃緑岩レンガ", "block.create.diorite_bricks_slab": "閃緑岩レンガのハーフブロック", "block.create.diorite_bricks_stairs": "閃緑岩レンガの階段", - "block.create.diorite_bricks_wall": "閃緑岩レンガの壁", + "block.create.diorite_bricks_wall": "閃緑岩レンガの塀", "block.create.diorite_cobblestone": "閃緑岩の丸石", "block.create.diorite_cobblestone_slab": "閃緑岩の丸石のハーフブロック", "block.create.diorite_cobblestone_stairs": "閃緑岩の丸石の階段", - "block.create.diorite_cobblestone_wall": "閃緑岩の丸石の壁", + "block.create.diorite_cobblestone_wall": "閃緑岩の丸石の塀", "block.create.diorite_pillar": "閃緑岩の柱", "block.create.dolomite": "苦灰岩", "block.create.dolomite_bricks": "苦灰岩レンガ", "block.create.dolomite_bricks_slab": "苦灰岩レンガのハーフブロック", "block.create.dolomite_bricks_stairs": "苦灰岩レンガの階段", - "block.create.dolomite_bricks_wall": "苦灰岩レンガの壁", + "block.create.dolomite_bricks_wall": "苦灰岩レンガの塀", "block.create.dolomite_cobblestone": "苦灰岩の丸石", "block.create.dolomite_cobblestone_slab": "苦灰岩の丸石のハーフブロック", "block.create.dolomite_cobblestone_stairs": "苦灰岩の丸石の階段", - "block.create.dolomite_cobblestone_wall": "苦灰岩の丸石の壁", + "block.create.dolomite_cobblestone_wall": "苦灰岩の丸石の塀", "block.create.dolomite_pillar": "苦灰岩の柱", "block.create.encased_chain_drive": "ケース入りチェーンドライブ", "block.create.encased_fan": "ケース入りファン", @@ -116,39 +119,39 @@ "block.create.fancy_andesite_bricks": "装飾された安山岩レンガ", "block.create.fancy_andesite_bricks_slab": "装飾された安山岩レンガのハーフブロック", "block.create.fancy_andesite_bricks_stairs": "装飾された安山岩レンガの階段", - "block.create.fancy_andesite_bricks_wall": "装飾された安山岩レンガの壁", + "block.create.fancy_andesite_bricks_wall": "装飾された安山岩レンガの塀", "block.create.fancy_dark_scoria_bricks": "装飾されたダークスコリアレンガ", "block.create.fancy_dark_scoria_bricks_slab": "装飾されたダークスコリアレンガのハーフブロック", "block.create.fancy_dark_scoria_bricks_stairs": "装飾されたダークスコリアレンガの階段", - "block.create.fancy_dark_scoria_bricks_wall": "装飾されたダークスコリアレンガの壁", + "block.create.fancy_dark_scoria_bricks_wall": "装飾されたダークスコリアレンガの塀", "block.create.fancy_diorite_bricks": "装飾された閃緑岩レンガ", "block.create.fancy_diorite_bricks_slab": "装飾された閃緑岩レンガのハーフブロック", "block.create.fancy_diorite_bricks_stairs": "装飾された閃緑岩レンガの階段", - "block.create.fancy_diorite_bricks_wall": "装飾された閃緑岩レンガの壁", + "block.create.fancy_diorite_bricks_wall": "装飾された閃緑岩レンガの塀", "block.create.fancy_dolomite_bricks": "装飾された苦灰岩レンガ", "block.create.fancy_dolomite_bricks_slab": "装飾された苦灰岩レンガのハーフブロック", "block.create.fancy_dolomite_bricks_stairs": "装飾された苦灰岩レンガの階段", - "block.create.fancy_dolomite_bricks_wall": "装飾された苦灰岩レンガの壁", + "block.create.fancy_dolomite_bricks_wall": "装飾された苦灰岩レンガの塀", "block.create.fancy_gabbro_bricks": "装飾された斑れい岩レンガ", "block.create.fancy_gabbro_bricks_slab": "装飾された斑れい岩レンガのハーフブロック", "block.create.fancy_gabbro_bricks_stairs": "装飾された斑れい岩レンガの階段", - "block.create.fancy_gabbro_bricks_wall": "装飾された斑れい岩レンガの壁", + "block.create.fancy_gabbro_bricks_wall": "装飾された斑れい岩レンガの塀", "block.create.fancy_granite_bricks": "装飾された花崗岩レンガ", "block.create.fancy_granite_bricks_slab": "装飾された花崗岩レンガのハーフブロック", "block.create.fancy_granite_bricks_stairs": "装飾された花崗岩レンガの階段", - "block.create.fancy_granite_bricks_wall": "装飾された花崗岩レンガの壁", + "block.create.fancy_granite_bricks_wall": "装飾された花崗岩レンガの塀", "block.create.fancy_limestone_bricks": "装飾された石灰岩レンガ", "block.create.fancy_limestone_bricks_slab": "装飾された石灰岩レンガのハーフブロック", "block.create.fancy_limestone_bricks_stairs": "装飾された石灰岩レンガの階段", - "block.create.fancy_limestone_bricks_wall": "装飾された石灰岩レンガの壁", + "block.create.fancy_limestone_bricks_wall": "装飾された石灰岩レンガの塀", "block.create.fancy_scoria_bricks": "装飾されたスコリアレンガ", "block.create.fancy_scoria_bricks_slab": "装飾されたスコリアレンガのハーフブロック", "block.create.fancy_scoria_bricks_stairs": "装飾されたスコリアレンガの階段", - "block.create.fancy_scoria_bricks_wall": "装飾されたスコリアレンガの壁", + "block.create.fancy_scoria_bricks_wall": "装飾されたスコリアレンガの塀", "block.create.fancy_weathered_limestone_bricks": "装飾された風化した石灰岩レンガ", "block.create.fancy_weathered_limestone_bricks_slab": "装飾された風化した石灰岩レンガのハーフブロック", "block.create.fancy_weathered_limestone_bricks_stairs": "装飾された風化した石灰岩レンガの階段", - "block.create.fancy_weathered_limestone_bricks_wall": "装飾された風化した石灰岩レンガの壁", + "block.create.fancy_weathered_limestone_bricks_wall": "装飾された風化した石灰岩レンガの塀", "block.create.fluid_pipe": "液体パイプ", "block.create.fluid_tank": "液体タンク", "block.create.fluid_valve": "液体バルブ", @@ -160,11 +163,11 @@ "block.create.gabbro_bricks": "斑れい岩レンガ", "block.create.gabbro_bricks_slab": "斑れい岩レンガのハーフブロック", "block.create.gabbro_bricks_stairs": "斑れい岩レンガの階段", - "block.create.gabbro_bricks_wall": "斑れい岩レンガの壁", + "block.create.gabbro_bricks_wall": "斑れい岩レンガの塀", "block.create.gabbro_cobblestone": "斑れい岩の丸石", "block.create.gabbro_cobblestone_slab": "斑れい岩の丸石のハーフブロック", "block.create.gabbro_cobblestone_stairs": "斑れい岩の丸石の階段", - "block.create.gabbro_cobblestone_wall": "斑れい岩の丸石の壁", + "block.create.gabbro_cobblestone_wall": "斑れい岩の丸石の塀", "block.create.gabbro_pillar": "斑れい岩の柱", "block.create.gantry_carriage": "ガントリーキャリッジ", "block.create.gantry_shaft": "ガントリーシャフト", @@ -174,26 +177,29 @@ "block.create.granite_bricks": "花崗岩レンガ", "block.create.granite_bricks_slab": "花崗岩レンガのハーフブロック", "block.create.granite_bricks_stairs": "花崗岩レンガの階段", - "block.create.granite_bricks_wall": "花崗岩レンガの壁", + "block.create.granite_bricks_wall": "花崗岩レンガの塀", "block.create.granite_cobblestone": "花崗岩の丸石", "block.create.granite_cobblestone_slab": "花崗岩の丸石のハーフブロック", "block.create.granite_cobblestone_stairs": "花崗岩の丸石の階段", - "block.create.granite_cobblestone_wall": "花崗岩の丸石の壁", + "block.create.granite_cobblestone_wall": "花崗岩の丸石の塀", "block.create.granite_pillar": "花崗岩の柱", + "block.create.gray_nixie_tube": "灰色のニキシー管", "block.create.gray_sail": "灰色の帆", "block.create.gray_seat": "灰色のシート", "block.create.gray_valve_handle": "灰色のバルブハンドル", + "block.create.green_nixie_tube": "緑色のニキシー管", "block.create.green_sail": "緑色の帆", "block.create.green_seat": "緑色のシート", "block.create.green_valve_handle": "緑色のバルブハンドル", "block.create.hand_crank": "ハンドクランク", + "block.create.haunted_bell": "憑りつかれた鐘", "block.create.honey": "ハチミツ", "block.create.horizontal_framed_glass": "横型ガラス窓", "block.create.horizontal_framed_glass_pane": "横型ガラス窓板", "block.create.hose_pulley": "ホースプーリー", "block.create.item_drain": "アイテム排液口", "block.create.jungle_window": "ジャングルの窓", - "block.create.jungle_window_pane": "ジャングルの窓パネル", + "block.create.jungle_window_pane": "ジャングルの窓板", "block.create.large_cogwheel": "大きな歯車", "block.create.layered_andesite": "安山岩の組石", "block.create.layered_dark_scoria": "ダークスコリアの組石", @@ -204,13 +210,16 @@ "block.create.layered_limestone": "石灰岩の組石", "block.create.layered_scoria": "スコリアの組石", "block.create.layered_weathered_limestone": "風化した石灰岩の組石", - "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.lectern_controller": "書見台コントローラー", + "block.create.light_blue_nixie_tube": "空色のニキシー菅", "block.create.light_blue_sail": "空色の帆", "block.create.light_blue_seat": "空色のシート", "block.create.light_blue_valve_handle": "空色のバルブハンドル", + "block.create.light_gray_nixie_tube": "薄灰色のニキシー管", "block.create.light_gray_sail": "薄灰色の帆", "block.create.light_gray_seat": "薄灰色のシート", "block.create.light_gray_valve_handle": "薄灰色のバルブハンドル", + "block.create.lime_nixie_tube": "黄緑色のニキシー管", "block.create.lime_sail": "黄緑色の帆", "block.create.lime_seat": "黄緑色のシート", "block.create.lime_valve_handle": "黄緑色のバルブハンドル", @@ -219,14 +228,15 @@ "block.create.limestone_bricks": "石灰岩レンガ", "block.create.limestone_bricks_slab": "石灰岩レンガのハーフブロック", "block.create.limestone_bricks_stairs": "石灰岩レンガの階段", - "block.create.limestone_bricks_wall": "石灰岩レンガの壁", + "block.create.limestone_bricks_wall": "石灰岩レンガの塀", "block.create.limestone_cobblestone": "石灰岩の丸石", "block.create.limestone_cobblestone_slab": "石灰岩の丸石のハーフブロック", "block.create.limestone_cobblestone_stairs": "石灰岩の丸石の階段", - "block.create.limestone_cobblestone_wall": "石灰岩の丸石の壁", + "block.create.limestone_cobblestone_wall": "石灰岩の丸石の塀", "block.create.limestone_pillar": "石灰岩の柱", "block.create.linear_chassis": "リニアシャーシ", "block.create.lit_blaze_burner": "燃焼中のブレイズバーナー", + "block.create.magenta_nixie_tube": "赤紫色のニキシー管", "block.create.magenta_sail": "赤紫色の帆", "block.create.magenta_seat": "赤紫色のシート", "block.create.magenta_valve_handle": "赤紫色のバルブハンドル", @@ -259,12 +269,12 @@ "block.create.nixie_tube": "ニキシー管", "block.create.nozzle": "ノズル", "block.create.oak_window": "オークの窓", - "block.create.oak_window_pane": "オークの窓パネル", + "block.create.oak_window_pane": "オークの窓板", "block.create.orange_sail": "橙色の帆", "block.create.orange_seat": "橙色のシート", "block.create.orange_valve_handle": "橙色のバルブハンドル", "block.create.ornate_iron_window": "鉄の装飾ガラス", - "block.create.ornate_iron_window_pane": "鉄の装飾ガラスパネル", + "block.create.ornate_iron_window_pane": "鉄の装飾ガラス板", "block.create.overgrown_andesite": "生い茂った安山岩", "block.create.overgrown_dark_scoria": "生い茂ったダークスコリア", "block.create.overgrown_diorite": "生い茂った閃緑岩", @@ -277,40 +287,41 @@ "block.create.paved_andesite": "舗装された安山岩", "block.create.paved_andesite_slab": "舗装された安山岩のハーフブロック", "block.create.paved_andesite_stairs": "舗装された安山岩の階段", - "block.create.paved_andesite_wall": "舗装された安山岩の壁", + "block.create.paved_andesite_wall": "舗装された安山岩の塀", "block.create.paved_dark_scoria": "舗装されたダークスコリア", "block.create.paved_dark_scoria_slab": "舗装されたダークスコリアのハーフブロック", "block.create.paved_dark_scoria_stairs": "舗装されたダークスコリアの階段", - "block.create.paved_dark_scoria_wall": "舗装されたダークスコリアの壁", + "block.create.paved_dark_scoria_wall": "舗装されたダークスコリアの塀", "block.create.paved_diorite": "舗装された閃緑岩", "block.create.paved_diorite_slab": "舗装された閃緑岩のハーフブロック", "block.create.paved_diorite_stairs": "舗装された閃緑岩の階段", - "block.create.paved_diorite_wall": "舗装された閃緑岩の壁", + "block.create.paved_diorite_wall": "舗装された閃緑岩の塀", "block.create.paved_dolomite": "舗装された苦灰岩", "block.create.paved_dolomite_slab": "舗装された苦灰岩のハーフブロック", "block.create.paved_dolomite_stairs": "舗装された苦灰岩の階段", - "block.create.paved_dolomite_wall": "舗装された苦灰岩の壁", + "block.create.paved_dolomite_wall": "舗装された苦灰岩の塀", "block.create.paved_gabbro": "舗装された斑れい岩", "block.create.paved_gabbro_slab": "舗装された斑れい岩のハーフブロック", "block.create.paved_gabbro_stairs": "舗装された斑れい岩の階段", - "block.create.paved_gabbro_wall": "舗装された斑れい岩の壁", + "block.create.paved_gabbro_wall": "舗装された斑れい岩の塀", "block.create.paved_granite": "舗装された花崗岩", "block.create.paved_granite_slab": "舗装された花崗岩のハーフブロック", "block.create.paved_granite_stairs": "舗装された花崗岩の階段", - "block.create.paved_granite_wall": "舗装された花崗岩の壁", + "block.create.paved_granite_wall": "舗装された花崗岩の塀", "block.create.paved_limestone": "舗装された石灰岩", "block.create.paved_limestone_slab": "舗装された石灰岩のハーフブロック", "block.create.paved_limestone_stairs": "舗装された石灰岩の階段", - "block.create.paved_limestone_wall": "舗装された石灰岩の壁", + "block.create.paved_limestone_wall": "舗装された石灰岩の塀", "block.create.paved_scoria": "舗装されたスコリア", "block.create.paved_scoria_slab": "舗装されたスコリアのハーフブロック", "block.create.paved_scoria_stairs": "舗装されたスコリアの階段", - "block.create.paved_scoria_wall": "舗装されたスコリアの壁", + "block.create.paved_scoria_wall": "舗装されたスコリアの塀", "block.create.paved_weathered_limestone": "舗装された風化した石灰岩", "block.create.paved_weathered_limestone_slab": "舗装された風化した石灰岩のハーフブロック", "block.create.paved_weathered_limestone_stairs": "舗装された風化した石灰岩の階段", - "block.create.paved_weathered_limestone_wall": "舗装された風化した石灰岩の壁", - "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.paved_weathered_limestone_wall": "舗装された風化した石灰岩の塀", + "block.create.peculiar_bell": "風変わりな鐘", + "block.create.pink_nixie_tube": "桃色のニキシー管", "block.create.pink_sail": "桃色の帆", "block.create.pink_seat": "桃色のシート", "block.create.pink_valve_handle": "桃色のバルブハンドル", @@ -318,37 +329,39 @@ "block.create.polished_dark_scoria": "磨かれたダークスコリア", "block.create.polished_dark_scoria_slab": "磨かれたダークスコリアのハーフブロック", "block.create.polished_dark_scoria_stairs": "磨かれたダークスコリアの階段", - "block.create.polished_dark_scoria_wall": "磨かれたダークスコリアの壁", + "block.create.polished_dark_scoria_wall": "磨かれたダークスコリアの塀", "block.create.polished_dolomite": "磨かれた苦灰岩", "block.create.polished_dolomite_slab": "磨かれた苦灰岩のハーフブロック", "block.create.polished_dolomite_stairs": "磨かれた苦灰岩の階段", - "block.create.polished_dolomite_wall": "磨かれた苦灰岩の壁", + "block.create.polished_dolomite_wall": "磨かれた苦灰岩の塀", "block.create.polished_gabbro": "磨かれた斑れい岩", "block.create.polished_gabbro_slab": "磨かれた斑れい岩のハーフブロック", "block.create.polished_gabbro_stairs": "磨かれた斑れい岩の階段", - "block.create.polished_gabbro_wall": "磨かれた斑れい岩の壁", + "block.create.polished_gabbro_wall": "磨かれた斑れい岩の塀", "block.create.polished_limestone": "磨かれた石灰岩", "block.create.polished_limestone_slab": "磨かれた石灰岩のハーフブロック", "block.create.polished_limestone_stairs": "磨かれた石灰岩の階段", - "block.create.polished_limestone_wall": "磨かれた石灰岩の壁", + "block.create.polished_limestone_wall": "磨かれた石灰岩の塀", "block.create.polished_scoria": "磨かれたスコリア", "block.create.polished_scoria_slab": "磨かれたスコリアのハーフブロック", "block.create.polished_scoria_stairs": "磨かれたスコリアの階段", - "block.create.polished_scoria_wall": "磨かれたスコリアの壁", + "block.create.polished_scoria_wall": "磨かれたスコリアの塀", "block.create.polished_weathered_limestone": "磨かれた風化石灰岩", "block.create.polished_weathered_limestone_slab": "磨かれた風化石灰岩のハーフブロック", "block.create.polished_weathered_limestone_stairs": "磨かれた風化した石灰岩の階段", - "block.create.polished_weathered_limestone_wall": "磨かれた風化した石灰岩の壁", + "block.create.polished_weathered_limestone_wall": "磨かれた風化した石灰岩の塀", "block.create.portable_fluid_interface": "ポータブル液体インターフェース", "block.create.portable_storage_interface": "ポータブルストレージインターフェース", "block.create.powered_latch": "パワードラッチ", "block.create.powered_toggle_latch": "パワードトグルラッチ", "block.create.pulley_magnet": "プーリーマグネット", "block.create.pulse_repeater": "パルスリピーター", + "block.create.purple_nixie_tube": "紫色のニキシー管", "block.create.purple_sail": "紫色の帆", "block.create.purple_seat": "紫色のシート", "block.create.purple_valve_handle": "紫色のバルブハンドル", "block.create.radial_chassis": "ラジアルシャーシ", + "block.create.red_nixie_tube": "赤色のニキシー管", "block.create.red_sail": "赤色の帆", "block.create.red_seat": "赤色のシート", "block.create.red_valve_handle": "赤色のバルブハンドル", @@ -359,18 +372,18 @@ "block.create.rope": "ロープ", "block.create.rope_pulley": "ローププーリー", "block.create.rotation_speed_controller": "回転速度コントローラー", - "block.create.sail_frame": "帆のフレーム", + "block.create.sail_frame": "帆フレーム", "block.create.schematic_table": "概略図テーブル", "block.create.schematicannon": "概略図砲", "block.create.scoria": "スコリア", "block.create.scoria_bricks": "スコリアレンガ", "block.create.scoria_bricks_slab": "スコリアレンガのハーフブロック", "block.create.scoria_bricks_stairs": "スコリアレンガの階段", - "block.create.scoria_bricks_wall": "スコリアレンガの壁", + "block.create.scoria_bricks_wall": "スコリアレンガの塀", "block.create.scoria_cobblestone": "スコリアの丸石", "block.create.scoria_cobblestone_slab": "スコリアの丸石のハーフブロック", "block.create.scoria_cobblestone_stairs": "スコリアの丸石の階段", - "block.create.scoria_cobblestone_wall": "スコリアの丸石の壁", + "block.create.scoria_cobblestone_wall": "スコリアの丸石の塀", "block.create.scoria_pillar": "スコリアの柱", "block.create.secondary_linear_chassis": "セカンダリリニアシャーシ", "block.create.sequenced_gearshift": "シーケンスギアシフト", @@ -381,9 +394,9 @@ "block.create.speedometer": "速度メーター", "block.create.spout": "アイテム注液口", "block.create.spruce_window": "マツの窓", - "block.create.spruce_window_pane": "マツの窓パネル", + "block.create.spruce_window_pane": "マツの窓板", "block.create.sticker": "スティッカー", - "block.create.sticky_mechanical_piston": "粘着メカニカルピストン", + "block.create.sticky_mechanical_piston": "メカニカル粘着ピストン", "block.create.stockpile_switch": "在庫スイッチ", "block.create.stressometer": "応力メーター", "block.create.tiled_glass": "タイルガラス", @@ -392,34 +405,39 @@ "block.create.vertical_framed_glass": "縦型ガラス窓", "block.create.vertical_framed_glass_pane": "縦型ガラス窓板", "block.create.warped_window": "歪んだ窓", - "block.create.warped_window_pane": "歪んだ窓パネル", + "block.create.warped_window_pane": "歪んだ窓板", "block.create.water_wheel": "水車", "block.create.weathered_limestone": "風化した石灰岩", "block.create.weathered_limestone_bricks": "風化した石灰岩レンガ", "block.create.weathered_limestone_bricks_slab": "風化した石灰岩レンガのハーフブロック", "block.create.weathered_limestone_bricks_stairs": "風化した石灰岩レンガの階段", - "block.create.weathered_limestone_bricks_wall": "風化した石灰岩レンガの壁", + "block.create.weathered_limestone_bricks_wall": "風化した石灰岩レンガの塀", "block.create.weathered_limestone_cobblestone": "風化した石灰岩の丸石", "block.create.weathered_limestone_cobblestone_slab": "風化した石灰岩の丸石のハーフブロック", "block.create.weathered_limestone_cobblestone_stairs": "風化した石灰岩の丸石の階段", - "block.create.weathered_limestone_cobblestone_wall": "風化した石灰岩の丸石の壁", + "block.create.weathered_limestone_cobblestone_wall": "風化した石灰岩の丸石の塀", "block.create.weathered_limestone_pillar": "風化した石灰岩の柱", "block.create.weighted_ejector": "重量射出機", + "block.create.white_nixie_tube": "白色のニキシー管", "block.create.white_sail": "白色の帆", "block.create.white_seat": "白色のシート", "block.create.white_valve_handle": "白色のバルブハンドル", "block.create.windmill_bearing": "風車ベアリング", "block.create.wooden_bracket": "木製ブラケット", + "block.create.yellow_nixie_tube": "黄色のニキシー管", "block.create.yellow_sail": "黄色の帆", "block.create.yellow_seat": "黄色のシート", "block.create.yellow_valve_handle": "黄色のバルブハンドル", "block.create.zinc_block": "亜鉛ブロック", "block.create.zinc_ore": "亜鉛鉱石", + "enchantment.create.capacity": "容量増加", + "enchantment.create.potato_recovery": "ポテト回収", + "entity.create.contraption": "からくり", - "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.crafting_blueprint": "クラフトブループリント", "entity.create.gantry_contraption": "ガントリーからくり", - "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", + "entity.create.potato_projectile": "ポテト弾", "entity.create.seat": "シート", "entity.create.stationary_contraption": "付設からくり", "entity.create.super_glue": "超粘着剤", @@ -444,13 +462,13 @@ "item.create.chocolate_glazed_berries": "チョコレートグレーズドベリー", "item.create.chromatic_compound": "色彩の化合物", "item.create.cinder_flour": "ネザーラックの粉", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_backtank": "銅のバックタンク", "item.create.copper_ingot": "銅インゴット", "item.create.copper_nugget": "銅塊", "item.create.copper_sheet": "銅板", "item.create.crafter_slot_cover": "クラフタースロットカバー", - "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crafting_blueprint": "クラフトブループリント", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "砕いたアルミニウム鉱石", "item.create.crushed_brass": "砕いた真鍮", "item.create.crushed_copper_ore": "砕いた銅鉱石", @@ -465,8 +483,8 @@ "item.create.crushed_tin_ore": "砕いた錫鉱石", "item.create.crushed_uranium_ore": "砕いたウラン鉱石", "item.create.crushed_zinc_ore": "砕いた亜鉛鉱石", - "item.create.diving_boots": "UNLOCALIZED: Diving Boots", - "item.create.diving_helmet": "UNLOCALIZED: Diving Helmet", + "item.create.diving_boots": "潜水ブーツ", + "item.create.diving_helmet": "潜水ヘルメット", "item.create.dough": "生地", "item.create.electron_tube": "電子管", "item.create.empty_blaze_burner": "空のブレイズバーナー", @@ -479,14 +497,17 @@ "item.create.handheld_worldshaper": "携帯型ワールドシェーパー", "item.create.honey_bucket": "ハチミツ入りバケツ", "item.create.honeyed_apple": "リンゴのハチミツかけ", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "組み立て中の歯車", + "item.create.incomplete_large_cogwheel": "組み立て中の大きな歯車", + "item.create.incomplete_precision_mechanism": "組み立て中の精密機構", "item.create.iron_sheet": "鉄板", - "item.create.linked_controller": "UNLOCALIZED: Linked Controller", + "item.create.linked_controller": "リンクコントローラー", "item.create.minecart_contraption": "からくり付きトロッコ", "item.create.minecart_coupling": "トロッコ連結器", "item.create.polished_rose_quartz": "磨かれたローズクォーツ", - "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", + "item.create.potato_cannon": "ポテトキャノン", "item.create.powdered_obsidian": "黒曜石の粉", + "item.create.precision_mechanism": "精密機構", "item.create.propeller": "プロペラ", "item.create.red_sand_paper": "赤い紙やすり", "item.create.refined_radiance": "高貴な光輝", @@ -510,7 +531,7 @@ "_": "->------------------------] Advancements [------------------------<-", "advancement.create.root": "Createへようこそ", - "advancement.create.root.desc": "素晴らしいからくり機構を作る時間だ!", + "advancement.create.root.desc": "素晴らしいからくり仕掛けを作る時間だ!", "advancement.create.andesite_alloy": "大いに押韻", "advancement.create.andesite_alloy.desc": "Createの素材には変な名前がついています、安山岩合金もその一つです", "advancement.create.its_alive": "こいつ…動くぞ!", @@ -519,51 +540,51 @@ "advancement.create.shifting_gears.desc": "大きい歯車と小さい歯車を噛み合わせて回転速度を変更する", "advancement.create.overstressed": "超過応力", "advancement.create.overstressed.desc": "応力の限界を肌で感じる", - "advancement.create.belt": "コンブ駆動", + "advancement.create.belt": "ベルトコンブア", "advancement.create.belt.desc": "2つのシャフトをメカニカルベルトで繋ぐ", - "advancement.create.tunnel": "隠せ!", - "advancement.create.tunnel.desc": "メカニカルベルトをトンネルで装飾する", + "advancement.create.tunnel": "隠れろ!", + "advancement.create.tunnel.desc": "メカニカルベルトをトンネルで飾る", "advancement.create.splitter_tunnel": "困難は分割せよ", "advancement.create.splitter_tunnel.desc": "真鍮トンネルで仕分け機を作る", "advancement.create.chute": "転がり落ちる", "advancement.create.chute.desc": "メカニカルベルトの垂直バージョン、シュートを設置する", - "advancement.create.upward_chute": "空への誘い", + "advancement.create.upward_chute": "机上の空論", "advancement.create.upward_chute.desc": "落ちているアイテムがファンで駆動するシュートに飛んでいく様子を見る", - "advancement.create.belt_funnel": "ファンネルのぶらさがってる、ひらひらしたやつ", - "advancement.create.belt_funnel.desc": "ベルトやデポ等の上に横向きのファンネルを置き、特殊形態にする", - "advancement.create.belt_funnel_kiss": "オウムと羽ばたき", + "advancement.create.belt_funnel": "ファンネルのひらひら", + "advancement.create.belt_funnel.desc": "ベルトやデポなどの上に横向きのファンネルを置き、特殊形態にする", + "advancement.create.belt_funnel_kiss": "コウノトリの羽ばたき", "advancement.create.belt_funnel_kiss.desc": "2つのベルトに載せたファンネルにキスをさせる", "advancement.create.fan": "メカニカルエアベンダー", "advancement.create.fan.desc": "ケース入りファンから出る風に乗る", - "advancement.create.fan_lava": "地熱暖房器具", + "advancement.create.fan_lava": "地熱ファンヒーター", "advancement.create.fan_lava.desc": "アイテムを精錬する熱風に巻き込まれる", - "advancement.create.fan_water": "奇妙な洗濯機", + "advancement.create.fan_water": "風変りな洗濯機", "advancement.create.fan_water.desc": "アイテムを洗浄する涼風に巻き込まれる", "advancement.create.fan_smoke": "メカニカルふいご", "advancement.create.fan_smoke.desc": "アイテムを燻製する暖風に巻き込まれる", - "advancement.create.wrench": "便利に設定", + "advancement.create.wrench": "便利な設定", "advancement.create.wrench.desc": "からくり作りに役立つレンチを作る", "advancement.create.goggles": "応力をこの目で", "advancement.create.goggles.desc": "機械からより多くの情報を手に入れるために、エンジニアのゴーグルを作る", "advancement.create.speedometer": "正確な速度は?", - "advancement.create.speedometer.desc": "動作中の速度メーターをゴーグルで見て、正確な値を読み取る", + "advancement.create.speedometer.desc": "動作中の回転速度メーターをゴーグルで見て、正確な値を読み取る", "advancement.create.stressometer": "正確な応力は?", "advancement.create.stressometer.desc": "動作中の応力メーターをゴーグルを通して見て、正確な値を読み取る", "advancement.create.aesthetics": "装飾ブーム!", "advancement.create.aesthetics.desc": "シャフト、パイプ、歯車に木製ブラケットや金属ブラケットを取り付ける", "advancement.create.reinforced": "補強ブーム!", - "advancement.create.reinforced.desc": "シャフト、パイプ、メカニカルベルトなどにケーシングブロックを取り付ける", + "advancement.create.reinforced.desc": "シャフト、パイプ、メカニカルベルトにケーシングブロックを取り付ける", "advancement.create.water_wheel": "水力を使おう", "advancement.create.water_wheel.desc": "水車を置いて、回転させよう!", "advancement.create.chocolate_wheel": "味わい深い原動機", "advancement.create.chocolate_wheel.desc": "溶けたチョコレートで水車を回す", "advancement.create.lava_wheel": "マグマ・ホイール", - "advancement.create.lava_wheel.desc": "残念、これは無理だ", + "advancement.create.lava_wheel.desc": "こんなはずじゃなかった", "advancement.create.cuckoo": "今がその時だ", "advancement.create.cuckoo.desc": "鳩時計が就寝時間を告げるのを目撃する", - "advancement.create.millstone": "ポケット粉砕機", + "advancement.create.millstone": "ポケットクラッシャー", "advancement.create.millstone.desc": "石臼を置いて、回転させる", - "advancement.create.windmill": "凱風快晴", + "advancement.create.windmill": "微風", "advancement.create.windmill.desc": "風車を組み立てる", "advancement.create.maxed_windmill": "雄風", "advancement.create.maxed_windmill.desc": "最強の風車を組み立てる", @@ -595,13 +616,13 @@ "advancement.create.copper_casing.desc": "銅と木材を使って銅ケーシングを作る", "advancement.create.spout": "ぱしゃぱしゃ", "advancement.create.spout.desc": "アイテム注液口が液体を充填している様子を見る", - "advancement.create.spout_potion": "大きな醸造台", + "advancement.create.spout_potion": "世界のお薬屋さん", "advancement.create.spout_potion.desc": "アイテム注液口がポーションを瓶に詰めているところを見る", "advancement.create.chocolate": "夢の世界", "advancement.create.chocolate.desc": "溶けたチョコレート入りバケツを手に入れる", "advancement.create.item_drain": "バケツをひっくり返したような", "advancement.create.item_drain.desc": "アイテム排液口が液体アイテムを空にしている様子を見る", - "advancement.create.chained_item_drain": "鉛筆転がし!", + "advancement.create.chained_item_drain": "アイテムころりん", "advancement.create.chained_item_drain.desc": "自動化したアイテム排液口の上を転がるアイテムを見る", "advancement.create.glass_pipe": "フロウ・スパイ", "advancement.create.glass_pipe.desc": "まっすぐな液体パイプにレンチを使って、窓から通る液体を見る", @@ -617,7 +638,7 @@ "advancement.create.infinite_lava.desc": "無限と言えるほどの大量の溶岩を吸引する", "advancement.create.infinite_chocolate": "空想に溺れて", "advancement.create.infinite_chocolate.desc": "無限と言えるほどの大量の溶けたチョコレートを吸引する", - "advancement.create.crafter": "自動作業台", + "advancement.create.crafter": "部品集結!", "advancement.create.crafter.desc": "メカニカルクラフターを設置して、回転力を供給する", "advancement.create.clockwork_bearing": "時計仕掛け", "advancement.create.clockwork_bearing.desc": "時計仕掛けのベアリングの上に構造物を組み立てる", @@ -631,10 +652,10 @@ "advancement.create.flywheel.desc": "かまどエンジンを勢車に繋ぐ", "advancement.create.overstress_flywheel": "ハイレベル応力", "advancement.create.overstress_flywheel.desc": "かまどエンジンに超過応力をかける", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "手間暇かけた骨董品", + "advancement.create.precision_mechanism.desc": "精密機構を組み立てる", "advancement.create.mechanical_arm": "手が離せない!", - "advancement.create.mechanical_arm.desc": "搬入元と搬出先を設定したメカニカルアームを設置して、稼働させ、あなたのために一生懸命労働している様子を見る", + "advancement.create.mechanical_arm.desc": "搬入元と搬出先を設定したメカニカルアームを設置して稼働させ、あなたのために一生懸命働いている様子を見る", "advancement.create.musical_arm": "お気に入りの曲を流して!", "advancement.create.musical_arm.desc": "メカニカルアームがジュークボックスを使う様子を見る", "advancement.create.arm_many_targets": "整理整頓", @@ -659,8 +680,8 @@ "advancement.create.wand_of_symmetry.desc": "対象の杖を作る", "advancement.create.extendo_grip": "ビヨヨーン!", "advancement.create.extendo_grip.desc": "マジックハンドを手に入れる", - "advancement.create.potato_cannon": "UNLOCALIZED: Fwoomp!", - "advancement.create.potato_cannon.desc": "UNLOCALIZED: Defeat an enemy with your Potato Cannon.", + "advancement.create.potato_cannon": "バキューン!", + "advancement.create.potato_cannon.desc": "ポテトキャノンで敵を倒す", "advancement.create.dual_extendo_grip": "究極のビヨンビヨン時代", "advancement.create.dual_extendo_grip.desc": "二刀流のマジックハンドで超人的なリーチを手に入れる", "advancement.create.eob": "ベータ版はここまで", @@ -672,25 +693,31 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create Palettes", - "death.attack.create.crush": "%1$s は破砕ホイールによって処理されました", - "death.attack.create.fan_fire": "%1$s は熱風で焼死した", - "death.attack.create.fan_lava": "%1$s は溶岩ファンによって焼死した", - "death.attack.create.mechanical_drill": "%1$s はメカニカルドリルに突き刺さった", - "death.attack.create.mechanical_saw": "%1$s はメカニカルソーで半分にカットされた", - "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", - "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", - "death.attack.create.cuckoo_clock_explosion": "%1$s は改ざんされた鳩時計に爆破された", + "death.attack.create.crush": "%1$sは破砕ホイールによって処理された", + "death.attack.create.crush.player": "%1$sは%2$sに破砕ホイールに投入された", + "death.attack.create.fan_fire": "%1$sはケース入りファンによって燻製にされた", + "death.attack.create.fan_fire.player": "%1$sは%2$sによって燻製にされた", + "death.attack.create.fan_lava": "%1$sはケース入りファンで精錬された", + "death.attack.create.fan_lava.player": "%1$sは%2$sによって熱風に投げ込まれた", + "death.attack.create.mechanical_drill": "%1$sはメカニカルドリルに突き抜かれた", + "death.attack.create.mechanical_drill.player": "%1$sは%2$sにドリルの目の前に投げ込まれた", + "death.attack.create.mechanical_saw": "%1$sはメカニカルソーで半分にカットされた", + "death.attack.create.mechanical_saw.player": "%1$sは%2$sによってメカニカルソーの回転する刃に投げ込まれた", + "death.attack.create.potato_cannon": "%1$sは%2$sのポテトキャノンに撃ち抜かれた", + "death.attack.create.potato_cannon.item": "%1$sは%3$sで%2$sに撃た抜かれた", + "death.attack.create.cuckoo_clock_explosion": "%1$sは改造された鳩時計に爆破された", + "death.attack.create.cuckoo_clock_explosion.player": "%1$sは何者かによって改造された鳩時計に爆破された", "create.block.deployer.damage_source_name": "悪いデプロイヤー", "create.block.cart_assembler.invalid": "トロッコアセンブラはレールの上にのみ設置できます", - "create.menu.return": "UNLOCALIZED: Return to Menu", - "create.menu.configure": "UNLOCALIZED: Configure...", - "create.menu.ponder_index": "UNLOCALIZED: Ponder Index", - "create.menu.only_ingame": "UNLOCALIZED: Available in the Pause Menu", - "create.menu.project_page": "UNLOCALIZED: Project Page", - "create.menu.report_bugs": "UNLOCALIZED: Report Issues", - "create.menu.support": "UNLOCALIZED: Support Us", + "create.menu.return": "メニューに戻る", + "create.menu.configure": "設定...", + "create.menu.ponder_index": "思案索引", + "create.menu.only_ingame": "一時停止メニューで利用可能", + "create.menu.project_page": "プロジェクトページ", + "create.menu.report_bugs": "バグ報告", + "create.menu.support": "私たちを応援する", "create.recipe.crushing": "粉砕", "create.recipe.milling": "製粉", @@ -702,7 +729,7 @@ "create.recipe.fan_blasting.fan": "溶岩の奥のケース入りファン", "create.recipe.pressing": "プレス", "create.recipe.mixing": "混合", - "create.recipe.deploying": "UNLOCALIZED: Deploying", + "create.recipe.deploying": "使用", "create.recipe.automatic_shapeless": "自動不定形クラフト", "create.recipe.automatic_brewing": "自動醸造", "create.recipe.packing": "圧縮", @@ -716,16 +743,16 @@ "create.recipe.mystery_conversion": "神秘の変転", "create.recipe.spout_filling": "アイテム注液口による注入", "create.recipe.draining": "アイテムから排液", - "create.recipe.sequenced_assembly": "UNLOCALIZED: Sequenced Assembly", - "create.recipe.assembly.next": "UNLOCALIZED: Next: %1$s", - "create.recipe.assembly.step": "UNLOCALIZED: Step %1$s:", - "create.recipe.assembly.progress": "UNLOCALIZED: Progress: %1$s/%2$s", - "create.recipe.assembly.pressing": "UNLOCALIZED: Process in Press", - "create.recipe.assembly.spout_filling_fluid": "UNLOCALIZED: Spout %1$s", - "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", - "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", - "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.sequenced_assembly": "組立ライン", + "create.recipe.assembly.next": "次の工程: %1$s", + "create.recipe.assembly.step": "手順: %1$s:", + "create.recipe.assembly.progress": "進捗: %1$s/%2$s", + "create.recipe.assembly.pressing": "プレスする", + "create.recipe.assembly.spout_filling_fluid": "%1$sを注液", + "create.recipe.assembly.deploying_item": "%1$sを組み込む", + "create.recipe.assembly.cutting": "ソーでの切断", + "create.recipe.assembly.repeat": "%1$s回繰り返す", + "create.recipe.assembly.junk": "ランダムな仕損品", "create.recipe.processing.chance": "%1$s%%チャンス", "create.recipe.heat_requirement.none": "加熱不要", "create.recipe.heat_requirement.heated": "加熱が必要", @@ -778,16 +805,16 @@ "create.orientation.alongZ": "Z に沿る", "create.orientation.alongX": "X に沿る", - "create.gui.terrainzapper.title": "携帯型ワールドシェーパー", - "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", - "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", - "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", - "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", - "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", - "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", - "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", - "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", - "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", + "create.gui.terrainzapper.title": "携帯型ブロックザッパー", + "create.gui.terrainzapper.searchDiagonal": "対角線にフォロー", + "create.gui.terrainzapper.searchFuzzy": "素材の境界を無視", + "create.gui.terrainzapper.patternSection": "模様", + "create.gui.terrainzapper.pattern.solid": "敷き詰め", + "create.gui.terrainzapper.pattern.checkered": "市松模様", + "create.gui.terrainzapper.pattern.inversecheckered": "逆市松模様", + "create.gui.terrainzapper.pattern.chance25": "25%", + "create.gui.terrainzapper.pattern.chance50": "50%", + "create.gui.terrainzapper.pattern.chance75": "75%", "create.gui.terrainzapper.placement": "配置", "create.gui.terrainzapper.placement.merged": "合併", "create.gui.terrainzapper.placement.attached": "添える", @@ -796,8 +823,8 @@ "create.gui.terrainzapper.brush.cuboid": "直方体", "create.gui.terrainzapper.brush.sphere": "球体", "create.gui.terrainzapper.brush.cylinder": "円筒", - "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", - "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", + "create.gui.terrainzapper.brush.surface": "表面", + "create.gui.terrainzapper.brush.cluster": "鉱石", "create.gui.terrainzapper.tool": "ツール", "create.gui.terrainzapper.tool.fill": "埋立", "create.gui.terrainzapper.tool.place": "設置", @@ -807,8 +834,8 @@ "create.gui.terrainzapper.tool.flatten": "なだらかに", "create.terrainzapper.shiftRightClickToSet": "シフト-右クリックで形状を選択", - "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", - "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", + "create.terrainzapper.usingBlock": "使用中: %1$s", + "create.terrainzapper.leftClickToSet": "ブロックをスニークせず左クリックでブロックを選択", "create.minecart_coupling.two_couplings_max": "トロッコを2つ以上連結させることはできません", "create.minecart_coupling.unloaded": "列車の一部のあるチャンクがロードされていません", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "%1$sに属していないか", "create.item_attributes.added_by": "%1$sによって追加されたか", "create.item_attributes.added_by.inverted": "%1$sによって追加されていないか", + "create.item_attributes.shulker_level": "%1$sシュルカーか", + "create.item_attributes.shulker_level.inverted": "%1$sシュルカーでないか", + "create.item_attributes.shulker_level.full": "満杯の", + "create.item_attributes.shulker_level.empty": "空の", + "create.item_attributes.shulker_level.partial": "一部埋まっている", "create.item_attributes.has_enchant": "エンチャントされているか%1$s", "create.item_attributes.has_enchant.inverted": "エンチャントがされていないか", "create.item_attributes.color": "%1$sで染められているか", @@ -1134,20 +1166,27 @@ "create.tooltip.chute.fans_pull_up": "ファンが上から吸い込んでいます", "create.tooltip.chute.fans_pull_down": "ファンが下から吸い込んでいます", "create.tooltip.chute.contains": "内容物: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "配布中", + "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "右クリックで取り出し", - "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", - "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", - "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", - "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", - "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.linked_controller.bind_mode": "割り当てモード", + "create.linked_controller.press_keybind": "%1$s、%2$s、%3$s、%4$s、%5$sまたは%6$sを押すとこの周波数がそのキーに割り当てられます", + "create.linked_controller.key_bound": "周波数を割り当てました %1$s", + "create.linked_controller.frequency_slot_1": "キーバインド: %1$s、周波数 #1", + "create.linked_controller.frequency_slot_2": "キーバインド: %1$s、周波数 #2", - "create.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", - "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", - "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", - "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", - "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", - "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", - "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.crafting_blueprint.crafting_slot": "材料スロット", + "create.crafting_blueprint.filter_items_viable": "フィルターが使えます", + "create.crafting_blueprint.display_slot": "表示スロット", + "create.crafting_blueprint.inferred": "レシピから推測", + "create.crafting_blueprint.manually_assigned": "手動割り当て", + "create.crafting_blueprint.secondary_display_slot": "第2表示スロット", + "create.crafting_blueprint.optional": "オプション", + + "create.potato_cannon.ammo.attack_damage": "攻撃力: %1$s", + "create.potato_cannon.ammo.reload_ticks": "リロード時間(tick): %1$s", + "create.potato_cannon.ammo.knockback": "ノックバック: %1$s", "create.hint.hose_pulley.title": "底なし搬出", "create.hint.hose_pulley": "対象となる液体は無限とみなされています。", @@ -1176,45 +1215,46 @@ "create.command.killTPSCommand.argument.tickTime": "tickTime", "create.contraption.minecart_contraption_too_big": "このからくりトロッコは大きすぎて拾えません。", - "create.contraption.minecart_contraption_illegal_pickup": "UNLOCALIZED: A mystical force is binding this Cart Contraption to the world", + "create.contraption.minecart_contraption_illegal_pickup": "神秘的な力がからくりカートを世界に縛り付けています。", "_": "->------------------------] Subtitles [------------------------<-", "create.subtitle.contraption_disassemble": "からくりが止まる", - "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", + "create.subtitle.peculiar_bell_use": "風変わりな鐘が鳴る", "create.subtitle.mixing": "混ぜる音", "create.subtitle.mechanical_press_activation_belt": "メカニカルプレスがボンと鳴る", - "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", - "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.fwoomp": "ポテトランチャーがバキューンと鳴る", + "create.subtitle.worldshaper_place": "ワールドシェーパーが設置する", + "create.subtitle.crushing_1": "粉砕音", "create.subtitle.depot_slide": "アイテムが滑る", - "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.saw_activate_stone": "メカニカルソーが動作する", "create.subtitle.blaze_munch": "ブレイズの咀嚼音", "create.subtitle.funnel_flap": "ファンネルがはためく", "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", + "create.subtitle.haunted_bell_use": "憑りつかれた鐘が鳴る", "create.subtitle.scroll_value": "スクロールのカチカチ音", "create.subtitle.crafter_craft": "メカニカルクラフターがクラフトする", - "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", + "create.subtitle.controller_put": "コントローラのトントン音", "create.subtitle.cranking": "ハンドクランクが回る", "create.subtitle.wrench_remove": "機械を壊す", "create.subtitle.cogs": "歯車がゴロゴロと鳴る", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", - "create.subtitle.wrench_rotate": "レンチを使う", - "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", - "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", - "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.wrench_rotate": "レンチが使用される", + "create.subtitle.potato_hit": "野菜が衝突する", + "create.subtitle.saw_activate_wood": "メカニカルソーが動作する", + "create.subtitle.haunted_bell_convert": "憑りつかれた鐘が目覚める", + "create.subtitle.deployer_polish": "デプロイヤーが磨く", + "create.subtitle.deny": "失敗音", + "create.subtitle.controller_click": "コントローラーのカチカチ音", "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", - "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", + "create.subtitle.copper_armor_equip": "潜水服がチャリンと鳴る", + "create.subtitle.controller_take": "書見台が空になる", "create.subtitle.mechanical_press_activation": "メカニカルプレスがガーンと鳴る", "create.subtitle.contraption_assemble": "からくりが動く", "create.subtitle.crafter_click": "メカニカルクラフターのカチカチ音", "create.subtitle.depot_plop": "デプロイヤーにアイテムが入れられる", - "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.confirm": "成功音", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1251,7 +1291,7 @@ "item.create.wand_of_symmetry.tooltip.control2": "空中を右クリックしたとき", "item.create.wand_of_symmetry.tooltip.action2": "有効な対象の鏡を_削除_", "item.create.wand_of_symmetry.tooltip.control3": "スニークしながら右クリックしたとき", - "item.create.wand_of_symmetry.tooltip.action3": "_設定インターフェース_を開きます。", + "item.create.wand_of_symmetry.tooltip.action3": "_設定画面_を開きます。", "item.create.handheld_worldshaper.tooltip": "携帯型ワールドシェーパー", "item.create.handheld_worldshaper.tooltip.summary": "特色ある_風景_や_地形_を作成する便利なツール。", @@ -1260,7 +1300,7 @@ "item.create.handheld_worldshaper.tooltip.control2": "ブロックを右クリックしたとき", "item.create.handheld_worldshaper.tooltip.action2": "現在選択されている_ブラシ_と_ツール_を目標の場所に適用します。", "item.create.handheld_worldshaper.tooltip.control3": "スニークしながら右クリックしたとき", - "item.create.handheld_worldshaper.tooltip.action3": "_設定インターフェース_を開きます。", + "item.create.handheld_worldshaper.tooltip.action3": "_設定画面_を開きます。", "item.create.tree_fertilizer.tooltip": "樹木の肥料", "item.create.tree_fertilizer.tooltip.summary": "一般的な種類の木の成長を早めるのに適したミネラルを配合した強力な肥料。", @@ -1271,39 +1311,39 @@ "item.create.extendo_grip.tooltip.summary": "ビヨヨーン!着用者の_射程_を大幅に_伸ばし_ます。", "item.create.extendo_grip.tooltip.condition1": "オフハンドに装備したとき", "item.create.extendo_grip.tooltip.behaviour1": "_メインハンド_で使うアイテムの_射程_を_伸ばし_ます。", - "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.extendo_grip.tooltip.condition2": "銅のバックタンクを装備したとき", + "item.create.extendo_grip.tooltip.behaviour2": "_耐久値_を消費しなくなります。代わりに_圧縮空気_をタンクから消費します。", - "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", - "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", - "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", - "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.potato_cannon.tooltip": "ポテトキャノン", + "item.create.potato_cannon.tooltip.summary": "バキューン!自分が育てた野菜を敵に発射します。_銅のバックタンク_の圧縮空気でも動かせます。", + "item.create.potato_cannon.tooltip.condition1": "左クリックしたとき", + "item.create.potato_cannon.tooltip.behaviour1": "_インベントリ_の中から_適切_なアイテムを発射します。", + "item.create.potato_cannon.tooltip.condition2": "銅のバックタンクを装備した時", + "item.create.potato_cannon.tooltip.behaviour2": "_耐久性_を消費しなくなります。代わりに_圧縮空気_をタンクから消費します", "item.create.filter.tooltip": "フィルター", "item.create.filter.tooltip.summary": "物流系の装置の_搬入_と_搬出_をより_正確_に_制御_し、_アイテムのセット_またはいくつかの_入れ子になったフィルター_と照合します。", "item.create.filter.tooltip.condition1": "フィルタースロットにセットしたとき", "item.create.filter.tooltip.behaviour1": "_設定_に応じてアイテムの流れを_制御_します。", "item.create.filter.tooltip.condition2": "右クリックしたとき", - "item.create.filter.tooltip.behaviour2": "_設定インターフェース_を開きます。", + "item.create.filter.tooltip.behaviour2": "_設定画面_を開きます。", "item.create.attribute_filter.tooltip": "属性フィルター", "item.create.attribute_filter.tooltip.summary": "物流系の装置の_搬入_と_搬出_をより_正確_に_制御_し、アイテムの_属性_と_カテゴリのセット_と照合します。", "item.create.attribute_filter.tooltip.condition1": "フィルタースロットにセットしたとき", "item.create.attribute_filter.tooltip.behaviour1": "_設定_に応じてアイテムの流れを_制御_します。", "item.create.attribute_filter.tooltip.condition2": "右クリックしたとき", - "item.create.attribute_filter.tooltip.behaviour2": "_設定インターフェース_を開きます。", + "item.create.attribute_filter.tooltip.behaviour2": "_設定画面_を開きます。", "item.create.empty_schematic.tooltip": "空の概略図", "item.create.empty_schematic.tooltip.summary": "レシピの材料、および_概略図テーブル_での書き込みに使われます。", "item.create.schematic.tooltip": "概略図", - "item.create.schematic.tooltip.summary": "ワールドに設置できる構造物を保持します。ホログラムを必要に応じて配置し、_概略図砲_を使って建築します。", + "item.create.schematic.tooltip.summary": "ワールドに設置できる構造物を保存します。ホログラムを必要に応じて配置し、_概略図砲_を使って建築します。", "item.create.schematic.tooltip.condition1": "持ったとき", "item.create.schematic.tooltip.behaviour1": "画面上のツールを使ってホログラムを配置します。", "item.create.schematic.tooltip.control1": "スニークしながら右クリックしたとき", - "item.create.schematic.tooltip.action1": "正確な_座標_を入力する_インターフェース_を開きます", + "item.create.schematic.tooltip.action1": "正確な_座標_の入力_画面_を開きます", "item.create.schematic_and_quill.tooltip": "概略図と羽根ペン", "item.create.schematic_and_quill.tooltip.summary": "ワールドの構造物を.nbtファイルに保存できます。", @@ -1319,9 +1359,9 @@ "item.create.schematic_and_quill.tooltip.action3": "選択を_リセット_して削除します。", "block.create.schematicannon.tooltip": "概略図砲", - "block.create.schematicannon.tooltip.summary": "ブロックを撃って、展開された_概略図_をもとにワールドに設置します。隣接する収納ブロックからのアイテムを自動搬入し、_火薬_を燃料とします。", + "block.create.schematicannon.tooltip.summary": "ブロックを撃って、_概略図_をもとにワールドに設置します。隣接する収納ブロックからのアイテムを自動搬入し、_火薬_を燃料とします。", "block.create.schematicannon.tooltip.condition1": "右クリックしたとき", - "block.create.schematicannon.tooltip.behaviour1": "_インターフェース_を開きます。", + "block.create.schematicannon.tooltip.behaviour1": "_UI_を開きます。", "block.create.schematic_table.tooltip": "概略図テーブル", "block.create.schematic_table.tooltip.summary": "保存された構造物を_空の概略図_に書き込みます。", @@ -1333,7 +1373,7 @@ "item.create.goggles.tooltip.condition1": "着用したとき", "item.create.goggles.tooltip.behaviour1": "設置された機械の_回転速度_および、_機械_の_応力への影響_と_許容量_を_色付きのインジケーター_で表示します。", "item.create.goggles.tooltip.condition2": "計器を見たとき", - "item.create.goggles.tooltip.behaviour2": "計器が接続されているネットワークの_回転速度_または_応力_に関する詳細情報を表示します。", + "item.create.goggles.tooltip.behaviour2": "計器が接続されている動力ネットワークの_回転速度_または_応力_に関する詳細情報を表示します。", "item.create.goggles.tooltip.condition3": "液体コンテナを見たとき", "item.create.goggles.tooltip.behaviour3": "ブロックの_容量_と、その中に貯蔵されている_液体_の詳細情報を表示します。", @@ -1356,23 +1396,28 @@ "block.create.turntable.tooltip.summary": "_回転力_を洗練された乗り物酔いに変えます。", "block.create.stockpile_switch.tooltip": "在庫スイッチ", - "block.create.stockpile_switch.tooltip.summary": "接続されたコンテナの_空き容量_に基づいてレッドストーン信号を切り替えます。便利なフィルターが付属しています。_コンパレータ―_とは違って、_在庫スイッチ_は、信号が反転される_しきい値_を設定できます。", + "block.create.stockpile_switch.tooltip.summary": "接続されたコンテナの_空き容量_によってレッドストーン信号を切り替えます。便利なフィルターが付属しています。_コンパレータ―_とは違って、_在庫スイッチ_は、信号が反転される_しきい値_を設定できます。", "block.create.stockpile_switch.tooltip.condition1": "右クリックしたとき", - "block.create.stockpile_switch.tooltip.behaviour1": "_設定インターフェース_を開きます。", + "block.create.stockpile_switch.tooltip.behaviour1": "_設定画面_を開きます。", "block.create.content_observer.tooltip": "コンテンツオブザーバー", - "block.create.content_observer.tooltip.summary": "設定された_フィルター_に一致する_コンテナ_や_メカニカルベルト_内の_アイテム_を_検出_します。観察している_収納ブロック_、_ベルト_、または_シュート_に一致するアイテムが含まれている場合、このは_レッドストーン信号_を発します。観察された_ファンネル_が一致するアイテムを_運搬_すると、このコンポーネントは_レッドストーンパルス_を発します。", + "block.create.content_observer.tooltip.summary": "設定された_フィルター_に一致する_コンテナ_や_メカニカルベルト_内の_アイテム_を_検出_します。観察している_収納ブロック_、_ベルト_、または_シュート_に一致するアイテムが含まれている場合、このは_レッドストーン信号_を発します。観察している_ファンネル_が一致するアイテムを_運搬_すると、このコンポーネントは_レッドストーンパルス_を発します。", "block.create.adjustable_crate.tooltip": "可変クレート", "block.create.adjustable_crate.tooltip.summary": "この_収納ブロック_は、容量を手動で調整できます。任意のアイテムを_16スタック_まで収納できます。_レッドストーンコンパレーター_に対応しています。", - "block.create.adjustable_crate.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "block.create.adjustable_crate.tooltip.behaviour1": "_インターフェース_を開きます。", + "block.create.adjustable_crate.tooltip.condition1": "右クリックしたとき", + "block.create.adjustable_crate.tooltip.behaviour1": "_UI_を開きます。", "block.create.creative_crate.tooltip": "クリエイティブクレート", - "block.create.creative_crate.tooltip.summary": "この_収納ブロック_は、あらゆるアイテムを無限に複製します。隣接する_概略図砲_へブロックを無限に供給します。", + "block.create.creative_crate.tooltip.summary": "あらゆるアイテムを無限に複製する_収納ブロック_。隣接する_概略図砲_へブロックを無限に供給します。", "block.create.creative_crate.tooltip.condition1": "フィルタースロットにアイテムが入っているとき", "block.create.creative_crate.tooltip.behaviour1": "このクレートから何かを_搬出_すると、指定されたアイテムが_無限_に_搬出_されます。このクレートに_搬入_されたアイテムは_消滅_します。", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "コントローラーレール", "block.create.controller_rail.tooltip.summary": "トロッコの_移動速度_を_細かく制御_できる_一方通行_の_パワード_レール", "block.create.controller_rail.tooltip.condition1": "レッドストーン信号を受けたとき", @@ -1388,44 +1433,44 @@ "item.create.refined_radiance.tooltip": "高貴な光輝", "item.create.refined_radiance.tooltip.summary": "_吸収した光輝_から鍛造した色彩素材。", - "item.create.refined_radiance.tooltip.condition1": "UNLOCALIZED: Work In Progress", - "item.create.refined_radiance.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", + "item.create.refined_radiance.tooltip.condition1": "作業中", + "item.create.refined_radiance.tooltip.behaviour1": "この素材の使用方法は将来のリリースで実装予定です。", "item.create.shadow_steel.tooltip": "シャドウスチール", "item.create.shadow_steel.tooltip.summary": "_奈落の虚無_から鍛造した色彩素材。", - "item.create.shadow_steel.tooltip.condition1": "UNLOCALIZED: Work In Progress", - "item.create.shadow_steel.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", + "item.create.shadow_steel.tooltip.condition1": "作業中", + "item.create.shadow_steel.tooltip.behaviour1": "この素材の使用方法は将来のリリースで実装予定です。", - "item.create.linked_controller.tooltip": "UNLOCALIZED: LINKED CONTROLLER", - "item.create.linked_controller.tooltip.summary": "UNLOCALIZED: Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.", - "item.create.linked_controller.tooltip.condition1": "UNLOCALIZED: R-Click", - "item.create.linked_controller.tooltip.behaviour1": "UNLOCALIZED: _Toggles_ the controller. _Movement_ _controls_ are taken over while its active.", - "item.create.linked_controller.tooltip.condition2": "UNLOCALIZED: R-Click while Sneaking", - "item.create.linked_controller.tooltip.behaviour2": "UNLOCALIZED: Opens the manual _Configuration Interface_.", - "item.create.linked_controller.tooltip.condition3": "UNLOCALIZED: R-Click on Redstone Link Receiver", - "item.create.linked_controller.tooltip.behaviour3": "UNLOCALIZED: Enables _Bind Mode_, press one of the _six controls_ to bind it to the _Links' Frequency_.", - "item.create.linked_controller.tooltip.condition4": "UNLOCALIZED: R-Click on Lectern", - "item.create.linked_controller.tooltip.behaviour4": "UNLOCALIZED: Places the Controller into the Lectern for easy activation. (R-Click while Sneaking to retrieve it)", + "item.create.linked_controller.tooltip": "リンクコントローラー", + "item.create.linked_controller.tooltip.summary": "_6つのボタン_に割り当てられた_レッドストーンリンク_周波数を_片手_で_制御_できます。", + "item.create.linked_controller.tooltip.condition1": "左クリック", + "item.create.linked_controller.tooltip.behaviour1": "コントローラーを_オンオフ_します。_制御_がオンのときは_移動_できません。", + "item.create.linked_controller.tooltip.condition2": "スニークしながら左クリック", + "item.create.linked_controller.tooltip.behaviour2": "手動_設定画面_を開きます", + "item.create.linked_controller.tooltip.condition3": "レッドストーンリンク受信機を左クリックしたとき", + "item.create.linked_controller.tooltip.behaviour3": "_割り当てモード_をオンにします。_6つのコントロール_のうち1つを押してリンクの周波数に_割り当て_ます。", + "item.create.linked_controller.tooltip.condition4": "書見台を左クリックしたとき", + "item.create.linked_controller.tooltip.behaviour4": "コントローラーを書見台に設置し、簡単に使えるようにします。(スニーク中に左クリックで取り出せます)", - "item.create.diving_helmet.tooltip": "UNLOCALIZED: DIVING HELMET", - "item.create.diving_helmet.tooltip.summary": "UNLOCALIZED: Together with a _Copper_ _Backtank_, allows the wielder to _breathe_ _underwater_ for an extended amount of time.", - "item.create.diving_helmet.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_helmet.tooltip.behaviour1": "UNLOCALIZED: Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.", + "item.create.diving_helmet.tooltip": "潜水ヘルメット", + "item.create.diving_helmet.tooltip.summary": "_銅のバックタンク_と一緒に使うと、長時間_水中_で_呼吸_できるようになるヘルメット。", + "item.create.diving_helmet.tooltip.condition1": "装備したとき", + "item.create.diving_helmet.tooltip.behaviour1": "バックタンクからゆっくりと_圧縮空気_を排出しながら、_水中呼吸_の効果を供給します。", - "item.create.copper_backtank.tooltip": "UNLOCALIZED: COPPER BACKTANK", - "item.create.copper_backtank.tooltip.summary": "UNLOCALIZED: A _Wearable_ _Tank_ for carrying Pressurized Air.", - "item.create.copper_backtank.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.copper_backtank.tooltip.behaviour1": "UNLOCALIZED: Provides _Pressurized_ _Air_ to Equipment that requires it.", - "item.create.copper_backtank.tooltip.condition2": "UNLOCALIZED: When placed, Powered by Kinetics", - "item.create.copper_backtank.tooltip.behaviour2": "UNLOCALIZED: _Collects_ _Pressurized_ _Air_ at a rate depending on the Rotational Speed.", + "item.create.copper_backtank.tooltip": "銅のバックタンク", + "item.create.copper_backtank.tooltip.summary": "圧縮空気を運ぶため_携帯タンク_", + "item.create.copper_backtank.tooltip.condition1": "装備したとき", + "item.create.copper_backtank.tooltip.behaviour1": "必要な装備に_圧縮空気_を供給します。", + "item.create.copper_backtank.tooltip.condition2": "設置して動力を供給したとき", + "item.create.copper_backtank.tooltip.behaviour2": "_圧縮空気_を_集めます_。速度は回転速度によって決まります。", - "item.create.diving_boots.tooltip": "UNLOCALIZED: DIVING BOOTS", - "item.create.diving_boots.tooltip.summary": "UNLOCALIZED: A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.", - "item.create.diving_boots.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_boots.tooltip.behaviour1": "UNLOCALIZED: Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.", + "item.create.diving_boots.tooltip": "潜水ブーツ", + "item.create.diving_boots.tooltip.summary": "海底を歩けるようになる_重いブーツ_。", + "item.create.diving_boots.tooltip.condition1": "装備したとき", + "item.create.diving_boots.tooltip.behaviour1": "_沈むのが早くなり_、_泳げなく_なります。その代わり、水中で_歩行_と_ジャンプ_が可能になります。また、メカニカルベルトの影響を受けなくなります。", - "item.create.crafting_blueprint.tooltip": "UNLOCALIZED: CRAFTING BLUEPRINT", - "item.create.crafting_blueprint.tooltip.summary": "UNLOCALIZED: _Placed_ on a wall, it can be used to _specify_ _ingredient_ _arrangements_ for easier manual crafting. Each slot represents a Recipe.", + "item.create.crafting_blueprint.tooltip": "クラフトブループリント", + "item.create.crafting_blueprint.tooltip.summary": "壁に_貼り_、_材料_の_配置_を_指定_することで手作業でのクラフトを簡単にできます。各スロットが1つのレシピを表しています。", "item.create.crafting_blueprint.condition1": "UNLOCALIZED: R-Click empty Slot", "item.create.crafting_blueprint.behaviour1": "UNLOCALIZED: Opens a _Crafting_ _menu_ allowing you to _configure_ a _recipe_ and items to display.", "item.create.crafting_blueprint.condition2": "UNLOCALIZED: R-Click configured Slot", @@ -1436,13 +1481,13 @@ "item.create.minecart_coupling.tooltip.condition1": "トロッコに使ったとき", "item.create.minecart_coupling.tooltip.behaviour1": "_2台_のトロッコを連結します。それらは移動中に_一定_の_距離_を保とうします。", - "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip": "風変わりな鐘", + "block.create.peculiar_bell.tooltip.summary": "装飾用の_真鍮の鐘。_魂の炎_の真上に置くと、別の使い方が見つかるかもしれません...", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "憑りつかれた鐘", + "block.create.haunted_bell.tooltip.summary": "ネザーに彷徨う魂が宿る、呪われた鐘", + "block.create.haunted_bell.tooltip.condition1": "持ったとき、鳴らしたとき", + "block.create.haunted_bell.tooltip.behaviour1": "_敵モブ_がスポーンする近くの_光のない場所_を示します", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1459,46 +1504,46 @@ "create.ponder.replay": "最初から", "create.ponder.think_back": "戻る", "create.ponder.slow_text": "熟考(スロー再生)", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "シャーシや超粘着剤を使えば大きな構造物も動かせます", - "create.ponder.shared.rpm32": "32 RPM", - "create.ponder.shared.sneak_and": "スニーク +", - "create.ponder.shared.storage_on_contraption": "構造物中の収納ブロックは自動的にドロップを拾います", + "create.ponder.exit": "終了", + "create.ponder.welcome": "思案画面へようこそ", + "create.ponder.categories": "Createで利用可能なカゴテリ", + "create.ponder.index_description": "アイテムをクリックすると、関連するアイテムやブロックの情報が表示されます。", + "create.ponder.index_title": "思案索引", + "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "この挙動はレンチを使って変更できます", + "create.ponder.shared.storage_on_contraption": "構造物中の収納ブロックは自動的にドロップを拾います", + "create.ponder.shared.sneak_and": "スニーク +", "create.ponder.shared.rpm8": "8 RPM", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "動力源: 16 RPM", - "create.ponder.shared.rpm16": "16 RPM", - "create.ponder.tag.kinetic_sources": "原動機", - "create.ponder.tag.kinetic_sources.description": "回転力を生み出す機械です", - "create.ponder.tag.contraption_actor": "からくり構造部品", - "create.ponder.tag.contraption_actor.description": "ブロックを動かす機械に取り付けたときに特別な動作をする機械です", - "create.ponder.tag.arm_targets": "メカニカルアームのターゲット", - "create.ponder.tag.arm_targets.description": "メカニカルアームの搬入元または搬出先にできる機械/ブロックです", - "create.ponder.tag.logistics": "輸送機械", - "create.ponder.tag.logistics.description": "アイテムの運搬を補助する機械です", - "create.ponder.tag.movement_anchor": "からくり機械", - "create.ponder.tag.movement_anchor.description": "取り付けたブロック構造物を様々な方法で動かすことができるからくりを作ることができる機械です", - "create.ponder.tag.creative": "クリエイティブ限定", - "create.ponder.tag.creative.description": "サバイバルモードでは通常入手できない機械です", - "create.ponder.tag.kinetic_relays": "伝達機械", - "create.ponder.tag.kinetic_relays.description": "回転力の伝達に役立つ機械です", - "create.ponder.tag.windmill_sails": "風車ベアリング用の帆", - "create.ponder.tag.windmill_sails.description": "風車につける構造物を組み立てたときに帆にカウントされるブロック。どのブロックを使っても同じ効率です", - "create.ponder.tag.contraption_assembly": "ブロック組み立て用品", - "create.ponder.tag.contraption_assembly.description": "アニメーションして動く構造物を組み立てるための道具や機械です", - "create.ponder.tag.decoration": "装飾", - "create.ponder.tag.decoration.description": "主に装飾に使うブロックです", - "create.ponder.tag.kinetic_appliances": "作業機械", - "create.ponder.tag.kinetic_appliances.description": "回転力を利用する機械です", + "create.ponder.shared.movement_anchors": "シャーシや超粘着剤を使えば大きな構造物も動かせます", "create.ponder.tag.redstone": "制御機械", "create.ponder.tag.redstone.description": "レッドストーン工学に役立つ機械です", + "create.ponder.tag.contraption_assembly": "ブロック組み立て用品", + "create.ponder.tag.contraption_assembly.description": "アニメーションして動く構造物を組み立てるための道具や機械です", "create.ponder.tag.fluids": "液体制御機械", "create.ponder.tag.fluids.description": "液体の輸送や利用に役立つ機械です", + "create.ponder.tag.decoration": "装飾", + "create.ponder.tag.decoration.description": "主に装飾に使うブロックです", + "create.ponder.tag.windmill_sails": "風車ベアリング用の帆", + "create.ponder.tag.windmill_sails.description": "風車につける構造物を組み立てたときに帆にカウントされるブロック。どのブロックを使っても同じ効率です", + "create.ponder.tag.arm_targets": "メカニカルアームのターゲット", + "create.ponder.tag.arm_targets.description": "メカニカルアームの搬入元または搬出先にできる機械/ブロックです", + "create.ponder.tag.kinetic_appliances": "作業機械", + "create.ponder.tag.kinetic_appliances.description": "回転力を利用する機械です", + "create.ponder.tag.kinetic_sources": "原動機", + "create.ponder.tag.kinetic_sources.description": "回転力を生み出す機械です", + "create.ponder.tag.movement_anchor": "からくり機械", + "create.ponder.tag.movement_anchor.description": "取り付けたブロック構造物を様々な方法で動かすことができるからくりを作ることができる機械です", + "create.ponder.tag.kinetic_relays": "伝達機械", + "create.ponder.tag.kinetic_relays.description": "回転力の伝達に役立つ機械です", + "create.ponder.tag.contraption_actor": "からくり構造部品", + "create.ponder.tag.contraption_actor.description": "ブロックを動かす機械に取り付けたときに特別な動作をする機械です", + "create.ponder.tag.creative": "クリエイティブ限定", + "create.ponder.tag.creative.description": "サバイバルモードでは通常入手できない機械です", + "create.ponder.tag.logistics": "輸送機械", + "create.ponder.tag.logistics.description": "アイテムの運搬を補助する機械です", "create.ponder.adjustable_pulse_repeater.header": "可変パルスリピーターによる信号制御", "create.ponder.adjustable_pulse_repeater.text_1": "可変パルスリピーターは信号を遅延し、短いパルスにして出力します", @@ -1524,10 +1569,10 @@ "create.ponder.andesite_tunnel.text_4": "残ったものは、そのルートを進み続けます", "create.ponder.basin.header": "鉢によるアイテム加工", - "create.ponder.basin.text_1": "鉢には材料となるアイテムや液体を入れられます", + "create.ponder.basin.text_1": "鉢には素材となるアイテムや液体を入れられます", "create.ponder.basin.text_2": "鉢は完成品アイテムを斜め下へ搬出しようとします", - "create.ponder.basin.text_3": "搬出できる機械が存在する場合、鉢には搬出用の蛇口が表示されます", - "create.ponder.basin.text_4": "ここではいくつかの選択肢があります", + "create.ponder.basin.text_3": "搬出できるブロックが存在する場合、鉢には搬出用の蛇口が表示されます", + "create.ponder.basin.text_4": "搬出先のブロックにはいくつかの選択肢があります", "create.ponder.basin.text_5": "搬出したアイテムは下の収納ブロックに入ります", "create.ponder.basin.text_6": "搬出先がない場合、鉢は完成品アイテムを保持します", "create.ponder.basin.text_7": "これは、完成品アイテムを材料として再利用する必要がある場合に役立ちます", @@ -1536,7 +1581,7 @@ "create.ponder.bearing_modes.header": ":メカニカルベアリングの動作モード", "create.ponder.bearing_modes.text_1": "止まったとき、ベアリングは格子に沿った近い角度に構造物を配置します", - "create.ponder.bearing_modes.text_2": "通常のブロックに戻らないように設定したり、開始時の角度のみブロックに戻るように設定することもできます", + "create.ponder.bearing_modes.text_2": "通常のブロックに戻らないように設定したり、開始時の角度のみブロックに戻るように設定したりできます", "create.ponder.belt_casing.header": "ケース入りベルト", "create.ponder.belt_casing.text_1": "真鍮か安山岩のケーシングを使ってメカニカルベルトを飾れます", @@ -1545,16 +1590,16 @@ "create.ponder.belt_connector.header": "メカニカルベルトの使い方", "create.ponder.belt_connector.text_1": "メカニカルベルトを持って2つのシャフトを右クリックすると、シャフトにベルトコンベアを繋げて設置されます", "create.ponder.belt_connector.text_2": "誤ったシャフトをクリックしてしまった場合、スニークしながら右クリックでキャンセルできます", - "create.ponder.belt_connector.text_3": "ベルトの何処にでもシャフトを追加できます", + "create.ponder.belt_connector.text_3": "ベルト内のどこでも、シャフトを追加できます", "create.ponder.belt_connector.text_4": "ベルトを介して接続されたシャフトは、同じ速度・方向で回転します", "create.ponder.belt_connector.text_5": "追加したシャフトは、レンチで取り除けま", "create.ponder.belt_connector.text_6": "メカニカルベルトは見栄えのために染色できます", "create.ponder.belt_directions.header": "メカニカルベルトの有効な向きについて", "create.ponder.belt_directions.text_1": "ベルトは自由な方向に接続できるわけではありません", - "create.ponder.belt_directions.text_2": "1.水平方向", + "create.ponder.belt_directions.text_2": "1.水平", "create.ponder.belt_directions.text_3": "2.斜め", - "create.ponder.belt_directions.text_4": "3.垂直方向", + "create.ponder.belt_directions.text_4": "3.垂直", "create.ponder.belt_directions.text_5": "4.垂直方向のシャフトを水平に", "create.ponder.belt_directions.text_6": "これらはすべて接続可能な方向です。ベルトの長さは2~20ブロックの間で自由に接続できます", @@ -1565,7 +1610,7 @@ "create.ponder.blaze_burner.header": "ブレイズバーナーへの餌やり", "create.ponder.blaze_burner.text_1": "ブレイズバーナーは、鉢で加工するアイテムを加熱できます", "create.ponder.blaze_burner.text_2": "その為には、ブレイズに燃料を与える必要があります", - "create.ponder.blaze_burner.text_3": "ブレイズケーキを与えると、バーナーはさらに強力な火力を出せます", + "create.ponder.blaze_burner.text_3": "ブレイズケーキを与えると、バーナーはさらに火力を出せます", "create.ponder.blaze_burner.text_4": "供給作業は、デプロイヤーやメカニカルアームで自動化できます", "create.ponder.brass_funnel.header": "真鍮ファンネル", @@ -1584,7 +1629,7 @@ "create.ponder.brass_tunnel.text_7": "搬入したアイテムは、接続されているすべての搬出口に分配されます", "create.ponder.brass_tunnel.text_8": "アイテムをトンネルへ直接搬入することもできます", - "create.ponder.brass_tunnel_modes.header": "真鍮トンネルのモード", + "create.ponder.brass_tunnel_modes.header": "真鍮トンネルの動作モード", "create.ponder.brass_tunnel_modes.text_1": "真鍮トンネルはレンチを使って分配モードを変更できます", "create.ponder.brass_tunnel_modes.text_10": "「同期」は、真鍮製トンネルのデフォルト設定です", "create.ponder.brass_tunnel_modes.text_11": "アイテムはグループ内の全てのトンネルがアイテムを搬入できる場合のみ通過を許可します", @@ -1599,35 +1644,35 @@ "create.ponder.brass_tunnel_modes.text_9": "「ランダム」は、スタック全体をランダムに選択された搬出口に分配します ", "create.ponder.cart_assembler.header": "トロッコアセンブラによる構造物の移動", - "create.ponder.cart_assembler.text_1": "レッドストーン信号を受けたアセンブラは、通過するトロッコに接続された構造物を取り付けます", + "create.ponder.cart_assembler.text_1": "レッドストーン信号を受けたアセンブラは通過するトロッコに、取り付けられた構造物を取り付けます", "create.ponder.cart_assembler.text_2": "レッドストーン信号を受けていない場合、通過するトロッコの構造物を取り外し、ブロックへ戻します", "create.ponder.cart_assembler.text_3": "トロッコにレンチを使うと、構造物を付けたまま別の場所へ運べます", "create.ponder.cart_assembler_dual.header": "列車を組み立てる", "create.ponder.cart_assembler_dual.text_1": "2つのトロッコアセンブラが構造物を共有している場合...", - "create.ponder.cart_assembler_dual.text_2": "...どちらかにレッドストーン信号を受けると、列車が組み立てられます", + "create.ponder.cart_assembler_dual.text_2": "...どちらかにレッドストーン信号を与えると、列車が組み立てられます", "create.ponder.cart_assembler_dual.text_3": "トロッコ連結器で接続されたトロッコと同様の動作をします", "create.ponder.cart_assembler_modes.header": "からくり付きトロッコの方向設定", "create.ponder.cart_assembler_modes.text_1": "トロッコの構造物は、トロッコの動きに合わせて回転します", - "create.ponder.cart_assembler_modes.text_2": "アセンブラーが「常に向きを固定する」に設定されている場合、構造物の向きは変わりません", - "create.ponder.cart_assembler_modes.text_3": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + "create.ponder.cart_assembler_modes.text_2": "この矢印は、構造物のどちら側が前面かを示します", + "create.ponder.cart_assembler_modes.text_3": "アセンブラが「常に向きを固定する」に設定されている場合、からくりの向きは変わりません", "create.ponder.cart_assembler_rails.header": "その他のトロッコとレールの種類", "create.ponder.cart_assembler_rails.text_1": "通常のレールに設置されたトロッコアセンブラは、通過するカートの動きに影響を与えません", "create.ponder.cart_assembler_rails.text_2": "パワードレールやコントローラーレールでは、レッドストーン信号を受けるまでトロッコは固定されます", - "create.ponder.cart_assembler_rails.text_3": "他のトロッコをアンカーとして使えます", + "create.ponder.cart_assembler_rails.text_3": "他のトロッコを使うこともできます", "create.ponder.cart_assembler_rails.text_4": "かまど付きトロッコは、構造物の収納ブロックから燃料を確保します", "create.ponder.chain_drive.header": "ケース入りチェーンドライブによる回転力の伝達", "create.ponder.chain_drive.text_1": "チェーンドライブは、一列に並べると回転を伝達します", - "create.ponder.chain_drive.text_2": "この様に接続された全てのシャフトは、回転方向が同じです", - "create.ponder.chain_drive.text_3": "列のどの部分でも90度回転させて設置できます", + "create.ponder.chain_drive.text_2": "このように、に接続された全てのシャフトは、回転方向が同じです", + "create.ponder.chain_drive.text_3": "列の任意の部分を90度方向を変えて設置できます", "create.ponder.chain_gearshift.header": "チェーンギアシフトによる回転速度の制御", "create.ponder.chain_gearshift.text_1": "信号を受けていないチェーンギアシフトは、チェーンドライブと同じように動作します", "create.ponder.chain_gearshift.text_2": "信号を受けている時は、列内の他のチェーンドライブに伝達される速度が2倍になります", - "create.ponder.chain_gearshift.text_3": "信号を受けているチェーンギアシフトが動力源に無い場合、速度が半分になります", + "create.ponder.chain_gearshift.text_3": "信号を受けているチェーンギアシフトが動力源でない場合、速度が半分になります", "create.ponder.chain_gearshift.text_4": "いずれの場合も、列内のチェーンドライブは常に「信号入りチェーンギアシフト」の2倍の速度で動作します", "create.ponder.chain_gearshift.text_5": "レッドストーン信号の強度で、比率を1と2の間でより正確に調整できます", "create.ponder.chain_gearshift.text_6": "12 RPM", @@ -1639,7 +1684,7 @@ "create.ponder.chute_upward.header": "シュートでの上方向へ運搬", "create.ponder.chute_upward.text_1": "シュートの上部または下部にファンを配置すると、アイテムを上方向へ運搬できます", - "create.ponder.chute_upward.text_2": "エンジニアのゴーグルを付けてシュートを見ると、移動方向の情報が表示されます", + "create.ponder.chute_upward.text_2": "エンジニアのゴーグルを付けてシュートを見ると、移動方向が表示されます", "create.ponder.chute_upward.text_3": "ブロックで詰まっている端では、アイテムを側面から搬出入する必要があります", "create.ponder.clockwork_bearing.header": "時計仕掛けのベアリングを使った構造物のアニメーション", @@ -1653,27 +1698,27 @@ "create.ponder.clockwork_bearing.text_8": "2つ目の構造物は分針として回転します", "create.ponder.clutch.header": "クラッチによる回転力の制御", - "create.ponder.clutch.text_1": "クラッチは直線に回転を伝達します", - "create.ponder.clutch.text_2": "レッドストーン信号を受けると、回転の伝達を停止します", + "create.ponder.clutch.text_1": "クラッチはまっすぐ回転を伝達します", + "create.ponder.clutch.text_2": "レッドストーン信号を与えると、回転の伝達が止まります", "create.ponder.cog_speedup.header": "歯車による回転速度変化", "create.ponder.cog_speedup.text_1": "大小の歯車は斜めに接続できます", - "create.ponder.cog_speedup.text_2": "大きな歯車から歯車に接続すると、伝達される回転速度が2倍になります", - "create.ponder.cog_speedup.text_3": "逆に接続すると、伝達される回転速度が半分になります", + "create.ponder.cog_speedup.text_2": "大きな歯車から歯車に接続すると、伝達先の回転速度が2倍になります", + "create.ponder.cog_speedup.text_3": "逆に接続すると、伝達先の回転速度が半分になります", "create.ponder.cogwheel.header": "歯車による回転力の伝達", "create.ponder.cogwheel.text_1": "歯車は隣接する歯車へ回転力を伝達します", "create.ponder.cogwheel.text_2": "このように連結された隣のシャフトは、逆方向に回転します", - "create.ponder.creative_fluid_tank.header": "UNLOCALIZED: Creative Fluid Tanks", - "create.ponder.creative_fluid_tank.text_1": "UNLOCALIZED: Creative Fluid Tanks can be used to provide a bottomless supply of fluid", - "create.ponder.creative_fluid_tank.text_2": "UNLOCALIZED: Right-Click with a fluid containing item to configure it", - "create.ponder.creative_fluid_tank.text_3": "UNLOCALIZED: Pipe Networks can now endlessly draw the assigned fluid from the tank", - "create.ponder.creative_fluid_tank.text_4": "UNLOCALIZED: Any Fluids pushed back into a Creative Fluid Tank will be voided", + "create.ponder.creative_fluid_tank.header": "クリエイティブ液体タンク", + "create.ponder.creative_fluid_tank.text_1": "クリエイティブ液体タンクは、液体を無限に供給できます", + "create.ponder.creative_fluid_tank.text_2": "液体容器アイテムで右クリックで液体を指定できます", + "create.ponder.creative_fluid_tank.text_3": "液体ネットワークはタンクから指定された液体を無限に引き出すことができます", + "create.ponder.creative_fluid_tank.text_4": "クリエイティブ液体タンクに押し入れた液体は消滅します", "create.ponder.creative_motor.header": "クリエイティブモーターによる回転力の生成", - "create.ponder.creative_motor.text_1": "クリエイティブモーターは、コンパクトで調整できる原動機です", - "create.ponder.creative_motor.text_2": "背面パネルを見てスクロールすると、モーターの回転速度を変更できます", + "create.ponder.creative_motor.text_1": "クリエイティブモーターは、コンパクトで調整可能な原動機です", + "create.ponder.creative_motor.text_2": "背面パネルを見ながらスクロールすると、モーターの回転速度を変更できます", "create.ponder.crushing_wheels.header": "破砕ホイールによるアイテム加工", "create.ponder.crushing_wheels.text_1": "一対の破砕ホイールは、非常に効果的にアイテムを粉砕できます", @@ -1689,7 +1734,7 @@ "create.ponder.deployer.text_13": "フィルターを設定すると、一致するアイテムを持っている時だけ稼働します", "create.ponder.deployer.text_14": "また、フィルターに一致するアイテムのみが搬入されるようになり...", "create.ponder.deployer.text_15": "...一致しないアイテムのみが搬出されます", - "create.ponder.deployer.text_2": "動作は、常に前方2ブロックの位置へ行われます", + "create.ponder.deployer.text_2": "動作は、常に手前2ブロックの位置へ行われます", "create.ponder.deployer.text_3": "真正面のブロックが邪魔になることはありません", "create.ponder.deployer.text_4": "デプロイヤーは以下の動作に使えます", "create.ponder.deployer.text_5": "ブロックの設置", @@ -1703,42 +1748,43 @@ "create.ponder.deployer_contraption.text_2": "...稼働した場所ごとに稼働し、からくり内の収納ブロックのアイテムを使用します", "create.ponder.deployer_contraption.text_3": "フィルタースロットを使って、どのアイテムを使用するか指定できます", - "create.ponder.deployer_modes.header": "デプロイヤーのモード", + "create.ponder.deployer_modes.header": "デプロイヤーの動作モード", "create.ponder.deployer_modes.text_1": "デフォルトでは、デプロイヤーは右クリックの動作を模倣します", "create.ponder.deployer_modes.text_2": "レンチを使えば、左クリックの動作を模倣するように設定できます", - "create.ponder.deployer_processing.header": "UNLOCALIZED: Processing Items using Deployers", - "create.ponder.deployer_processing.text_1": "UNLOCALIZED: With a fitting held item, Deployers can process items provided beneath them", - "create.ponder.deployer_processing.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Deployer", - "create.ponder.deployer_processing.text_3": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.deployer_processing.text_4": "UNLOCALIZED: The Deployer will hold and process them automatically", + "create.ponder.deployer_processing.header": "デプロイヤーによるアイテムの処理", + "create.ponder.deployer_processing.text_1": "装着されたアイテムで、デプロイヤーの先にあるアイテムを処理することができます", + "create.ponder.deployer_processing.text_2": "加工したいアイテムはドロップしたり、デプロイヤーの下のデポに置いてください", + "create.ponder.deployer_processing.text_3": "ベルトでアイテムを供給すると", + "create.ponder.deployer_processing.text_4": "デプロイヤーが自動でアイテムを止め、加工します。", "create.ponder.deployer_redstone.header": "レッドストーン信号によるデプロイヤーの制御", "create.ponder.deployer_redstone.text_1": "レッドストーン信号を受けている間、デプロイヤーは稼働しません", "create.ponder.deployer_redstone.text_2": "デプロイヤーは停止する前に、開始したサイクルは終了させます", - "create.ponder.deployer_redstone.text_3": "その為、オフのパルス信号を使って丁度1サイクルだけ稼働させられます", + "create.ponder.deployer_redstone.text_3": "その為、反転したパルス信号を使って丁度1サイクルだけ稼働させられます", "create.ponder.depot.header": "デポの使い方", "create.ponder.depot.text_1": "デポは動かないメカニカルベルトのようなブロックです", - "create.ponder.depot.text_2": "右クリックして、手動でのアイテム搬出入できます", + "create.ponder.depot.text_2": "右クリックして、手動でアイテム搬出入できます", "create.ponder.depot.text_3": "メカニカルベルトのように、載せたアイテムを加工できます", "create.ponder.depot.text_4": "また、メカニカルアームにアイテムを供給することもできます", "create.ponder.empty_blaze_burner.header": "空のブレイズバーナーの使い方", - "create.ponder.empty_blaze_burner.text_1": "空のバーナーでブレイズを右クリックし捕獲できます", + "create.ponder.empty_blaze_burner.text_1": "空のバーナーでブレイズを右クリックすると捕獲できます", "create.ponder.empty_blaze_burner.text_2": "また、ブレイズはスポーンブロックから直接捕獲することもできます", - "create.ponder.empty_blaze_burner.text_3": "これで、様々な機械で利用する理想的な熱源が得られます", + "create.ponder.empty_blaze_burner.text_3": "これで、様々な機械で利用できる理想的な熱源が得られます", "create.ponder.empty_blaze_burner.text_4": "空のブレイズバーナーは火打石と打ち金を使って火を付ければ装飾にも使えます", - "create.ponder.empty_blaze_burner.text_5": "しかし、これは加工用の熱源には適していません", + "create.ponder.empty_blaze_burner.text_5": "さらに、魂の宿ったアイテムを使うことで炎を変化させられます", + "create.ponder.empty_blaze_burner.text_6": "しかし、これは加工用の熱源には適していません", - "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", - "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", - "create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state", - "create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed", + "create.ponder.encased_fluid_pipe.header": "ケース入り液体パイプ", + "create.ponder.encased_fluid_pipe.text_1": "銅ケーシングで液体パイプを飾ることができます", + "create.ponder.encased_fluid_pipe.text_2": "ただの飾りではなく、ケース入りパイプは接続がロックされます", + "create.ponder.encased_fluid_pipe.text_3": "隣接するブロックの設置や破壊などの更新に反応しなくなります", "create.ponder.fan_direction.header": "ケース入りファンの気流", "create.ponder.fan_direction.text_1": "ケース入りファンは、回転力を利用して気流を生み出します", - "create.ponder.fan_direction.text_2": "気流の強さと方向は、供給される回転力に依存します", + "create.ponder.fan_direction.text_2": "気流の強さと方向は、供給される回転力によって決まります", "create.ponder.fan_processing.header": "ケース付きファンによるアイテム加工", "create.ponder.fan_processing.text_1": "溶岩を通過した気流は、加熱されます", @@ -1754,34 +1800,34 @@ "create.ponder.fan_source.text_1": "ファンを熱源に向けて設置すると、回転力を生成できます", "create.ponder.fan_source.text_2": "レッドストーン信号を受けると、回転力が生成されます", - "create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes", - "create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets", - "create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window", - "create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments", - "create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids", - "create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first", - "create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents", - "create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid", + "create.ponder.fluid_pipe_flow.header": "銅パイプを使った液体の移動", + "create.ponder.fluid_pipe_flow.text_1": "液体パイプは2つ以上の液体源と輸送先を繋ぐことができます", + "create.ponder.fluid_pipe_flow.text_2": "レンチを使うと、まっすぐなパイプに窓を付けられます", + "create.ponder.fluid_pipe_flow.text_3": "窓付きパイプは側面と隣接するパイプとつながりません", + "create.ponder.fluid_pipe_flow.text_4": "メカニカルポンプを使えば液体を輸送できます", + "create.ponder.fluid_pipe_flow.text_5": "はじめは液体が輸送されません", + "create.ponder.fluid_pipe_flow.text_6": "液れが終点まで届くと徐々に輸送されていきます", + "create.ponder.fluid_pipe_flow.text_7": "つまり、パイプブロック自体には液体は物理的に入っていないということです", - "create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers", - "create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks", - "create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained", - "create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...", - "create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources", - "create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly", + "create.ponder.fluid_pipe_interaction.header": "液体容器の排出と充填", + "create.ponder.fluid_pipe_interaction.text_1": "液体ネットワークは終点でさまざまなブロックとやりとりできます", + "create.ponder.fluid_pipe_interaction.text_2": "液体を溜めることができれば、どのようなブロックでも液体の搬入・搬出ができます", + "create.ponder.fluid_pipe_interaction.text_3": "開いているパイプの端の目の前の液体ブロックは吸い込めます", + "create.ponder.fluid_pipe_interaction.text_4": "また、開いたスペースに液体ブロックを設置できます", + "create.ponder.fluid_pipe_interaction.text_5": "パイプは、いくつかのブロックから直接液体を吸い込めます", - "create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank", - "create.ponder.fluid_tank_sizes.text_1": "UNLOCALIZED: Fluid Tanks can be combined to increase the total capacity", - "create.ponder.fluid_tank_sizes.text_2": "UNLOCALIZED: Their base square can be up to 3 blocks wide...", - "create.ponder.fluid_tank_sizes.text_3": "UNLOCALIZED: ...and grow in height by more than 30 additional layers", - "create.ponder.fluid_tank_sizes.text_4": "UNLOCALIZED: Using a Wrench, a tanks' window can be toggled", + "create.ponder.fluid_tank_sizes.header": "液体タンクのサイズ", + "create.ponder.fluid_tank_sizes.text_1": "液体タンクは複数組み合わせて容量を増やせます。", + "create.ponder.fluid_tank_sizes.text_2": "横幅は最大3ブロック", + "create.ponder.fluid_tank_sizes.text_3": "高さは30ブロック以上重ねられます", + "create.ponder.fluid_tank_sizes.text_4": "レンチを使って、タンクの窓を付け外しできます", - "create.ponder.fluid_tank_storage.header": "UNLOCALIZED: Storing Fluids in Fluid Tanks", - "create.ponder.fluid_tank_storage.text_1": "UNLOCALIZED: Fluid Tanks can be used to store large amounts of fluid", - "create.ponder.fluid_tank_storage.text_2": "UNLOCALIZED: Pipe networks can push and pull fluids from any side", - "create.ponder.fluid_tank_storage.text_3": "UNLOCALIZED: The contained fluid can be measured by a Comparator", - "create.ponder.fluid_tank_storage.text_4": "UNLOCALIZED: However, in Survival Mode Fluids cannot be added or taken manually", - "create.ponder.fluid_tank_storage.text_5": "UNLOCALIZED: You can use Basins, Item Drains and Spouts to drain or fill fluid containing items", + "create.ponder.fluid_tank_storage.header": "液体タンクへの液体の貯蔵", + "create.ponder.fluid_tank_storage.text_1": "液体タンクは大量の液体を貯蔵することができます", + "create.ponder.fluid_tank_storage.text_2": "どの方向からでも液体を搬出入できます", + "create.ponder.fluid_tank_storage.text_3": "コンパレーターで液体量を測れます", + "create.ponder.fluid_tank_storage.text_4": "しかし、サバイバルモードでは手動で液体を出し入れできません。", + "create.ponder.fluid_tank_storage.text_5": "鉢、アイテム排液口、アイテム注液口などを使えばアイテムから液体を出し入れできます。", "create.ponder.flywheel.header": "勢車による回転力の生成", "create.ponder.flywheel.text_1": "かまどエンジンで回転力を生成するには、勢車が必要です", @@ -1795,9 +1841,9 @@ "create.ponder.funnel_compat.text_4": "アイテム排液口など", "create.ponder.funnel_direction.header": "運搬の方向", - "create.ponder.funnel_direction.text_1": "通常の配置では、収納ブロックからアイテムを搬出ます", + "create.ponder.funnel_direction.text_1": "通常の配置では、収納ブロックからアイテムを搬出します", "create.ponder.funnel_direction.text_2": "スニークしながら設置すると、収納ブロックにアイテムを搬入します", - "create.ponder.funnel_direction.text_3": "レンチを使って、設置後にファンネルのモードを変えられます", + "create.ponder.funnel_direction.text_3": "レンチを使って、設置後にファンネルの動作モードを変えられます", "create.ponder.funnel_direction.text_4": "ほとんどの方向で同じことができます", "create.ponder.funnel_direction.text_5": "ベルト上のファンネルは、ベルトの移動方向に応じて搬入/搬出が決まります", @@ -1818,18 +1864,18 @@ "create.ponder.furnace_engine.text_3": "溶鉱炉を使うと、エンジンの効率が2倍になります", "create.ponder.gantry_carriage.header": "ガントリーキャリッジの使い方", - "create.ponder.gantry_carriage.text_1": "ガントリーキャリッジは、ガントリーシャフトに取り付けてスライドさせられます", - "create.ponder.gantry_carriage.text_2": "ガントリーの仕掛けは、取り付けたブロックを動かせます", + "create.ponder.gantry_carriage.text_1": "ガントリーキャリッジは、ガントリーシャフトに取り付けてスライドできます", + "create.ponder.gantry_carriage.text_2": "ガントリーは、取り付けられたブロックを動かします", - "create.ponder.gantry_cascaded.header": "立体ガンドリー", + "create.ponder.gantry_cascaded.header": "立体ガントリー", "create.ponder.gantry_cascaded.text_1": "ガントリーシャフトは、超粘着剤を使わずにキャリッジに取り付けられます", "create.ponder.gantry_cascaded.text_2": "そのガントリーシャフトに取り付けたキャリッジも同様です", - "create.ponder.gantry_cascaded.text_3": "このように、ガントリー機構を立体的に接続すると、複数の移動軸をカバーできます", + "create.ponder.gantry_cascaded.text_3": "このように、ガントリーを立体的に接続すると、複数の移動軸をカバーできます", "create.ponder.gantry_direction.header": "ガントリーの移動方向", "create.ponder.gantry_direction.text_1": "ガントリーシャフトは、向きを反対に設置できます", "create.ponder.gantry_direction.text_2": "キャリッジの移動方向は、シャフトの向きによって決まります", - "create.ponder.gantry_direction.text_3": "また、シャフトの回転方向にも依存します", + "create.ponder.gantry_direction.text_3": "また、シャフトの回転方向によっても決まります", "create.ponder.gantry_direction.text_4": "キャリッジへ伝達する回転力も同じルールが適用されます", "create.ponder.gantry_redstone.header": "ガントリーでの回転力の伝播", @@ -1843,11 +1889,11 @@ "create.ponder.gearbox.header": "ギアボックスによる回転力の伝達", "create.ponder.gearbox.text_1": "回転軸の向きを変えようとすると、すぐに機構がかさばってしまいます", "create.ponder.gearbox.text_2": "これをコンパクトにしたものがギアボックスです", - "create.ponder.gearbox.text_3": "角を曲がったシャフトは鏡映しの方向に回転します", - "create.ponder.gearbox.text_4": "直線方向への接続は、回転方向が逆になります", + "create.ponder.gearbox.text_3": "直角に曲げて伝達すると、鏡映しの方向に回転します", + "create.ponder.gearbox.text_4": "まっすぐ伝達すると、回転方向が逆になります", "create.ponder.gearshift.header": "ギアシフトによる回転力の制御", - "create.ponder.gearshift.text_1": "ギアシフトは、直線に回転を伝達します", + "create.ponder.gearshift.text_1": "ギアシフトは、まっすぐ回転を伝達します", "create.ponder.gearshift.text_2": "レッドストーン信号を受けると、回転方向を逆に伝達します", "create.ponder.hand_crank.header": "ハンドクランクによる回転力の生成", @@ -1856,33 +1902,33 @@ "create.ponder.hand_crank.text_3": "回転速度は比較的速めです", "create.ponder.hand_crank.text_4": "スニークしながら右クリックし続けると、時計回りに回転します", - "create.ponder.hose_pulley.header": "UNLOCALIZED: Source Filling and Draining using Hose Pulleys", - "create.ponder.hose_pulley.text_1": "UNLOCALIZED: Hose Pulleys can be used to fill or drain large bodies of Fluid", - "create.ponder.hose_pulley.text_2": "UNLOCALIZED: With the Kinetic Input, the height of the pulleys' hose can be controlled", - "create.ponder.hose_pulley.text_3": "UNLOCALIZED: The Pulley retracts while the input rotation is inverted", - "create.ponder.hose_pulley.text_4": "UNLOCALIZED: On the opposite side, pipes can be connected", - "create.ponder.hose_pulley.text_5": "UNLOCALIZED: Attached pipe networks can either provide fluid to the hose...", - "create.ponder.hose_pulley.text_6": "UNLOCALIZED: ...or pull from it, draining the pool instead", - "create.ponder.hose_pulley.text_7": "UNLOCALIZED: Fill and Drain speed of the pulley depends entirely on the fluid networks' throughput", + "create.ponder.hose_pulley.header": "ホースプーリーを使った液体の吸入・放出", + "create.ponder.hose_pulley.text_1": "ホースプーリーは、大規模な液体の吸入や放出に使います", + "create.ponder.hose_pulley.text_2": "回転力の入出口はプーリーのホースの高さを変えるのに使います", + "create.ponder.hose_pulley.text_3": "回転方向を逆にするとプーリーが収納されます", + "create.ponder.hose_pulley.text_4": "反対側にはパイプを接続できます", + "create.ponder.hose_pulley.text_5": "接続された液体ネットワークはプーリーに液体を供給し、放出できます", + "create.ponder.hose_pulley.text_6": "また、プーリーから吸い出し、代わりに吸入することもできます", + "create.ponder.hose_pulley.text_7": "プーリーの吸入・放出速度は液体ネットワークの性能で決まります", - "create.ponder.hose_pulley_infinite.header": "UNLOCALIZED: Passively Filling and Draining large bodies of Fluid", - "create.ponder.hose_pulley_infinite.text_1": "UNLOCALIZED: When deploying the Hose Pulley into a large enough ocean...", - "create.ponder.hose_pulley_infinite.text_2": "UNLOCALIZED: It will provide/dispose fluids without affecting the source", - "create.ponder.hose_pulley_infinite.text_3": "UNLOCALIZED: Pipe networks can limitlessly take fluids from/to such pulleys", + "create.ponder.hose_pulley_infinite.header": "大規模な液体の無限の吸入・放出", + "create.ponder.hose_pulley_infinite.text_1": "ホースプーリーを十分に大きな海に設置すると", + "create.ponder.hose_pulley_infinite.text_2": "海に影響を与えずに液体を吸入・放出できます", + "create.ponder.hose_pulley_infinite.text_3": "つまり、液体ネットワークはこのプーリーから液体を無限に出し入れできます", - "create.ponder.hose_pulley_level.header": "UNLOCALIZED: Fill and Drain level of Hose Pulleys", - "create.ponder.hose_pulley_level.text_1": "UNLOCALIZED: While fully retracted, the Hose Pulley cannot operate", - "create.ponder.hose_pulley_level.text_2": "UNLOCALIZED: Draining runs from top to bottom", - "create.ponder.hose_pulley_level.text_3": "UNLOCALIZED: The surface level will end up just below where the hose ends", - "create.ponder.hose_pulley_level.text_4": "UNLOCALIZED: Filling runs from bottom to top", - "create.ponder.hose_pulley_level.text_5": "UNLOCALIZED: The filled pool will not grow beyond the layer above the hose end", + "create.ponder.hose_pulley_level.header": "ホースプーリーの吸入・放出レベル", + "create.ponder.hose_pulley_level.text_1": "完全に収納された状態では、ホースプーリーは稼働しません", + "create.ponder.hose_pulley_level.text_2": "上から下に水を吸入します", + "create.ponder.hose_pulley_level.text_3": "表面の高さはホースのすぐ下になります", + "create.ponder.hose_pulley_level.text_4": "下から上に向かって放出します", + "create.ponder.hose_pulley_level.text_5": "ホースの端より上に放出されることはありません", - "create.ponder.item_drain.header": "UNLOCALIZED: Emptying Fluid Containers using Item Drains", - "create.ponder.item_drain.text_1": "UNLOCALIZED: Item Drains can extract fluids from items", - "create.ponder.item_drain.text_2": "UNLOCALIZED: Right-click it to pour fluids from your held item into it", - "create.ponder.item_drain.text_3": "UNLOCALIZED: When items are inserted from the side...", - "create.ponder.item_drain.text_4": "UNLOCALIZED: ...they roll across, emptying out their contained fluid", - "create.ponder.item_drain.text_5": "UNLOCALIZED: Pipe Networks can now pull the fluid from the drains' internal buffer", + "create.ponder.item_drain.header": "アイテム排液口で液体容器を空にする", + "create.ponder.item_drain.text_1": "アイテム排液口はアイテムから液体を取り出せます", + "create.ponder.item_drain.text_2": "右クリックすると、持っているアイテムの中の液体を注ぐことができます", + "create.ponder.item_drain.text_3": "横からアイテムを入れると...", + "create.ponder.item_drain.text_4": "...中に詰まった液体を出しながら横に転がっていきます", + "create.ponder.item_drain.text_5": "液体ネットワークで、排液口から液体を取り出せます", "create.ponder.large_cogwheel.header": "大きな歯車による回転力の伝達", "create.ponder.large_cogwheel.text_1": "大きな歯車は、直角に接続できます", @@ -1894,12 +1940,12 @@ "create.ponder.linear_chassis_attachment.text_3": "素手でスニークしながら右クリックすると粘着剤を剥がせます", "create.ponder.linear_chassis_attachment.text_4": "リニアシャーシの特殊な粘着面は、ブロックの列をまとめてくっつけることができます", "create.ponder.linear_chassis_attachment.text_5": "レンチを使って、このシャーシの粘着範囲を正確に調整できます", - "create.ponder.linear_chassis_attachment.text_6": "CTRLを押しながらスクロールすると、接続している全てのシャーシブロックの範囲を調整できます", + "create.ponder.linear_chassis_attachment.text_6": "CTRLを押しながらスクロールすると、接続している全てのシャーシブロックの範囲を一気に調整できます", "create.ponder.linear_chassis_attachment.text_7": "他の面にブロックを接着するには、超粘着剤を使う必要があります", "create.ponder.linear_chassis_attachment.text_8": "この仕組みを使えば、どんな形の構造物もからくりとして動かせます", "create.ponder.linear_chassis_group.header": "リニアシャーシをグループで動かす", - "create.ponder.linear_chassis_group.text_1": "リニアシャーシは、隣の同じシャーシブロックと接続します", + "create.ponder.linear_chassis_group.text_1": "リニアシャーシは、隣の同じ種類のシャーシと繋がります", "create.ponder.linear_chassis_group.text_2": "からくり機械で1つを動かすと、他のリニアシャーシも一緒に動きます", "create.ponder.linear_chassis_group.text_3": "異なる種類のシャーシや、別の方向を向いているシャーシは接続されません", @@ -1924,7 +1970,7 @@ "create.ponder.mechanical_arm_modes.header": "メカニカルアームの分配モード", "create.ponder.mechanical_arm_modes.text_1": "搬入元", "create.ponder.mechanical_arm_modes.text_2": "搬出先", - "create.ponder.mechanical_arm_modes.text_3": "アームに複数の有効な搬出先が設定されている場合...", + "create.ponder.mechanical_arm_modes.text_3": "アームは複数の有効な搬出先が設定されていると...", "create.ponder.mechanical_arm_modes.text_4": "...設定に従ってアイテムを分配します", "create.ponder.mechanical_arm_modes.text_5": "レンチを持ってスクロールすると設定を変えられます", "create.ponder.mechanical_arm_modes.text_6": "「順繰り分配」は、有効な全ての搬出先へ順番に搬出します", @@ -1938,8 +1984,8 @@ "create.ponder.mechanical_arm_redstone.text_3": "それを利用し、反転したパルス信号を使って1回だけ稼働させられます", "create.ponder.mechanical_bearing.header": "メカニカルベアリングによる構造物の移動", - "create.ponder.mechanical_bearing.text_1": "メカニカルベアリングは、前方にブロックを取り付けられます", - "create.ponder.mechanical_bearing.text_2": "回転力を供給すると、組み立てた構造物を回転できます", + "create.ponder.mechanical_bearing.text_1": "メカニカルベアリングは、手前にブロックを取り付けられます", + "create.ponder.mechanical_bearing.text_2": "回転力を供給すると、組み立てた構造物を回せます", "create.ponder.mechanical_crafter.header": "メカニカルクラフターの配置", "create.ponder.mechanical_crafter.text_1": "メカニカルクラフターは、あらゆるクラフトレシピを自動化できます", @@ -1963,7 +2009,7 @@ "create.ponder.mechanical_drill.header": "メカニカルドリルでブロックを破壊する", "create.ponder.mechanical_drill.text_1": "メカニカルドリルは回転力を供給すると、目の前のブロックを破壊します", - "create.ponder.mechanical_drill.text_2": "採掘速度は回転速度に依存します", + "create.ponder.mechanical_drill.text_2": "採掘速度は回転速度で決まります", "create.ponder.mechanical_drill_contraption.header": "からくりに組み込んでのメカニカルドリルの使い方", "create.ponder.mechanical_drill_contraption.text_1": "からくりの一部として、メカニカルドリルを動かすと...", @@ -1977,49 +2023,49 @@ "create.ponder.mechanical_mixer.text_1": "ミキサーと鉢があれば、いくつかのクラフトレシピを自動化できます", "create.ponder.mechanical_mixer.text_2": "自動化できるのは不定形レシピといくつかの追加レシピです", "create.ponder.mechanical_mixer.text_3": "レシピの中には、ブレイズバーナーの熱を必要とするものもあります", - "create.ponder.mechanical_mixer.text_4": "フィルタースロットは、2つのレシピが競合する場合に使えます", + "create.ponder.mechanical_mixer.text_4": "フィルタースロットは、2つのレシピが競合するときに使えます", "create.ponder.mechanical_piston.header": "メカニカルピストンによる構造物の移動", - "create.ponder.mechanical_piston.text_1": "メカニカルピストンは、前方にあるブロックを動かせます", - "create.ponder.mechanical_piston.text_2": "移動の速度と方向は、供給する回転力に依存します", - "create.ponder.mechanical_piston.text_3": "粘着性メカニカルピストンは、取り付けられたブロックを引き戻せます", + "create.ponder.mechanical_piston.text_1": "メカニカルピストンは、手前にあるブロックを動かせます", + "create.ponder.mechanical_piston.text_2": "移動の速度と方向は、供給する回転力で決まります", + "create.ponder.mechanical_piston.text_3": "メカニカル粘着ピストンは、取り付けられたブロックを引き戻せます", "create.ponder.mechanical_piston_modes.header": "メカニカルピストンの動作モード", "create.ponder.mechanical_piston_modes.text_1": "ピストンの動作が止まると、移動した構造物はブロックへ戻ります", - "create.ponder.mechanical_piston_modes.text_2": "ブロックに戻らないように設定したり、動かし始めた場所でのみブロックに戻るように設定できます", + "create.ponder.mechanical_piston_modes.text_2": "ブロックに戻らないように設定したり、動かし始めた場所でのみブロックに戻るように設定したりできます", "create.ponder.mechanical_plough.header": "からくりに組み込んでのメカニカルプラウの使い方", "create.ponder.mechanical_plough.text_1": "プラウを組み込んだからくりを動かすと...", - "create.ponder.mechanical_plough.text_2": "...当たり判定のないブロックが破壊されます", + "create.ponder.mechanical_plough.text_2": "...当たり判定のないブロックが破壊します", "create.ponder.mechanical_plough.text_3": "さらに、プラウは土を耕やします", "create.ponder.mechanical_plough.text_4": "また、エンティティを傷つけずに飛ばすこともできます", "create.ponder.mechanical_press.header": "メカニカルプレスによるアイテム加工", "create.ponder.mechanical_press.text_1": "メカニカルプレスは、その下に配置されたアイテムを加工できます", - "create.ponder.mechanical_press.text_2": "加工するアイテムは下に落としたり、プレス機の下にあるデポに置いたり", - "create.ponder.mechanical_press.text_3": "アイテムがベルトへ供給されると...", - "create.ponder.mechanical_press.text_4": "...プレス機が自動的にアイテムを保持し、加工します", + "create.ponder.mechanical_press.text_2": "加工するアイテムは下に落としたり、プレス機の下にあるデポに置いたりしてください", + "create.ponder.mechanical_press.text_3": "アイテムがベルトで供給されると...", + "create.ponder.mechanical_press.text_4": "...プレスが自動でアイテムを止め、加工します", "create.ponder.mechanical_press_compacting.header": "メカニカルプレスでの圧縮加工", "create.ponder.mechanical_press_compacting.text_1": "鉢に入れられたアイテムをプレスし、圧縮加工できます", "create.ponder.mechanical_press_compacting.text_2": "圧縮加工には、2x2、3x3のクラフトレシピに加え、いくつかの追加レシピがあります", "create.ponder.mechanical_press_compacting.text_3": "これらのレシピの中には、ブレイズバーナーの熱を必要とするものがあります", - "create.ponder.mechanical_press_compacting.text_4": "フィルタースロットは、2つのレシピが競合する場合に使えます", + "create.ponder.mechanical_press_compacting.text_4": "フィルタースロットは、2つのレシピが競合するときに使えます", - "create.ponder.mechanical_pump_flow.header": "UNLOCALIZED: Fluid Transportation using Mechanical Pumps", - "create.ponder.mechanical_pump_flow.text_1": "UNLOCALIZED: Mechanical Pumps govern the flow of their attached pipe networks", - "create.ponder.mechanical_pump_flow.text_2": "UNLOCALIZED: When powered, their arrow indicates the direction of flow", - "create.ponder.mechanical_pump_flow.text_3": "UNLOCALIZED: The network behind is now pulling fluids...", - "create.ponder.mechanical_pump_flow.text_4": "UNLOCALIZED: ...while the network in front is transferring it outward", - "create.ponder.mechanical_pump_flow.text_5": "UNLOCALIZED: Reversing the input rotation reverses the direction of flow", - "create.ponder.mechanical_pump_flow.text_6": "UNLOCALIZED: Use a Wrench to reverse the orientation of pumps manually", + "create.ponder.mechanical_pump_flow.header": "メカニカルポンプによる液体輸送", + "create.ponder.mechanical_pump_flow.text_1": "メカニカルポンプは、接続されたネットワークの液体の流れを制御します", + "create.ponder.mechanical_pump_flow.text_2": "稼働させると、矢印が液体の流れる方向を示します", + "create.ponder.mechanical_pump_flow.text_3": "後ろのネットワークが液体を吸い取っているのに対し...", + "create.ponder.mechanical_pump_flow.text_4": "...前のネットワークが液体を外側に送っています", + "create.ponder.mechanical_pump_flow.text_5": "回転方向を逆にすると、流れの方向が逆になります", + "create.ponder.mechanical_pump_flow.text_6": "レンチを使って手動でポンプの向きを変えることもできます", - "create.ponder.mechanical_pump_speed.header": "UNLOCALIZED: Throughput of Mechanical Pumps", - "create.ponder.mechanical_pump_speed.text_1": "UNLOCALIZED: Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away", - "create.ponder.mechanical_pump_speed.text_2": "UNLOCALIZED: Speeding up the input rotation changes the speed of flow propagation...", - "create.ponder.mechanical_pump_speed.text_3": "UNLOCALIZED: ...aswell as how quickly fluids are transferred", - "create.ponder.mechanical_pump_speed.text_4": "UNLOCALIZED: Pumps can combine their throughputs within shared pipe networks", - "create.ponder.mechanical_pump_speed.text_5": "UNLOCALIZED: Alternating their orientation can help align their flow directions", + "create.ponder.mechanical_pump_speed.header": "メカニカルポンプの輸送速度", + "create.ponder.mechanical_pump_speed.text_1": "速度に関わらず、メカニカルポンプは16ブロック先までのパイプに影響を与えます", + "create.ponder.mechanical_pump_speed.text_2": "回転速度を速くすることで、流れの送られる速度と...", + "create.ponder.mechanical_pump_speed.text_3": "...液体の輸送速度が変わります", + "create.ponder.mechanical_pump_speed.text_4": "液体ネットワーク内のポンプはそれぞれ別の速度で動かすことができます", + "create.ponder.mechanical_pump_speed.text_5": "向きを交互にすることで、流れの方向を揃えることができます", "create.ponder.mechanical_saw_breaker.header": "メカニカルソーによる伐採", "create.ponder.mechanical_saw_breaker.text_1": "メカニカルソーは回転力を供給すると、目の前の木を伐採できます", @@ -2034,7 +2080,7 @@ "create.ponder.mechanical_saw_processing.text_2": "加工されたアイテムは、常にソーの回転方向とは逆に移動します", "create.ponder.mechanical_saw_processing.text_3": "ソーはメカニカルベルトと繋げて加工できます", "create.ponder.mechanical_saw_processing.text_4": "複数の完成品がある場合、フィルタースロットでどの完成品を作るかを指定できます", - "create.ponder.mechanical_saw_processing.text_5": "フィルターがない場合、ソーは全ての加工結果を順番に繰り返します", + "create.ponder.mechanical_saw_processing.text_5": "フィルターがない場合、ソーは全ての加工を順番に繰り返します", "create.ponder.millstone.header": "石臼でのアイテム加工", "create.ponder.millstone.text_1": "石臼はアイテムを粉砕加工する機械です", @@ -2046,27 +2092,28 @@ "create.ponder.nixie_tube.header": "ニキシー管の使い方", "create.ponder.nixie_tube.text_1": "ニキシー管は受けたレッドストーン信号の強度を表示します", "create.ponder.nixie_tube.text_2": "金床で名付けた名札を使って、好きな文字を表示することもできます", + "create.ponder.nixie_tube.text_3": "染料で右クリックすることで表示の色を変えられます", "create.ponder.piston_pole.header": "ピストン延長ポール", "create.ponder.piston_pole.text_1": "ポールが無いとメカニカルピストンは動きません", "create.ponder.piston_pole.text_2": "後ろに付けたポールの長さによって、伸び縮みする長さが決まります", - "create.ponder.portable_fluid_interface.header": "UNLOCALIZED: Contraption Fluid Exchange", - "create.ponder.portable_fluid_interface.text_1": "UNLOCALIZED: Fluid Tanks on moving contraptions cannot be accessed by any pipes", - "create.ponder.portable_fluid_interface.text_2": "UNLOCALIZED: This component can interact with fluid tanks without the need to stop the contraption", - "create.ponder.portable_fluid_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_fluid_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_fluid_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL Tanks on the contraption", - "create.ponder.portable_fluid_interface.text_6": "UNLOCALIZED: Fluid can now be inserted...", - "create.ponder.portable_fluid_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_fluid_interface.text_8": "UNLOCALIZED: After no contents have been exchanged for a while, the contraption will continue on its way", + "create.ponder.portable_fluid_interface.header": "からくり液体交換", + "create.ponder.portable_fluid_interface.text_1": "移動しているからくりの液体タンクは、どんなパイプでも出し入れできません", + "create.ponder.portable_fluid_interface.text_2": "この機械は、からくりをブロックに戻すことなく液体を出し入れできます", + "create.ponder.portable_fluid_interface.text_3": "1~2ブロックの隙間を開けて2つ目のインターフェースを設置しましょう", + "create.ponder.portable_fluid_interface.text_4": "すれ違ったときに必ず接続されます", + "create.ponder.portable_fluid_interface.text_5": "接続中は、設置されている方のインターフェースはからくり内全てのタンクのように振る舞います", + "create.ponder.portable_fluid_interface.text_6": "液体の搬入と...", + "create.ponder.portable_fluid_interface.text_7": "...搬出ができるます", + "create.ponder.portable_fluid_interface.text_8": "しばらく中身が出し入れされないと、このからくりはまた動き出します", "create.ponder.portable_storage_interface.header": "稼働中のからくりとの搬出入", "create.ponder.portable_storage_interface.text_1": "稼働中のからくりに組み込まれた収納ブロックは、プレイヤーが開くことはできません", "create.ponder.portable_storage_interface.text_2": "この装置は、からくりを停止することなく、収納ブロックと搬出入できます", - "create.ponder.portable_storage_interface.text_3": "1~2ブロックの間隔をあけて、二つ目のインターフェースを設置しましょう", + "create.ponder.portable_storage_interface.text_3": "1~2ブロックの間隔をあけて、2つ目のインターフェースを設置しましょう", "create.ponder.portable_storage_interface.text_4": "両者がすれ違うたびに接続されます", - "create.ponder.portable_storage_interface.text_5": "接続されている間、設置されている方のインターフェースはからくり内全ての収納ブロックのように振る舞います", + "create.ponder.portable_storage_interface.text_5": "接続中、設置されている方のインターフェースはからくり内全ての収納ブロックのように振る舞います", "create.ponder.portable_storage_interface.text_6": "アイテムを搬入したり...", "create.ponder.portable_storage_interface.text_7": "...アイテムを搬出したりできます", "create.ponder.portable_storage_interface.text_8": "しばらくの間アイテムのやり取りがないと、からくりは稼働を再開します", @@ -2078,19 +2125,19 @@ "create.ponder.powered_latch.text_1": "パワードラッチはレッドストーン信号で制御できるレバーです", "create.ponder.powered_latch.text_2": "後ろからの信号でオンに", "create.ponder.powered_latch.text_3": "側面からの信号でオフに戻ります", - "create.ponder.powered_latch.text_4": "パワードラッチは、手動でも切り替えられます", + "create.ponder.powered_latch.text_4": "パワードラッチは、手動でもオンオフできます", "create.ponder.powered_toggle_latch.header": "パワードトグルラッチによる信号制御", "create.ponder.powered_toggle_latch.text_1": "パワードトグルラッチはレッドストーン信号で切り替えできるレバーです", "create.ponder.powered_toggle_latch.text_2": "後ろからの信号で切り替えできます", "create.ponder.powered_toggle_latch.text_3": "何度も信号を送るとオンとオフと繰り返します", - "create.ponder.powered_toggle_latch.text_4": "パワードトグルラッチは、手動で切り替えることもできます", + "create.ponder.powered_toggle_latch.text_4": "パワードトグルラッチは、手動でもオンオフもできます", "create.ponder.pulse_repeater.header": "パルスリピーターによる信号制御", "create.ponder.pulse_repeater.text_1": "パルスリピーターは、レッドストーン信号を短縮して1tickのパルス信号にします", "create.ponder.radial_chassis.header": "ラジアルシャーシによるブロックの取り付け", - "create.ponder.radial_chassis.text_1": "ラジアルシャーシは、同種のシャーシブロックと繋がります", + "create.ponder.radial_chassis.text_1": "ラジアルシャーシは、同じ種類のシャーシと繋がります", "create.ponder.radial_chassis.text_2": "からくり機械によって1つが動かされると、他も一緒に動きます", "create.ponder.radial_chassis.text_3": "ラジアルシャーシの側面を粘着面にできます", "create.ponder.radial_chassis.text_4": "もう一度クリックすると、他の全ての面も粘着面になります", @@ -2114,7 +2161,7 @@ "create.ponder.rope_pulley.header": "ローププーリーによる構造物の移動", "create.ponder.rope_pulley.text_1": "ローププーリーは、回転力を供給するとブロックを垂直に動かせます", - "create.ponder.rope_pulley.text_2": "移動の方向と速度は、供給される回転力に依存します", + "create.ponder.rope_pulley.text_2": "移動の方向と速度は、供給される回転力で決まります", "create.ponder.rope_pulley_attachment.header": "プーリーをからくりの一部として動かす", "create.ponder.rope_pulley_attachment.text_1": "プーリーがからくりによって動かされると...", @@ -2123,11 +2170,11 @@ "create.ponder.rope_pulley_modes.header": "ローププーリーの動作モード", "create.ponder.rope_pulley_modes.text_1": "プーリーの動きが止まると、移動した構造物はブロックに戻ります", - "create.ponder.rope_pulley_modes.text_2": "ブロックに戻らないように設定することも、動かし始めた場所でのみブロックに戻るように設定することもできます", + "create.ponder.rope_pulley_modes.text_2": "ブロックに戻らないように設定したり、動かし始めた場所でのみブロックに戻るように設定したりできます", "create.ponder.rotation_speed_controller.header": "回転速度コントローラーの使い方", "create.ponder.rotation_speed_controller.text_1": "コントローラーは、側面の軸から上の大きな歯車に回転を伝達します", - "create.ponder.rotation_speed_controller.text_2": "側面のパネルを見てスクロールすると、伝達する回転速度を調整できます", + "create.ponder.rotation_speed_controller.text_2": "側面のパネルを見ながらスクロールすると、伝達する回転速度を調整できます", "create.ponder.sail.header": "帆による風車の組み立て", "create.ponder.sail.text_1": "帆は、風車を作るのに便利なブロックです", @@ -2141,7 +2188,7 @@ "create.ponder.sequenced_gearshift.header": "シーケンスギアシフトによる回転の制御", "create.ponder.sequenced_gearshift.text_1": "シーケンスギアシフトは、設定されたプログラムに従って回転を伝達します", - "create.ponder.sequenced_gearshift.text_2": "右クリックで設定インターフェースを開けます", + "create.ponder.sequenced_gearshift.text_2": "右クリックで設定画面を開けます", "create.ponder.sequenced_gearshift.text_3": "レッドストーン信号を受けると、設定されたプログラムを実行します", "create.ponder.sequenced_gearshift.text_4": "終了すると止まり、また次のレッドストーン信号を受けると同じように実行します", "create.ponder.sequenced_gearshift.text_5": "レッドストーンコンパレータで、現在の進捗を読み取れます", @@ -2158,36 +2205,36 @@ "create.ponder.smart_chute.text_3": "マウスホイールで搬出するスタック量を指定できます", "create.ponder.smart_chute.text_4": "レッドストーン信号で、スマートシュートを停止させることもできます", - "create.ponder.smart_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Smart Pipes", - "create.ponder.smart_pipe.text_1": "UNLOCALIZED: Smart pipes can help control flows by fluid type", - "create.ponder.smart_pipe.text_2": "UNLOCALIZED: When placed directly at the source, they can specify the type of fluid to extract", - "create.ponder.smart_pipe.text_3": "UNLOCALIZED: Simply Right-Click their filter slot with any item containing the desired fluid", - "create.ponder.smart_pipe.text_4": "UNLOCALIZED: When placed further down a pipe network, smart pipes will only let matching fluids continue", + "create.ponder.smart_pipe.header": "スマートパイプによる液体制御", + "create.ponder.smart_pipe.text_1": "スマートパイプは液体の種類によって流れを制御できます", + "create.ponder.smart_pipe.text_2": "搬入元に直接つなげることで、搬出する液体の種類を指定できます", + "create.ponder.smart_pipe.text_3": "フィルタースロットを右クリックして、液体の入ったアイテムを装着して指定することもできます", + "create.ponder.smart_pipe.text_4": "スマートパイプは、パイプネットワークの搬出先に設置すると指定された液体のみを流します", "create.ponder.speedometer.header": "速度メーターによる動力情報の監視", "create.ponder.speedometer.text_1": "速度メーターは、接続された機械の現在の回転速度を表示します", "create.ponder.speedometer.text_2": "エンジニアのゴーグルを装着していると、より詳細な情報を得られます", "create.ponder.speedometer.text_3": "コンパレータは、速度メーターの測定値に応じたレッドストーン信号を出力します", - "create.ponder.spout_filling.header": "UNLOCALIZED: Filling Items using a Spout", - "create.ponder.spout_filling.text_1": "UNLOCALIZED: The Spout can fill fluid holding items provided beneath it", - "create.ponder.spout_filling.text_2": "UNLOCALIZED: The content of a Spout cannot be accessed manually", - "create.ponder.spout_filling.text_3": "UNLOCALIZED: Instead, Pipes can be used to supply it with fluids", - "create.ponder.spout_filling.text_4": "UNLOCALIZED: The Input items can be placed on a Depot under the Spout", - "create.ponder.spout_filling.text_5": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.spout_filling.text_6": "UNLOCALIZED: The Spout will hold and process them automatically", + "create.ponder.spout_filling.header": "アイテム注液口によるアイテム充填", + "create.ponder.spout_filling.text_1": "注液口は、その下に用意されたアイテムを液体で満たすことができます", + "create.ponder.spout_filling.text_2": "注液口の中身は手動で出し入れすることはできません", + "create.ponder.spout_filling.text_3": "代わりに、パイプを使って液体を供給しましょう", + "create.ponder.spout_filling.text_4": "容器アイテムは、注液口の下のデポに置きましょう", + "create.ponder.spout_filling.text_5": "ベルトでアイテムを供給すると...", + "create.ponder.spout_filling.text_6": "...注液口が自動でアイテムを止め、加工します", "create.ponder.stabilized_bearings.header": "からくりの角度の固定", - "create.ponder.stabilized_bearings.text_1": "メカニカルベアリングが動いている構造物に組み込まれているとき ...", + "create.ponder.stabilized_bearings.text_1": "メカニカルベアリングが動いている構造物に組み込まれているとき...", "create.ponder.stabilized_bearings.text_2": "...自身の角度を真っ直ぐに保とうとします", "create.ponder.stabilized_bearings.text_3": "ベアリングにブロックを取り付けると", "create.ponder.stabilized_bearings.text_4": "ベアリングに取り付けたサブのからくり全体が角度を真っ直ぐに保ったままになります", "create.ponder.sticker.header": "スティッカーを使ったブロックの付け外し", "create.ponder.sticker.text_1": "スティッカーは、ブロックの付け外しをレッドストーン信号で制御できます", - "create.ponder.sticker.text_2": "信号を受けると、状態が切り替わります", - "create.ponder.sticker.text_3": "付けているときは、からくりで動かされるとブロックも一緒に動きます", - "create.ponder.sticker.text_4": "もう一度信号を受けると、ブロックは離れます", + "create.ponder.sticker.text_2": "レッドストーン信号を受けると、状態が切り替わります", + "create.ponder.sticker.text_3": "付いているときは、からくりが動かされるとブロックも一緒に動きます", + "create.ponder.sticker.text_4": "もう一度信号を受けると、ブロックは外れます", "create.ponder.stressometer.header": "応力メーターによる動力情報の監視", "create.ponder.stressometer.text_1": "応力メーターは、接続された動力ネットワークの現在の応力許容量を表示します", @@ -2208,11 +2255,11 @@ "create.ponder.valve_handle.text_4": "スニーク状態で右クリックし続けると、時計回りに回転します", "create.ponder.valve_handle.text_5": "バルブハンドルは、染色できます", - "create.ponder.valve_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Valves", - "create.ponder.valve_pipe.text_1": "UNLOCALIZED: Valve pipes help control fluids propagating through pipe networks", - "create.ponder.valve_pipe.text_2": "UNLOCALIZED: Their shaft input controls whether fluid is currently allowed through", - "create.ponder.valve_pipe.text_3": "UNLOCALIZED: Given Rotational Force in the opening direction, the valve will open up", - "create.ponder.valve_pipe.text_4": "UNLOCALIZED: It can be closed again by reversing the input rotation", + "create.ponder.valve_pipe.header": "バルブによる液体制御", + "create.ponder.valve_pipe.text_1": "バルブは、液体ネットワークに流れる液体を制御するのに役立ちます", + "create.ponder.valve_pipe.text_2": "回転力で、液体が現在通過できるか制御します", + "create.ponder.valve_pipe.text_3": "開放方向に回転力を与えるとバルブが開きます", + "create.ponder.valve_pipe.text_4": "回転方向を逆にすることでバルブを閉められます", "create.ponder.water_wheel.header": "水車による回転力の生成", "create.ponder.water_wheel.text_1": "水車は隣接する水流から回転力を生み出します", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index dd6dc4268..fee16d39d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 923", + "_": "Missing Localizations: 24", "_": "->------------------------] Game Elements [------------------------<-", @@ -7,10 +7,10 @@ "block.create.acacia_window_pane": "아카시아나무 유리판 ", "block.create.adjustable_chain_gearshift": "벨트 변속기", "block.create.adjustable_crate": "가변 창고", - "block.create.adjustable_pulse_repeater": "가변 펄스 리피터", - "block.create.adjustable_repeater": "가변 리피터", + "block.create.adjustable_pulse_repeater": "가변 펄스 중계기", + "block.create.adjustable_repeater": "가변 중계기", "block.create.analog_lever": "아날로그 레버", - "block.create.andesite_belt_funnel": "안산암 깔때기", + "block.create.andesite_belt_funnel": "안산암 퍼널", "block.create.andesite_bricks": "안산암 벽돌", "block.create.andesite_bricks_slab": "안산암 벽돌 반 블록", "block.create.andesite_bricks_stairs": "안산암 벽돌 계단", @@ -21,26 +21,29 @@ "block.create.andesite_cobblestone_stairs": "안산암 조약돌 계단", "block.create.andesite_cobblestone_wall": "안산암 조약돌 담장", "block.create.andesite_encased_shaft": "안산암 케이스를 씌운 축", - "block.create.andesite_funnel": "안산암 깔때기", + "block.create.andesite_funnel": "안산암 퍼널", "block.create.andesite_pillar": "안산암 기둥", "block.create.andesite_tunnel": "안산암 터널", "block.create.basin": "대야", - "block.create.belt": "컨베이어 벨트", + "block.create.belt": "벨트", "block.create.birch_window": "자작나무 유리창", "block.create.birch_window_pane": "자작나무 유리판", + "block.create.black_nixie_tube": "검은색 닉시관", "block.create.black_sail": "검은색 날개", "block.create.black_seat": "검은색 좌석", "block.create.black_valve_handle": "검은색 밸브 손잡이", "block.create.blaze_burner": "블레이즈 버너", + "block.create.blue_nixie_tube": "파란색 닉시관", "block.create.blue_sail": "파란색 날개", "block.create.blue_seat": "파란색 좌석", "block.create.blue_valve_handle": "파란색 밸브 손잡이", - "block.create.brass_belt_funnel": "황동 깔때기", + "block.create.brass_belt_funnel": "황동 퍼널", "block.create.brass_block": "황동 블록", "block.create.brass_casing": "황동 케이스", "block.create.brass_encased_shaft": "황동 케이스를 씌운 축", - "block.create.brass_funnel": "황동 깔때기", + "block.create.brass_funnel": "황동 퍼널", "block.create.brass_tunnel": "황동 터널", + "block.create.brown_nixie_tube": "갈색 닉시관", "block.create.brown_sail": "갈색 날개", "block.create.brown_seat": "갈색 좌석", "block.create.brown_valve_handle": "갈색 밸브 손잡이", @@ -58,7 +61,7 @@ "block.create.cogwheel": "톱니바퀴", "block.create.content_observer": "정보 감지기", "block.create.controller_rail": "방향 레일", - "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "block.create.copper_backtank": "구리 산소통", "block.create.copper_block": "구리 블록", "block.create.copper_casing": "구리 케이스", "block.create.copper_ore": "구리 광석", @@ -68,12 +71,12 @@ "block.create.creative_crate": "크리에이티브 창고", "block.create.creative_fluid_tank": "크리에이티브 탱크", "block.create.creative_motor": "크리에이티브 모터", - "block.create.crimson_window": "UNLOCALIZED: Crimson Window", - "block.create.crimson_window_pane": "UNLOCALIZED: Crimson Window Pane", + "block.create.crimson_window": "진홍빛 유리창", + "block.create.crimson_window_pane": "진홍빛 유리판", "block.create.crushing_wheel": "분쇄 휠", "block.create.crushing_wheel_controller": "분쇄 휠 컨트롤러", "block.create.cuckoo_clock": "뻐꾸기 시계", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "청록색 닉시관", "block.create.cyan_sail": "청록색 날개", "block.create.cyan_seat": "청록색 좌석", "block.create.cyan_valve_handle": "청록색 밸브 손잡이", @@ -110,7 +113,7 @@ "block.create.dolomite_cobblestone_stairs": "백운암 조약돌 계단", "block.create.dolomite_cobblestone_wall": "백운암 조약돌 담장", "block.create.dolomite_pillar": "백운암 기둥", - "block.create.encased_chain_drive": "케이스를 씌운 축", + "block.create.encased_chain_drive": "체인 드라이브", "block.create.encased_fan": "선풍기", "block.create.encased_fluid_pipe": "구리 케이스를 씌운 파이프", "block.create.fancy_andesite_bricks": "장식된 안산암 벽돌", @@ -166,27 +169,30 @@ "block.create.gabbro_cobblestone_stairs": "반려암 조약돌 계단", "block.create.gabbro_cobblestone_wall": "반려암 조약돌 담장", "block.create.gabbro_pillar": "반려암 기둥", - "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", - "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", + "block.create.gantry_carriage": "갠트리 운반대", + "block.create.gantry_shaft": "갠트리 축", "block.create.gearbox": "기어박스", "block.create.gearshift": "기어쉬프트", "block.create.glass_fluid_pipe": "액체 파이프", "block.create.granite_bricks": "화강암 벽돌", - "block.create.granite_bricks_slab": "화강함 벽돌 반 블록", - "block.create.granite_bricks_stairs": "화강함 벽돌 계단", - "block.create.granite_bricks_wall": "화강함 벽돌 담장", + "block.create.granite_bricks_slab": "화강암 벽돌 반 블록", + "block.create.granite_bricks_stairs": "화강암 벽돌 계단", + "block.create.granite_bricks_wall": "화강암 벽돌 담장", "block.create.granite_cobblestone": "화강암 조약돌", "block.create.granite_cobblestone_slab": "화강암 조약돌 반 블록", "block.create.granite_cobblestone_stairs": "화강암 조약돌 계단", "block.create.granite_cobblestone_wall": "화강암 조약돌 담장", "block.create.granite_pillar": "화강암 기둥", + "block.create.gray_nixie_tube": "회색 닉시관", "block.create.gray_sail": "회색 날개", "block.create.gray_seat": "회색 좌석", "block.create.gray_valve_handle": "회색 밸브 손잡이", + "block.create.green_nixie_tube": "초록색 닉시관", "block.create.green_sail": "초록색 날개", "block.create.green_seat": "초록색 좌석", "block.create.green_valve_handle": "초록색 밸브 손잡이", "block.create.hand_crank": "핸드 크랭크", + "block.create.haunted_bell": "귀신들린 종", "block.create.honey": "꿀", "block.create.horizontal_framed_glass": "수평 유리", "block.create.horizontal_framed_glass_pane": "수평 유리판", @@ -195,22 +201,25 @@ "block.create.jungle_window": "정글나무 유리창", "block.create.jungle_window_pane": "정글나무 유리판", "block.create.large_cogwheel": "큰 톱니바퀴", - "block.create.layered_andesite": "층이 있는 안산암", - "block.create.layered_dark_scoria": "층이 있는 짙은 스코리아", - "block.create.layered_diorite": "층이 있는 섬록암", - "block.create.layered_dolomite": "층이 있는 백운암", - "block.create.layered_gabbro": "층이 있는 반려암", - "block.create.layered_granite": "층이 있는 화강암", - "block.create.layered_limestone": "층이 있는 석회암", - "block.create.layered_scoria": "층이 있는 스코리아", - "block.create.layered_weathered_limestone": "층이 있는 풍화된 석회암", - "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.layered_andesite": "이어지는 안산암", + "block.create.layered_dark_scoria": "이어지는 짙은 스코리아", + "block.create.layered_diorite": "이어지는 섬록암", + "block.create.layered_dolomite": "이어지는 백운암", + "block.create.layered_gabbro": "이어지는 반려암", + "block.create.layered_granite": "이어지는 화강암", + "block.create.layered_limestone": "이어지는 석회암", + "block.create.layered_scoria": "이어지는 스코리아", + "block.create.layered_weathered_limestone": "이어지는 풍화된 석회암", + "block.create.lectern_controller": "독서대 조작기", + "block.create.light_blue_nixie_tube": "하늘핵 닉시관", "block.create.light_blue_sail": "하늘색 날개", "block.create.light_blue_seat": "하늘색 좌석", "block.create.light_blue_valve_handle": "하늘색 밸브 손잡이", + "block.create.light_gray_nixie_tube": "회백색 닉시관", "block.create.light_gray_sail": "회백색 날개", "block.create.light_gray_seat": "회백색 좌석", "block.create.light_gray_valve_handle": "회백색 밸브 손잡이", + "block.create.lime_nixie_tube": "연두색 닉시관", "block.create.lime_sail": "연두색 날개", "block.create.lime_seat": "연두색 좌석", "block.create.lime_valve_handle": "연두색 밸브 손잡이", @@ -227,12 +236,13 @@ "block.create.limestone_pillar": "석회암 기둥", "block.create.linear_chassis": "어두운 직선 섀시", "block.create.lit_blaze_burner": "불타는 빈 블레이즈 버너", + "block.create.magenta_nixie_tube": "자홍색 닉시관", "block.create.magenta_sail": "자홍색 날개", "block.create.magenta_seat": "자홍색 좌석", "block.create.magenta_valve_handle": "자홍색 밸브 손잡이", "block.create.mechanical_arm": "기계 팔", "block.create.mechanical_bearing": "베어링", - "block.create.mechanical_crafter": "기계식 조합기", + "block.create.mechanical_crafter": "조합기", "block.create.mechanical_drill": "드릴", "block.create.mechanical_harvester": "수확기", "block.create.mechanical_mixer": "믹서", @@ -248,15 +258,15 @@ "block.create.mossy_andesite": "이끼 낀 안산암", "block.create.mossy_dark_scoria": "이끼 낀 짙은 스코리아", "block.create.mossy_diorite": "이끼 낀 섬록암", - "block.create.mossy_dolomite": "이끼낀 백운암", - "block.create.mossy_gabbro": "이끼낀 반려암", + "block.create.mossy_dolomite": "이끼 낀 백운암", + "block.create.mossy_gabbro": "이끼 낀 반려암", "block.create.mossy_granite": "이끼 낀 화강암 벽돌", "block.create.mossy_limestone": "이끼 낀 석회암", "block.create.mossy_scoria": "이끼 낀 스코리아", "block.create.mossy_weathered_limestone": "이끼 낀 풍화된 석회암", "block.create.mysterious_cuckoo_clock": "뻐꾸기 시계?", "block.create.natural_scoria": "자연 스코리아", - "block.create.nixie_tube": "디지털 표시증", + "block.create.nixie_tube": "닉시관", "block.create.nozzle": "노즐", "block.create.oak_window": "참나무 유리창", "block.create.oak_window_pane": "참나무 유리판", @@ -310,7 +320,8 @@ "block.create.paved_weathered_limestone_slab": "포장된 풍화된 석회암 반 블록", "block.create.paved_weathered_limestone_stairs": "포장된 풍화된 석회암 계단", "block.create.paved_weathered_limestone_wall": "포장된 풍화된 석회암 담장", - "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.peculiar_bell": "황동 종", + "block.create.pink_nixie_tube": "분홍색 닉시관", "block.create.pink_sail": "분홍색 날개", "block.create.pink_seat": "분홍색 좌석", "block.create.pink_valve_handle": "분홍색 밸브 손잡이", @@ -339,16 +350,18 @@ "block.create.polished_weathered_limestone_slab": "윤나는 풍화된 석회암 반 블록", "block.create.polished_weathered_limestone_stairs": "윤나는 풍화된 석회암 계단", "block.create.polished_weathered_limestone_wall": "윤나는 풍화된 석회암 담장", - "block.create.portable_fluid_interface": "이동식 액체 인터페이스", - "block.create.portable_storage_interface": "이동식 아이템 인터페이스", + "block.create.portable_fluid_interface": "액체 인터페이스", + "block.create.portable_storage_interface": "아이템 인터페이스", "block.create.powered_latch": "레드스톤 걸쇠", "block.create.powered_toggle_latch": "레드스톤 토글 걸쇠", "block.create.pulley_magnet": "도르래 자석", - "block.create.pulse_repeater": "펄스 리피터", + "block.create.pulse_repeater": "펄스 중계기", + "block.create.purple_nixie_tube": "보라샥 닉시관", "block.create.purple_sail": "보라색 날개", "block.create.purple_seat": "보라색 좌석", "block.create.purple_valve_handle": "보라색 밸브 손잡이", "block.create.radial_chassis": "원형 섀시", + "block.create.red_nixie_tube": "빨간색 닉시관", "block.create.red_sail": "빨간색 날개", "block.create.red_seat": "빨간색 좌석", "block.create.red_valve_handle": "빨간색 밸브 손잡이", @@ -359,8 +372,8 @@ "block.create.rope": "밧줄", "block.create.rope_pulley": "밧줄 도르래", "block.create.rotation_speed_controller": "회전 속도 컨트롤러", - "block.create.sail_frame": "풍차 날개 프레임", - "block.create.schematic_table": "청사진 테이블", + "block.create.sail_frame": "풍차 날개 틀", + "block.create.schematic_table": "청사진 탁자", "block.create.schematicannon": "청사진 대포", "block.create.scoria": "스코리아", "block.create.scoria_bricks": "스코리아 벽돌", @@ -376,14 +389,14 @@ "block.create.sequenced_gearshift": "순서 기어쉬프트", "block.create.shadow_steel_casing": "그림자 케이스", "block.create.shaft": "축", - "block.create.smart_chute": "UNLOCALIZED: Smart Chute", + "block.create.smart_chute": "스마트 슈트", "block.create.smart_fluid_pipe": "스마트 액체 파이프", "block.create.speedometer": "속도 계측기", - "block.create.spout": "수도꼭지", + "block.create.spout": "주입기", "block.create.spruce_window": "가문비나무 유리창", "block.create.spruce_window_pane": "가문비나무 유리판", - "block.create.sticker": "UNLOCALIZED: Sticker", - "block.create.sticky_mechanical_piston": "끈끈이 기계식 피스톤", + "block.create.sticker": "부착기", + "block.create.sticky_mechanical_piston": "기계식 끈끈이 피스톤", "block.create.stockpile_switch": "수량 스위치", "block.create.stressometer": "피로도 계측기", "block.create.tiled_glass": "타일 유리", @@ -391,9 +404,9 @@ "block.create.turntable": "돌림판", "block.create.vertical_framed_glass": "수직 유리", "block.create.vertical_framed_glass_pane": "수직 유리판", - "block.create.warped_window": "UNLOCALIZED: Warped Window", - "block.create.warped_window_pane": "UNLOCALIZED: Warped Window Pane", - "block.create.water_wheel": "물레방아", + "block.create.warped_window": "뒤틀린 유리창", + "block.create.warped_window_pane": "뒤틀린 유리판", + "block.create.water_wheel": "물레바퀴", "block.create.weathered_limestone": "풍화된 석회암", "block.create.weathered_limestone_bricks": "풍화된 석회암 벽돌", "block.create.weathered_limestone_bricks_slab": "풍화된 석회암 벽돌 반 블록", @@ -404,24 +417,29 @@ "block.create.weathered_limestone_cobblestone_stairs": "풍화된 석회암 조약돌 계단", "block.create.weathered_limestone_cobblestone_wall": "풍화된 석회암 조약돌 담장", "block.create.weathered_limestone_pillar": "풍화된 석회암 기둥", - "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", + "block.create.weighted_ejector": "투척기", + "block.create.white_nixie_tube": "하얀색 닉시관", "block.create.white_sail": "하얀색 날개", "block.create.white_seat": "하얀색 좌석", "block.create.white_valve_handle": "하얀색 밸브 손잡이", "block.create.windmill_bearing": "풍차 베어링", "block.create.wooden_bracket": "나무 지지대", + "block.create.yellow_nixie_tube": "노란색 닉시관", "block.create.yellow_sail": "노란색 날개", "block.create.yellow_seat": "노란색 좌석", "block.create.yellow_valve_handle": "노란색 밸브 손잡이", - "block.create.zinc_block": "아연 블", + "block.create.zinc_block": "아연 블록", "block.create.zinc_ore": "아연 광석", - "entity.create.contraption": "장치", - "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", - "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", - "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", + "enchantment.create.capacity": "저장량", + "enchantment.create.potato_recovery": "대포알 회수", + + "entity.create.contraption": "구조물", + "entity.create.crafting_blueprint": "조합 청사진", + "entity.create.gantry_contraption": "갠트리 구조물", + "entity.create.potato_projectile": "감자포 투사체", "entity.create.seat": "좌석", - "entity.create.stationary_contraption": "고정된 장치", + "entity.create.stationary_contraption": "고정된 구조물", "entity.create.super_glue": "강력 접착제", "fluid.create.milk": "우유", @@ -431,7 +449,7 @@ "item.create.andesite_alloy": "안산암 합금", "item.create.attribute_filter": "속성 필터 틀", "item.create.bar_of_chocolate": "초콜릿 바", - "item.create.belt_connector": "기계식 벨트", + "item.create.belt_connector": "벨트", "item.create.blaze_cake": "블레이즈 케이크", "item.create.blaze_cake_base": "블레이즈 케이크 틀", "item.create.brass_hand": "황동 손", @@ -439,18 +457,18 @@ "item.create.brass_nugget": "황동 조각", "item.create.brass_sheet": "황동 판", "item.create.builders_tea": "건축가의 차", - "item.create.chest_minecart_contraption": "상자가 실린 광산 수레 장치", + "item.create.chest_minecart_contraption": "상자가 실린 광산 수레 구조물", "item.create.chocolate_bucket": "초콜릿 양동이", - "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", + "item.create.chocolate_glazed_berries": "초콜릿 바른 열매", "item.create.chromatic_compound": "색채 혼합물", "item.create.cinder_flour": "잿가루", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_backtank": "구리 산소통", "item.create.copper_ingot": "구리 주괴", "item.create.copper_nugget": "구리 조각", "item.create.copper_sheet": "구리 판", "item.create.crafter_slot_cover": "조합기 슬롯 덮개", - "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crafting_blueprint": "조합 청사진", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore", "item.create.crushed_brass": "분쇄된 황동", "item.create.crushed_copper_ore": "분쇄된 구리 광석", @@ -465,28 +483,31 @@ "item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore", "item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore", "item.create.crushed_zinc_ore": "분쇄된 아연 광석", - "item.create.diving_boots": "UNLOCALIZED: Diving Boots", - "item.create.diving_helmet": "UNLOCALIZED: Diving Helmet", + "item.create.diving_boots": "다이빙 부츠", + "item.create.diving_helmet": "다이빙 헬멧", "item.create.dough": "반죽", "item.create.electron_tube": "전지 튜브", "item.create.empty_blaze_burner": "빈 블레이즈 버너", "item.create.empty_schematic": "빈 청사진", "item.create.extendo_grip": "외장형 연장 팔", "item.create.filter": "필터 틀", - "item.create.furnace_minecart_contraption": "화로가 실린 광산 수레 장치", + "item.create.furnace_minecart_contraption": "화로가 실린 광산 수레 구조물", "item.create.goggles": "엔지니어의 고글", "item.create.golden_sheet": "금 판", - "item.create.handheld_worldshaper": "휴대용 세계편집기", + "item.create.handheld_worldshaper": "크리에이티브 세계편집기", "item.create.honey_bucket": "꿀 양동이", - "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.honeyed_apple": "꿀 바른 사과", + "item.create.incomplete_cogwheel": "미완성된 톱니바퀴", + "item.create.incomplete_large_cogwheel": "미완성된 큰 톱니바퀴", + "item.create.incomplete_precision_mechanism": "미완성된 정밀 기계장치", "item.create.iron_sheet": "철 판", - "item.create.linked_controller": "UNLOCALIZED: Linked Controller", - "item.create.minecart_contraption": "광산 수레 장치", + "item.create.linked_controller": "레드스톤 링크 조작기", + "item.create.minecart_contraption": "광산 수레 구조물", "item.create.minecart_coupling": "광산 수레 커플링", "item.create.polished_rose_quartz": "윤나는 장밋빛 석영", - "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", + "item.create.potato_cannon": "감자포", "item.create.powdered_obsidian": "흑요석 가루", + "item.create.precision_mechanism": "정밀 기계장치", "item.create.propeller": "프로펠러", "item.create.red_sand_paper": "붉은 사포", "item.create.refined_radiance": "정제된 광채", @@ -496,7 +517,7 @@ "item.create.schematic_and_quill": "청사진과 깃펜", "item.create.shadow_steel": "그림자 강철", "item.create.super_glue": "강력 접착제", - "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", + "item.create.sweet_roll": "롤빵", "item.create.tree_fertilizer": "나무 비료", "item.create.vertical_gearbox": "수직 기어박스", "item.create.wand_of_symmetry": "대칭의 지팡이", @@ -509,30 +530,30 @@ "_": "->------------------------] Advancements [------------------------<-", - "advancement.create.root": "Create모드에 어서오세요", - "advancement.create.root.desc": "멋진 장치들을 만들 시간입니다!", - "advancement.create.andesite_alloy": "합금..?", + "advancement.create.root": "Create!", + "advancement.create.root.desc": "멋진 장치들을 창조할 시간입니다!", + "advancement.create.andesite_alloy": "이게 합금?", "advancement.create.andesite_alloy.desc": "암석으로도 합금을 만들 수 있나요?", "advancement.create.its_alive": "살아 움직이는", - "advancement.create.its_alive.desc": "당신의 첫 장치가 움직이는 것을 보세요.", - "advancement.create.shifting_gears": "기어 변환", + "advancement.create.its_alive.desc": "당신의 첫 장치가 움직입니다!", + "advancement.create.shifting_gears": "톱니바퀴 돌리고!", "advancement.create.shifting_gears.desc": "크기가 다른 톱니바퀴를 연결하여 장치의 속도를 바꿀 수 있습니다.", - "advancement.create.overstressed": "과부화", - "advancement.create.overstressed.desc": "직접 피로도의 한계를 경험해보세요.", - "advancement.create.belt": "켈프 드라이브", - "advancement.create.belt.desc": "두 축에 컨베이어 벨트를 이으세요.", - "advancement.create.tunnel": "엄폐!", + "advancement.create.overstressed": "과부하", + "advancement.create.overstressed.desc": "피로도의 한계를 경험해보세요.", + "advancement.create.belt": "켈프 벨트", + "advancement.create.belt.desc": "두 축에 벨트를 이으세요.", + "advancement.create.tunnel": "벨트 꾸미기", "advancement.create.tunnel.desc": "터널을 이용해 벨트를 꾸며보세요.", "advancement.create.splitter_tunnel": "분할 정복 알고리즘", - "advancement.create.splitter_tunnel.desc": "여러 황동 터널을 이용하여 분리기를 만드세요.", + "advancement.create.splitter_tunnel.desc": "여러 황동 터널을 일렬로 설치해, 아이템을 나누세요.", "advancement.create.chute": "쏟아져 내려와", "advancement.create.chute.desc": "수직 벨트역할을 하는 슈트를 설치하세요.", - "advancement.create.upward_chute": "공중 납치", - "advancement.create.upward_chute.desc": "아이템이 바람을 받은 슈트안에서 날아가는 것을 보세요.", - "advancement.create.belt_funnel": "펄럭거리는 깔기", - "advancement.create.belt_funnel.desc": "깔때기를 벨트나 아이템 거치대에 설치하여 특별한 모양을 만들어 보세요.", - "advancement.create.belt_funnel_kiss": "깔때기는 어떻게 태어나?", - "advancement.create.belt_funnel_kiss.desc": "두 벨트 깔때기를 만나게하세요. 쪽!", + "advancement.create.upward_chute": "바람 납치", + "advancement.create.upward_chute.desc": "선풍기를 설치하고, 슈트 안에서 아이템이 날아가는 것을 보세요.", + "advancement.create.belt_funnel": "퍼널 깔기", + "advancement.create.belt_funnel.desc": "퍼널을 벨트나 아이템 거치대에 설치하여 특별한 모양을 만들어 보세요.", + "advancement.create.belt_funnel_kiss": "퍼널는 어떻게 태어나?", + "advancement.create.belt_funnel_kiss.desc": "두 벨트 퍼널을 만나게하세요. 쪽!", "advancement.create.fan": "바람의 힘을 느껴라", "advancement.create.fan.desc": "선풍기 바람을 느껴보세요.", "advancement.create.fan_lava": "지열 난방기", @@ -546,43 +567,43 @@ "advancement.create.goggles": "피로돋보기", "advancement.create.goggles.desc": "장치에 대한 운동 정보를 가져다 줄 고글을 만드세요.", "advancement.create.speedometer": "근데 얼마나 빨라?", - "advancement.create.speedometer.desc": "속도 계측기를 가동하세요. 고글을 통해 수치가 얼마나 되는지 보세요.", + "advancement.create.speedometer.desc": "속도 계측기를 작동하세요. 고글을 통해 수치가 얼마나 되는지 보세요.", "advancement.create.stressometer": "근데 얼마나 피로해?", - "advancement.create.stressometer.desc": "피로도 계측기를 가동하세요. 고글을 통해 수치가 얼마나 되는지 보세요.", - "advancement.create.aesthetics": "짠! 예술!", + "advancement.create.stressometer.desc": "피로도 계측기를 작동하세요. 고글을 통해 수치가 얼마나 되는지 보세요.", + "advancement.create.aesthetics": "미적 감각!", "advancement.create.aesthetics.desc": "축, 파이프, 톱니바퀴에 지지대를 설치하세요.", - "advancement.create.reinforced": "짠! 강화!", + "advancement.create.reinforced": "튼튼 보강!", "advancement.create.reinforced.desc": "축, 파이프, 벨트에 적절한 케이스를 씌우세요.", "advancement.create.water_wheel": "수력 동력화", - "advancement.create.water_wheel.desc": "물레방아를 설치하고 회전하게 만드세요!", - "advancement.create.chocolate_wheel": "초콜릿방아", - "advancement.create.chocolate_wheel.desc": "녹은 초콜릿으로 물레방아를 돌리세요.", - "advancement.create.lava_wheel": "불레방아", - "advancement.create.lava_wheel.desc": "이건 일어나지 않았어야 하는데...", - "advancement.create.cuckoo": "잘자...", - "advancement.create.cuckoo.desc": "뻐꾸기 시계가 잘 시간을 알리는 것을 관찰하세요.", + "advancement.create.water_wheel.desc": "물레바퀴를 설치하고 회전하게 만드세요!", + "advancement.create.chocolate_wheel": "초콜릿바퀴", + "advancement.create.chocolate_wheel.desc": "녹은 초콜릿으로 물레바퀴를 돌리세요.", + "advancement.create.lava_wheel": "불레바퀴", + "advancement.create.lava_wheel.desc": "용암으로 물레바퀴를 회전하게 만드세ㅇ... 어?", + "advancement.create.cuckoo": "벌써 이렇게나 시간이 지났어?", + "advancement.create.cuckoo.desc": "뻐꾸기 시계가 잘 시간을 알립니다. 잘 자...", "advancement.create.millstone": "나만의 작은 분쇄기", - "advancement.create.millstone.desc": "멧돌을 설치하고 가동시키세요.", - "advancement.create.windmill": "선선한 바람", + "advancement.create.millstone.desc": "멧돌을 설치하고 작동시키세요.", + "advancement.create.windmill": "산들 바람", "advancement.create.windmill.desc": "풍차 베어링을 작동시키세요.", - "advancement.create.maxed_windmill": "강한 바람", + "advancement.create.maxed_windmill": "거센 바람", "advancement.create.maxed_windmill.desc": "풍차 베어링을 최대 속력으로 작동시키세요.", "advancement.create.andesite_casing": "안산암 시대", "advancement.create.andesite_casing.desc": "안산암과 나무를 이용하여 기본 케이스를 만드세요.", - "advancement.create.mechanical_drill": "굴착기 가동", - "advancement.create.mechanical_drill.desc": "드릴을 설치하고 가동시키세요.", + "advancement.create.mechanical_drill": "굴착기 작동", + "advancement.create.mechanical_drill.desc": "드릴을 설치하고 작동시키세요.", "advancement.create.press": "'깡!'", "advancement.create.press.desc": "프레스를 만들고 금속 판을 만들어보세요.", "advancement.create.polished_rose_quartz": "장밋빛 다이아몬드", "advancement.create.polished_rose_quartz.desc": "장밋빛 석영을 투명해지도록 열심히 사포질하세요.", - "advancement.create.electron_tube": "삐빅-", + "advancement.create.electron_tube": "삐-빅", "advancement.create.electron_tube.desc": "전지 튜브를 만드세요. 발전된 장치들에 쓰입니다.", - "advancement.create.mechanical_saw": "벌목기 가동", - "advancement.create.mechanical_saw.desc": "톱을 설치하고 가동시키세요.", + "advancement.create.mechanical_saw": "벌목기 작동", + "advancement.create.mechanical_saw.desc": "톱을 설치하고 작동시키세요.", "advancement.create.basin": "대야 시스템", "advancement.create.basin.desc": "대야를 설치하고 아이템을 던져보세요.", "advancement.create.mixer": "섞고 돌리고 섞고", - "advancement.create.mixer.desc": "대야 위에 믹서를 설치하고, 가동시켜 재료를 만드세요.", + "advancement.create.mixer.desc": "대야 위에 믹서를 설치하고, 작동시켜 재료를 만드세요.", "advancement.create.blaze_burner": "살아있는 불", "advancement.create.blaze_burner.desc": "블레이즈 버너를 얻으세요.", "advancement.create.compact": "자동 압축", @@ -594,46 +615,46 @@ "advancement.create.copper_casing": "구리 시대", "advancement.create.copper_casing.desc": "구리 판을 이용해 구리 케이스를 만드세요.", "advancement.create.spout": "쪼르록", - "advancement.create.spout.desc": "수도꼭지가 아이템에 액체를 채우는 것을 보세요.", + "advancement.create.spout.desc": "주입기를 사용하여 아이템에 액체를 채우세요.", "advancement.create.spout_potion": "대규모 양조", - "advancement.create.spout_potion.desc": "수도꼭지가 병에 포션을 채우는 것을 보세요.", + "advancement.create.spout_potion.desc": "주입기를 사용하여 유리병에 물약을 채우세요.", "advancement.create.chocolate": "상상의 세계", - "advancement.create.chocolate.desc": "양동이에 녹은 초콜릿을 채우세요.", + "advancement.create.chocolate.desc": "초콜릿 양동이를 얻으세요.", "advancement.create.item_drain": "회전 배수", "advancement.create.item_drain.desc": "아이템 배수구가 액체를 비우는 것을 보세요.", "advancement.create.chained_item_drain": "구른다!", "advancement.create.chained_item_drain.desc": "아이템이 여러 배수구 위를 굴러가는 것을 보세요.", "advancement.create.glass_pipe": "액체 엿보기", - "advancement.create.glass_pipe.desc": "액체가 창이 달린 파이프를 지나는 것을 보세요. 직선 파이프에 렌치로 우클릭하면 창문이 생깁니다.", - "advancement.create.pipe_collision": "액체를 만나게하지 마세요!", - "advancement.create.pipe_collision.desc": "파이프 안에서 두 액체를 만나게 하세요.", + "advancement.create.glass_pipe.desc": "액체가 창이 달린 파이프를 지나는 것을 보세요. 직선 파이프를 렌치로 우클릭하면 창문이 생깁니다.", + "advancement.create.pipe_collision": "그 액체를 섞지 마오", + "advancement.create.pipe_collision.desc": "액체관에서 두 가지 액체가 만나는 것을 관찰하세요.", "advancement.create.pipe_spill": "누출 사고", "advancement.create.pipe_spill.desc": "파이프 끝을 열어 액체가 밖으로 나오는 것을 보세요.", "advancement.create.hose_pulley": "공업 펌프", "advancement.create.hose_pulley.desc": "호스 도르래를 사용하여 액체를 채우거나 빨아들이세요.", "advancement.create.infinite_water": "바다를 흡수하다", "advancement.create.infinite_water.desc": "무한으로 인식되는 물 웅덩이에서 물을 끌어올리세요.", - "advancement.create.infinite_lava": "세계의 핵을 흡수하다", + "advancement.create.infinite_lava": "지옥을 흡수하다", "advancement.create.infinite_lava.desc": "무한으로 인식되는 용암 웅덩이에서 용암을 끌어올리세요.", "advancement.create.infinite_chocolate": "상상 속에 잠기다", - "advancement.create.infinite_chocolate.desc": "무한으로 인식되는 초콜릿 웅덩이에서 초콜릿을 끌어올리세요..", + "advancement.create.infinite_chocolate.desc": "무한으로 인식되는 초콜릿 웅덩이에서 초콜릿을 끌어올리세요.", "advancement.create.crafter": "자동 조합", - "advancement.create.crafter.desc": "기계식 조합기를 설치하고 가동시키세요.", + "advancement.create.crafter.desc": "기계식 조합기를 설치하고 작동시키세요.", "advancement.create.clockwork_bearing": "시계 제작", "advancement.create.clockwork_bearing.desc": "시계 베어링에 구조물을 달고 작동시키세요.", - "advancement.create.nixie_tube": "스타일있게 표시하기", - "advancement.create.nixie_tube.desc": "디지털 표시등을 얻고 설치하세요.", + "advancement.create.nixie_tube": "나는 스타일있게 표시해", + "advancement.create.nixie_tube.desc": "닉시관을 만들고 설치하세요.", "advancement.create.deployer": "찌르고, 설치하고, 공격!", - "advancement.create.deployer.desc": "당신의 분신, 배포기를 설치하고 가동시키세요.", + "advancement.create.deployer.desc": "당신의 분신, 배포기를 설치하고 작동시키세요.", "advancement.create.speed_controller": "엔지니어들이 이 장치를 싫어합니다", "advancement.create.speed_controller.desc": "궁극의 회전속도 변경장치, 회전 속도 컨트롤러를 설치하세요.", "advancement.create.flywheel": "공장의 심장", "advancement.create.flywheel.desc": "화로엔진에 플라이휠을 연결하세요.", - "advancement.create.overstress_flywheel": "정말 높은 피로", + "advancement.create.overstress_flywheel": "정말정말 높은 피로", "advancement.create.overstress_flywheel.desc": "화로 엔진을 과부하하세요.", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", - "advancement.create.mechanical_arm": "할일이 많아!", + "advancement.create.precision_mechanism": "복잡한 호기심", + "advancement.create.precision_mechanism.desc": "정밀 기계장치를 조립하세요.", + "advancement.create.mechanical_arm": "바쁘다 바빠!", "advancement.create.mechanical_arm.desc": "기계 팔을 조합하고, 입력부와 출력부를 정하고, 설치한 다음 돌리세요. 그리고 그것이 작동하는 것을 보세요.", "advancement.create.musical_arm": "볼륨 최대로!", "advancement.create.musical_arm.desc": "기계 팔이 주크박스를 작동시키는 것을 보세요.", @@ -645,22 +666,22 @@ "advancement.create.fist_bump.desc": "두 배포기를 서로 부딫치게 하세요.", "advancement.create.crushing_wheel": "한 쌍의 거인들", "advancement.create.crushing_wheel.desc": "더 많은 재료를 더 효율적으로 갈 분쇄 휠을 만드세요.", - "advancement.create.blaze_cake": "설탕 러시", + "advancement.create.blaze_cake": "폭주", "advancement.create.blaze_cake.desc": "블레이즈 버너에게 줄 특별한 케이크를 만드세요.", "advancement.create.chromatic_compound": "양극성 재료", "advancement.create.chromatic_compound.desc": "색채 혼합물를 만드세요.", - "advancement.create.shadow_steel": "공허를 받아들이다", + "advancement.create.shadow_steel": "공허에서의 복귀", "advancement.create.shadow_steel.desc": "무의 금속, 그림자 강철을 생성하세요.", - "advancement.create.refined_radiance": "빛으로 제련되다", + "advancement.create.refined_radiance": "빛으로부터의 자극", "advancement.create.refined_radiance.desc": "강력한 색채 물질, 정제된 빛을 생성하세요.", "advancement.create.chromatic_age": "양극 시대", "advancement.create.chromatic_age.desc": "빛과 어둠의 케이스를 제작하세요.", "advancement.create.wand_of_symmetry": "빛나는 건축", "advancement.create.wand_of_symmetry.desc": "대칭의 지팡이를 만드세요.", "advancement.create.extendo_grip": "띠요오옹!", - "advancement.create.extendo_grip.desc": "외장형 연장 팔을 드세요.", - "advancement.create.potato_cannon": "UNLOCALIZED: Fwoomp!", - "advancement.create.potato_cannon.desc": "UNLOCALIZED: Defeat an enemy with your Potato Cannon.", + "advancement.create.extendo_grip.desc": "외장형 연장 팔을 손에 쥐세요.", + "advancement.create.potato_cannon": "퐁!", + "advancement.create.potato_cannon.desc": "감자포로 적을 처치하세요.", "advancement.create.dual_extendo_grip": "궁극의 띠용!", "advancement.create.dual_extendo_grip.desc": "쌍으로 외장형 연장 팔을 들어 인간을 뛰어넘은 사거리를 가지세요.", "advancement.create.eob": "End of Beta", @@ -672,28 +693,34 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create 팔레트", - "death.attack.create.crush": "%1$s이(가) 분쇄 휠에 의해 가공되었습니다", - "death.attack.create.fan_fire": "%1$s이(가) 뜨거운 바람에 의해 익어버렸습니다", - "death.attack.create.fan_lava": "%1$s이(가) 용암 바람으로 구워졌습니다", + "death.attack.create.crush": "%1$s이(가) 분쇄 휠로 가공되었습니다", + "death.attack.create.crush.player": "%1$s이(가) %2$s 때문에 분쇄 휠에서 가공되었습니다", + "death.attack.create.fan_fire": "%1$s이(가) 뜨거운 바람에 익어버렸습니다", + "death.attack.create.fan_fire.player": "%1$s이(가) %2$s 때문에 뜨거운 바람으로 익어버렸습니다", + "death.attack.create.fan_lava": "%1$s이(가) 용암 바람으로 제가 되었습니다", + "death.attack.create.fan_lava.player": "%1$s이(가) %2$s 때문에 용암 바람으로 재가 되었습니다", "death.attack.create.mechanical_drill": "%1$s이(가) 드릴에 관통당했습니다", + "death.attack.create.mechanical_drill.player": "%1$s이(가) %2$s 때문에 드릴에 관통당했습니다", "death.attack.create.mechanical_saw": "%1$s이(가) 톱날에 반으로 갈라져 죽었습니다", - "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", - "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", + "death.attack.create.mechanical_saw.player": "%1$s이(가) %2$s 때문에 톱날에 반으로 갈라져 죽었습니다", + "death.attack.create.potato_cannon": "%1$s이(가) %2$s의 감자포에 맞고 죽었습니다.", + "death.attack.create.potato_cannon.item": "%1$s이(가) %3$s을(를) 사용한 %2$s에게 맞아 죽었습니다.", "death.attack.create.cuckoo_clock_explosion": "%1$s이(가) 조작된 뻐꾸기 시계에 의해 폭파당했습니다", + "death.attack.create.cuckoo_clock_explosion.player": "%1$s이(가) 조작된 뻐꾸기 시계에 의해 폭파당했습니다", "create.block.deployer.damage_source_name": "배포기", - "create.block.cart_assembler.invalid": "카트조립기를 레일 위에 설치하세요", + "create.block.cart_assembler.invalid": "카트 조립기를 레일 위에 설치하세요", - "create.menu.return": "UNLOCALIZED: Return to Menu", - "create.menu.configure": "UNLOCALIZED: Configure...", - "create.menu.ponder_index": "UNLOCALIZED: Ponder Index", - "create.menu.only_ingame": "UNLOCALIZED: Available in the Pause Menu", - "create.menu.project_page": "UNLOCALIZED: Project Page", - "create.menu.report_bugs": "UNLOCALIZED: Report Issues", - "create.menu.support": "UNLOCALIZED: Support Us", + "create.menu.return": "메뉴로 돌아가기", + "create.menu.configure": "설정...", + "create.menu.ponder_index": "분석 메뉴", + "create.menu.only_ingame": "일시 정지 메뉴에서 가능합니다", + "create.menu.project_page": "Curseforge 페이지", + "create.menu.report_bugs": "버그 제보하기", + "create.menu.support": "후원하기", "create.recipe.crushing": "분쇄", - "create.recipe.milling": "맷돌질", + "create.recipe.milling": "제분", "create.recipe.fan_washing": "세척", "create.recipe.fan_washing.fan": "물과 선풍기", "create.recipe.fan_smoking": "훈연", @@ -710,26 +737,26 @@ "create.recipe.sawing": "제재", "create.recipe.mechanical_crafting": "기계 조합", "create.recipe.automatic_shaped": "유형 자동 조합", - "create.recipe.block_cutting": "블 절단", - "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", + "create.recipe.block_cutting": "블록 절단", + "create.recipe.wood_cutting": "나무 절단", "create.recipe.sandpaper_polishing": "사포질", "create.recipe.mystery_conversion": "?", "create.recipe.spout_filling": "채우기", "create.recipe.draining": "배수", - "create.recipe.sequenced_assembly": "UNLOCALIZED: Sequenced Assembly", - "create.recipe.assembly.next": "UNLOCALIZED: Next: %1$s", - "create.recipe.assembly.step": "UNLOCALIZED: Step %1$s:", - "create.recipe.assembly.progress": "UNLOCALIZED: Progress: %1$s/%2$s", - "create.recipe.assembly.pressing": "UNLOCALIZED: Process in Press", - "create.recipe.assembly.spout_filling_fluid": "UNLOCALIZED: Spout %1$s", - "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", - "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", - "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.sequenced_assembly": "순서 조립", + "create.recipe.assembly.next": "다음 단계: %1$s", + "create.recipe.assembly.step": "단계 %1$s:", + "create.recipe.assembly.progress": "진행도: %1$s/%2$s", + "create.recipe.assembly.pressing": "압착하기", + "create.recipe.assembly.spout_filling_fluid": "%1$s 주입하기", + "create.recipe.assembly.deploying_item": "%1$s 사용하기", + "create.recipe.assembly.cutting": "톱으로 자르기", + "create.recipe.assembly.repeat": "%1$s번 반복하기", + "create.recipe.assembly.junk": "조립 실패한 조각들", "create.recipe.processing.chance": "%1$s%% 확률", "create.recipe.heat_requirement.none": "열이 필요하지 않음", - "create.recipe.heat_requirement.heated": "고온으로 가열됨", - "create.recipe.heat_requirement.superheated": "초고온으로 가열됨", + "create.recipe.heat_requirement.heated": "가열됨", + "create.recipe.heat_requirement.superheated": "초고온 가열됨", "create.generic.range": "범위", "create.generic.radius": "반지름", @@ -755,8 +782,8 @@ "create.action.discard": "삭제", "create.keyinfo.toolmenu": "메뉴 세부정보 보기", - "create.keyinfo.scrollup": "Simulate Mousewheel Up (inworld)", - "create.keyinfo.scrolldown": "Simulate Mousewheel Down (inworld)", + "create.keyinfo.scrollup": "마우스 휠을 위로 이동 (인게임에서)", + "create.keyinfo.scrolldown": "마우스 휠을 아래로 이동 (인게임에서)", "create.gui.scrollInput.defaultTitle": "옵션을 선택하세요:", "create.gui.scrollInput.scrollToModify": "스크롤로 수정하기", @@ -765,12 +792,12 @@ "create.gui.scrollInput.shiftScrollsFaster": "쉬프트-스크롤로 빨리 수정하기", "create.gui.toolmenu.focusKey": "[%1$s]를 눌러 세부정보 보기", "create.gui.toolmenu.cycle": "스크롤로 순환", - "create.gui.symmetryWand.mirrorType": "반사", - "create.gui.symmetryWand.orientation": "방위", + "create.gui.symmetryWand.mirrorType": "거울의 형태", + "create.gui.symmetryWand.orientation": "거울의 방향", - "create.symmetry.mirror.plane": "거울 모드", - "create.symmetry.mirror.doublePlane": "사각형 모드", - "create.symmetry.mirror.triplePlane": "팔각형 모드", + "create.symmetry.mirror.plane": "거울", + "create.symmetry.mirror.doublePlane": "사각형", + "create.symmetry.mirror.triplePlane": "팔각형", "create.orientation.orthogonal": "수직으로", "create.orientation.diagonal": "대각선으로", @@ -778,37 +805,37 @@ "create.orientation.alongZ": "Z좌표를 따라", "create.orientation.alongX": "X좌표를 따라", - "create.gui.terrainzapper.title": "휴대용 세계편집기", - "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", - "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", - "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", - "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", - "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", - "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", - "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", - "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", - "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", - "create.gui.terrainzapper.placement": "설치방식", + "create.gui.terrainzapper.title": "크리에이티브 세계편집기", + "create.gui.terrainzapper.searchDiagonal": "대각선 블록 포함", + "create.gui.terrainzapper.searchFuzzy": "물질 경계 무시", + "create.gui.terrainzapper.patternSection": "패턴", + "create.gui.terrainzapper.pattern.solid": "기본", + "create.gui.terrainzapper.pattern.checkered": "체스판", + "create.gui.terrainzapper.pattern.inversecheckered": "반전된 체스판", + "create.gui.terrainzapper.pattern.chance25": "랜덤하게 25% 채우기", + "create.gui.terrainzapper.pattern.chance50": "랜덤하게 50% 채우기", + "create.gui.terrainzapper.pattern.chance75": "랜덤하게 75% 채우기", + "create.gui.terrainzapper.placement": "설치 기준", "create.gui.terrainzapper.placement.merged": "선택한 블록에", - "create.gui.terrainzapper.placement.attached": "선택한 블록 옆에", + "create.gui.terrainzapper.placement.attached": "선택한 블록 밖에", "create.gui.terrainzapper.placement.inserted": "선택한 블록 안에", "create.gui.terrainzapper.brush": "브러쉬", "create.gui.terrainzapper.brush.cuboid": "정육면체", "create.gui.terrainzapper.brush.sphere": "구", - "create.gui.terrainzapper.brush.cylinder": "원통", - "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", - "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", - "create.gui.terrainzapper.tool": "도구", + "create.gui.terrainzapper.brush.cylinder": "원기둥", + "create.gui.terrainzapper.brush.surface": "면", + "create.gui.terrainzapper.brush.cluster": "원", + "create.gui.terrainzapper.tool": "설치 방식", "create.gui.terrainzapper.tool.fill": "채우기", - "create.gui.terrainzapper.tool.place": "설치", + "create.gui.terrainzapper.tool.place": "설치하기", "create.gui.terrainzapper.tool.replace": "대체", "create.gui.terrainzapper.tool.clear": "지우기", "create.gui.terrainzapper.tool.overlay": "덮어씌우기", - "create.gui.terrainzapper.tool.flatten": "평탄화", + "create.gui.terrainzapper.tool.flatten": "다듬기", "create.terrainzapper.shiftRightClickToSet": "쉬프트-우클릭으로 모양 설정하기", - "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", - "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", + "create.terrainzapper.usingBlock": "사용 중: %1$s", + "create.terrainzapper.leftClickToSet": "좌클릭으로 재료로 쓸 블록을 선택하세요", "create.minecart_coupling.two_couplings_max": "광산 수레는 최대 2개의 커플링만 가질 수 있습니다", "create.minecart_coupling.unloaded": "열차 일부분이 로딩되지 않은 청크에 있는 것 같습니다", @@ -817,18 +844,18 @@ "create.minecart_coupling.too_far": "광산 수레들이 너무 멀리 떨어져 있습니다", "create.contraptions.movement_mode": "이동 설정", - "create.contraptions.movement_mode.move_place": "멈췄을때 항상 블록을 설치함", - "create.contraptions.movement_mode.move_place_returned": "멈췄을떄 최초 위치에서만 블록을 설치함", - "create.contraptions.movement_mode.move_never_place": "멈춰도 블록을 설치하지 않음", - "create.contraptions.movement_mode.rotate_place": "멈췄을때 항상 블록을 설치함", - "create.contraptions.movement_mode.rotate_place_returned": "멈췄을떄 최초 위치에서만 블록을 설치함", - "create.contraptions.movement_mode.rotate_never_place": "멈춰도 블록을 설치하지 않음", + "create.contraptions.movement_mode.move_place": "멈췄을 때 항상 구조물을 설치함", + "create.contraptions.movement_mode.move_place_returned": "멈췄을 때 시작 위치에서만 구조물을 설치함", + "create.contraptions.movement_mode.move_never_place": "멈춰도 구조물을 설치하지 않음", + "create.contraptions.movement_mode.rotate_place": "멈췄을 때 항상 구조물을 설치함", + "create.contraptions.movement_mode.rotate_place_returned": "멈췄을 때 시작 위치에서만 구조물을 설치함", + "create.contraptions.movement_mode.rotate_never_place": "멈춰도 구조물을 설치하지 않음", "create.contraptions.cart_movement_mode": "수레 장치 이동 설정", - "create.contraptions.cart_movement_mode.rotate": "장치가 항상 전방을 향함", - "create.contraptions.cart_movement_mode.rotate_paused": "수레가 회전할때 장치 행동을 멈춤", - "create.contraptions.cart_movement_mode.rotation_locked": "장치가 회전하지 않음", + "create.contraptions.cart_movement_mode.rotate": "구조물이 항상 전방을 향함", + "create.contraptions.cart_movement_mode.rotate_paused": "수레가 회전할때 구조물이 행동을 멈춤", + "create.contraptions.cart_movement_mode.rotation_locked": "구조물이 회전하지 않음", "create.contraptions.windmill.rotation_direction": "회전 방향", - "create.contraptions.clockwork.clock_hands": "시계 바늘", + "create.contraptions.clockwork.clock_hands": "시계침", "create.contraptions.clockwork.hour_first": "시침 먼저", "create.contraptions.clockwork.minute_first": "분침 먼저", "create.contraptions.clockwork.hour_first_24": "24시간 바늘 먼저", @@ -836,69 +863,69 @@ "create.logistics.filter": "필터", "create.logistics.recipe_filter": "조합법 필터", "create.logistics.fluid_filter": "액체 필터", - "create.logistics.firstFrequency": "주파수. #1", - "create.logistics.secondFrequency": "주파수. #2", - "create.logistics.filter.apply": "%1$s에 필터 저장됨", - "create.logistics.filter.apply_click_again": "%1$s에 필터 저장됨 / 다시 눌러 수량 복사하기", - "create.logistics.filter.apply_count": "필터에 추출 횟수를 적용했습니다.", + "create.logistics.firstFrequency": "주파수 #1", + "create.logistics.secondFrequency": "주파수 #2", + "create.logistics.filter.apply": "%1$s에 필터를 적용했습니다.", + "create.logistics.filter.apply_click_again": "%1$s에 필터를 적용했습니다. 다시 적용하면 가지고 있는 아이템의 수량을 복사하여 필터에 적용합니다.", + "create.logistics.filter.apply_count": "필터에 수량을 적용했습니다.", - "create.gui.goggles.generator_stats": "발동 상태:", - "create.gui.goggles.kinetic_stats": "가동 상태:", + "create.gui.goggles.generator_stats": "동력 상태:", + "create.gui.goggles.kinetic_stats": "작동 상태:", "create.gui.goggles.at_current_speed": "현재 에너지량", - "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", - "create.gui.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", - "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", - "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", - "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]", - "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk", - "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", - "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", - "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", - "create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", - "create.gui.gauge.info_header": "게이지 정보:", + "create.gui.goggles.pole_length": "축 길이:", + "create.gui.goggles.fluid_container": "액체 저장 정보:", + "create.gui.goggles.fluid_container.capacity": "용량: ", + "create.gui.assembly.exception": "이 구조물은 움직일 수 없습니다:", + "create.gui.assembly.exception.unmovableBlock": "[%1$s,%2$s,%3$s]에 움직일 수 없는 [%4$s]이(가) 있습니다.", + "create.gui.assembly.exception.chunkNotLoaded": "[%1$s,%2$s,%3$s]에 있는 블록이 로드되지 않은 청크에 있습니다.", + "create.gui.assembly.exception.structureTooLarge": "이 구조물에 너무 많은 블록이 포함되어 있습니다.\n설정된 최댓값: %1$s개", + "create.gui.assembly.exception.tooManyPistonPoles": "이 피스톤에 너무 많은 연장 축이 부착되어 있습니다.\n설정된 최댓값: %1$s개", + "create.gui.assembly.exception.noPistonPoles": "이 피스톤은 연장 축이 없습니다.", + "create.gui.assembly.exception.not_enough_sails": "부착된 구조물에 날개 블록이 부족합니다. 현재: %1$s개 \n최소 %2$s개가 필요합니다.", + "create.gui.gauge.info_header": "계측기 정보:", "create.gui.speedometer.title": "회전 속도", "create.gui.stressometer.title": "네트워크 부하", "create.gui.stressometer.capacity": "용량", "create.gui.stressometer.overstressed": "과부하됨", - "create.gui.stressometer.no_rotation": "회전없음", + "create.gui.stressometer.no_rotation": "동력없음", "create.gui.contraptions.not_fast_enough": "이 %1$s은(는) 작동하기에 _회전 속도_가 _부족합니다_", "create.gui.contraptions.network_overstressed": "_과부하!_ _높은 피로도_ _용량_을 가진 발전기를 추가로 설치하거나 _장치 속도_를 _늦추세요_.", - "create.gui.adjustable_crate.title": "가변 창고 ", + "create.gui.adjustable_crate.title": "가변 창고", "create.gui.adjustable_crate.storageSpace": "저장 공간", "create.gui.stockpile_switch.title": "수량 스위치", "create.gui.stockpile_switch.invert_signal": "신호 반전", "create.gui.stockpile_switch.move_to_lower_at": "최소 신호 발동 비율:%1$s%%", "create.gui.stockpile_switch.move_to_upper_at": "최소 신호 유지 비율:%1$s%%", "create.gui.sequenced_gearshift.title": "순서 기어쉬프트", - "create.gui.sequenced_gearshift.instruction": "설명", - "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", - "create.gui.sequenced_gearshift.instruction.turn_angle": "회전", + "create.gui.sequenced_gearshift.instruction": "지시", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "축 회전", + "create.gui.sequenced_gearshift.instruction.turn_angle": "축 회전", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "각도", - "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", - "create.gui.sequenced_gearshift.instruction.turn_distance": "피스톤", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "피스톤/도르래/겐트리 회전", + "create.gui.sequenced_gearshift.instruction.turn_distance": "장치 회전", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "거리", - "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", - "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", - "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", - "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", - "create.gui.sequenced_gearshift.instruction.end": "마침", - "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", - "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "지연 시간", + "create.gui.sequenced_gearshift.instruction.delay": "지연", + "create.gui.sequenced_gearshift.instruction.delay.duration": "지연시간", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "종료", + "create.gui.sequenced_gearshift.instruction.end": "종료", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "새 레드스톤 신호 대기", + "create.gui.sequenced_gearshift.instruction.await": "대기", "create.gui.sequenced_gearshift.speed": "속도, 방향", - "create.gui.sequenced_gearshift.speed.forward": "입력된 속도, 그대로 회전", - "create.gui.sequenced_gearshift.speed.forward_fast": "입력된 속도의 2배, 그대로 회전", - "create.gui.sequenced_gearshift.speed.back": "입력된 속도, 반대로 회전", - "create.gui.sequenced_gearshift.speed.back_fast": "입력된 속도의 2배, 반대로 회전", + "create.gui.sequenced_gearshift.speed.forward": "입력 속도, 그대로 회전", + "create.gui.sequenced_gearshift.speed.forward_fast": "입력 속도의 2배, 그대로 회전", + "create.gui.sequenced_gearshift.speed.back": "입력 속도, 반대로 회전", + "create.gui.sequenced_gearshift.speed.back_fast": "입력 속도의 2배, 반대로 회전", - "create.schematicAndQuill.dimensions": "청사진 크기: %1$sx%2$sx%3$s", - "create.schematicAndQuill.firstPos": "첫번쨰 위치 지정됨.", - "create.schematicAndQuill.secondPos": "두번째 위치 지정됨.", - "create.schematicAndQuill.noTarget": "[Ctrl]을 눌러 공기 블록을 선택하기.", - "create.schematicAndQuill.abort": "위치 제거됨.", - "create.schematicAndQuill.title": "청사진 이름", - "create.schematicAndQuill.convert": "저장하고 바로 설치하기", - "create.schematicAndQuill.fallbackName": "내 청사진", - "create.schematicAndQuill.saved": "%1$s로 저장됨", + "create.schematicAndQuill.dimensions": "설계도 크기: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "첫 번째 위치를 설정했습니다.", + "create.schematicAndQuill.secondPos": "두 번째 위치를 설정했습니다.", + "create.schematicAndQuill.noTarget": "[Ctrl]을(를) 누르면 허공을 선택할 수 있습니다.", + "create.schematicAndQuill.abort": "위치 설정을 제거했습니다.", + "create.schematicAndQuill.title": "설계도 이름:", + "create.schematicAndQuill.convert": "저장하고 즉시 적용", + "create.schematicAndQuill.fallbackName": "My Schematic", + "create.schematicAndQuill.saved": "%1$s으(로) 저장했습니다", "create.schematic.invalid": "[!] 없는 아이템 - 청사진 테이블을 이용하세요", "create.schematic.position": "위치", @@ -917,12 +944,12 @@ "create.schematic.tool.rotate": "회전", "create.schematic.tool.print": "설치", "create.schematic.tool.flip": "뒤집기", - "create.schematic.tool.deploy.description.0": "구조물을 해당 위치로 고정합니다.", - "create.schematic.tool.deploy.description.1": "땅에다 우클릭으로 설치합니다.", - "create.schematic.tool.deploy.description.2": "[Ctrl]을 눌러 플레이어-청사진의 거리를 설정합니다.", - "create.schematic.tool.deploy.description.3": "[Ctrl]-스크롤로 거리를 조정합니다.", - "create.schematic.tool.move.description.0": "청사진을 수평 이동시킵니다.", - "create.schematic.tool.move.description.1": "청사진을 보고 [CTRL]-스크롤로 밉니다.", + "create.schematic.tool.deploy.description.0": "구조물의 위치를 설정합니다.", + "create.schematic.tool.deploy.description.1": "오른쪽 버튼을 누르면 땅에 배치합니다.", + "create.schematic.tool.deploy.description.2": "[Ctrl]을 누르면 일정 거리를 유지합니다.", + "create.schematic.tool.deploy.description.3": "[Ctrl]을 누르고 스크롤하면 거리를 변경합니다.", + "create.schematic.tool.move.description.0": "청사진이 수평 이동합니다.", + "create.schematic.tool.move.description.1": "청사진을 바라보며 [CTRL]을 누르고 스크롤하면 청사진을 밀어냅니다.", "create.schematic.tool.move.description.2": "", "create.schematic.tool.move.description.3": "", "create.schematic.tool.movey.description.0": "청사진을 수직 이동시킵니다.", @@ -934,7 +961,7 @@ "create.schematic.tool.rotate.description.2": "", "create.schematic.tool.rotate.description.3": "", "create.schematic.tool.print.description.0": "구조물을 즉시 설치합니다.", - "create.schematic.tool.print.description.1": "[우클릭]으로 현재 지점에 설치를 허가합니다.", + "create.schematic.tool.print.description.1": "[우클릭]으로 현재 지점에 설치합니다.", "create.schematic.tool.print.description.2": "이 도구는 크리에이티브 모드 전용입니다.", "create.schematic.tool.print.description.3": "", "create.schematic.tool.flip.description.0": "당신이 보는 면으로 청사진을 뒤집습니다.", @@ -944,7 +971,7 @@ "create.schematics.synchronizing": "동기화 중...", "create.schematics.uploadTooLarge": "청사진이 너무 큽니다!.", - "create.schematics.maxAllowedSize": "최대 청사진 파일 크기는:", + "create.schematics.maxAllowedSize": "최대 청사진 파일 크기:", "create.gui.schematicTable.refresh": "파일 새로고침", "create.gui.schematicTable.open_folder": "폴더 열기", @@ -954,7 +981,7 @@ "create.gui.schematicTable.uploading": "업로딩 중...", "create.gui.schematicTable.finished": "업로드 완료!", "create.gui.schematicannon.title": "청사진 대포", - "create.gui.schematicannon.listPrinter": "재료 목록 프린터", + "create.gui.schematicannon.listPrinter": "재료 목록 인쇄", "create.gui.schematicannon.gunpowderLevel": "화약 용량 %1$s%%", "create.gui.schematicannon.shotsRemaining": "남은 발포 수 : %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "화약 여분: %1$s", @@ -975,16 +1002,16 @@ "create.gui.schematicannon.option.dontReplaceSolid.description": "대포가 작업구역의 온전한 블록을 대체하지 않습니다.", "create.gui.schematicannon.option.replaceWithSolid.description": "대포가 작업구역의 온전한 블록을 대포가 가진 재료로 대체합니다.", "create.gui.schematicannon.option.replaceWithAny.description": "대포가 작업구역의 온전한 블록을 대포가 가진 어떠한 재료로든 대체합니다.", - "create.gui.schematicannon.option.replaceWithEmpty.description": "대포가 작업구역의 블록들을 제거하고 공기로 채웁니다.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "대포가 작업구역의 블록들을 제거합니다.", "create.schematicannon.status.idle": "휴식", "create.schematicannon.status.ready": "준비됨", - "create.schematicannon.status.running": "가동 중", + "create.schematicannon.status.running": "작동 중", "create.schematicannon.status.finished": "완료", - "create.schematicannon.status.paused": "멈춤", + "create.schematicannon.status.paused": "일시 중지", "create.schematicannon.status.stopped": "중단됨", "create.schematicannon.status.noGunpowder": "화약이 부족함", - "create.schematicannon.status.targetNotLoaded": "블록이 준비되지 않음", + "create.schematicannon.status.targetNotLoaded": "목표가 없음", "create.schematicannon.status.targetOutsideRange": "목표가 너무 멀리 떨어져 있습니다.", "create.schematicannon.status.searching": "검색 중", "create.schematicannon.status.skipping": "건너뛰는 중", @@ -995,8 +1022,8 @@ "create.schematicannon.status.schematicNotPlaced": "청사진이 전개되지 않음", "create.schematicannon.status.schematicExpired": "청사진 파일이 제거됨", - "create.materialChecklist": "UNLOCALIZED: Material Checklist", - "create.materialChecklist.blocksNotLoaded": "UNLOCALIZED: * Disclaimer *\n\nMaterial List may be inaccurate due to relevant chunks not being loaded.", + "create.materialChecklist": "재료 목록", + "create.materialChecklist.blocksNotLoaded": "* 경고 *\n\n관련된 청크가 불러와지지 않아 재료 목록이 부정확할 수 있습니다.", "create.gui.filter.deny_list": "UNLOCALIZED: Deny-List", "create.gui.filter.deny_list.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Deny-List accepts everything.", @@ -1039,52 +1066,57 @@ "create.item_attributes.in_item_group.inverted": "%1$s탭에 속함", "create.item_attributes.added_by": "%1$s모드가 추가함", "create.item_attributes.added_by.inverted": "%1$s모드가 추가하지 않음", - "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", - "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", - "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", - "create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s", - "create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level", - "create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level", - "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", - "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", - "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", - "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", - "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", - "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", - "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", - "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", - "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", - "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", - "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", - "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", - "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", - "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", - "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", - "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", - "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", - "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", - "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", - "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", - "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", - "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", + "create.item_attributes.shulker_level": "셜커가 %1$s있음", + "create.item_attributes.shulker_level.inverted": "셜커가 %1$s있지 않음", + "create.item_attributes.shulker_level.full": "가득 차", + "create.item_attributes.shulker_level.empty": "비어", + "create.item_attributes.shulker_level.partial": "조금 차", + "create.item_attributes.has_enchant": "%1$s 마법부여를 가지고 있음", + "create.item_attributes.has_enchant.inverted": "%1$s 마법부여를 가지고 있지 않음", + "create.item_attributes.color": "염색됨", + "create.item_attributes.color.inverted": "염색되지 않음", + "create.item_attributes.max_enchanted": "마법부여가 최고 레벨임", + "create.item_attributes.max_enchanted.inverted": "마법부여가 최고 레벨이 아님", + "create.item_attributes.has_fluid": "%1$s을(를) 담고 있음", + "create.item_attributes.has_fluid.inverted": "%1$s을(를) 담고 있지 않음", + "create.item_attributes.has_name": "%1$s이라는 이름을 갖고 있음", + "create.item_attributes.has_name.inverted": "%1$s이라는 이름을 갖고 있지 않음", + "create.item_attributes.book_author": "%1$s이(가) 작성함", + "create.item_attributes.book_author.inverted": "%1$s이(가) 작성하지 않음", + "create.item_attributes.book_copy_original": "원본임", + "create.item_attributes.book_copy_original.inverted": "원본이 아님", + "create.item_attributes.book_copy_first": "원본의 복사본임", + "create.item_attributes.book_copy_first.inverted": "원본의 복사본이 아님", + "create.item_attributes.book_copy_second": "복사본의 복사본임", + "create.item_attributes.book_copy_second.inverted": "복사본의 복사본이 아님", + "create.item_attributes.book_copy_tattered": "낡고 헐었음", + "create.item_attributes.book_copy_tattered.inverted": "낡고 헐지 않음", + "create.item_attributes.astralsorcery_crystal": "%1$s 수정 속성을 가짐", + "create.item_attributes.astralsorcery_crystal.inverted": "%1$s 수정 속성을 가지고 있지 않음", + "create.item_attributes.astralsorcery_constellation": "%1$s에 조율됨", + "create.item_attributes.astralsorcery_constellation.inverted": "%1$s에 조율되지 않음", + "create.item_attributes.astralsorcery_perk_gem": "%1$s 퍽 속성을 가짐", + "create.item_attributes.astralsorcery_perk_gem.inverted": "%1$s 퍽 속성을 가지고 있지 않음", + "create.item_attributes.astralsorcery_amulet": "%1$s이(가) 향상됨", + "create.item_attributes.astralsorcery_amulet.inverted": "%1$s이(가) 향상되지 않음", "create.gui.attribute_filter.no_selected_attributes": "속성이 선택되지 않음", "create.gui.attribute_filter.selected_attributes": "선택된 속성:", "create.gui.attribute_filter.add_attribute": "리스트에 속성을 추가합니다", "create.gui.attribute_filter.add_inverted_attribute": "리스트에 반대 속성을 추가합니다.", - "create.gui.attribute_filter.allow_list_disjunctive": "UNLOCALIZED: Allow-List (Any)", - "create.gui.attribute_filter.allow_list_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", - "create.gui.attribute_filter.allow_list_conjunctive": "UNLOCALIZED: Allow-List (All)", - "create.gui.attribute_filter.allow_list_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", - "create.gui.attribute_filter.deny_list": "UNLOCALIZED: Deny-List", - "create.gui.attribute_filter.deny_list.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_disjunctive": "화이트리스트 (최소)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.", + "create.gui.attribute_filter.allow_list_conjunctive": "화이트리스트 (모두)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "아이템이 선택된 속성 모두를 가지고 있어야 통과시킵니다.", + "create.gui.attribute_filter.deny_list": "블랙리스트", + "create.gui.attribute_filter.deny_list.description": "아이템이 선택된 속성이 없다면 통과시킵니다.", "create.gui.attribute_filter.add_reference_item": "참고할 아이템을 추가하기", - "create.tooltip.holdForDescription": "UNLOCALIZED: Hold [%1$s] for Summary", - "create.tooltip.holdForControls": "UNLOCALIZED: Hold [%1$s] for Controls", + "create.tooltip.holdForDescription": "[%1$s]을 눌러 설명 보기", + "create.tooltip.holdForControls": "[%1$s]을 눌러 조작법 보기", "create.tooltip.keyShift": "Shift", "create.tooltip.keyCtrl": "Ctrl", - "create.tooltip.speedRequirement": "회전속도 요구: %1$s", + "create.tooltip.speedRequirement": "요구 회전속도: %1$s", "create.tooltip.speedRequirement.none": "없음", "create.tooltip.speedRequirement.medium": "보통", "create.tooltip.speedRequirement.high": "빠름", @@ -1092,7 +1124,7 @@ "create.tooltip.stressImpact.low": "낮음", "create.tooltip.stressImpact.medium": "보통", "create.tooltip.stressImpact.high": "높음", - "create.tooltip.stressImpact.overstressed": "과부하됨", + "create.tooltip.stressImpact.overstressed": "과부하", "create.tooltip.capacityProvided": "피로도 용량: %1$s", "create.tooltip.capacityProvided.low": "적음", "create.tooltip.capacityProvided.medium": "보통", @@ -1100,63 +1132,70 @@ "create.tooltip.generationSpeed": "%1$s %2$s만큼 발전함", "create.tooltip.analogStrength": "레드스톤 출력: %1$s/15", - "create.mechanical_arm.extract_from": "%1$s에서 아이템을 가져감", - "create.mechanical_arm.deposit_to": "%1$s에 아이템을 넣음", - "create.mechanical_arm.summary": "이 기계 팔은 %1$s개의 입력부와 %2$s개의 출력부를 가졌습니다.", - "create.mechanical_arm.points_outside_range": "%1$s개의 상호작용 포인트가 거리제한으로 인해 삭제되었습니다.", + "create.mechanical_arm.extract_from": "%1$s을(를) 입력구로 설정했습니다", + "create.mechanical_arm.deposit_to": "%1$s을(를) 출력구로 설정했습니다", + "create.mechanical_arm.summary": "이 기계식 팔은 %1$s개의 입력구와 %2$s개의 출력구가 있습니다", + "create.mechanical_arm.points_outside_range": "범위 제한으로 인해 %1$s개의 선택된 지점이 해제되었습니다", - "create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected", - "create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)", - "create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)", - "create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]", - "create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size", + "create.weighted_ejector.target_set": "투척 지점이 설정되었습니다", + "create.weighted_ejector.target_not_valid": "인접한 블록에다 발사합니다 (투척 지점이 올바르지 않습니다)", + "create.weighted_ejector.no_target": "인접한 블록에다 발사합니다 (투척 지점이 설정되지 않았습니다)", + "create.weighted_ejector.targeting": "[%1$s,%2$s,%3$s]에다 투척합니다", + "create.weighted_ejector.stack_size": "투척하는 아이템의 수량", - "create.logistics.when_multiple_outputs_available": "다수의 입력부가 존재할 때", + "create.logistics.when_multiple_outputs_available": "여러 출력구가 있을 때", - "create.mechanical_arm.selection_mode.round_robin": "순서대로 옮김", - "create.mechanical_arm.selection_mode.forced_round_robin": "순서대로 옮김(강제적)", - "create.mechanical_arm.selection_mode.prefer_first": "첫 포인트 우선", + "create.mechanical_arm.selection_mode.round_robin": "돌아가며 처리", + "create.mechanical_arm.selection_mode.forced_round_robin": "돌아가며 처리(강제적)", + "create.mechanical_arm.selection_mode.prefer_first": "설정 순서 우선시", - "create.tunnel.selection_mode.split": "분리", - "create.tunnel.selection_mode.forced_split": "강제 분리", - "create.tunnel.selection_mode.round_robin": "순차적 배분", - "create.tunnel.selection_mode.forced_round_robin": "강제 순차적 배분", - "create.tunnel.selection_mode.prefer_nearest": "가까운 곳 선호", - "create.tunnel.selection_mode.randomize": "랜덤", - "create.tunnel.selection_mode.synchronize": "입력부 동기화", + "create.tunnel.selection_mode.split": "분할", + "create.tunnel.selection_mode.forced_split": "분할(강제적)", + "create.tunnel.selection_mode.round_robin": "순서대로 처리", + "create.tunnel.selection_mode.forced_round_robin": "순서대로 처리(강제적)", + "create.tunnel.selection_mode.prefer_nearest": "가장 가까운 곳", + "create.tunnel.selection_mode.randomize": "무작위", + "create.tunnel.selection_mode.synchronize": "입력 동기화", "create.tooltip.chute.header": "슈트 정보", - "create.tooltip.chute.items_move_down": "아이템이 아래로 이동합니다.", - "create.tooltip.chute.items_move_up": "아이템이 위로 이동합니다.", + "create.tooltip.chute.items_move_down": "아이템이 아래로 이동", + "create.tooltip.chute.items_move_up": "아이템이 위로 이동", "create.tooltip.chute.no_fans_attached": "선풍기가 부착되지 않음", "create.tooltip.chute.fans_push_up": "선풍기가 아래에서 밈", "create.tooltip.chute.fans_push_down": "선풍기가 위에서 밈", "create.tooltip.chute.fans_pull_up": "선풍기가 위에서 당김", "create.tooltip.chute.fans_pull_down": "선풍기가 아래에서 당김", - "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.tooltip.chute.contains": "들어있는 아이템: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "분배 중인 아이템:", + "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "우클릭하여 회수", - "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", - "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", - "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", - "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", - "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.linked_controller.bind_mode": "연결 모드 활성화", + "create.linked_controller.press_keybind": "%1$s, %2$s, %3$s, %4$s, %5$s, %6$s 중 하나를 눌러 이 주파수를 해당 조작키에 연결하세요", + "create.linked_controller.key_bound": "%1$s에 주파수가 연결되었습니다", + "create.linked_controller.frequency_slot_1": "조작키: %1$s, 주파수 #1", + "create.linked_controller.frequency_slot_2": "조작키: %1$s, 주파수 #2", - "create.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", - "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", - "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", - "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", - "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", - "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", - "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.crafting_blueprint.crafting_slot": "재료 슬롯", + "create.crafting_blueprint.filter_items_viable": "필터도 가능합니다", + "create.crafting_blueprint.display_slot": "전시 슬롯", + "create.crafting_blueprint.inferred": "실제 조합법과 같음", + "create.crafting_blueprint.manually_assigned": "직접 지정함", + "create.crafting_blueprint.secondary_display_slot": "두번째 전시 슬롯", + "create.crafting_blueprint.optional": "추가적", - "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", - "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", + "create.potato_cannon.ammo.attack_damage": "%1$s 공격 피해", + "create.potato_cannon.ammo.reload_ticks": "%1$s 재장전 틱", + "create.potato_cannon.ammo.knockback": "%1$s 밀쳐내는 거리", + + "create.hint.hose_pulley.title": "무한 공급", + "create.hint.hose_pulley": "해당 액체는 _무한_합니다.", "create.hint.mechanical_arm_no_targets.title": "목표 없음", - "create.hint.mechanical_arm_no_targets": "이 _기계 팔_은 _목표_가 설정되지 않은 것 같습니다. _기계 팔을 손에 들고_ 벨트, 아이템 거치대, 깔때기를 _우클릭_하여 목표로 지정하세요.", - "create.hint.empty_bearing.title": "베어링 업데이트_", + "create.hint.mechanical_arm_no_targets": "이 _기계 팔_은 _목표_가 설정되지 않았습니다. _기계 팔을 손에 들고_ 벨트, 아이템 거치대, 퍼널을 _우클릭_하여 목표로 지정하세요.", + "create.hint.empty_bearing.title": "베어링 업데이트", "create.hint.empty_bearing": "_맨 손_으로 베어링을 _우클릭_하여 구조물을 _부착_하세요.", - "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", - "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.hint.full_deployer.title": "배포기 아이템 과적", + "create.hint.full_deployer": "이 _배포기_는 _배출_할 아이템을 가지고 있습니다. 호퍼 , 퍼널 등을 이용해 아이템을 빼내세요.", "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1175,46 +1214,47 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", - "create.contraption.minecart_contraption_illegal_pickup": "UNLOCALIZED: A mystical force is binding this Cart Contraption to the world", + "create.contraption.minecart_contraption_too_big": "이 수레 구조물은 들기에 너무 큽니다", + "create.contraption.minecart_contraption_illegal_pickup": "신비로운 힘이 이 수레 구조물을 세계에 묶어두고 있습니다", "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", - "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", - "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", - "create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.contraption_disassemble": "구조물이 멈춤", + "create.subtitle.peculiar_bell_use": "황동 종이 울림", + "create.subtitle.mixing": "섞는 소리", + "create.subtitle.mechanical_press_activation_belt": "압착기가 작동함", + "create.subtitle.fwoomp": "감자포를 쏨", + "create.subtitle.worldshaper_place": "세계편집기가 쏨", + "create.subtitle.crushing_1": "분쇄되는 소리", + "create.subtitle.depot_slide": "아이템이 미끄러짐", + "create.subtitle.saw_activate_stone": "톱이 작동함", + "create.subtitle.blaze_munch": "블레이즈 버너가 섭취함", + "create.subtitle.funnel_flap": "퍼널이 펄럭거림", "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", - "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.haunted_bell_use": "귀신들린 종이 울림", + "create.subtitle.scroll_value": "스크롤 소리", + "create.subtitle.crafter_craft": "조합기가 조합함", + "create.subtitle.controller_put": "조작기를 놓음", + "create.subtitle.cranking": "크랭크가 돌아감", + "create.subtitle.wrench_remove": "장치가 부숴짐", + "create.subtitle.cogs": "톱니바퀴가 돌아감", "create.subtitle.slime_added": "슬라임이 철퍽거림", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", - "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", - "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", - "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", - "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", - "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", - "create.subtitle.mechanical_press_activation": "압착기가 가동됨", - "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", - "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.wrench_rotate": "렌치를 사용함", + "create.subtitle.potato_hit": "채소가 부딫힘", + "create.subtitle.saw_activate_wood": "톱이 작동함", + "create.subtitle.haunted_bell_convert": "종에 귀신이 들림", + "create.subtitle.deployer_polish": "배포기가 윤나게 함", + "create.subtitle.deny": "취소음", + "create.subtitle.controller_click": "조작기를 누름", + "create.subtitle.schematicannon_launch_block": "청사진 대포가 발사함", + "create.subtitle.copper_armor_equip": "잠수용 장비가 철커덕거림", + "create.subtitle.controller_take": "독서대가 비워짐", + "create.subtitle.mechanical_press_activation": "압착기가 작동함", + "create.subtitle.contraption_assemble": "구조물이 움직임", + "create.subtitle.crafter_click": "조합기가 작동함", + "create.subtitle.depot_plop": "아이템이 놓임", + "create.subtitle.confirm": "확인음", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1235,15 +1275,15 @@ "block.create.metal_bracket.tooltip.summary": "금속을 이용해 _축, 톱니바퀴, 파이프_를 꾸며보세요.", "block.create.seat.tooltip": "SEAT", - "block.create.seat.tooltip.summary": "앉아서 드라이브를 즐기세요! _움직이는 장치_에 _플레이어_를 _고정_시킵니다. 가구용으로도 좋습니다! 다양한 색깔이 존재합니다.", + "block.create.seat.tooltip.summary": "앉아서 드라이브를 즐기세요! _움직이는 구조물_에 _플레이어_를 _고정_시킵니다. 가구용으로도 좋습니다! 다양한 색깔이 존재합니다.", "block.create.seat.tooltip.condition1": "좌석에 우클릭", "block.create.seat.tooltip.behaviour1": "플레이어가 좌석에 _앉습니다_. _왼쪽 쉬프트_를 눌러 좌석에서 _일어섭니다_.", "item.create.blaze_cake.tooltip": "블레이즈 케이크", - "item.create.blaze_cake.tooltip.summary": "열심히 일하는 _블레이즈_ _버너_의 식사입니다. 그들을 더 화끈하게 만드세요!", + "item.create.blaze_cake.tooltip.summary": "열심히 일하는 _블레이즈_ _버너_의 식사입니다. 블레이즈를 더 뜨겁게 만드세요!", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", - "item.create.wand_of_symmetry.tooltip.summary": "설정된 반사 모드에 따라 블록 설치를 _똑같이_ _재현_합니다.", + "item.create.wand_of_symmetry.tooltip.summary": "설정된 반사 모드에 따라 블록 설치를 _똑같이_ _배치_합니다.", "item.create.wand_of_symmetry.tooltip.condition1": "단축바에 있을 때", "item.create.wand_of_symmetry.tooltip.behaviour1": "활성화 유지", "item.create.wand_of_symmetry.tooltip.control1": "땅에다 우클릭", @@ -1271,18 +1311,18 @@ "item.create.extendo_grip.tooltip.summary": "띠요오옹! 사용자의 _사거리_를 늘려줍니다.", "item.create.extendo_grip.tooltip.condition1": "다른 손에 있을 때", "item.create.extendo_grip.tooltip.behaviour1": "_기존_ _손_에있는 아이템의 사거리를 늘립니다.", - "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.extendo_grip.tooltip.condition2": "구리 산소통을 착용했을 때", + "item.create.extendo_grip.tooltip.behaviour2": "_내구도_가 _소모되지_ _않고_, 탱크에서 _공기_가 _소모됩니다_.", - "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", - "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", - "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", - "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.potato_cannon.tooltip": "POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "퐁! 집에서 키운 작물로 적을 처치하세요! _구리_ _산소통_의 산소로 움직일 수 있습니다.", + "item.create.potato_cannon.tooltip.condition1": "우클릭", + "item.create.potato_cannon.tooltip.behaviour1": "_인벤토리_에서 적당한 아이템을 _쏩니다_.", + "item.create.potato_cannon.tooltip.condition2": "구리 산소통을 착용했을 때", + "item.create.potato_cannon.tooltip.behaviour2": "_내구도_가 _소모되지_ _않고_, 탱크에서 _공기_가 _소모됩니다_.", "item.create.filter.tooltip": "FILTER", - "item.create.filter.tooltip.summary": "장치의 _입력_과 _출력_을 필터 _아이템_ 목록에 따라 _조정_합니다.", + "item.create.filter.tooltip.summary": "장치의 _입력_과 _출력_을 _필터_ 목록에 따라 _조정_합니다.", "item.create.filter.tooltip.condition1": "필터 슬롯에 있을 때", "item.create.filter.tooltip.behaviour1": "필터 _설정_에 따라 아이템 흐름을 _조정_합니다.", "item.create.filter.tooltip.condition2": "우클릭", @@ -1300,7 +1340,7 @@ "item.create.schematic.tooltip": "SCHEMATIC", "item.create.schematic.tooltip.summary": "세계에 구조물을 _홀로그램으로_ 불러와 지정하고 설치합니다. 지정된 홀로그램은 _청사진_ _대포_의 _작업_ _영역_이 됩니다.", - "item.create.schematic.tooltip.condition1": "들고 있을 떄", + "item.create.schematic.tooltip.condition1": "들고 있을 때", "item.create.schematic.tooltip.behaviour1": "UI의 도구로 _변경/설치_ 할 수 있습니다.", "item.create.schematic.tooltip.control1": "웅크린 상태에서 우클릭", "item.create.schematic.tooltip.action1": "정확한 _좌표_ 입력을 위한 창을 엽니다.", @@ -1319,9 +1359,9 @@ "item.create.schematic_and_quill.tooltip.action3": "선택 영역을 리셋하고 _삭제_합니다.", "block.create.schematicannon.tooltip": "SCHEMATICANNON", - "block.create.schematicannon.tooltip.summary": "장착된 청사진을 바탕으로 블록들을 _발포_합니다. _화약_을 연료로 사용하고 주변 인벤토리 공간에서 아이템을 사용합니다.", - "block.create.schematicannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "block.create.schematicannon.tooltip.behaviour1": "UNLOCALIZED: Opens the _Interface_", + "block.create.schematicannon.tooltip.summary": "장착된 청사진을 바탕으로 블록들을 _발포_합니다. _화약_을 연료로 사용하고 주변 보관함에서 아이템을 사용합니다.", + "block.create.schematicannon.tooltip.condition1": "우클릭", + "block.create.schematicannon.tooltip.behaviour1": "설정 창을 엽니다.", "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", "block.create.schematic_table.tooltip.summary": "_빈_ _청사진_에 저장된 청사진을 불러옵니다.", @@ -1334,18 +1374,18 @@ "item.create.goggles.tooltip.behaviour1": "해당 장치의 _속도_, _피로도_, _용량_을 레벨에 따라 에 따라 색상 UI를 보여줍니다.", "item.create.goggles.tooltip.condition2": "계측기를 바라볼 때", "item.create.goggles.tooltip.behaviour2": "계측기가 연결된 네트워크의 _속도_나 _스트레스_의 자세한 정보를 보여줍니다.", - "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", - "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", + "item.create.goggles.tooltip.condition3": "액체 용기를 바라볼 때", + "item.create.goggles.tooltip.behaviour3": "_용량_이 얼마나 되는지, _어떤 액체_가 들어있는 지 알려줍니다.", - "item.create.wrench.tooltip": "WRENCH", + "item.create.wrench.tooltip": "렌치", "item.create.wrench.tooltip.summary": "장치 구성에 유용한 도구입니다. 장치를 _회전_, _설정_, _해체_하는 데 쓰입니다.", "item.create.wrench.tooltip.control1": "장치에 우클릭", "item.create.wrench.tooltip.action1": "사용자가 바라보는 _면으로_ 혹은 _반대로_ 장치를 돌립니다.", "item.create.wrench.tooltip.control2": "웅크린 상태에서 우클릭", - "item.create.wrench.tooltip.action2": "_장치_를 _해체_하고 _즉시_ _인벤토리_로 넣습니다.", + "item.create.wrench.tooltip.action2": "_장치_를 _해체_하고 _즉시_ _보관함_으로 넣습니다.", "block.create.nozzle.tooltip": "NOZZLE", - "block.create.nozzle.tooltip.summary": "덮힌 환풍기 _앞_에 붙여 환풍기의 효과를 _전방_으로 _확대_합니다.", + "block.create.nozzle.tooltip.summary": "선풍기 _앞_에 붙여 선풍기의 효과를 _전방향_으로 _확대_합니다.", "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", "block.create.cuckoo_clock.tooltip.summary": "_시간의_ _흐름_을 알고 공간을 _꾸미는_ 데 좋은 공예품입니다.", @@ -1353,26 +1393,31 @@ "block.create.cuckoo_clock.tooltip.behaviour1": "현재 시각을 보여주고 하루에 두 번 울립니다. 점심과 플레이어가 바로 잘 수 있는 저녁에 울립니다.", "block.create.turntable.tooltip": "TURNTABLE", - "block.create.turntable.tooltip.summary": "_회전력_으로 _멀미_를 일으킵니다.", + "block.create.turntable.tooltip.summary": "_동력_으로 _멀미_를 일으킵니다.", "block.create.stockpile_switch.tooltip": "stockpile_switch", - "block.create.stockpile_switch.tooltip.summary": "붙어있는 _저장소_에 들어있는 아이템을 기반으로 레드스톤 신호를 보냅니다. 필터도 제공됩니다. _비교기_와 반대로, 수량 스위치는 신호가 반전되는 _임계점_을 조절할 수 있습니다.", - "block.create.stockpile_switch.tooltip.condition1": "우클릭 할 때", - "block.create.stockpile_switch.tooltip.behaviour1": "UI를 엽니다.", + "block.create.stockpile_switch.tooltip.summary": "붙어있는 _보관함_에 들어있는 아이템을 기반으로 레드스톤 신호를 보냅니다. 필터도 제공됩니다. _비교기_와 반대로, 수량 스위치는 신호가 반전되는 _임계점_을 조절할 수 있습니다.", + "block.create.stockpile_switch.tooltip.condition1": "우클릭", + "block.create.stockpile_switch.tooltip.behaviour1": "설정 창을 엽니다.", "block.create.content_observer.tooltip": "CONTENT OBSERVER", - "block.create.content_observer.tooltip.summary": "저장소나 벨트의 아이템을 등록된 _필터_를 이용해 _탐지_합니다. _인벤토리, 벨트, 슈트_ 안에 해당 아이템을 탐지하는 동안, 레드스톤 신호를 보냅니다. _깔대기_가 해당 아이템을 수송하면, _1틱_의 레드스톤 신호를 보냅니다.", + "block.create.content_observer.tooltip.summary": "보관함이나 벨트의 아이템을 등록된 _필터_를 이용해 _탐지_합니다. _보관함, 벨트, 슈트_ 안에 해당 아이템을 탐지하는 동안, 레드스톤 신호를 보냅니다. _퍼널_가 해당 아이템을 수송하면, _1틱_의 레드스톤 신호를 보냅니다.", "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", - "block.create.adjustable_crate.tooltip.summary": "이 저장소는 용량을 _직접_ _정할_ 수 있습니다. 아무아이템이나 최대 16스택씩 담을 수 있습니다. 레드스톤 비교기와 호환됩니다.", - "block.create.adjustable_crate.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "block.create.adjustable_crate.tooltip.behaviour1": "UNLOCALIZED: Opens the _Interface_.", + "block.create.adjustable_crate.tooltip.summary": "이 보관함는 용량을 _직접_ _정할_ 수 있습니다. 아무아이템이나 최대 16스택씩 담을 수 있습니다. 레드스톤 비교기와 호환됩니다.", + "block.create.adjustable_crate.tooltip.condition1": "우클릭", + "block.create.adjustable_crate.tooltip.behaviour1": "설정 창을 엽니다.", "block.create.creative_crate.tooltip": "THE ENDLESS CRATE", "block.create.creative_crate.tooltip.summary": "이 상자는 아무 아이템을 _무한히_ 저장합니다. 청사진 대포 옆에 놓을 시 준비물을 _전부_ 공급합니다.", "block.create.creative_crate.tooltip.condition1": "필터에 아이템을 설정할 시", "block.create.creative_crate.tooltip.behaviour1": "선택된 아이템을 _무한정_으로 _빼낼_ 수 있습니다. 대신 _들어간_ 아이템은 _삭제_됩니다.", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "CONTROLLER RAIL", "block.create.controller_rail.tooltip.summary": "_광산 수레_의 _이동속도_를 _세밀하게_ _조정_할 수 있는 _양방향_ _전동 레일_입니다.", "block.create.controller_rail.tooltip.condition1": "레드스톤 신호를 받을 때", @@ -1384,7 +1429,7 @@ "item.create.sand_paper.tooltip.behaviour1": "_다른 손_에있는 아이템과 _바닥에 있는 아이템_을 윤냅니다.", "item.create.builders_tea.tooltip": "BUILDERS TEA", - "item.create.builders_tea.tooltip.summary": "하루를 시작하기에 좋은 음료입니다. _ 새로운 영감_을 줍니다.", + "item.create.builders_tea.tooltip.summary": "하루를 시작하기에 좋은 음료입니다. _새로운 영감_을 줍니다.", "item.create.refined_radiance.tooltip": "REFINED RADIANCE", "item.create.refined_radiance.tooltip.summary": "_흡수된_ _빛_으로 제련된 색채 혼합물입니다.", @@ -1396,864 +1441,866 @@ "item.create.shadow_steel.tooltip.condition1": "UNLOCALIZED: Work In Progress", "item.create.shadow_steel.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", - "item.create.linked_controller.tooltip": "UNLOCALIZED: LINKED CONTROLLER", - "item.create.linked_controller.tooltip.summary": "UNLOCALIZED: Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.", - "item.create.linked_controller.tooltip.condition1": "UNLOCALIZED: R-Click", - "item.create.linked_controller.tooltip.behaviour1": "UNLOCALIZED: _Toggles_ the controller. _Movement_ _controls_ are taken over while its active.", - "item.create.linked_controller.tooltip.condition2": "UNLOCALIZED: R-Click while Sneaking", - "item.create.linked_controller.tooltip.behaviour2": "UNLOCALIZED: Opens the manual _Configuration Interface_.", - "item.create.linked_controller.tooltip.condition3": "UNLOCALIZED: R-Click on Redstone Link Receiver", - "item.create.linked_controller.tooltip.behaviour3": "UNLOCALIZED: Enables _Bind Mode_, press one of the _six controls_ to bind it to the _Links' Frequency_.", - "item.create.linked_controller.tooltip.condition4": "UNLOCALIZED: R-Click on Lectern", - "item.create.linked_controller.tooltip.behaviour4": "UNLOCALIZED: Places the Controller into the Lectern for easy activation. (R-Click while Sneaking to retrieve it)", + "item.create.linked_controller.tooltip": "LINKED CONTROLLER", + "item.create.linked_controller.tooltip.summary": "_여섯_ _버튼_으로 _레드스톤_ _링크_와 연결되는 _휴대용_ _조작기_입니다.", + "item.create.linked_controller.tooltip.condition1": "우클릭", + "item.create.linked_controller.tooltip.behaviour1": "조작기를 킵니다. 조작하면서 _움직일_ _수_ _없습니다_.", + "item.create.linked_controller.tooltip.condition2": "웅크리면서 우클릭", + "item.create.linked_controller.tooltip.behaviour2": "_설정_ _창_을 엽니다.", + "item.create.linked_controller.tooltip.condition3": "레드스톤 링크 수신기에 우클릭", + "item.create.linked_controller.tooltip.behaviour3": "_연결_ _모드_를 활성화하고, _여섯_ _버튼_ 중 하나를 눌러 조작기를 주파수와 연결합니다.", + "item.create.linked_controller.tooltip.condition4": "독서대에 우클릭", + "item.create.linked_controller.tooltip.behaviour4": "조작기를 독서대에 올려놓아 쉽게 조작할 수 있습니다. (웅크리면서 우클릭으로 회수헙니다.)", - "item.create.diving_helmet.tooltip": "UNLOCALIZED: DIVING HELMET", - "item.create.diving_helmet.tooltip.summary": "UNLOCALIZED: Together with a _Copper_ _Backtank_, allows the wielder to _breathe_ _underwater_ for an extended amount of time.", - "item.create.diving_helmet.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_helmet.tooltip.behaviour1": "UNLOCALIZED: Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.", + "item.create.diving_helmet.tooltip": "DIVING HELMET", + "item.create.diving_helmet.tooltip.summary": "_구리_ _산소통_과 함께, 착용자가 물 속에서 _오랫동안_ _호흡_할 수 있게합니다.", + "item.create.diving_helmet.tooltip.condition1": "착용했을 때", + "item.create.diving_helmet.tooltip.behaviour1": "산소통에서 공기를 느리게 빨아들이며 _수중_ _호흡_ 효과를 제공합니다.", - "item.create.copper_backtank.tooltip": "UNLOCALIZED: COPPER BACKTANK", - "item.create.copper_backtank.tooltip.summary": "UNLOCALIZED: A _Wearable_ _Tank_ for carrying Pressurized Air.", - "item.create.copper_backtank.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.copper_backtank.tooltip.behaviour1": "UNLOCALIZED: Provides _Pressurized_ _Air_ to Equipment that requires it.", - "item.create.copper_backtank.tooltip.condition2": "UNLOCALIZED: When placed, Powered by Kinetics", - "item.create.copper_backtank.tooltip.behaviour2": "UNLOCALIZED: _Collects_ _Pressurized_ _Air_ at a rate depending on the Rotational Speed.", + "item.create.copper_backtank.tooltip": "COPPER BACKTANK", + "item.create.copper_backtank.tooltip.summary": "공기를 옮길 수 있는 _착용가능한_ 탱크입니다.", + "item.create.copper_backtank.tooltip.condition1": "착용했을 때", + "item.create.copper_backtank.tooltip.behaviour1": "필요한 장비에 _공기_를 제공합니다.", + "item.create.copper_backtank.tooltip.condition2": "설치되고 동력으로 회전될 때", + "item.create.copper_backtank.tooltip.behaviour2": "동력 속도에 따라 _공기_를 _모읍니다_.", - "item.create.diving_boots.tooltip": "UNLOCALIZED: DIVING BOOTS", - "item.create.diving_boots.tooltip.summary": "UNLOCALIZED: A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.", - "item.create.diving_boots.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_boots.tooltip.behaviour1": "UNLOCALIZED: Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.", + "item.create.diving_boots.tooltip": "DIVING BOOTS", + "item.create.diving_boots.tooltip.summary": "해저를 돌아다니기에 적합한 _무거운_ _부츠_ 한 켤레입니다.", + "item.create.diving_boots.tooltip.condition1": "착용했을 때", + "item.create.diving_boots.tooltip.behaviour1": "착용자는 빠르게 가라앉고 _수영_할 수 _없습니다_. 대신 물 속에서 _걷고_, _뛸_ 수 있습니다. 또한 _벨트_에 영향받지 않습니다.", - "item.create.crafting_blueprint.tooltip": "UNLOCALIZED: CRAFTING BLUEPRINT", - "item.create.crafting_blueprint.tooltip.summary": "UNLOCALIZED: _Placed_ on a wall, it can be used to _specify_ _ingredient_ _arrangements_ for easier manual crafting. Each slot represents a Recipe.", - "item.create.crafting_blueprint.condition1": "UNLOCALIZED: R-Click empty Slot", - "item.create.crafting_blueprint.behaviour1": "UNLOCALIZED: Opens a _Crafting_ _menu_ allowing you to _configure_ a _recipe_ and items to display.", - "item.create.crafting_blueprint.condition2": "UNLOCALIZED: R-Click configured Slot", - "item.create.crafting_blueprint.behaviour2": "UNLOCALIZED: _Applies_ the _configured_ _recipe_ with matching Ingredients found in your _Inventory_. _Sneak_ to craft up to a _Stack_ of items.", + "item.create.crafting_blueprint.tooltip": "CRAFTING BLUEPRINT", + "item.create.crafting_blueprint.tooltip.summary": "벽에 설치해 _특정_ _재료_로 더 _쉽게_ _조합_할 수 있습니다. 각 슬롯은 조합법을 나타냅니다.", + "item.create.crafting_blueprint.condition1": "빈 슬롯을 우클릭", + "item.create.crafting_blueprint.behaviour1": "_조합법_과 전시할 아이템을 설정하는 창을 엽니다.", + "item.create.crafting_blueprint.condition2": "설정된 슬롯에 우클릭", + "item.create.crafting_blueprint.behaviour2": "자신의 _인벤토리_에서 해당 슬롯의 _조합법_을 _실행_합니다. _웅크리면서_ 우클릭하면 한 번에 여러개를 조합합니다.", "item.create.minecart_coupling.tooltip": "MINECART COUPLING", "item.create.minecart_coupling.tooltip.summary": "당신의 모든 _수레들을 이어 _멋진 _기차_를 만들어보세요.", "item.create.minecart_coupling.tooltip.condition1": "광산 수레에 사용할 때", "item.create.minecart_coupling.tooltip.behaviour1": "_두 수레를 묶어_ 이동할 때 고정된 _거리를 유지하게_ 합니다.", - "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip": "PECULIAR BELL", + "block.create.peculiar_bell.tooltip.summary": "장식을 위한 황동 종입니다. 영혼 불꽃 위에 설치하면 _기이한_ 일이 일어난다고 합니다...", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "지옥의 길잃은 영혼들이 씌인 _저주받은_ 종입니다.", + "block.create.haunted_bell.tooltip.condition1": "들고 있거나 종을 울릴 때", + "block.create.haunted_bell.tooltip.behaviour1": "_적대적_ _몹_이 생성되는 _빛이_ _없는_ 자리를 표시합니다.", "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", - "create.ponder.subject": "UNLOCALIZED: Subject of this scene", - "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", - "create.ponder.associated": "UNLOCALIZED: Associated Entries", - "create.ponder.close": "UNLOCALIZED: Close", - "create.ponder.identify": "UNLOCALIZED: Identify", - "create.ponder.next": "UNLOCALIZED: Next Scene", - "create.ponder.previous": "UNLOCALIZED: Previous Scene", - "create.ponder.replay": "UNLOCALIZED: Replay", - "create.ponder.think_back": "UNLOCALIZED: Think Back", - "create.ponder.slow_text": "UNLOCALIZED: Comfy Reading", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", - "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", - "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", - "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", - "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", - "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", - "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", - "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", - "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", - "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", - "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", - "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", - "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", - "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", - "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", - "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", - "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", - "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", - "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", - "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", - "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", - "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", - "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", - "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", - "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", - "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", - "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", - "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - - "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", - "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", - "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", - "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", - - "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", - "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", - "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", - "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", - "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", - "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", - - "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", - "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", - "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", - "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", - - "create.ponder.andesite_tunnel.header": "UNLOCALIZED: Using Andesite Tunnels", - "create.ponder.andesite_tunnel.text_1": "UNLOCALIZED: Andesite Tunnels can be used to cover up your belts", - "create.ponder.andesite_tunnel.text_2": "UNLOCALIZED: Whenever an Andesite Tunnel has connections to the sides...", - "create.ponder.andesite_tunnel.text_3": "UNLOCALIZED: ...they will split exactly one item off of any passing stacks", - "create.ponder.andesite_tunnel.text_4": "UNLOCALIZED: The remainder will continue on its path", - - "create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin", - "create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing", - "create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them", - "create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet", - "create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here", - "create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below", - "create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing", - "create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients", - "create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin", - "create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items", - - "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", - "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", - "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", - - "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", - - "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", - "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", - "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", - "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", - "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", - "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", - "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", - - "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", - "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", - "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", - "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", - "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", - "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", - "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks", - - "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", - "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", - "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", - - "create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners", - "create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin", - "create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items", - "create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat", - "create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms", - - "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.brass_tunnel.header": "UNLOCALIZED: Using Brass Tunnels", - "create.ponder.brass_tunnel.text_1": "UNLOCALIZED: Brass Tunnels can be used to cover up your belts", - "create.ponder.brass_tunnel.text_2": "UNLOCALIZED: Brass Tunnels have filter slots on each open side", - "create.ponder.brass_tunnel.text_3": "UNLOCALIZED: Filters on inbound connections simply block non-matching items", - "create.ponder.brass_tunnel.text_4": "UNLOCALIZED: Filters on outbound connections can be used to sort items by type", - "create.ponder.brass_tunnel.text_5": "UNLOCALIZED: Whenever a passing item has multiple valid exits, the distribution mode will decide how to handle it", - "create.ponder.brass_tunnel.text_6": "UNLOCALIZED: Brass Tunnels on parallel belts will form a group", - "create.ponder.brass_tunnel.text_7": "UNLOCALIZED: Incoming Items will now be distributed across all connected exits", - "create.ponder.brass_tunnel.text_8": "UNLOCALIZED: For this, items can also be inserted into the Tunnel block directly", - - "create.ponder.brass_tunnel_modes.header": "UNLOCALIZED: Distribution Modes of the Brass Tunnel", - "create.ponder.brass_tunnel_modes.text_1": "UNLOCALIZED: Using a Wrench, the distribution behaviour of Brass Tunnels can be configured", - "create.ponder.brass_tunnel_modes.text_10": "UNLOCALIZED: 'Synchronize Inputs' is a unique setting for Brass Tunnels", - "create.ponder.brass_tunnel_modes.text_11": "UNLOCALIZED: Items are only allowed past if every tunnel in the group has one waiting", - "create.ponder.brass_tunnel_modes.text_12": "UNLOCALIZED: This ensures that all affected belts supply items at the same rate", - "create.ponder.brass_tunnel_modes.text_2": "UNLOCALIZED: 'Split' will attempt to distribute the stack evenly between available outputs", - "create.ponder.brass_tunnel_modes.text_3": "UNLOCALIZED: If an output is unable to take more items, it will be skipped", - "create.ponder.brass_tunnel_modes.text_4": "UNLOCALIZED: 'Forced Split' will never skip outputs, and instead wait until they are free", - "create.ponder.brass_tunnel_modes.text_5": "UNLOCALIZED: 'Round Robin' keeps stacks whole, and cycles through outputs iteratively", - "create.ponder.brass_tunnel_modes.text_6": "UNLOCALIZED: Once Again, if an output is unable to take more items, it will be skipped", - "create.ponder.brass_tunnel_modes.text_7": "UNLOCALIZED: 'Forced Round Robin' never skips outputs", - "create.ponder.brass_tunnel_modes.text_8": "UNLOCALIZED: 'Prefer Nearest' prioritizes the outputs closest to the items' input location", - "create.ponder.brass_tunnel_modes.text_9": "UNLOCALIZED: 'Randomize' will distribute whole stacks to randomly picked outputs", - - "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", - "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", - "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", - "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", - - "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", - "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", - "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", - "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", - - "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", - "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", - "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: This Arrow indicates which side of the Structure will be considered the front", - "create.ponder.cart_assembler_modes.text_3": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", - - "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", - "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", - "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", - "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", - "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", - - "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", - "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", - "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", - "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - - "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", - "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exactly like Chain Drives", - "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", - "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", - "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", - "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", - "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - - "create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", - "create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories", - "create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created", - "create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal", - - "create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes", - "create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward", - "create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction", - "create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides", - - "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", - "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", - "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", - "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", - "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", - "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", - "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", - "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", - "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", - - "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - - "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - - "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - - "create.ponder.creative_fluid_tank.header": "UNLOCALIZED: Creative Fluid Tanks", - "create.ponder.creative_fluid_tank.text_1": "UNLOCALIZED: Creative Fluid Tanks can be used to provide a bottomless supply of fluid", - "create.ponder.creative_fluid_tank.text_2": "UNLOCALIZED: Right-Click with a fluid containing item to configure it", - "create.ponder.creative_fluid_tank.text_3": "UNLOCALIZED: Pipe Networks can now endlessly draw the assigned fluid from the tank", - "create.ponder.creative_fluid_tank.text_4": "UNLOCALIZED: Any Fluids pushed back into a Creative Fluid Tank will be voided", - - "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", - "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", - "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", - - "create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels", - "create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively", - "create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other", - "create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed", - "create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well", - - "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", - "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", - "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", - "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", - "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", - "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", - "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", - "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", - "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", - "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", - "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", - "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", - "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", - "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", - "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", - "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", - - "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", - "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", - "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", - "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", - - "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", - "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", - "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", - - "create.ponder.deployer_processing.header": "UNLOCALIZED: Processing Items using Deployers", - "create.ponder.deployer_processing.text_1": "UNLOCALIZED: With a fitting held item, Deployers can process items provided beneath them", - "create.ponder.deployer_processing.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Deployer", - "create.ponder.deployer_processing.text_3": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.deployer_processing.text_4": "UNLOCALIZED: The Deployer will hold and process them automatically", - - "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", - "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", - "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", - "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", - - "create.ponder.depot.header": "UNLOCALIZED: Using Depots", - "create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements", - "create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it", - "create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing", - "create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms", - - "create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners", - "create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it", - "create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly", - "create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines", - "create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating", - - "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", - "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", - "create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state", - "create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed", - - "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", - "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", - "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", - - "create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans", - "create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated", - "create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted", - "create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated", - "create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them", - "create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup", - "create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it", - "create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range", - "create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts", - - "create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans", - "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", - "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", - - "create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes", - "create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets", - "create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window", - "create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments", - "create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids", - "create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first", - "create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents", - "create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid", - - "create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers", - "create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks", - "create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained", - "create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...", - "create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources", - "create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly", - - "create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank", - "create.ponder.fluid_tank_sizes.text_1": "UNLOCALIZED: Fluid Tanks can be combined to increase the total capacity", - "create.ponder.fluid_tank_sizes.text_2": "UNLOCALIZED: Their base square can be up to 3 blocks wide...", - "create.ponder.fluid_tank_sizes.text_3": "UNLOCALIZED: ...and grow in height by more than 30 additional layers", - "create.ponder.fluid_tank_sizes.text_4": "UNLOCALIZED: Using a Wrench, a tanks' window can be toggled", - - "create.ponder.fluid_tank_storage.header": "UNLOCALIZED: Storing Fluids in Fluid Tanks", - "create.ponder.fluid_tank_storage.text_1": "UNLOCALIZED: Fluid Tanks can be used to store large amounts of fluid", - "create.ponder.fluid_tank_storage.text_2": "UNLOCALIZED: Pipe networks can push and pull fluids from any side", - "create.ponder.fluid_tank_storage.text_3": "UNLOCALIZED: The contained fluid can be measured by a Comparator", - "create.ponder.fluid_tank_storage.text_4": "UNLOCALIZED: However, in Survival Mode Fluids cannot be added or taken manually", - "create.ponder.fluid_tank_storage.text_5": "UNLOCALIZED: You can use Basins, Item Drains and Spouts to drain or fill fluid containing items", - - "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", - "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", - "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", - "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", - - "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", - "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", - "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", - "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting", - - "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", - "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement. A mechanical belt should help here.", - - "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", - "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", - "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", - "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", - - "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - - "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - - "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", - "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", - "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", - "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", - "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", - - "create.ponder.hose_pulley.header": "UNLOCALIZED: Source Filling and Draining using Hose Pulleys", - "create.ponder.hose_pulley.text_1": "UNLOCALIZED: Hose Pulleys can be used to fill or drain large bodies of Fluid", - "create.ponder.hose_pulley.text_2": "UNLOCALIZED: With the Kinetic Input, the height of the pulleys' hose can be controlled", - "create.ponder.hose_pulley.text_3": "UNLOCALIZED: The Pulley retracts while the input rotation is inverted", - "create.ponder.hose_pulley.text_4": "UNLOCALIZED: On the opposite side, pipes can be connected", - "create.ponder.hose_pulley.text_5": "UNLOCALIZED: Attached pipe networks can either provide fluid to the hose...", - "create.ponder.hose_pulley.text_6": "UNLOCALIZED: ...or pull from it, draining the pool instead", - "create.ponder.hose_pulley.text_7": "UNLOCALIZED: Fill and Drain speed of the pulley depends entirely on the fluid networks' throughput", - - "create.ponder.hose_pulley_infinite.header": "UNLOCALIZED: Passively Filling and Draining large bodies of Fluid", - "create.ponder.hose_pulley_infinite.text_1": "UNLOCALIZED: When deploying the Hose Pulley into a large enough ocean...", - "create.ponder.hose_pulley_infinite.text_2": "UNLOCALIZED: It will provide/dispose fluids without affecting the source", - "create.ponder.hose_pulley_infinite.text_3": "UNLOCALIZED: Pipe networks can limitlessly take fluids from/to such pulleys", - - "create.ponder.hose_pulley_level.header": "UNLOCALIZED: Fill and Drain level of Hose Pulleys", - "create.ponder.hose_pulley_level.text_1": "UNLOCALIZED: While fully retracted, the Hose Pulley cannot operate", - "create.ponder.hose_pulley_level.text_2": "UNLOCALIZED: Draining runs from top to bottom", - "create.ponder.hose_pulley_level.text_3": "UNLOCALIZED: The surface level will end up just below where the hose ends", - "create.ponder.hose_pulley_level.text_4": "UNLOCALIZED: Filling runs from bottom to top", - "create.ponder.hose_pulley_level.text_5": "UNLOCALIZED: The filled pool will not grow beyond the layer above the hose end", - - "create.ponder.item_drain.header": "UNLOCALIZED: Emptying Fluid Containers using Item Drains", - "create.ponder.item_drain.text_1": "UNLOCALIZED: Item Drains can extract fluids from items", - "create.ponder.item_drain.text_2": "UNLOCALIZED: Right-click it to pour fluids from your held item into it", - "create.ponder.item_drain.text_3": "UNLOCALIZED: When items are inserted from the side...", - "create.ponder.item_drain.text_4": "UNLOCALIZED: ...they roll across, emptying out their contained fluid", - "create.ponder.item_drain.text_5": "UNLOCALIZED: Pipe Networks can now pull the fluid from the drains' internal buffer", - - "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - - "create.ponder.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", - "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", - "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", - "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", - "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", - "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", - "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", - "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", - "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", - - "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", - "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", - "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", - "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", - - "create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms", - "create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed", - "create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets", - "create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)", - "create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection", - "create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously", - "create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range", - "create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly", - "create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap", - - "create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm", - "create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs", - "create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs", - "create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter", - "create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering", - "create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm", - "create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute", - - "create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm", - "create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input", - "create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs", - "create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...", - "create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting", - "create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it", - "create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available", - "create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped", - "create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free", - "create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm", - - "create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone", - "create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate", - "create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles", - "create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", - - "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", - "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", - "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", - - "create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters", - "create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe", - "create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged", - "create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side", - "create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit", - "create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate", - "create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually", - "create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin", - "create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse", - - "create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters", - "create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically", - "create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined", - "create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location", - - "create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters", - "create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path", - "create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement", - "create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters", - - "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", - "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", - "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", - - "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", - "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", - "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", - - "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", - "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", - "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", - - "create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer", - "create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated", - "create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones", - "create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner", - "create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.", - - "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", - "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", - "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", - "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", - - "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", - "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", - "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", - - "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", - "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", - "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", - "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", - "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", - - "create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press", - "create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it", - "create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press", - "create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically", - - "create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press", - "create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted", - "create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones", - "create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner", - "create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.", - - "create.ponder.mechanical_pump_flow.header": "UNLOCALIZED: Fluid Transportation using Mechanical Pumps", - "create.ponder.mechanical_pump_flow.text_1": "UNLOCALIZED: Mechanical Pumps govern the flow of their attached pipe networks", - "create.ponder.mechanical_pump_flow.text_2": "UNLOCALIZED: When powered, their arrow indicates the direction of flow", - "create.ponder.mechanical_pump_flow.text_3": "UNLOCALIZED: The network behind is now pulling fluids...", - "create.ponder.mechanical_pump_flow.text_4": "UNLOCALIZED: ...while the network in front is transferring it outward", - "create.ponder.mechanical_pump_flow.text_5": "UNLOCALIZED: Reversing the input rotation reverses the direction of flow", - "create.ponder.mechanical_pump_flow.text_6": "UNLOCALIZED: Use a Wrench to reverse the orientation of pumps manually", - - "create.ponder.mechanical_pump_speed.header": "UNLOCALIZED: Throughput of Mechanical Pumps", - "create.ponder.mechanical_pump_speed.text_1": "UNLOCALIZED: Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away", - "create.ponder.mechanical_pump_speed.text_2": "UNLOCALIZED: Speeding up the input rotation changes the speed of flow propagation...", - "create.ponder.mechanical_pump_speed.text_3": "UNLOCALIZED: ...aswell as how quickly fluids are transferred", - "create.ponder.mechanical_pump_speed.text_4": "UNLOCALIZED: Pumps can combine their throughputs within shared pipe networks", - "create.ponder.mechanical_pump_speed.text_5": "UNLOCALIZED: Alternating their orientation can help align their flow directions", - - "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", - "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", - "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", - - "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", - "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", - "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", - - "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", - "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", - "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", - "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", - "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", - "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", - - "create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone", - "create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them", - "create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels", - "create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top", - "create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click", - "create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation", - - "create.ponder.nixie_tube.header": "UNLOCALIZED: Using Nixie Tubes", - "create.ponder.nixie_tube.text_1": "UNLOCALIZED: When powered by Redstone, Nixie Tubes will display the redstone signals' strength", - "create.ponder.nixie_tube.text_2": "UNLOCALIZED: Using name tags edited with an anvil, custom text can be displayed", - - "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", - "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", - "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", - - "create.ponder.portable_fluid_interface.header": "UNLOCALIZED: Contraption Fluid Exchange", - "create.ponder.portable_fluid_interface.text_1": "UNLOCALIZED: Fluid Tanks on moving contraptions cannot be accessed by any pipes", + "create.ponder.hold_to_ponder": "[%1$s]키를 눌러 분석하기", + "create.ponder.subject": "분석의 주제", + "create.ponder.pondering": "분석 중입니다...", + "create.ponder.identify_mode": "탐색모드가 활성화되어 있습니다. \n[%1$s]를 눌러 중지합니다.", + "create.ponder.associated": "연관된 항목들", + "create.ponder.close": "닫기", + "create.ponder.identify": "탐색", + "create.ponder.next": "다음 장면", + "create.ponder.previous": "이전 장면", + "create.ponder.replay": "다시 재생", + "create.ponder.think_back": "되돌아가기", + "create.ponder.slow_text": "편하게 읽기", + "create.ponder.exit": "나가기", + "create.ponder.welcome": "분석 메뉴에 어서오세요", + "create.ponder.categories": "Create에서 둘러볼 수 있는 목록들", + "create.ponder.index_description": "아이콘을 클릭해 관련 아이템과 블록에 대해 알아볼 수 있습니다.", + "create.ponder.index_title": "분석 메뉴 제목", + "create.ponder.shared.rpm16": "16 RPM", + "create.ponder.shared.behaviour_modify_wrench": "이 기능은 렌치를 이용해 변경할 수 있습니다.", + "create.ponder.shared.storage_on_contraption": "구조물에 부착된 보관함은 구조물이 떨어뜨린 아이템을 자동으로 줍습니다.", + "create.ponder.shared.sneak_and": "웅크리기 +", + "create.ponder.shared.rpm8": "8 RPM", + "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm32": "32 RPM", + "create.ponder.shared.rpm16_source": "기본 속도: 16 RPM", + "create.ponder.shared.movement_anchors": "섀시나 강력 접착제를 이용해 큰 구조물도 옮길 수 있습니다.", + "create.ponder.tag.redstone": "레드스톤 부품", + "create.ponder.tag.redstone.description": "레드스톤 공학에 쓰이는 부품입니다.", + "create.ponder.tag.contraption_assembly": "블록 부착 도구", + "create.ponder.tag.contraption_assembly.description": "블록들을 이어 구조물로 만들게해주는 도구와 부품입니다.", + "create.ponder.tag.fluids": "액체 조정", + "create.ponder.tag.fluids.description": "액체를 나르고 사용하는 장치입니다.", + "create.ponder.tag.decoration": "장식", + "create.ponder.tag.decoration.description": "주로 장식 용도로 쓰이는 부품입니다.", + "create.ponder.tag.windmill_sails": "풍차 베어링의 날개", + "create.ponder.tag.windmill_sails.description": "조립되었을 때 풍차 구조물의 동력에 영향을 주는 블록들입니다. 이 블록들은 동일한 효율을 가집니다.", + "create.ponder.tag.arm_targets": "기계 팔의 목표 대상", + "create.ponder.tag.arm_targets.description": "기계 팔이 가져가거나 놓을 곳으로 선택할 수 있는 부품입니다.", + "create.ponder.tag.kinetic_appliances": "동력 장치", + "create.ponder.tag.kinetic_appliances.description": "동력을 사용하는 장치입니다.", + "create.ponder.tag.kinetic_sources": "동력 생산", + "create.ponder.tag.kinetic_sources.description": "동력을 생산하는 장치입니다.", + "create.ponder.tag.movement_anchor": "이동 고정장치", + "create.ponder.tag.movement_anchor.description": "부착된 구조물을 다양한 방법으로 움직이게하는 장치입니다.", + "create.ponder.tag.kinetic_relays": "동력 부품", + "create.ponder.tag.kinetic_relays.description": "동력을 다른 곳으로 연결할 때 도움을 주는 부품입니다.", + "create.ponder.tag.contraption_actor": "구조물 장치", + "create.ponder.tag.contraption_actor.description": "움직이는 구조물에 부착되어 특정 기능을 수행하는 장치입니다.", + "create.ponder.tag.creative": "크리에이티브 모드", + "create.ponder.tag.creative.description": "서바이벌 모드에서는 얻을 수 없는 부품입니다.", + "create.ponder.tag.logistics": "아이템 수송", + "create.ponder.tag.logistics.description": "아이템을 옮기는데 도움을 줄 부품입니다.", + + "create.ponder.adjustable_pulse_repeater.header": "가변 펄스 중계기를 이용해 신호 조절하기", + "create.ponder.adjustable_pulse_repeater.text_1": "가변 펄스 중계기는 딜레이 이후 짧은 신호를 보냅니다.", + "create.ponder.adjustable_pulse_repeater.text_2": "마우스 휠을 이용하여 딜레이를 조절합니다.", + "create.ponder.adjustable_pulse_repeater.text_3": "딜레이는 최대 30분까지 조절할 수 있습니다.", + + "create.ponder.adjustable_repeater.header": "가변 중계기를 이용해 신호 조절하기", + "create.ponder.adjustable_repeater.text_1": "가변 중계기는 기존 중계기와 비슷합니다.", + "create.ponder.adjustable_repeater.text_2": "정해진 딜레이만큼 신호를 주고...", + "create.ponder.adjustable_repeater.text_3": "...정해진 딜레이만큼 쉽니다.", + "create.ponder.adjustable_repeater.text_4": "마우스 휠을 이용해 딜레이를 조절합니다.", + "create.ponder.adjustable_repeater.text_5": "딜레이는 최대 30분까지 조절할 수 있습니다.", + + "create.ponder.analog_lever.header": "아날로그 레버를 이용해 신호 조절하기", + "create.ponder.analog_lever.text_1": "아날로그 레버는 정확하고 간편하게 레드스톤 신호의 세기를 조절합니다.", + "create.ponder.analog_lever.text_2": "우클릭으로 세기를 높입니다.", + "create.ponder.analog_lever.text_3": "웅크리면서 우클릭하면, 세기를 낮춥니다.", + + "create.ponder.andesite_tunnel.header": "안산암 터널 사용하기", + "create.ponder.andesite_tunnel.text_1": "안산암 터널은 벨트를 덮는데 사용할 수 있습니다.", + "create.ponder.andesite_tunnel.text_2": "인신임 터널의 옆면에 접촉점이 있다면...", + "create.ponder.andesite_tunnel.text_3": "...터널은 통과하는 아이템 스택에서 1개의 아이템을 분리시킵니다.", + "create.ponder.andesite_tunnel.text_4": "나머지는 가던 길을 갑니다.", + + "create.ponder.basin.header": "대야 안에서 아이템 처리하기", + "create.ponder.basin.text_1": "대야는 아이템과 액체를 담을 수 있습니다.", + "create.ponder.basin.text_2": "처리 이후, 대야는 옆면 아래로 결과물을 내보냅니다.", + "create.ponder.basin.text_3": "알맞는 부품이 있다면, 대야는 수송관을 나타냅니다.", + "create.ponder.basin.text_4": "다양한 부품들이 아이템을 받을 수 있습니다.", + "create.ponder.basin.text_5": "결과물은 아래 보관함에 떨어집니다.", + "create.ponder.basin.text_6": "수송관이 없다면, 대야는 처리된 아이템을 보관합니다.", + "create.ponder.basin.text_7": "결과물이 다시 사용될 때 유용합니다.", + "create.ponder.basin.text_8": "이 경우, 대야에서 특정 결과물을 빼내야 합니다.", + "create.ponder.basin.text_9": "처리되지 않은 아이템이 나오는 것을 방지하기 위해서는 필터가 필요합니다.", + + "create.ponder.bearing_modes.header": "베어링의 이동 설정", + "create.ponder.bearing_modes.text_1": "멈췄을 때, 베어링은 구조물을 가까운 수직 각도로 설치합니다.", + "create.ponder.bearing_modes.text_2": "이는 절대 설치하지 않거나, 시작한 지점에만 설치하도록 설정할 수 있습니다.", + + "create.ponder.belt_casing.header": "벨트 덮기", + "create.ponder.belt_casing.text_1": "황동, 안산암 케이스는 벨트를 꾸미는데 사용됩니다.", + "create.ponder.belt_casing.text_2": "렌치로 케이스를 없앨 수 있습니다.", + + "create.ponder.belt_connector.header": "벨트 사용하기", + "create.ponder.belt_connector.text_1": "두 축을 벨트로 우클릭하여 연결합니다.", + "create.ponder.belt_connector.text_2": "실수로 선택했다면, 웅크리면서 우클릭하여 취소합니다.", + "create.ponder.belt_connector.text_3": "벨트에 축을 추가로 넣을 수 있습니다.", + "create.ponder.belt_connector.text_4": "벨트로 연결된 축들은 같은 속도, 방향으로 회전합니다.", + "create.ponder.belt_connector.text_5": "추가된 축은 렌치로 없앨 수 있습니다.", + "create.ponder.belt_connector.text_6": "벨트를 염색하여 꾸밀 수 있습니다.", + + "create.ponder.belt_directions.header": "벨트 설치에 알맞는 방향", + "create.ponder.belt_directions.text_1": "벨트는 임의의 각도로 설치할 수 없습니다.", + "create.ponder.belt_directions.text_2": "1. 수평으로 연결할 수 있습니다.", + "create.ponder.belt_directions.text_3": "2. 대각선으로 연결할 수 있습니다.", + "create.ponder.belt_directions.text_4": "3. 수직으로 연결할 수 있습니다.", + "create.ponder.belt_directions.text_5": "4. 또한 수직 축을 평행하게 연결할 수 있습니다.", + "create.ponder.belt_directions.text_6": "이것들이 가능한 방향입니다. 벨트는 2 ~ 20 블록 길이를 연결합니다.", + + "create.ponder.belt_transport.header": "벨트를 이용한 수송", + "create.ponder.belt_transport.text_1": "움직이는 벨트는 아이템과 엔티티를 옮깁니다.", + "create.ponder.belt_transport.text_2": "빈손으로 우클릭하여 벨트 위의 아이템을 가져옵니다.", + + "create.ponder.blaze_burner.header": "블레이즈 버너 데우기", + "create.ponder.blaze_burner.text_1": "블레이즈 버너는 대야 안에서 처리되는 아이템에 열을 제공합니다.", + "create.ponder.blaze_burner.text_2": "이런 식으로, 블레이즈는 가연성 물질을 먹습니다.", + "create.ponder.blaze_burner.text_3": "블레이즈 케아크를 먹이면 버너는 더 뜨겁게 타오릅니다.", + "create.ponder.blaze_burner.text_4": "이 시스템은 배포기나 기계 팔을 이용해 자동화될 수 있습니다.", + + "create.ponder.brass_funnel.header": "황동 퍼널", + "create.ponder.brass_funnel.text_1": "안산암 퍼널는 아이템 한 개만 뽑아냅니다.", + "create.ponder.brass_funnel.text_2": "황동 퍼널는 한 스택까지 뽑을 수 있습니다.", + "create.ponder.brass_funnel.text_3": "핕터 슬롯을 스크롤하여 추출 갯수를 조절합니다.", + "create.ponder.brass_funnel.text_4": "필터 슬롯에 아이템을 사용하여 추출할 아이템 종류를 정합니다.", + + "create.ponder.brass_tunnel.header": "황동 터널 사용하기", + "create.ponder.brass_tunnel.text_1": "황동 터널은 벨트를 덮는데 사용할 수 있습니다.", + "create.ponder.brass_tunnel.text_2": "황동 터널은 열린 면마다 필터 슬롯이 있습니다.", + "create.ponder.brass_tunnel.text_3": "입구 필터는 맞지않는 아이템을 막습니다.", + "create.ponder.brass_tunnel.text_4": "출구 필터는 종류에 따라 아이템을 분류합니다.", + "create.ponder.brass_tunnel.text_5": "지나가는 아이템의 출구가 여러개일 때, 분배 모드가 어떻게 분배할지 정합니다.", + "create.ponder.brass_tunnel.text_6": "벨트 위, 평행한 황동 터널끼리는 연결됩니다.", + "create.ponder.brass_tunnel.text_7": "들어오는 아이템은 연결된 모든 출구로 분배됩니다.", + "create.ponder.brass_tunnel.text_8": "이런 식으로, 터널을 통해 직접 아이템을 넣을 수 있습니다.", + + "create.ponder.brass_tunnel_modes.header": "황동 터널의 분배 모드", + "create.ponder.brass_tunnel_modes.text_1": "렌치를 이용해, 황동 터널이 어떻게 분배할지 설정합니다.", + "create.ponder.brass_tunnel_modes.text_10": "[입력 동기화] 설정은 황동 터널만의 고유 설정입니다.", + "create.ponder.brass_tunnel_modes.text_11": "모든 입구에 아이템이 있어야만 통과할 수 있습니다.", + "create.ponder.brass_tunnel_modes.text_12": "이 설정은 연결된 모든 벨트에 아이템을 동시에 공급할 수 있습니다.", + "create.ponder.brass_tunnel_modes.text_2": "[분할] 설정은 가능한 출구에 아이템을 동등하게 분배하려 합니다.", + "create.ponder.brass_tunnel_modes.text_3": "한 출구가 아이템을 더 받을 수 없을 때, 그 출구는 제외됩니다.", + "create.ponder.brass_tunnel_modes.text_4": "[분리(강제적)] 설정은 출구를 제외하지 않습니다. 대신, 모두 아이템을 받을 수 있을 때까지 기다립니다.", + "create.ponder.brass_tunnel_modes.text_5": "[순서대로 처리] 설정은 아이템 수량을 유지한 채, 출구 차례대로 아이템을 분배합니다.", + "create.ponder.brass_tunnel_modes.text_6": "전 설정과 마찬가지로, 한 출구가 아이템을 더 받을 수 없다면, 그 출구는 제외됩니다.", + "create.ponder.brass_tunnel_modes.text_7": "[순서대로 처리(강제적)] 설정은 출구를 제외하지 않습니다.", + "create.ponder.brass_tunnel_modes.text_8": "[가장 가까운 곳] 설정은 입구와 가까운 출구 순서로 우선순위를 정합니다.", + "create.ponder.brass_tunnel_modes.text_9": "[무작위] 설정은 랜덤한 출구로 아이템을 분배합니다.", + + "create.ponder.cart_assembler.header": "카트 조립기로 구조물 움직이기", + "create.ponder.cart_assembler.text_1": "활성화된 카트 조립기는 지나가는 수레에 구조물을 부착합니다.", + "create.ponder.cart_assembler.text_2": "신호가 없다면, 구조물을 때어냅니다.", + "create.ponder.cart_assembler.text_3": "수레에 렌치로 우클릭하면 구조물을 들고 다닐 수 있습니다.", + + "create.ponder.cart_assembler_dual.header": "기차 구조물 조립하기", + "create.ponder.cart_assembler_dual.text_1": "두 조립기가 같은 구조물을 공유할 때...", + "create.ponder.cart_assembler_dual.text_2": "둘 중 하나를 작동시키면 기차 구조물이 됩니다.", + "create.ponder.cart_assembler_dual.text_3": "두 수레는 수레 커플링으로 연결된 것처럼 행동합니다.", + + "create.ponder.cart_assembler_modes.header": "수레 구조물 회전 설정", + "create.ponder.cart_assembler_modes.text_1": "구조물이 바라보는 방향은 수레의 방향과 동일합니다.", + "create.ponder.cart_assembler_modes.text_2": "이 화살표는 구조물이 바라보는 방향을 나타냅니다.", + "create.ponder.cart_assembler_modes.text_3": "조립기 설정에서 회전을 잠갔다면, 구조물은 회전하지 않습니다.", + + "create.ponder.cart_assembler_rails.header": "다른 종류의 수레와 레일", + "create.ponder.cart_assembler_rails.text_1": "일반 레일위의 조립기는 지나가는 수레에 아무 영향을 미치지 않습니다.", + "create.ponder.cart_assembler_rails.text_2": "전동 레일, 방향 레일 위에 있을 때, 신호를 받을 때까지 수레는 멈춥니다.", + "create.ponder.cart_assembler_rails.text_3": "다른 수레들도 쓸 수 있습니다.", + "create.ponder.cart_assembler_rails.text_4": "화로 수레는 부착된 보관함에서 연료를 가져와 스스로 움직입니다.", + + "create.ponder.chain_drive.header": "체인 드라이브로 회전 전달하기", + "create.ponder.chain_drive.text_1": "체인 드라이브는 한 줄로 회전을 전달합니다.", + "create.ponder.chain_drive.text_2": "이렇게 연결된 모든 축들은 같은 방향으로 회전합니다.", + "create.ponder.chain_drive.text_3": "한 줄의 아무 부분을 90도 돌릴 수 있습니다.", + + "create.ponder.chain_gearshift.header": "벨트 변속기를 통해 회전 속도 조절하기", + "create.ponder.chain_gearshift.text_1": "신호를 받지 않은 벨트 변속기는 체인 드라이브와 똑같이 작동합니다.", + "create.ponder.chain_gearshift.text_2": "신호를 받으면, 다른 체인 드라이브에 전달되는 속도는 2배가 됩니다.", + "create.ponder.chain_gearshift.text_3": "반대로 벨트 변속기가 직접 회전을 받지 않고 있다면, 변속기의 속도는 절반이 됩니다.", + "create.ponder.chain_gearshift.text_4": "두 가지 경우에도, 같은 줄의 체인 드라이브의 속도는 변속기 속도의 2배가 됩니다.", + "create.ponder.chain_gearshift.text_5": "아날로그 레버를 사용하면, 속도 비율을 1 ~ 2배 사이로 맞출 수 있습니다.", + "create.ponder.chain_gearshift.text_6": "12 RPM", + + "create.ponder.chute.header": "슈트를 이용해 아이템을 아래로 옮기기", + "create.ponder.chute.text_1": "슈트는 보관함에 있는 아이템을 수직으로 옮깁니다.", + "create.ponder.chute.text_2": "렌치를 이용해 창문을 만들 수 있습니다.", + "create.ponder.chute.text_3": "슈트 옆면에 다른 슈트를 설치하면 대각선으로 연결됩니다.", + + "create.ponder.chute_upward.header": "슈트를 이용해 아이템을 위로 옮기기", + "create.ponder.chute_upward.text_1": "선풍기를 위/아래에 설치하면, 슈트는 아이템을 위로 보냅니다.", + "create.ponder.chute_upward.text_2": "엔지니어의 고글로 슈트를 관찰하여 이동 방향을 확인하세요.", + "create.ponder.chute_upward.text_3": "막힌 끝 부분에서 아이템은 옆에서 넣거나 빼내야합니다.", + + "create.ponder.clockwork_bearing.header": "시계 베어링을 이용한 구조물 움직이기", + "create.ponder.clockwork_bearing.text_1": "시계 베어링은 앞에 있는 블록을 부착시킵니다.", + "create.ponder.clockwork_bearing.text_2": "동력을 받으면, 현재 시간에 맞춰 구조물이 돌아갑니다.", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "베어링을 우클릭하여 구조물을 멈추거나 움직이세요.", + "create.ponder.clockwork_bearing.text_6": "시침 구조물 앞에 분침 구조물을 추가할 수 있습니다.", + "create.ponder.clockwork_bearing.text_7": "접착제나 슬라임볼로 두 구조물을 연결하지 마세요.", + "create.ponder.clockwork_bearing.text_8": "두번째 구조물은 분침처럼 돌아갑니다.", + + "create.ponder.clutch.header": "클러치를 이용해 동력 조절하기", + "create.ponder.clutch.text_1": "클러치는 한 줄로 동력을 전달합니다.", + "create.ponder.clutch.text_2": "레드스톤 신호를 받으면, 동력 전달을 끊습니다.", + + "create.ponder.cog_speedup.header": "톱니바퀴로 기어변속하기", + "create.ponder.cog_speedup.text_1": "큰 톱니바퀴와 작은 톱니바퀴는 대각선으로 연결됩니다.", + "create.ponder.cog_speedup.text_2": "큰 쪽에서 작은 쪽으로 가는 속도는 2배가 됩니다.", + "create.ponder.cog_speedup.text_3": "반대의 경우에는 속도가 절반이 됩니다.", + + "create.ponder.cogwheel.header": "톱니바퀴를 이용해 동력 전달하기", + "create.ponder.cogwheel.text_1": "톱니바퀴는 인접한 톱니바퀴에 동력을 전달합니다.", + "create.ponder.cogwheel.text_2": "이렇게 연결된 톱니바퀴 축은 반대방향으로 돌아갑니다.", + + "create.ponder.creative_fluid_tank.header": "크리에이티브 탱크", + "create.ponder.creative_fluid_tank.text_1": "크리에이티브 탱크는 무한히 액체를 공급합니다.", + "create.ponder.creative_fluid_tank.text_2": "액체가 든 용기로 우클릭하여 액체를 채울 수 있습니다.", + "create.ponder.creative_fluid_tank.text_3": "파이프로 탱크에서 액체를 무한히 뽑아낼 수 있습니다.", + "create.ponder.creative_fluid_tank.text_4": "크리에이티브 탱크로 들어가는 모든 액체는 사라집니다.", + + "create.ponder.creative_motor.header": "크리에이티브 모터를 이용해 동력 생산하기", + "create.ponder.creative_motor.text_1": "크리에이티브 모터는 동력을 쉽게 생산, 조절합니다.", + "create.ponder.creative_motor.text_2": "모터 후면을 스크롤해서 모터의 RPM을 조절합니다.", + + "create.ponder.crushing_wheels.header": "분쇄 휠을 이용해 아이템 가공하기", + "create.ponder.crushing_wheels.text_1": "한 쌍의 분쇄 휠은 아이템을 매우 효과적으로 갈아버립니다.", + "create.ponder.crushing_wheels.text_2": "동력을 전달하여 서로 맞물리게 해야합니다.", + "create.ponder.crushing_wheels.text_3": "위에서 투입된 아이템은 가공되고, 아래로 떨어집니다.", + "create.ponder.crushing_wheels.text_4": "이 과정은 자동화 될 수 있습니다.", + + "create.ponder.deployer.header": "배포기 이용하기", + "create.ponder.deployer.text_1": "동력을 받으면, 배포기는 플레이어의 행동을 흉내냅니다.", + "create.ponder.deployer.text_10": "손에다 우클릭하여 배포기가 쓸 아이템을 건네세요.", + "create.ponder.deployer.text_11": "아이템은 자동으로 투입될 수 있습니다.", + "create.ponder.deployer.text_12": "필터 슬롯도 있습니다.", + "create.ponder.deployer.text_13": "필터가 설정되면, 필터에 맞는 아이템을 들고있을 때 작동합니다.", + "create.ponder.deployer.text_14": "필터에 맞는 아이템만 들어가며...", + "create.ponder.deployer.text_15": "...그 외의 아이템은 배출됩니다.", + "create.ponder.deployer.text_2": "배포기는 한 칸 떨어진 블록에 상호작용합니다.", + "create.ponder.deployer.text_3": "바로 앞에 블록이 있어도 상괸없습니다.", + "create.ponder.deployer.text_4": "배포기가 할 수 있는 것:", + "create.ponder.deployer.text_5": "블록 설치하기", + "create.ponder.deployer.text_6": "아이템 사용하기", + "create.ponder.deployer.text_7": "블록 활성화하기", + "create.ponder.deployer.text_8": "블록 수확하기", + "create.ponder.deployer.text_9": "몹 공격하기", + + "create.ponder.deployer_contraption.header": "구조물에서의 배포기", + "create.ponder.deployer_contraption.text_1": "배포기가 움직이는 구조물의 일부면...", + "create.ponder.deployer_contraption.text_2": "...배포기는 움직일 때마다 작동하며, 구조물에 붙어있는 아무 보관함의 아이템을 사용합니다.", + "create.ponder.deployer_contraption.text_3": "필터를 이용해 어떤 아이템을 사용할 지 정할 수 있습니다.", + + "create.ponder.deployer_modes.header": "배포기의 작동 방식", + "create.ponder.deployer_modes.text_1": "배포기는 기본적으로 우클릭을 흉내냅니다.", + "create.ponder.deployer_modes.text_2": "렌치를 이용해, 좌클릭을 흉내내도록 설정할 수 있습니다.", + + "create.ponder.deployer_processing.header": "배포기로 아이템 가공하기", + "create.ponder.deployer_processing.text_1": "배포기가 적절한 아이템을 가지고 있으면, 아래 있는 아이템을 가공합니다.", + "create.ponder.deployer_processing.text_2": "가공할 아이템은 배포기 아래에 떨구거나 아이템 거치대에 올려두어야 합니다.", + "create.ponder.deployer_processing.text_3": "아이템이 벨트에 있으면...", + "create.ponder.deployer_processing.text_4": "...압착기가 알아서 아이템 이동을 멈추고 가공합니다.", + + "create.ponder.deployer_redstone.header": "레드스톤과 배포기", + "create.ponder.deployer_redstone.text_1": "레드스톤 신호를 받으면, 배포기는 작동하지 않습니다.", + "create.ponder.deployer_redstone.text_2": "작동을 멈추기 전에, 배포기는 입력된 행동을 마무리합니다.", + "create.ponder.deployer_redstone.text_3": "따라서 부정 펄스는 한 번만 작동하게 합니다.", + + "create.ponder.depot.header": "아이템 거치대 사용하기", + "create.ponder.depot.text_1": "아이템 거치대는 고정된 벨트 역할입니다.", + "create.ponder.depot.text_2": "우클릭해서 아이템을 놓거나 가져갑니다.", + "create.ponder.depot.text_3": "벨트처럼, 놓여진 아이템은 가공될 수 있습니다.", + "create.ponder.depot.text_4": "그리고 기계 팔의 목표가 될 수 있습니다.", + + "create.ponder.empty_blaze_burner.header": "빈 블레이즈 버너 사용하기", + "create.ponder.empty_blaze_burner.text_1": "블레이즈를 우클릭하여 버너에 가둡니다.", + "create.ponder.empty_blaze_burner.text_2": "또는 스포너에서도 블레이즈를 가둘 수 있습니다.", + "create.ponder.empty_blaze_burner.text_3": "이제 당신은 다양한 장치에 쓰일 이상적인 열원을 얻었습니다.", + "create.ponder.empty_blaze_burner.text_4": "장식적인 요소로는 라이터로 불을 붙일 수 있습니다.", + "create.ponder.empty_blaze_burner.text_5": "불꽃은 영혼불꽃으로 바꿀 수 있습니다.", + "create.ponder.empty_blaze_burner.text_6": "그러나 장치에 쓰일 열원으로는 적합하지 않습니다.", + + "create.ponder.encased_fluid_pipe.header": "파이프에 케이스 씌우기", + "create.ponder.encased_fluid_pipe.text_1": "구리 케이스로 파이프를 꾸밀 수 있습니다.", + "create.ponder.encased_fluid_pipe.text_2": "파이프를 가려주는 것 외에도, 파이프의 방향을 고정시키는 역할도 합니다.", + "create.ponder.encased_fluid_pipe.text_3": "이 파이프는 이제 나중에 추가된 블록에 영향받지 않습니다.", + + "create.ponder.fan_direction.header": "선풍기의 공기흐름", + "create.ponder.fan_direction.text_1": "선풍기는 동력을 이용해 바람을 만들어냅니다.", + "create.ponder.fan_direction.text_2": "바람의 세기와 방향, 거리는 동력에 따라 달라집니다.", + + "create.ponder.fan_processing.header": "선풍기로 아이템 가공하기", + "create.ponder.fan_processing.text_1": "바람이 용암을 통과하면, 공기가 뜨거워집니다.", + "create.ponder.fan_processing.text_2": "바람이 지나가는 자리의 아이템은 구워집니다.", + "create.ponder.fan_processing.text_3": "음식은 불타 없어집니다.", + "create.ponder.fan_processing.text_4": "대신, 불을 이용하면 음식을 굽습니다.", + "create.ponder.fan_processing.text_5": "물을 통과하는 바람을 통해 세척할 수 있습니다.", + "create.ponder.fan_processing.text_6": "이를 통해 새로운 가공을 할 수 있습니다.", + "create.ponder.fan_processing.text_7": "선풍기의 속도는 가공 속도와 관련이 없습니다!", + "create.ponder.fan_processing.text_8": "선풍기 가공은 벨트나 아이템 거치대의 아이템에도 적용됩니다.", + + "create.ponder.fan_source.header": "선풍기를 이용해 동력 생산하기", + "create.ponder.fan_source.text_1": "열원을 향한 선풍기는 동력을 제공합니다.", + "create.ponder.fan_source.text_2": "레드스톤 신호를 받으면, 동력을 제공하기 시작합니다.", + + "create.ponder.fluid_pipe_flow.header": "파이프로 액체 옮기기", + "create.ponder.fluid_pipe_flow.text_1": "파이프는 한 종류의 액체만 옮깁니다.", + "create.ponder.fluid_pipe_flow.text_2": "렌치를 이용하여 직선 파이프에 창문을 달 수 있습니다.", + "create.ponder.fluid_pipe_flow.text_3": "창문이 있는 파이프는 옆에 있는 파이프와 연결되지 않습니다.", + "create.ponder.fluid_pipe_flow.text_4": "펌프를 이용하면 파이프로 액체를 옮길 수 있습니다.", + "create.ponder.fluid_pipe_flow.text_5": "처음엔 액체가 빠지지 않습니다.", + "create.ponder.fluid_pipe_flow.text_6": "액체 흐름이 이어지면, 시작 탱크에서 끝 탱크로 액체가 본격적으로 이동합니다.", + "create.ponder.fluid_pipe_flow.text_7": "이렇기 때문에, 파이프는 실질적으로 아무런 액체도 담지 않습니다.", + + "create.ponder.fluid_pipe_interaction.header": "액체 용기를 비우고 채우기", + "create.ponder.fluid_pipe_interaction.text_1": "파이프의 끝은 다양한 블록과 상호작용할 수 있습니다.", + "create.ponder.fluid_pipe_interaction.text_2": "액체를 담을 수 있는 모든 블록은 비우거나 채울 수 있습니다.", + "create.ponder.fluid_pipe_interaction.text_3": "끝 부분에 있는 액체의 원천도 흡수할 수 있으며...", + "create.ponder.fluid_pipe_interaction.text_4": "...비어있는 곳에 액체를 배출할 수도 있습니다.", + "create.ponder.fluid_pipe_interaction.text_5": "다양한 다른 블록에서도 액체를 뽑아낼 수도 있습니다.", + + "create.ponder.fluid_tank_sizes.header": "액체 탱크의 크기", + "create.ponder.fluid_tank_sizes.text_1": "액체 탱크는 여러개 연결하여 용량을 늘릴 수 있습니다.", + "create.ponder.fluid_tank_sizes.text_2": "밑면 너비는 3블록까지 늘릴 수 있습니다.", + "create.ponder.fluid_tank_sizes.text_3": "높이는 32블록까지 가능합니다.", + "create.ponder.fluid_tank_sizes.text_4": "렌치를 이용해 탱크의 창문을 닫을 수 있습니다.", + + "create.ponder.fluid_tank_storage.header": "탱크에 액체 저장하기", + "create.ponder.fluid_tank_storage.text_1": "탱크는 많은 양의 액체를 저장합니다.", + "create.ponder.fluid_tank_storage.text_2": "어느 쪽에서나 파이프로 액체를 넣고 빼낼 수 있습니다.", + "create.ponder.fluid_tank_storage.text_3": "담긴 액체의 양은 비교기로 측정할 수 있습니다.", + "create.ponder.fluid_tank_storage.text_4": "그러나 서바이벌 모드에서는 액체를 직접 빼내고 넣을 순 없습니다.", + "create.ponder.fluid_tank_storage.text_5": "대야, 아이템 배수구, 주입기를 통해 액체를 빼내거나 채울 수 있습니다.", + + "create.ponder.flywheel.header": "플라이휠로 동력 생산하기", + "create.ponder.flywheel.text_1": "플라이휠로 동력을 생산하기 위해선, 화로 엔진이 필요합니다.", + "create.ponder.flywheel.text_2": "플라이휠은 피로도 용량이 매우 높습니다.", + "create.ponder.flywheel.text_3": "용광로를 사용하면 동력 속도가 2배가 됩니다.", + + "create.ponder.funnel_compat.header": "퍼널 호환성", + "create.ponder.funnel_compat.text_1": "퍼널은 다른 장치들 위에 설치할 수 있습니다.", + "create.ponder.funnel_compat.text_2": "세로 톱", + "create.ponder.funnel_compat.text_3": "아이템 거치대", + "create.ponder.funnel_compat.text_4": "아이템 배수구", + + "create.ponder.funnel_direction.header": "수송 방향", + "create.ponder.funnel_direction.text_1": "설치하면, 보관함에서 아이템을 빼냅니다.", + "create.ponder.funnel_direction.text_2": "웅크리면서 설치하면, 아이템을 가져갑니다.", + "create.ponder.funnel_direction.text_3": "렌치를 이용해 설치 이후에도 설정을 변경할 수 있습니다.", + "create.ponder.funnel_direction.text_4": "다른 면에 설치해도 같은 규칙을 따릅니다.", + "create.ponder.funnel_direction.text_5": "벨트 위의 퍼널는 벨트의 움직임에 따라 아이템을 빼내거나 가져갑니다.", + + "create.ponder.funnel_intro.header": "퍼널 사용하기", + "create.ponder.funnel_intro.text_1": "퍼널는 보관함에서 아이템을 옮기거나 빼낼 때 유용합니다.", + + "create.ponder.funnel_redstone.header": "레드스톤 신호", + "create.ponder.funnel_redstone.text_1": "레드스톤 신호를 받으면 동작을 멈춥니다.", + + "create.ponder.funnel_transfer.header": "직접 수송", + "create.ponder.funnel_transfer.text_1": "퍼널는 아이템을 보관함에서 다른 보관함로 옮깁니다.", + "create.ponder.funnel_transfer.text_2": "슈트나 스마트 슈트가 이런 목적에 더 적합합니다.", + "create.ponder.funnel_transfer.text_3": "수평 방향으로는 벨트가 적합합니다.", + + "create.ponder.furnace_engine.header": "화로 엔진을 이용해 동력 생산하기", + "create.ponder.furnace_engine.text_1": "화로 엔진은 부착된 화로가 타오를 때 동력을 생산합니다.", + "create.ponder.furnace_engine.text_2": "제공되는 피로도 용량이 매우 높습니다.", + "create.ponder.furnace_engine.text_3": "용광로를 사용하면 동력 속도가 2배가 됩니다.", + + "create.ponder.gantry_carriage.header": "갠트리 운반대 사용하기", + "create.ponder.gantry_carriage.text_1": "갠트리 운반대는 갠트리 축 위에서 움직입니다.", + "create.ponder.gantry_carriage.text_2": "갠트리 장치는 부착된 블록들을 움직입니다.", + + "create.ponder.gantry_cascaded.header": "계단식 갠트리", + "create.ponder.gantry_cascaded.text_1": "갠트리 운반대에 접착제 없이 갠트리 축을 붙일 수 있습니다.", + "create.ponder.gantry_cascaded.text_2": "움직이는 축 위의 운반대에도 적용됩니다.", + "create.ponder.gantry_cascaded.text_3": "아렇게 갠트리 시스템은 여러 축으로 이어나갈 수 있습니다.", + + "create.ponder.gantry_direction.header": "갠트리 동작 방향", + "create.ponder.gantry_direction.text_1": "갠트리 축은 서로 반대되게 설치할 수 있습니다.", + "create.ponder.gantry_direction.text_2": "운반대의 이동 방향은 축의 방향을 따릅니다.", + "create.ponder.gantry_direction.text_3": "축의 회전방향도 마찬가지입니다.", + "create.ponder.gantry_direction.text_4": "운반대 축의 회전에도 적용됩니다.", + + "create.ponder.gantry_redstone.header": "갠트리 동력 전달", + "create.ponder.gantry_redstone.text_1": "레드스톤 신호를 받은 갠트리 축은 운반대를 멈춤니다.", + "create.ponder.gantry_redstone.text_2": "대신, 동력은 운반대의 축에게 이어집니다.", + + "create.ponder.gantry_shaft.header": "갠트리 축 사용하기", + "create.ponder.gantry_shaft.text_1": "갠트리 축은 갠트리 장치에 필요합니다. 갠트리 운반대가 축을 따라 움직입니다.", + "create.ponder.gantry_shaft.text_2": "갠트리 장치는 부착된 블록들을 움직입니다.", + + "create.ponder.gearbox.header": "기어박스를 이용해 동력 전달하기", + "create.ponder.gearbox.text_1": "회전축을 변경하는 일은 쉽게 귀찮아집니다.", + "create.ponder.gearbox.text_2": "기어박스는 그런 문제를 쉽게 해결합니다.", + "create.ponder.gearbox.text_3": "모서리 축들은 서로 다른 방향으로 돌아갑니다.", + "create.ponder.gearbox.text_4": "반대편 축은 거꾸로 돌아갑니다.", + + "create.ponder.gearshift.header": "기어쉬프트를 이용해 동력 조절하기", + "create.ponder.gearshift.text_1": "기어쉬프트는 한 줄로 동력을 전달합니다.", + "create.ponder.gearshift.text_2": "레드스톤 신호를 받으면, 회전을 반전시킵니다.", + + "create.ponder.hand_crank.header": "핸드 크랭크로 동력 생산하기", + "create.ponder.hand_crank.text_1": "핸드 크랭크는 플레이어가 직접 동력을 생산하는 장치입니다.", + "create.ponder.hand_crank.text_2": "우클릭하면 시계 반대방향으로 회전합니다.", + "create.ponder.hand_crank.text_3": "동력 속도는 생각보다 빠릅니다.", + "create.ponder.hand_crank.text_4": "웅크리고 우클릭하면 시계 방향으로 회전합니다.", + + "create.ponder.hose_pulley.header": "호스 도르래로 액체 채우고 비우기", + "create.ponder.hose_pulley.text_1": "호스 도르래는 많은 양의 액체를 채우거나 비울 수 있습니다.", + "create.ponder.hose_pulley.text_2": "동력을 전달하여 호스의 높이를 정합니다.", + "create.ponder.hose_pulley.text_3": "동력 방향이 반전되면 호스는 올라갑니다.", + "create.ponder.hose_pulley.text_4": "반대쪽에는 파이프를 연결할 수 있습니다.", + "create.ponder.hose_pulley.text_5": "연결된 파이프에서 호스로 전달하여 액체를 채우거나...", + "create.ponder.hose_pulley.text_6": "...반대 방향으로 방향을 바꿔 액체를 비울 수 있습니다.", + "create.ponder.hose_pulley.text_7": "호스의 채우거나 비우는 속도는 펌프 속도에 기반합니다.", + + "create.ponder.hose_pulley_infinite.header": "매우 많은 양의 액체를 채우고 비우기", + "create.ponder.hose_pulley_infinite.text_1": "넓은 바다에서 호스 도르래를 작동시키면...", + "create.ponder.hose_pulley_infinite.text_2": "...물 블록을 없애거나 추가하지 않고 액체를 얻거나 버릴 수 있습니다.", + "create.ponder.hose_pulley_infinite.text_3": "파이프로 이런 도르래에서 무한한 액체를 얻을 수 있습니다.", + + "create.ponder.hose_pulley_level.header": "호스 도르래의 채우고 비우는 기준", + "create.ponder.hose_pulley_level.text_1": "호스가 완전히 올라가 있을 때, 도르래는 작동하지 않습니다.", + "create.ponder.hose_pulley_level.text_2": "맨 위부터 비웁니다.", + "create.ponder.hose_pulley_level.text_3": "호스 끝부분 아래의 액체는 그대로 남습니다.", + "create.ponder.hose_pulley_level.text_4": "맨 아래부터 채웁니다.", + "create.ponder.hose_pulley_level.text_5": "호스 끝부분 위는 채우지 않습니다.", + + "create.ponder.item_drain.header": "아이템 배수구로 액체 비우기", + "create.ponder.item_drain.text_1": "배수구는 아이템에서 액체를 비웁니다.", + "create.ponder.item_drain.text_2": "우클릭하여 손에 든 아이템에서 액체를 붓습니다.", + "create.ponder.item_drain.text_3": "아이템이 옆에서 들어온다면...", + "create.ponder.item_drain.text_4": "...아이템은 굴라가며 담긴 액체를 비웁니다.", + "create.ponder.item_drain.text_5": "배수구 탱크에 있는 액체는 파이프로 옮길 수 있습니다.", + + "create.ponder.large_cogwheel.header": "큰 톱니바퀴로 동력 전달하기", + "create.ponder.large_cogwheel.text_1": "큰 톱니바퀴는 수직으로 서로 맞물립니다.", + "create.ponder.large_cogwheel.text_2": "이는 다른 축으로 동력을 전달하는데 도움이 됩니다.", + + "create.ponder.linear_chassis_attachment.header": "직선 섀시를 이용해 블록 붙이기", + "create.ponder.linear_chassis_attachment.text_1": "직선 섀시의 열린 면은 접착할 수 있습니다.", + "create.ponder.linear_chassis_attachment.text_2": "다시 클릭하면 다른 면도 접착할 수 있게 만듭니다.", + "create.ponder.linear_chassis_attachment.text_3": "빈 손으로 웅크리고 우클릭하여 접착제를 없앨 수 있습니다.", + "create.ponder.linear_chassis_attachment.text_4": "직선 섀시의 접착면은 접착면 앞에 있는 블록들을 연결합니다.", + "create.ponder.linear_chassis_attachment.text_5": "렌치로 이용해 섀시의 접착 거리를 조절할 수 있습니다.", + "create.ponder.linear_chassis_attachment.text_6": "[CTRL]키를 누르고 스크롤하면 연결된 모든 섀시의 거리를 조절할 수 있습니다.", + "create.ponder.linear_chassis_attachment.text_7": "다른 면에 블록을 붙이려면 접착제가 필요합니다.", + "create.ponder.linear_chassis_attachment.text_8": "이런 원리를 통해 구조물이 장치로써 움직일 수 있게 됩니다.", + + "create.ponder.linear_chassis_group.header": "여러 직선 섀시 움직이기", + "create.ponder.linear_chassis_group.text_1": "직선 섀시는 다른 직선 섀시와 연결될 수 있습니다.", + "create.ponder.linear_chassis_group.text_2": "하나가 움직이면, 다른 섀시도 같이 움직입니다.", + "create.ponder.linear_chassis_group.text_3": "다른 종류의 섀시, 다른 면을 바라보는 섀시는 붙지 않습니다.", + + "create.ponder.mechanical_arm.header": "기계 팔 설치하기", + "create.ponder.mechanical_arm.text_1": "기계 팔은 설치되기 전, 입력부와 출력부를 지정해야 합니다.", + "create.ponder.mechanical_arm.text_2": "우클릭으로 보관함을 가진 블록을 대상으로 지정합니다.", + "create.ponder.mechanical_arm.text_3": "다시 우클릭하여 입력부(파랑) 출력부(주황)을 설정합니다.", + "create.ponder.mechanical_arm.text_4": "좌클릭하여 대상 선택을 해제합니다.", + "create.ponder.mechanical_arm.text_5": "설치된 기계 팔은 이전에 선택된 블록들을 대상으로 정합니다.", + "create.ponder.mechanical_arm.text_6": "거리안에 있다면 여러 블록을 지정할 수 있습니다.", + "create.ponder.mechanical_arm.text_7": "하지만 모든 보관함을 지닌 블록이 지정되지는 않습니다.", + "create.ponder.mechanical_arm.text_8": "퍼널와 아이템 거치대가 이런 문제를 해결할 수 있습니다.", + + "create.ponder.mechanical_arm_filtering.header": "기계 팔 필터링", + "create.ponder.mechanical_arm_filtering.text_1": "입력부", + "create.ponder.mechanical_arm_filtering.text_2": "출력부", + "create.ponder.mechanical_arm_filtering.text_3": "때때로 기계 팔이 필터에 맞추어 동작해야할 때가 있습니다.", + "create.ponder.mechanical_arm_filtering.text_4": "하지만 기계 팔자체에서 필터 기능을 지원하지는 않습니다.", + "create.ponder.mechanical_arm_filtering.text_5": "대신, 황동 퍼널의 필터는 기계 팔의 필터역할을 합니다.", + "create.ponder.mechanical_arm_filtering.text_6": "기계 팔은 필터에 맞게 적당한 양만 가져가는 똑똑한 친구입니다.", + + "create.ponder.mechanical_arm_modes.header": "기계 팔의 분배 설정", + "create.ponder.mechanical_arm_modes.text_1": "입력부", + "create.ponder.mechanical_arm_modes.text_2": "출력부", + "create.ponder.mechanical_arm_modes.text_3": "기계 팔이 여러 곳에 아이템을 전달해야 한다면...", + "create.ponder.mechanical_arm_modes.text_4": "...현재 분배 설정에 따라 행동합니다.", + "create.ponder.mechanical_arm_modes.text_5": "렌치로 스크롤하여 어떻게 분배할지 설정하세요.", + "create.ponder.mechanical_arm_modes.text_6": "'순서대로 옮김'은 가능한 곳을 순환하며 아이템을 분배합니다.", + "create.ponder.mechanical_arm_modes.text_7": "어느 한 곳이 더 전달받을 수 없다면, 그 곳은 넘어갑니다.", + "create.ponder.mechanical_arm_modes.text_8": "[돌아가며 처리(강제적)]은 전달할 곳을 절대 넘어가지 않고, 공간이 남을 때까지 기다립니다.", + "create.ponder.mechanical_arm_modes.text_9": "[설정 순서 우선시]은 기계 팔을 설치할 때 설정한 곳 순서대로 아이템을 전달합니다.", + + "create.ponder.mechanical_arm_redstone.header": "기계 팔과 레드스톤", + "create.ponder.mechanical_arm_redstone.text_1": "레드스톤 신호를 받으면, 기계 팔은 작동을 멈춥니다.", + "create.ponder.mechanical_arm_redstone.text_2": "작동을 멈추기 전에, 기계 팔은 입력된 행동을 마무리합니다.", + "create.ponder.mechanical_arm_redstone.text_3": "따라서 부정 펄스는 한 번만 작동하게 합니다.", + + "create.ponder.mechanical_bearing.header": "베어링으로 구조물 옮기기", + "create.ponder.mechanical_bearing.text_1": "베어링은 앞에 있는 블록을 부착시킵니다.", + "create.ponder.mechanical_bearing.text_2": "동력을 받으면, 블록들은 회전하는 구조물로 변합니다.", + + "create.ponder.mechanical_crafter.header": "조합기 설치하기", + "create.ponder.mechanical_crafter.text_1": "다수의 조합기로 모든 조합을 자동화할 수 있습니다.", + "create.ponder.mechanical_crafter.text_2": "렌치를 이용해, 조합기의 경로를 변경할 수 있습니다.", + "create.ponder.mechanical_crafter.text_3": "올바른 조합을 위해서는, 모든 조합기의 경로가 외부로 나가는 한 길로 이어져야합니다.", + "create.ponder.mechanical_crafter.text_4": "결과물은 경로 끝 보관함에 보내집니다.", + "create.ponder.mechanical_crafter.text_5": "조합기는 동력이 요구됩니다.", + "create.ponder.mechanical_crafter.text_6": "앞면을 우클릭해서 직접 아이템을 넣습니다.", + "create.ponder.mechanical_crafter.text_7": "모든 면이 아이템을 가지고 있다면, 조합이 시작됩니다.", + "create.ponder.mechanical_crafter.text_8": "모든 면이 아이템을 가지고 있지 않아도, 레드스톤 신호로 조합을 강제 시작할 수 있습니다.", + + "create.ponder.mechanical_crafter_connect.header": "조합기에 아이템 넣기", + "create.ponder.mechanical_crafter_connect.text_1": "조합기에 아이템을 자동으로 넣을 수 있습니다.", + "create.ponder.mechanical_crafter_connect.text_2": "후면에 렌치를 이용해 조합기 보관함을 연결할 수 있습니다.", + "create.ponder.mechanical_crafter_connect.text_3": "이제 모든 조합기가 한 곳에서 아이템을 받습니다.", + + "create.ponder.mechanical_crafter_covers.header": "조합기 슬롯 덮기", + "create.ponder.mechanical_crafter_covers.text_1": "몇몇 조합은 빈 공간을 채워줄 조합기가 필요합니다.", + "create.ponder.mechanical_crafter_covers.text_2": "슬롯 덮개를 이용해, 조합기에 빈 공간을 만들 수 있습니다.", + "create.ponder.mechanical_crafter_covers.text_3": "렌치를 이용해 보관함을 연결해도 덮개가 있는 조합기에는 아이템이 들어오지 않습니다.", + + "create.ponder.mechanical_drill.header": "드릴을 이용해 블록 부수기", + "create.ponder.mechanical_drill.text_1": "동력을 받으면, 드릴은 앞에 있는 블록을 파괴합니다.", + "create.ponder.mechanical_drill.text_2": "채굴 속도는 동력 속도에 비례합니다.", + + "create.ponder.mechanical_drill_contraption.header": "구조물에서의 드릴", + "create.ponder.mechanical_drill_contraption.text_1": "드릴이 움직이는 구조물의 일부면...", + "create.ponder.mechanical_drill_contraption.text_2": "...드릴이 부딫히는 블록을 파괴합니다.", + + "create.ponder.mechanical_harvester.header": "구조물에서의 수확기", + "create.ponder.mechanical_harvester.text_1": "수확기가 움직이는 구조물의 일부면...", + "create.ponder.mechanical_harvester.text_2": "...지나가는 길에 있는 작물을 수확하고, 성장 수치를 초기화합니다.", + + "create.ponder.mechanical_mixer.header": "믹서로 아이템 가공하기", + "create.ponder.mechanical_mixer.text_1": "믹서와 대야를 이용해 몇몇 조합을 자동화할 수 있습니다.", + "create.ponder.mechanical_mixer.text_2": "가능한 조합법은 어느 무형 조합법이나 가능하며, 모드에서 추가된 조합법도 있습니다.", + "create.ponder.mechanical_mixer.text_3": "몇몇 조합법은 블레이즈 버너의 열을 요구합니다.", + "create.ponder.mechanical_mixer.text_4": "필터 슬롯을 이용해 조합법이 겹치는 것을 방지합니다.", + + "create.ponder.mechanical_piston.header": "기계식 피스톤으로 구조물 옮기기", + "create.ponder.mechanical_piston.text_1": "기계식 피스톤은 블록들을 앞으로 움직입니다.", + "create.ponder.mechanical_piston.text_2": "속도와 방향은 들어오는 동력에 기반합니다.", + "create.ponder.mechanical_piston.text_3": "끈끈이 기계식 피스톤은 블록들을 다시 끌어옵니다.", + + "create.ponder.mechanical_piston_modes.header": "기계식 피스톤의 이동 설정", + "create.ponder.mechanical_piston_modes.text_1": "피스톤이 움직임을 멈추면, 움직인 구조물은 블록으로 바뀝니다.", + "create.ponder.mechanical_piston_modes.text_2": "블록으로 바뀌지 않게 하거나, 시작지점에서만 바뀌도록 설정할 수 있습니다.", + + "create.ponder.mechanical_plough.header": "구조물에서의 쟁기", + "create.ponder.mechanical_plough.text_1": "쟁기가 움직이는 구조물의 일부면...", + "create.ponder.mechanical_plough.text_2": "...히트박스가 없는 블록을 파괴합니다.", + "create.ponder.mechanical_plough.text_3": "또, 쟁기는 경작지를 만들 수 있습니다.", + "create.ponder.mechanical_plough.text_4": "...그리고 엔티티를 피해없이 날려보낼 수도 있습니다!", + + "create.ponder.mechanical_press.header": "압착기로 아이템 가공하기", + "create.ponder.mechanical_press.text_1": "압착기는 아래에 놓인 아이템을 가공할 수 있습니다.", + "create.ponder.mechanical_press.text_2": "가공할 아이템은 압착기 아래에 떨구거나 아이템 거치대에 올려두어야 합니다.", + "create.ponder.mechanical_press.text_3": "아이템이 벨트에 있으면...", + "create.ponder.mechanical_press.text_4": "...압착기가 알아서 아이템 이동을 멈추고 가공합니다.", + + "create.ponder.mechanical_press_compacting.header": "압착기로 아이템 압축하기", + "create.ponder.mechanical_press_compacting.text_1": "대야와 함께 사용해서 아이템을 압축할 수 있습니다.", + "create.ponder.mechanical_press_compacting.text_2": "가능한 조합법은 2x2 / 3x3 조합법을 포함하고, 모드에서 추가된 조합법도 있습니다.", + "create.ponder.mechanical_press_compacting.text_3": "몇몇 조합법은 블레이즈 버너의 열을 요구합니다.", + "create.ponder.mechanical_press_compacting.text_4": "필터 슬롯을 이용해 조합법이 겹치는 것을 방지합니다.", + + "create.ponder.mechanical_pump_flow.header": "펌프를 이용해 액체 옮기기", + "create.ponder.mechanical_pump_flow.text_1": "펌프는 연결된 파이프속 흐름을 관리합니다.", + "create.ponder.mechanical_pump_flow.text_2": "동력을 전달받으면 화살표가 흐름의 방향을 알려줍니다.", + "create.ponder.mechanical_pump_flow.text_3": "화살표 뒤의 파이프는 액체를 뽑아내고...", + "create.ponder.mechanical_pump_flow.text_4": "...화살표 앞의 파이프는 액체를 밀어냅니다.", + "create.ponder.mechanical_pump_flow.text_5": "동력 방향을 반전시키면 흐름의 방향도 반전됩니다.", + "create.ponder.mechanical_pump_flow.text_6": "렌치로 펌프 방향 자체를 돌릴 수도 있습니다.", + + "create.ponder.mechanical_pump_speed.header": "펌프의 처리율", + "create.ponder.mechanical_pump_speed.text_1": "동력 속도와는 상관없이 펌프는 16블록 길이의 파이프까지 영향을 미칩니다.", + "create.ponder.mechanical_pump_speed.text_2": "동력 속도를 높이면 액체가 흐르는 속도가 높아지고...", + "create.ponder.mechanical_pump_speed.text_3": "...옮기는 액체의 양도 증가합니다.", + "create.ponder.mechanical_pump_speed.text_4": "펌프는 병렬로 설치할 수 있습니다.", + "create.ponder.mechanical_pump_speed.text_5": "펌프 방향을 바꾸어 흐름의 뱡향을 통일할 수 있습니다.", + + "create.ponder.mechanical_saw_breaker.header": "톱으로 나무 베기", + "create.ponder.mechanical_saw_breaker.text_1": "동력을 받으면 앞에 있는 나무를 벱니다.", + "create.ponder.mechanical_saw_breaker.text_2": "두꺼운 나무를 벨려면, 땅에 붙어있는 마지막 나무 블록을 파괴해야합니다.", + + "create.ponder.mechanical_saw_contraption.header": "구조물에서의 톱", + "create.ponder.mechanical_saw_contraption.text_1": "톱이 움직이는 구조물의 일부면...", + "create.ponder.mechanical_saw_contraption.text_2": "...부딫히는 모든 나무를 벱니다.", + + "create.ponder.mechanical_saw_processing.header": "톱으로 아이템 가공하기", + "create.ponder.mechanical_saw_processing.text_1": "위를 바라보는 톱은 다양한 아이템을 가공합니다.", + "create.ponder.mechanical_saw_processing.text_2": "가공되는 아이템은 언제나 동력의 반대로 움직입니다.", + "create.ponder.mechanical_saw_processing.text_3": "톱은 벨트와 연동이 가능합니다.", + "create.ponder.mechanical_saw_processing.text_4": "재료가 여러 결과물로 가공될 수 있을 때, 필터로 제한할 수 있습니다.", + "create.ponder.mechanical_saw_processing.text_5": "필터가 없다면 톱은 모든 결과물을 순서대로 만듭니다.", + + "create.ponder.millstone.header": "맷돌로 아이템 갈기", + "create.ponder.millstone.text_1": "맷돌은 아이템을 갈아버립니다!", + "create.ponder.millstone.text_2": "톱니바퀴를 옆에 설치하여 돌릴 수 있습니다.", + "create.ponder.millstone.text_3": "윗면으로 아이템을 투입하세요.", + "create.ponder.millstone.text_4": "시간이 지난 후, 우클릭으로 결과물을 얻을 수 있습니다.", + "create.ponder.millstone.text_5": "결과물은 자동으로 빼낼 수 있습니다.", + + "create.ponder.nixie_tube.header": "닉시관 사용하기", + "create.ponder.nixie_tube.text_1": "레드스톤 신호를 받으면, 닉시관은 레드스톤 신호 세기를 나타냅니다.", + "create.ponder.nixie_tube.text_2": "이름표를 사용하여 원하는 글자를 나타낼 수도 있습니다.", + "create.ponder.nixie_tube.text_3": "염료를 들고 우클릭하여 색을 바꿀 수 있습니다.", + + "create.ponder.piston_pole.header": "피스톤 연장 축", + "create.ponder.piston_pole.text_1": "연장 축이 없으면, 기계식 피스톤은 움직일 수 없습니다.", + "create.ponder.piston_pole.text_2": "연장 축의 수가 곧 피스톤이 연장할 수 있는 거리입니다.", + + "create.ponder.portable_fluid_interface.header": "구조물 장치의 액체 교환", + "create.ponder.portable_fluid_interface.text_1": "액체 인터페이스는 장치를 멈추지 않아도 탱크와 상호작용할 수 있습니다.", "create.ponder.portable_fluid_interface.text_2": "UNLOCALIZED: This component can interact with fluid tanks without the need to stop the contraption", - "create.ponder.portable_fluid_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_fluid_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_fluid_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL Tanks on the contraption", - "create.ponder.portable_fluid_interface.text_6": "UNLOCALIZED: Fluid can now be inserted...", - "create.ponder.portable_fluid_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_fluid_interface.text_8": "UNLOCALIZED: After no contents have been exchanged for a while, the contraption will continue on its way", + "create.ponder.portable_fluid_interface.text_3": "두 번째 인터페이스를 1~2 블록 띄우고 설치하세요.", + "create.ponder.portable_fluid_interface.text_4": "서로를 마주칠 때마다, 접속을 시도합니다.", + "create.ponder.portable_fluid_interface.text_5": "접속한 상태에서, 블록 상태의 인터페이스는 장치의 모든 탱크와 동일합니다.", + "create.ponder.portable_fluid_interface.text_6": "액체를 넣을 수도 있고...", + "create.ponder.portable_fluid_interface.text_7": "...장치에서 액체를 뺄 수도 있습니다.", + "create.ponder.portable_fluid_interface.text_8": "일정 시간동안 액체가 교환되지 않으면, 장치는 움직입니다.", - "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.portable_storage_interface.header": "구조물 장치의 아이템 교환", + "create.ponder.portable_storage_interface.text_1": "움직이는 장치의 보관함은 플레이어가 열 수 없습니다.", + "create.ponder.portable_storage_interface.text_2": "아이템 인터페이스는 장치를 멈추지 않아도 장치 보관함과 상호작용할 수 있습니다.", + "create.ponder.portable_storage_interface.text_3": "두 번째 인터페이스를 1~2 블록 띄우고 설치하세요.", + "create.ponder.portable_storage_interface.text_4": "서로를 마주칠 때마다, 접속을 시도합니다.", + "create.ponder.portable_storage_interface.text_5": "접속한 상태에서, 블록 상태의 인터페이스는 장치의 모든 보관함과 동일합니다.", + "create.ponder.portable_storage_interface.text_6": "아이템을 넣을 수도 있고...", + "create.ponder.portable_storage_interface.text_7": "...장치에서 아이템을 뺄 수도 있습니다.", + "create.ponder.portable_storage_interface.text_8": "일정 시간동안 아이템이 교환되지 않으면, 장치는 움직입니다.", - "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.portable_storage_interface_redstone.header": "레드스톤 설정", + "create.ponder.portable_storage_interface_redstone.text_1": "레드스톤 신호를 받으면 인터페이스가 작동하지 않습니다.", - "create.ponder.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", - "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", - "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", - "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", - "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + "create.ponder.powered_latch.header": "레드스톤 걸쇠 사용하기", + "create.ponder.powered_latch.text_1": "레드스톤 걸쇠는 설정 가능한 레버입니다.", + "create.ponder.powered_latch.text_2": "뒤에서 오는 신호는 걸쇠 신호를 키고...", + "create.ponder.powered_latch.text_3": "...옆에서 오는 신호는 걸쇠 신호를 끕니다.", + "create.ponder.powered_latch.text_4": "레드스톤 걸쇠는 직접 끄고 킬 수도 있습니다.", - "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", - "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", - "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", - "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", - "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + "create.ponder.powered_toggle_latch.header": "레드스톤 토글 걸쇠 사용하기", + "create.ponder.powered_toggle_latch.text_1": "레드스톤 토글 걸쇠는 설정 가능한 레버입니다.", + "create.ponder.powered_toggle_latch.text_2": "뒤에서 오는 신호는 걸쇠의 신호를 킵니다.", + "create.ponder.powered_toggle_latch.text_3": "혹은 끕니다.", + "create.ponder.powered_toggle_latch.text_4": "레드스톤 토글 걸쇠는 직접 끄고 킬 수도 있습니다.", - "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", - "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.pulse_repeater.header": "펄스 중계기 사용하기", + "create.ponder.pulse_repeater.text_1": "펄스 중계기는 어느 레드스톤 신호라도 1틱 신호로 바꿉니다.", - "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", - "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", - "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", - "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", - "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", - "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", - "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", - "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", - "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", - "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + "create.ponder.radial_chassis.header": "원형 섀시를 이용해 블록 붙이기", + "create.ponder.radial_chassis.text_1": "원형 섀시는 다른 원형 섀시와 이어집니다.", + "create.ponder.radial_chassis.text_2": "하나가 움직이면, 다른 섀시도 같이 움직입니다.", + "create.ponder.radial_chassis.text_3": "원형 섀시의 옆면은 접착할 수 있습니다.", + "create.ponder.radial_chassis.text_4": "한번 더 클릭하여 모든 면을 접착면으로 만들 수 있습니다.", + "create.ponder.radial_chassis.text_5": "빈손으로 웅크리고 우클릭하여 접착제를 없앨 수 있습니다.", + "create.ponder.radial_chassis.text_6": "접착면에 블록이 있으면...", + "create.ponder.radial_chassis.text_7": "...해당 층 반지름 안에 있는 모든 블록을 연결합니다.", + "create.ponder.radial_chassis.text_8": "렌치룰 이용하여, 섀시의 부착 반지름을 조절할 수 있습니다.", + "create.ponder.radial_chassis.text_9": "접착면 반지름 밖의 블록은 붙지 않습니다.", - "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", - "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", - "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_contact.header": "동형 감지기", + "create.ponder.redstone_contact.text_1": "서로 마주보는 동형 감지기는 레드스톤 신호를 발생시킵니다.", + "create.ponder.redstone_contact.text_2": "어느 한쪽이 움직이는 장치의 일부라도 동일하게 작동합니다.", - "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", - "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", - "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", - "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", - "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", + "create.ponder.redstone_link.header": "레드스톤 링크 사용하기", + "create.ponder.redstone_link.text_1": "레드스톤 링크는 레드스톤 신호를 무선으로 전달합니다.", + "create.ponder.redstone_link.text_2": "웅크리면서 우클릭하여 신호를 수신하게 만듭니다.", + "create.ponder.redstone_link.text_3": "렌치로 우클릭도 같은 기능을 합니다.", + "create.ponder.redstone_link.text_4": "수신기는 128블록이내의 발신기 레드스톤 신호 세기를 전달합니다.", + "create.ponder.redstone_link.text_5": "두 슬롯에 아이템을 두어 주파수를 설정할 수 있습니다.", + "create.ponder.redstone_link.text_6": "맞는 주파수끼리만 레드스톤 링크가 작동합니다.", - "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", - "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", - "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + "create.ponder.rope_pulley.header": "밧줄 도르래로 구조물 옮기기", + "create.ponder.rope_pulley.text_1": "밧줄 도르래는 동력을 받으면 블록을 수직으로 옮깁니다.", + "create.ponder.rope_pulley.text_2": "방향과 속도는 들어오는 동력에 기반합니다.", - "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", - "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", - "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", - "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + "create.ponder.rope_pulley_attachment.header": "구조물로서의 밧줄 도르래", + "create.ponder.rope_pulley_attachment.text_1": "도르래가 장치에 의해 움직여지면...", + "create.ponder.rope_pulley_attachment.text_2": "...도르래에 딸린 구조물도 함께 움직입니다.", + "create.ponder.rope_pulley_attachment.text_3": "다만 도르래는 멈춰있을 때만 작동합니다.", - "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", - "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", - "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rope_pulley_modes.header": "밧줄 도르래의 이동 설정", + "create.ponder.rope_pulley_modes.text_1": "도르래가 움직임을 멈추면, 움직인 구조물은 블록으로 바뀝니다.", + "create.ponder.rope_pulley_modes.text_2": "블록으로 바뀌지 않게 하거나, 시작지점에서만 바뀌도록 설정할 수 있습니다.", - "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", - "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", - "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + "create.ponder.rotation_speed_controller.header": "회전 속도 컨트롤러 사용하기", + "create.ponder.rotation_speed_controller.text_1": "회전 속도 컨트롤러는 회전을 위 톱니바퀴로 회전을 전달합니다.", + "create.ponder.rotation_speed_controller.text_2": "스크롤하여 톱니바퀴에 전달되는 RPM을 조절합니다.", - "create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails", - "create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with", - "create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks", - "create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them", - "create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames", + "create.ponder.sail.header": "날개를 이용해 풍차 조립하기", + "create.ponder.sail.text_1": "날개는 풍차를 만들기에 좋은 블록입니다.", + "create.ponder.sail.text_2": "강력 접착제나 섀시 없이 연결할 수 있습니다", + "create.ponder.sail.text_3": "염료로 우클릭하여 염색합니다.", + "create.ponder.sail.text_4": "가위로 우클릭하여 틀만 남길 수 있습니다.", - "create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames", - "create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with", - "create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks", + "create.ponder.sail_frame.header": "날개 틀을 이용해 풍차 조립하기", + "create.ponder.sail_frame.text_1": "날개 틀은 풍차를 만들기에 좋은 블록입니다.", + "create.ponder.sail_frame.text_2": "강력 접착제나 섀시 없이 연결할 수 있습니다", - "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", - "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", - "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", - "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", - "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", - "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.sequenced_gearshift.header": "순서화 전환기를 통한 회전 속도 제어", + "create.ponder.sequenced_gearshift.text_1": "순서화 전환기는 설정한 지시에 따라 회전됩니다.", + "create.ponder.sequenced_gearshift.text_2": "오른쪽 버튼을 누르면 설정 창이 열립니다.", + "create.ponder.sequenced_gearshift.text_3": "레드스톤 신호를 받으면 설정된 지시에 따라 회전하기 시작합니다.", + "create.ponder.sequenced_gearshift.text_4": "완료되면, 다음 레드스톤 신호를 기다립니다.", + "create.ponder.sequenced_gearshift.text_5": "레드스톤 비교기를 사용하면 현재 진행 상황을 알 수 있습니다.", - "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.shaft.header": "축을 통한 동력 전달", + "create.ponder.shaft.text_1": "축은 일직선으로 회전을 전달합니다.", - "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.shaft_casing.header": "축에 케이스 씌우기", + "create.ponder.shaft_casing.text_1": "황동 케이스나 안산암 케이스로 축을 장식할 수 있습니다.", - "create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes", - "create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control", - "create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer", - "create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size", - "create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.", + "create.ponder.smart_chute.header": "스마트 슈트을 통한 아이템 필터", + "create.ponder.smart_chute.text_1": "스마트 슈트은 필터 기능이 있는 슈트입니다.", + "create.ponder.smart_chute.text_2": "필터 슬롯으로 아이템을 지정하여 원하는 아이템을 입출력할 수 있습니다.", + "create.ponder.smart_chute.text_3": "스크롤하여 한 번에 내보내는 아이템의 양을 조절합니다.", + "create.ponder.smart_chute.text_4": "레드스톤 신호를 받으면 작동을 멈춥니다.", - "create.ponder.smart_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Smart Pipes", - "create.ponder.smart_pipe.text_1": "UNLOCALIZED: Smart pipes can help control flows by fluid type", - "create.ponder.smart_pipe.text_2": "UNLOCALIZED: When placed directly at the source, they can specify the type of fluid to extract", - "create.ponder.smart_pipe.text_3": "UNLOCALIZED: Simply Right-Click their filter slot with any item containing the desired fluid", - "create.ponder.smart_pipe.text_4": "UNLOCALIZED: When placed further down a pipe network, smart pipes will only let matching fluids continue", + "create.ponder.smart_pipe.header": "스마트 파이프를 통한 액체 필터", + "create.ponder.smart_pipe.text_1": "스마트 파이프는 필터 기능이 있는 파이프입니다.", + "create.ponder.smart_pipe.text_2": "비울 곳에다 설치하면, 어떤 액체를 뽑아낼지 설정할 수 있습니다.", + "create.ponder.smart_pipe.text_3": "필터 슬롯에 원하는 액체가 담긴 용기를 우클릭하면 됩니다.", + "create.ponder.smart_pipe.text_4": "다른 곳에 설치하면, 스마트 파이프는 맞는 액체만 통과시킵니다.", - "create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer", - "create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components", - "create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge", - "create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements", + "create.ponder.speedometer.header": "속도 계측기를 통한 정보 확인", + "create.ponder.speedometer.text_1": "속도 계측기는 연결된 장치의 속도를 표시합니다.", + "create.ponder.speedometer.text_2": "고글을 장착하면, 세부 정보를 확인할 수 있습니다.", + "create.ponder.speedometer.text_3": "속도 계측기의 측정값에 따라 비교기가 레드스톤 신호를 내보냅니다.", - "create.ponder.spout_filling.header": "UNLOCALIZED: Filling Items using a Spout", - "create.ponder.spout_filling.text_1": "UNLOCALIZED: The Spout can fill fluid holding items provided beneath it", - "create.ponder.spout_filling.text_2": "UNLOCALIZED: The content of a Spout cannot be accessed manually", - "create.ponder.spout_filling.text_3": "UNLOCALIZED: Instead, Pipes can be used to supply it with fluids", - "create.ponder.spout_filling.text_4": "UNLOCALIZED: The Input items can be placed on a Depot under the Spout", - "create.ponder.spout_filling.text_5": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.spout_filling.text_6": "UNLOCALIZED: The Spout will hold and process them automatically", + "create.ponder.spout_filling.header": "주입기로 아이템에 액체 채우기", + "create.ponder.spout_filling.text_1": "주입기는 아래있는 아이템을 액체를 채웁니다.", + "create.ponder.spout_filling.text_2": "주입기 탱크는 직접 건드릴 수 없습니다.", + "create.ponder.spout_filling.text_3": "대신, 파이프로 액체를 공급할 수는 있습니다.", + "create.ponder.spout_filling.text_4": "주입기 아래 아이템 거치대에 아이템을 놓아, 액체를 채울 수 있습니다.", + "create.ponder.spout_filling.text_5": "아이템이 벨트에 있으면...", + "create.ponder.spout_filling.text_6": "...주입기가 알아서 아이템 이동을 멈추고 가공합니다.", - "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", - "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", - "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", - "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", - "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + "create.ponder.stabilized_bearings.header": "베어링 안정화", + "create.ponder.stabilized_bearings.text_1": "베어링이 움직이는 구조물의 일부분이어도...", + "create.ponder.stabilized_bearings.text_2": "...방향이 유지됩니다.", + "create.ponder.stabilized_bearings.text_3": "베어링에 블록이 부착되어도...", + "create.ponder.stabilized_bearings.text_4": "...부착된 구조물의 방향이 유지됩니다.", - "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", - "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", - "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", - "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", - "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + "create.ponder.sticker.header": "부착기를 통한 블록 부착", + "create.ponder.sticker.text_1": "부착기는 레드스톤으로 제어할 수 있습니다.", + "create.ponder.sticker.text_2": "신호를 받으면, 부착기가 블록을 부착합니다.", + "create.ponder.sticker.text_3": "장치가 이동하면 부착된 블록도 같이 이동합니다.", + "create.ponder.sticker.text_4": "다시 한번 신호를 받으면, 블록이 부착되지 않습니다.", - "create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer", - "create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network", - "create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge", - "create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements", + "create.ponder.stressometer.header": "피로도 계측기를 통한 동적 정보 확인", + "create.ponder.stressometer.text_1": "피로도 계측기는 연결된 장치의 현재 부하를 표시합니다.", + "create.ponder.stressometer.text_2": "고글을 장착하면, 세부 정보를 확인할 수 있습니다.", + "create.ponder.stressometer.text_3": "피로도 계측기의 측정값에 따라 비교기가 레드스톤 신호를 내보냅니다.", - "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", - "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", - "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", - "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", - "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", - "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "create.ponder.super_glue.header": "강력 접착제로 블록 붙이기", + "create.ponder.super_glue.text_1": "강력 접착제는 두 블록 사이에 사용해 블록을 붙입니다.", + "create.ponder.super_glue.text_2": "장치가 작동할 때, 붙은 블록들은 같이 이동됩니다.", + "create.ponder.super_glue.text_3": "강력 접착제를 다른 손에 들고...", + "create.ponder.super_glue.text_4": "...블록을 설치하면 자동으로 블록을 붙일 수 있습니다.", + "create.ponder.super_glue.text_5": "왼쪽 버튼을 누르면 강력 접착제를 제거할 수 있습니다.", - "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", - "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", - "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", - "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", - "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", - "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + "create.ponder.valve_handle.header": "밸브 손잡이로 동력 생산하기", + "create.ponder.valve_handle.text_1": "밸브 손잡이를 사용하면 수동으로 동력을 생성할 수 있습니다.", + "create.ponder.valve_handle.text_2": "오클릭하면 반시계 방향으로 회전합니다.", + "create.ponder.valve_handle.text_3": "전달되는 속도는 상대적으로 낮습니다.", + "create.ponder.valve_handle.text_4": "웅크리고 우클릭하면 시계 방향으로 회전합니다.", + "create.ponder.valve_handle.text_5": "염료로 염색할 수 있습니다.", - "create.ponder.valve_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Valves", - "create.ponder.valve_pipe.text_1": "UNLOCALIZED: Valve pipes help control fluids propagating through pipe networks", - "create.ponder.valve_pipe.text_2": "UNLOCALIZED: Their shaft input controls whether fluid is currently allowed through", - "create.ponder.valve_pipe.text_3": "UNLOCALIZED: Given Rotational Force in the opening direction, the valve will open up", - "create.ponder.valve_pipe.text_4": "UNLOCALIZED: It can be closed again by reversing the input rotation", + "create.ponder.valve_pipe.header": "밸브로 흐름 조절하기", + "create.ponder.valve_pipe.text_1": "밸브는 파이프 속 액체 흐름을 조절합니다.", + "create.ponder.valve_pipe.text_2": "밸브의 축으로 액체가 통과할 수 있는지 조절합니다.", + "create.ponder.valve_pipe.text_3": "동력을 제공하면 밸브가 열립니다.", + "create.ponder.valve_pipe.text_4": "반대 방향으로 동력을 제공하면 밸브가 닫힙니다.", - "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", - "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", - "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", - "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", - "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "create.ponder.water_wheel.header": "물레바퀴로 동력 생산하기", + "create.ponder.water_wheel.text_1": "물레바퀴는 물의 흐름으로부터 동력을 끌어옵니다.", + "create.ponder.water_wheel.text_2": "많은 면에 힘이 가해질수록 물레바퀴가 더 빠르게 회전합니다.", + "create.ponder.water_wheel.text_3": "바퀴의 날이 물이 흐르는 방향으로 향하게 된다면...", + "create.ponder.water_wheel.text_4": "...회전 속도가 감소하게 됩니다.", - "create.ponder.weighted_ejector.header": "UNLOCALIZED: Using Weighted Ejectors", - "create.ponder.weighted_ejector.text_1": "UNLOCALIZED: Sneak and Right-Click holding an Ejector to select its target location", - "create.ponder.weighted_ejector.text_10": "UNLOCALIZED: It is now limited to this stack size, and only activates when its held stack reaches this amount", - "create.ponder.weighted_ejector.text_11": "UNLOCALIZED: Other Entities will always trigger an Ejector when stepping on it", - "create.ponder.weighted_ejector.text_2": "UNLOCALIZED: The placed ejector will now launch objects to the marked location", - "create.ponder.weighted_ejector.text_3": "UNLOCALIZED: A valid target can be at any height or distance within range", - "create.ponder.weighted_ejector.text_4": "UNLOCALIZED: They cannot however be off to a side", - "create.ponder.weighted_ejector.text_5": "UNLOCALIZED: If no valid Target was selected, it will simply target the block directly in front", - "create.ponder.weighted_ejector.text_6": "UNLOCALIZED: Supply Rotational Force in order to charge it up", - "create.ponder.weighted_ejector.text_7": "UNLOCALIZED: Items placed on the ejector cause it to trigger", - "create.ponder.weighted_ejector.text_8": "UNLOCALIZED: If Inventories are targeted, the ejector will wait until there is space", - "create.ponder.weighted_ejector.text_9": "UNLOCALIZED: Using the Wrench, a required Stack Size can be configured", + "create.ponder.weighted_ejector.header": "투척기 사용하기", + "create.ponder.weighted_ejector.text_1": "투척기를 들고 웅크리고 우클릭하면, 발사 지점을 정할 수 있습니다.", + "create.ponder.weighted_ejector.text_10": "투척기에 놓인 아이템의 양이 설정량에 도달한 경우에만 투척기가 작동합니다.", + "create.ponder.weighted_ejector.text_11": "다른 엔티티가 발사대를 밟으면, 항상 발사대가 작동합니다.", + "create.ponder.weighted_ejector.text_2": "투척기는 지정한 위치에다 물체를 투척합니다.", + "create.ponder.weighted_ejector.text_3": "이 범위의 아무 장소에 투척할 수 있습니다.", + "create.ponder.weighted_ejector.text_4": "옆으로 투척할 수는 없습니다.", + "create.ponder.weighted_ejector.text_5": "투척 지점이 선택되지 않거나 올바르지 않은 경우, 바로 앞에 물체를 투척합니다.", + "create.ponder.weighted_ejector.text_6": "투척하려면 회전력이 필요합니다.", + "create.ponder.weighted_ejector.text_7": "투척기에 아이템을 놓으면 투척기가 작동합니다.", + "create.ponder.weighted_ejector.text_8": "보관함이 투척 지점인 경우에는 보관함에 공간이 생길 때까지 기다립니다.", + "create.ponder.weighted_ejector.text_9": "렌치를 사용하여, 투척에 필요한 아이템의 양을 설정할 수 있습니다.", - "create.ponder.weighted_ejector_redstone.header": "UNLOCALIZED: Controlling Weighted Ejectors with Redstone", - "create.ponder.weighted_ejector_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Ejectors will not activate", - "create.ponder.weighted_ejector_redstone.text_2": "UNLOCALIZED: Furthermore, Observers can detect when Ejectors activate", + "create.ponder.weighted_ejector_redstone.header": "투척기와 레드스톤", + "create.ponder.weighted_ejector_redstone.text_1": "레드스톤 신호를 받으면, 투척기가 작동하지 않습니다.", + "create.ponder.weighted_ejector_redstone.text_2": "관측기는 투척기가 작동하는 것을 탐지할 수 있습니다.", - "create.ponder.weighted_ejector_tunnel.header": "UNLOCALIZED: Splitting item stacks using Weighted Ejectors", - "create.ponder.weighted_ejector_tunnel.text_1": "UNLOCALIZED: Combined with Brass Tunnels, Ejectors can split item stacks by specific amounts", - "create.ponder.weighted_ejector_tunnel.text_2": "UNLOCALIZED: First, configure the Brass Tunnel to 'Prefer Nearest', in order to prioritize its side output", - "create.ponder.weighted_ejector_tunnel.text_3": "UNLOCALIZED: The Stack Size set on the Ejector now determines the amount to be split off", - "create.ponder.weighted_ejector_tunnel.text_4": "UNLOCALIZED: While a new stack of the configured size exits the side output...", - "create.ponder.weighted_ejector_tunnel.text_5": "UNLOCALIZED: ...the remainder will continue on its path", + "create.ponder.weighted_ejector_tunnel.header": "투척기로 아이템 분할하기", + "create.ponder.weighted_ejector_tunnel.text_1": "황동 터널과 같이 사용하면 특정 양만큼 아이템을 분할할 수 있습니다.", + "create.ponder.weighted_ejector_tunnel.text_2": "먼저, 황동 터널을 '가까운 곳 선호' 방식으로 변경하여 측면에 아이템을 먼저 출력하게 만드세요.", + "create.ponder.weighted_ejector_tunnel.text_3": "이제, 투척기에 설정량에 따라 아이템을 분할할 수 있습니다.", + "create.ponder.weighted_ejector_tunnel.text_4": "설정량만큼의 아이템이 출력되고...", + "create.ponder.weighted_ejector_tunnel.text_5": "...나머지 아이템은 계속 수송됩니다", - "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", - "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", - "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", - "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", - "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", - "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", - "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + "create.ponder.windmill_source.header": "풍차 베어링으로 동력 생산하기", + "create.ponder.windmill_source.text_1": "풍차 베어링은 부착된 블록을 회전하게 만듭니다.", + "create.ponder.windmill_source.text_2": "날개 블록이 충분히 부착되어야 풍차의 역할을 합니다.", + "create.ponder.windmill_source.text_3": "우클릭하면 풍차 베어링이 동력을 생성합니다.", + "create.ponder.windmill_source.text_4": "날개 수에 따라 회전 속도가 바뀝니다.", + "create.ponder.windmill_source.text_5": "렌치를 들고 스크롤하면 회전 방향을 바꿀 수 있습니다.", + "create.ponder.windmill_source.text_6": "베어링에 우클릭하면 멈추고, 구조물을 수정할 수 있게 됩니다", - "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", - "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "create.ponder.windmill_structure.header": "풍차 구조물", + "create.ponder.windmill_structure.text_1": "최소 8개 이상의 날개 블록이 있는 구조물만 풍차로 사용할 수 있습니다.", "_": "Thank you for translating Create!" diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index d0630f074..76094fd59 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1723", + "_": "Missing Localizations: 1767", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,10 +28,12 @@ "block.create.belt": "Mechanische Transportband", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.black_nixie_tube": "UNLOCALIZED: Black Nixie Tube", "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_nixie_tube": "UNLOCALIZED: Blue Nixie Tube", "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "UNLOCALIZED: Brass Encased Shaft", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_nixie_tube": "UNLOCALIZED: Brown Nixie Tube", "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", @@ -73,7 +76,7 @@ "block.create.crushing_wheel": "Verpulveraar", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "UNLOCALIZED: Cyan Nixie Tube", "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", @@ -180,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.gray_nixie_tube": "UNLOCALIZED: Gray Nixie Tube", "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_nixie_tube": "UNLOCALIZED: Green Nixie Tube", "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "UNLOCALIZED: Hand Crank", + "block.create.haunted_bell": "UNLOCALIZED: Haunted Bell", "block.create.honey": "UNLOCALIZED: Honey", "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", @@ -205,12 +211,15 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.light_blue_nixie_tube": "UNLOCALIZED: Light Blue Nixie Tube", "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_nixie_tube": "UNLOCALIZED: Light Gray Nixie Tube", "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_nixie_tube": "UNLOCALIZED: Lime Nixie Tube", "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", @@ -227,6 +236,7 @@ "block.create.limestone_pillar": "Kalksteen Pillar", "block.create.linear_chassis": "Lineaar Frame", "block.create.lit_blaze_burner": "UNLOCALIZED: Lit Blaze Burner", + "block.create.magenta_nixie_tube": "UNLOCALIZED: Magenta Nixie Tube", "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", @@ -311,6 +321,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.pink_nixie_tube": "UNLOCALIZED: Pink Nixie Tube", "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", @@ -345,10 +356,12 @@ "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", "block.create.pulse_repeater": "Pulse Versterker", + "block.create.purple_nixie_tube": "UNLOCALIZED: Purple Nixie Tube", "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Rotation Frame", + "block.create.red_nixie_tube": "UNLOCALIZED: Red Nixie Tube", "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", @@ -405,17 +418,22 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Verweerde Kalksteen Pilaar", "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", + "block.create.white_nixie_tube": "UNLOCALIZED: White Nixie Tube", "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", + "block.create.yellow_nixie_tube": "UNLOCALIZED: Yellow Nixie Tube", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Block of Zinc", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", + "enchantment.create.capacity": "UNLOCALIZED: Capacity", + "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.contraption": "UNLOCALIZED: Contraption", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", @@ -444,13 +462,13 @@ "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", "item.create.copper_ingot": "Koperstaaf", "item.create.copper_nugget": "Koper klompje", "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore", "item.create.crushed_brass": "Gemalen Brons", "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", @@ -479,7 +497,9 @@ "item.create.handheld_worldshaper": "UNLOCALIZED: Creative Worldshaper", "item.create.honey_bucket": "UNLOCALIZED: Honey Bucket", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "UNLOCALIZED: Incomplete Cogwheel", + "item.create.incomplete_large_cogwheel": "UNLOCALIZED: Incomplete Large Cogwheel", + "item.create.incomplete_precision_mechanism": "UNLOCALIZED: Incomplete Precision Mechanism", "item.create.iron_sheet": "IJzeren Platen", "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", @@ -487,6 +507,7 @@ "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.precision_mechanism": "UNLOCALIZED: Precision Mechanism", "item.create.propeller": "Propeller", "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", "item.create.refined_radiance": "UNLOCALIZED: Refined Radiance", @@ -631,8 +652,8 @@ "advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect an engine to the Flywheel.", "advancement.create.overstress_flywheel": "UNLOCALIZED: High levels of Stress", "advancement.create.overstress_flywheel.desc": "UNLOCALIZED: Overstress a Furnace Engine.", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities", + "advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.", "advancement.create.mechanical_arm": "UNLOCALIZED: Busy Hands!", "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch as it does all the work for you.", "advancement.create.musical_arm": "UNLOCALIZED: Play Me My Theme Tune!", @@ -673,13 +694,19 @@ "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", "death.attack.create.crush": "%1$s is verwerkd door verpulverende wielen", + "death.attack.create.crush.player": "UNLOCALIZED: %1$s was thrown into Crushing Wheels by %2$s", "death.attack.create.fan_fire": "%1$s is verbrand door hete lucht", + "death.attack.create.fan_fire.player": "UNLOCALIZED: %1$s was thrown into a smoker by %2$s", "death.attack.create.fan_lava": "%1$s is verbrand door een lava ventilator", + "death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s", "death.attack.create.mechanical_drill": "%1$s is gespietst door een mechanische boor", + "death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s", "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", + "death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s", "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + "death.attack.create.cuckoo_clock_explosion.player": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", @@ -725,7 +752,7 @@ "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.assembly.junk": "UNLOCALIZED: Random salvage", "create.recipe.processing.chance": "%1$s%% Kans", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s", + "create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s", + "create.item_attributes.shulker_level.full": "UNLOCALIZED: full", + "create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty", + "create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled", "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", @@ -1134,6 +1166,9 @@ "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "UNLOCALIZED: Currently distributing:", + "create.tooltip.brass_tunnel.contains_entry": "UNLOCALIZED: > %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "UNLOCALIZED: Right-Click to retrieve", "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", @@ -1149,6 +1184,10 @@ "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.potato_cannon.ammo.attack_damage": "UNLOCALIZED: %1$s Attack Damage", + "create.potato_cannon.ammo.reload_ticks": "UNLOCALIZED: %1$s Reload Ticks", + "create.potato_cannon.ammo.knockback": "UNLOCALIZED: %1$s Knockback", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", @@ -1183,15 +1222,17 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", + "create.subtitle.mixing": "UNLOCALIZED: Mixing noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.crushing_1": "UNLOCALIZED: Crushing noises", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel flaps", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.haunted_bell_use": "UNLOCALIZED: Haunted Bell tolls", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", @@ -1202,13 +1243,12 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", @@ -1373,6 +1413,11 @@ "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "UNLOCALIZED: CONTROLLER RAIL", "block.create.controller_rail.tooltip.summary": "UNLOCALIZED: A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", "block.create.controller_rail.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", @@ -1437,12 +1482,12 @@ "item.create.minecart_coupling.tooltip.behaviour1": "UNLOCALIZED: _Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.", "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "UNLOCALIZED: HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "UNLOCALIZED: A _Cursed Bell_ haunted by lost souls of the Nether.", + "block.create.haunted_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", + "block.create.haunted_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1464,41 +1509,41 @@ "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", - "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", - "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", + "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", - "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", - "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", - "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", - "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", - "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", - "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", - "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", - "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", - "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", - "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", - "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", - "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", - "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", - "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", - "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", - "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", - "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", - "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", + "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", + "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", @@ -1729,7 +1774,8 @@ "create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly", "create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines", "create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating", + "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: The flame can be transformed using a soul-infused item", + "create.ponder.empty_blaze_burner.text_6": "UNLOCALIZED: However, without a blaze they are not suitable for industrial heating", "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", @@ -2046,6 +2092,7 @@ "create.ponder.nixie_tube.header": "UNLOCALIZED: Using Nixie Tubes", "create.ponder.nixie_tube.text_1": "UNLOCALIZED: When powered by Redstone, Nixie Tubes will display the redstone signals' strength", "create.ponder.nixie_tube.text_2": "UNLOCALIZED: Using name tags edited with an anvil, custom text can be displayed", + "create.ponder.nixie_tube.text_3": "UNLOCALIZED: Right-Click with Dye to change their display colour", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index 2ef7a4458..da08aed47 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 212", + "_": "Missing Localizations: 256", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,10 +28,12 @@ "block.create.belt": "Taśma", "block.create.birch_window": "Brzozowe okno", "block.create.birch_window_pane": "Brzozowa szyba okienna", + "block.create.black_nixie_tube": "UNLOCALIZED: Black Nixie Tube", "block.create.black_sail": "Czarny żagiel", "block.create.black_seat": "Czarne siedzenie", "block.create.black_valve_handle": "Czarne pokrętło", "block.create.blaze_burner": "Płomienny palnik", + "block.create.blue_nixie_tube": "UNLOCALIZED: Blue Nixie Tube", "block.create.blue_sail": "Niebieski żagiel", "block.create.blue_seat": "Niebieskie siedzenie", "block.create.blue_valve_handle": "Niebieskie pokrętło", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "Mosiężny izolowany wał", "block.create.brass_funnel": "Mosiężny lejek", "block.create.brass_tunnel": "Mosiężny tunel", + "block.create.brown_nixie_tube": "UNLOCALIZED: Brown Nixie Tube", "block.create.brown_sail": "Brązowy żagiel", "block.create.brown_seat": "Brązowe siedzenie", "block.create.brown_valve_handle": "Brązowe pokrętło", @@ -73,7 +76,7 @@ "block.create.crushing_wheel": "Koło kruszące", "block.create.crushing_wheel_controller": "Sterownik koła kruszącego", "block.create.cuckoo_clock": "Zegar z kukułką", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "UNLOCALIZED: Cyan Nixie Tube", "block.create.cyan_sail": "Błękitny żagiel", "block.create.cyan_seat": "Błękitne siedzenie", "block.create.cyan_valve_handle": "Błękitne pokrętło", @@ -180,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "Granitowe brukowe schody", "block.create.granite_cobblestone_wall": "Granitowy brukowy murek", "block.create.granite_pillar": "Granitowy filar", + "block.create.gray_nixie_tube": "UNLOCALIZED: Gray Nixie Tube", "block.create.gray_sail": "Szary żagiel", "block.create.gray_seat": "Szare siedzenie", "block.create.gray_valve_handle": "Szare pokrętło", + "block.create.green_nixie_tube": "UNLOCALIZED: Green Nixie Tube", "block.create.green_sail": "Zielony żagiel", "block.create.green_seat": "Zielone siedzenie", "block.create.green_valve_handle": "Zielone pokrętło", "block.create.hand_crank": "Ręczna korba", + "block.create.haunted_bell": "UNLOCALIZED: Haunted Bell", "block.create.honey": "Miód", "block.create.horizontal_framed_glass": "Poziome oprawione szkło", "block.create.horizontal_framed_glass_pane": "Pozioma oprawiona szyba", @@ -205,12 +211,15 @@ "block.create.layered_scoria": "Warstwowy żużel", "block.create.layered_weathered_limestone": "Warstwowy zwietrzały wapień", "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.light_blue_nixie_tube": "UNLOCALIZED: Light Blue Nixie Tube", "block.create.light_blue_sail": "Jasnoniebieski żagiel", "block.create.light_blue_seat": "Jasnoniebieskie siedzenie", "block.create.light_blue_valve_handle": "Jasnoniebieskie pokrętło", + "block.create.light_gray_nixie_tube": "UNLOCALIZED: Light Gray Nixie Tube", "block.create.light_gray_sail": "Jasnoszary żagiel", "block.create.light_gray_seat": "Jasnoszare siedzenie", "block.create.light_gray_valve_handle": "Jasnoszare pokrętło", + "block.create.lime_nixie_tube": "UNLOCALIZED: Lime Nixie Tube", "block.create.lime_sail": "Jasnozielony żagiel", "block.create.lime_seat": "Jasnozielone siedzenie", "block.create.lime_valve_handle": "Jasnozielone pokrętło", @@ -227,6 +236,7 @@ "block.create.limestone_pillar": "Wapienny filar", "block.create.linear_chassis": "Stelaż liniowy", "block.create.lit_blaze_burner": "Zapalony płomienny palnik", + "block.create.magenta_nixie_tube": "UNLOCALIZED: Magenta Nixie Tube", "block.create.magenta_sail": "Karmazynowy żagiel", "block.create.magenta_seat": "Karmazynowe siedzenie", "block.create.magenta_valve_handle": "Karmazynowe pokrętło", @@ -311,6 +321,7 @@ "block.create.paved_weathered_limestone_stairs": "Wygładzone zwietrzałe wapienne schody", "block.create.paved_weathered_limestone_wall": "Wygładzony zwietrzały wapienny murek", "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.pink_nixie_tube": "UNLOCALIZED: Pink Nixie Tube", "block.create.pink_sail": "Różowy żagiel", "block.create.pink_seat": "Różowe siedzenie", "block.create.pink_valve_handle": "Różowe pokrętło", @@ -345,10 +356,12 @@ "block.create.powered_toggle_latch": "Zasilany przełącznik", "block.create.pulley_magnet": "Krążek z magnesem", "block.create.pulse_repeater": "Przekaźnik pulsowy", + "block.create.purple_nixie_tube": "UNLOCALIZED: Purple Nixie Tube", "block.create.purple_sail": "Fioletowy żagiel", "block.create.purple_seat": "Fioletowe siedzenie", "block.create.purple_valve_handle": "Fioletowe pokrętło", "block.create.radial_chassis": "Stelaż promienisty", + "block.create.red_nixie_tube": "UNLOCALIZED: Red Nixie Tube", "block.create.red_sail": "Czerwony żagiel", "block.create.red_seat": "Czerwone siedzenie", "block.create.red_valve_handle": "Czerwone pokrętło", @@ -405,17 +418,22 @@ "block.create.weathered_limestone_cobblestone_wall": "Zwietrzały wapienny brukowy murek", "block.create.weathered_limestone_pillar": "Zwietrzały wapienny filar", "block.create.weighted_ejector": "Wyrzutnia odważnikowa", + "block.create.white_nixie_tube": "UNLOCALIZED: White Nixie Tube", "block.create.white_sail": "Biały żagiel", "block.create.white_seat": "Białe siedzenie", "block.create.white_valve_handle": "Białe pokrętło", "block.create.windmill_bearing": "Łożysko wiatraka", "block.create.wooden_bracket": "Drewniany wspornik", + "block.create.yellow_nixie_tube": "UNLOCALIZED: Yellow Nixie Tube", "block.create.yellow_sail": "Żółty żagiel", "block.create.yellow_seat": "Żółte siedzenie", "block.create.yellow_valve_handle": "Żółte pokrętło", "block.create.zinc_block": "Blok cynku", "block.create.zinc_ore": "Ruda cynku", + "enchantment.create.capacity": "UNLOCALIZED: Capacity", + "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.contraption": "Maszyna", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "Maszyna suwnicowa", @@ -444,13 +462,13 @@ "item.create.chocolate_glazed_berries": "Jagody w czekoladzie", "item.create.chromatic_compound": "Związek chromatyczny", "item.create.cinder_flour": "Rozżarzona mąka", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", "item.create.copper_backtank": "Miedziany zbiornik w plecaku", "item.create.copper_ingot": "Sztabka miedzi", "item.create.copper_nugget": "Bryłka miedzi", "item.create.copper_sheet": "Arkusz miedzi", "item.create.crafter_slot_cover": "Przykrywka na slot stołu rzemieślniczego", "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "Rozkruszona ruda żelaza", "item.create.crushed_brass": "Rozkruszony mosiądz", "item.create.crushed_copper_ore": "Rozkruszona ruda miedzi", @@ -479,7 +497,9 @@ "item.create.handheld_worldshaper": "Ręczny kształter", "item.create.honey_bucket": "Wiadro miodu", "item.create.honeyed_apple": "Jabłko w miodzie", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "UNLOCALIZED: Incomplete Cogwheel", + "item.create.incomplete_large_cogwheel": "UNLOCALIZED: Incomplete Large Cogwheel", + "item.create.incomplete_precision_mechanism": "UNLOCALIZED: Incomplete Precision Mechanism", "item.create.iron_sheet": "Arkusz żelaza", "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Maszyna w wagoniku", @@ -487,6 +507,7 @@ "item.create.polished_rose_quartz": "Wypolerowany kwarc różowy", "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Sproszkowany obsydian", + "item.create.precision_mechanism": "UNLOCALIZED: Precision Mechanism", "item.create.propeller": "Śmigło", "item.create.red_sand_paper": "Czerwony papier ścierny", "item.create.refined_radiance": "Świetlisty materiał", @@ -631,8 +652,8 @@ "advancement.create.flywheel.desc": "Skutecznie podłącz silnik do koła zamachowego.", "advancement.create.overstress_flywheel": "Wysoki poziom obciążenia", "advancement.create.overstress_flywheel.desc": "Przeładuj silnik spalinowy.", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities", + "advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.", "advancement.create.mechanical_arm": "Ręce pełne roboty", "advancement.create.mechanical_arm.desc": "Wytwórz ramię mechaniczne, wybierz miejsca wejścia i wyjścia, postaw je i wpraw w ruch. Patrz jak robi wszystko za Ciebie.", "advancement.create.musical_arm": "Zagraj coś dla mnie!", @@ -673,13 +694,19 @@ "itemGroup.create.palettes": "Palety Create", "death.attack.create.crush": "Gracz %1$s został zgnieciony przez koło kruszące", + "death.attack.create.crush.player": "UNLOCALIZED: %1$s was thrown into Crushing Wheels by %2$s", "death.attack.create.fan_fire": "Gracz %1$s poparzył się gorącym powietrzem", + "death.attack.create.fan_fire.player": "UNLOCALIZED: %1$s was thrown into a smoker by %2$s", "death.attack.create.fan_lava": "Gracz %1$s poparzył się kroplami lawy", + "death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s", "death.attack.create.mechanical_drill": "Gracz %1$s nabił się na mechaniczne wiertło", + "death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s", "death.attack.create.mechanical_saw": "Gracz %1$s został przecięty na pół przez mechaniczną piłę", + "death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s", "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "Gracz %1$s został wysadzony w powietrze przez uszkodzony zegar z kukułką", + "death.attack.create.cuckoo_clock_explosion.player": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "zbuntowany aplikator", "create.block.cart_assembler.invalid": "Postaw monter wagoników na torze", @@ -725,7 +752,7 @@ "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.assembly.junk": "UNLOCALIZED: Random salvage", "create.recipe.processing.chance": "%1$s%% szans", "create.recipe.heat_requirement.none": "Nie wymaga podgrzewania", "create.recipe.heat_requirement.heated": "Podrzewane", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "nie jest w grupie \"%1$s\"", "create.item_attributes.added_by": "dodany przez %1$s", "create.item_attributes.added_by.inverted": "niedodany przez %1$s", + "create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s", + "create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s", + "create.item_attributes.shulker_level.full": "UNLOCALIZED: full", + "create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty", + "create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled", "create.item_attributes.has_enchant": "posiada zaklęcie %1$s", "create.item_attributes.has_enchant.inverted": "nie posiada zaklęcia %1$s", "create.item_attributes.color": "jest zafarbowane, kolor %1$s", @@ -1134,6 +1166,9 @@ "create.tooltip.chute.fans_pull_up": "Wiatraki ciągną od góry", "create.tooltip.chute.fans_pull_down": "Wiatraki ciągną od dołu", "create.tooltip.chute.contains": "Zawiera: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "UNLOCALIZED: Currently distributing:", + "create.tooltip.brass_tunnel.contains_entry": "UNLOCALIZED: > %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "UNLOCALIZED: Right-Click to retrieve", "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", @@ -1149,6 +1184,10 @@ "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.potato_cannon.ammo.attack_damage": "UNLOCALIZED: %1$s Attack Damage", + "create.potato_cannon.ammo.reload_ticks": "UNLOCALIZED: %1$s Reload Ticks", + "create.potato_cannon.ammo.knockback": "UNLOCALIZED: %1$s Knockback", + "create.hint.hose_pulley.title": "Niewyczerpany zapas", "create.hint.hose_pulley": "Wybrane zbiornik cieczy jest uznany za nieskończony", "create.hint.mechanical_arm_no_targets.title": "Brak celi", @@ -1187,11 +1226,13 @@ "create.subtitle.mechanical_press_activation_belt": "Mechaniczna prasa stuka", "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "Kształter strzela", + "create.subtitle.crushing_1": "UNLOCALIZED: Crushing noises", "create.subtitle.depot_slide": "Przedmiot ślizga się", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "Płomyk szczęśliwie przeżuwa", "create.subtitle.funnel_flap": "Lejek trzepocze", "create.subtitle.schematicannon_finish": "Schematoarmata skończyła", + "create.subtitle.haunted_bell_use": "UNLOCALIZED: Haunted Bell tolls", "create.subtitle.scroll_value": "Kliknięcie", "create.subtitle.crafter_craft": "Mechaniczny stół rzemieślniczy konstruuje", "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", @@ -1202,13 +1243,12 @@ "create.subtitle.wrench_rotate": "Klucz skrzypi", "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.deployer_polish": "Aplikator poleruje", "create.subtitle.deny": "Dźwięk odmowy", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.schematicannon_launch_block": "Schematoarmata strzela", "create.subtitle.copper_armor_equip": "Sprzęt do nurkowania pobrzękuje", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", "create.subtitle.mechanical_press_activation": "Mechaniczna prasa się uruchamia", "create.subtitle.contraption_assemble": "Maszyna przesuwa się", @@ -1373,6 +1413,11 @@ "block.create.creative_crate.tooltip.condition1": "Kiedy przedmiot jest w slocie na filtr", "block.create.creative_crate.tooltip.behaviour1": "Bloki _wyciągające_ przedmioty z tego bloku będą miały _nieskończony zapas_ wybranego przedmiotu. Przedmioty włożone do tej skrzynki będą _usuwane_.", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "TORY STERUJĄCE", "block.create.controller_rail.tooltip.summary": "_Wielokierunkowy_ zasilany tor pozwalający na _dokładną kontrolę_ nad _prędkością wagonika_.", "block.create.controller_rail.tooltip.condition1": "Kiedy zasilone przez Redstone", @@ -1437,12 +1482,12 @@ "item.create.minecart_coupling.tooltip.behaviour1": "_Łączy_ dwa wagoniki, próbując utrzymać je w stałej odległości od siebie.", "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "UNLOCALIZED: HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "UNLOCALIZED: A _Cursed Bell_ haunted by lost souls of the Nether.", + "block.create.haunted_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", + "block.create.haunted_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1464,41 +1509,41 @@ "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "Z pomocą stelaży lub Super Glue, większe struktury mogą być przesuwane.", - "create.ponder.shared.rpm32": "32 Ob/min", - "create.ponder.shared.sneak_and": "Skradanie +", - "create.ponder.shared.storage_on_contraption": "Pojemniki przyłączone do maszyny będą podnosiły przedmioty automatycznie", + "create.ponder.shared.rpm16": "16 Ob/min", "create.ponder.shared.behaviour_modify_wrench": "To zachowanie może być zmodyfikowane przy pomocy klucza", + "create.ponder.shared.storage_on_contraption": "Pojemniki przyłączone do maszyny będą podnosiły przedmioty automatycznie", + "create.ponder.shared.sneak_and": "Skradanie +", "create.ponder.shared.rpm8": "8 Ob/min", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm32": "32 Ob/min", "create.ponder.shared.rpm16_source": "Źródło: 16 Ob/min", - "create.ponder.shared.rpm16": "16 Ob/min", - "create.ponder.tag.kinetic_sources": "Źródła siły obrotowej", - "create.ponder.tag.kinetic_sources.description": "Komponenty, które generują siłę obrotu", - "create.ponder.tag.contraption_actor": "Komponenty aktywne maszyn", - "create.ponder.tag.contraption_actor.description": "Komponenty, które posiadają specjalne zachowanie będąc podłączonymi do maszyny", - "create.ponder.tag.arm_targets": "Cele dla mechanicznego ramienia", - "create.ponder.tag.arm_targets.description": "Komponenty, które mogą być wybrane, jako wejście lub wyjście dla mechanicznego ramienia", - "create.ponder.tag.logistics": "Transport przedmiotów", - "create.ponder.tag.logistics.description": "Komponenty, które pomagają w transporcie przedmiotów", - "create.ponder.tag.movement_anchor": "Komponenty ruchome", - "create.ponder.tag.movement_anchor.description": "Komponenty, które pozwalają na tworzenie ruchomych maszyn, poruszając ją na wiele różnych sposobów.", - "create.ponder.tag.creative": "Tryb kreatywny", - "create.ponder.tag.creative.description": "Komponenty niedostępne na trybie przetrwania", - "create.ponder.tag.kinetic_relays": "Bloki obrotowe", - "create.ponder.tag.kinetic_relays.description": "Komponenty, które pomagają w przekazywaniu siły obrotowej w inne miejsca", - "create.ponder.tag.windmill_sails": "Bloki żaglo-podobne", - "create.ponder.tag.windmill_sails.description": "Bloki, które dokładają się do siły, z jaką obracają się łopaty maszyny wiatrakowej.", - "create.ponder.tag.contraption_assembly": "Bloki do tworzenia maszyn", - "create.ponder.tag.contraption_assembly.description": "Narzędzia i komponenty używane do konstrukcji ruchomych maszyn", - "create.ponder.tag.decoration": "Dekoracje", - "create.ponder.tag.decoration.description": "Komponenty używane głównie do celów estetycznych", - "create.ponder.tag.kinetic_appliances": "Urządzenia obrotowe", - "create.ponder.tag.kinetic_appliances.description": "Komponenty używające siły obrotowej", + "create.ponder.shared.movement_anchors": "Z pomocą stelaży lub Super Glue, większe struktury mogą być przesuwane.", "create.ponder.tag.redstone": "Komponenty logiczne", "create.ponder.tag.redstone.description": "Komponenty przydatne w Redstonie", + "create.ponder.tag.contraption_assembly": "Bloki do tworzenia maszyn", + "create.ponder.tag.contraption_assembly.description": "Narzędzia i komponenty używane do konstrukcji ruchomych maszyn", "create.ponder.tag.fluids": "Manipulator płynów", "create.ponder.tag.fluids.description": "Komponenty przydatne przy pracy z płynami", + "create.ponder.tag.decoration": "Dekoracje", + "create.ponder.tag.decoration.description": "Komponenty używane głównie do celów estetycznych", + "create.ponder.tag.windmill_sails": "Bloki żaglo-podobne", + "create.ponder.tag.windmill_sails.description": "Bloki, które dokładają się do siły, z jaką obracają się łopaty maszyny wiatrakowej.", + "create.ponder.tag.arm_targets": "Cele dla mechanicznego ramienia", + "create.ponder.tag.arm_targets.description": "Komponenty, które mogą być wybrane, jako wejście lub wyjście dla mechanicznego ramienia", + "create.ponder.tag.kinetic_appliances": "Urządzenia obrotowe", + "create.ponder.tag.kinetic_appliances.description": "Komponenty używające siły obrotowej", + "create.ponder.tag.kinetic_sources": "Źródła siły obrotowej", + "create.ponder.tag.kinetic_sources.description": "Komponenty, które generują siłę obrotu", + "create.ponder.tag.movement_anchor": "Komponenty ruchome", + "create.ponder.tag.movement_anchor.description": "Komponenty, które pozwalają na tworzenie ruchomych maszyn, poruszając ją na wiele różnych sposobów.", + "create.ponder.tag.kinetic_relays": "Bloki obrotowe", + "create.ponder.tag.kinetic_relays.description": "Komponenty, które pomagają w przekazywaniu siły obrotowej w inne miejsca", + "create.ponder.tag.contraption_actor": "Komponenty aktywne maszyn", + "create.ponder.tag.contraption_actor.description": "Komponenty, które posiadają specjalne zachowanie będąc podłączonymi do maszyny", + "create.ponder.tag.creative": "Tryb kreatywny", + "create.ponder.tag.creative.description": "Komponenty niedostępne na trybie przetrwania", + "create.ponder.tag.logistics": "Transport przedmiotów", + "create.ponder.tag.logistics.description": "Komponenty, które pomagają w transporcie przedmiotów", "create.ponder.adjustable_pulse_repeater.header": "Kontrola sygnałów z wykorzystaniem regulowanych przekaźników pulsu", "create.ponder.adjustable_pulse_repeater.text_1": "Regulowane przekaźniki pulsu emitują krótki puls po opóźnieniu", @@ -1729,7 +1774,8 @@ "create.ponder.empty_blaze_burner.text_2": "Ewentualnie, Płomyk może być zabrany prosto z jego Spawnera", "create.ponder.empty_blaze_burner.text_3": "Masz teraz idealne źródło ciepła dla przeróżnych maszyn", "create.ponder.empty_blaze_burner.text_4": "Dla celów dekoracyjnych, puste palniki można też zapalić krzesiwem", - "create.ponder.empty_blaze_burner.text_5": "Nie będzie on dawał jednak ciepła", + "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: The flame can be transformed using a soul-infused item", + "create.ponder.empty_blaze_burner.text_6": "Nie będzie on dawał jednak ciepła", "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", @@ -2046,6 +2092,7 @@ "create.ponder.nixie_tube.header": "Używanie lamp cyfrowych", "create.ponder.nixie_tube.text_1": "Kiedy zasilone, lampy cyfrowe wyświetlą siłę sygnału Redstone, jaki otrzymują", "create.ponder.nixie_tube.text_2": "Używając znaczników i kowadła można wyświetlić własny tekst", + "create.ponder.nixie_tube.text_3": "UNLOCALIZED: Right-Click with Dye to change their display colour", "create.ponder.piston_pole.header": "Przedłużenia tłoka", "create.ponder.piston_pole.text_1": "Bez przyłączonych przedłużeń, mechaniczny tłok nie może się wysunąć", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index cd60e31b3..084267626 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1764", + "_": "Missing Localizations: 1808", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,10 +28,12 @@ "block.create.belt": "Esteira Mecânica", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.black_nixie_tube": "UNLOCALIZED: Black Nixie Tube", "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_nixie_tube": "UNLOCALIZED: Blue Nixie Tube", "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "UNLOCALIZED: Brass Encased Shaft", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_nixie_tube": "UNLOCALIZED: Brown Nixie Tube", "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", @@ -73,7 +76,7 @@ "block.create.crushing_wheel": "Roda de Moer", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "UNLOCALIZED: Cyan Nixie Tube", "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", @@ -180,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.gray_nixie_tube": "UNLOCALIZED: Gray Nixie Tube", "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_nixie_tube": "UNLOCALIZED: Green Nixie Tube", "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "UNLOCALIZED: Hand Crank", + "block.create.haunted_bell": "UNLOCALIZED: Haunted Bell", "block.create.honey": "UNLOCALIZED: Honey", "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", @@ -205,12 +211,15 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.light_blue_nixie_tube": "UNLOCALIZED: Light Blue Nixie Tube", "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_nixie_tube": "UNLOCALIZED: Light Gray Nixie Tube", "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_nixie_tube": "UNLOCALIZED: Lime Nixie Tube", "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", @@ -227,6 +236,7 @@ "block.create.limestone_pillar": "Pilar de Calcário", "block.create.linear_chassis": "Chassis de Translado", "block.create.lit_blaze_burner": "UNLOCALIZED: Lit Blaze Burner", + "block.create.magenta_nixie_tube": "UNLOCALIZED: Magenta Nixie Tube", "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", @@ -311,6 +321,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.pink_nixie_tube": "UNLOCALIZED: Pink Nixie Tube", "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", @@ -345,10 +356,12 @@ "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", "block.create.pulse_repeater": "Repetidor de Pulso", + "block.create.purple_nixie_tube": "UNLOCALIZED: Purple Nixie Tube", "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Chassis de Rotação", + "block.create.red_nixie_tube": "UNLOCALIZED: Red Nixie Tube", "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", @@ -405,17 +418,22 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Pilar de Calcário Resistido", "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", + "block.create.white_nixie_tube": "UNLOCALIZED: White Nixie Tube", "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", + "block.create.yellow_nixie_tube": "UNLOCALIZED: Yellow Nixie Tube", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Block of Zinc", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", + "enchantment.create.capacity": "UNLOCALIZED: Capacity", + "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.contraption": "UNLOCALIZED: Contraption", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", @@ -444,13 +462,13 @@ "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", "item.create.copper_ingot": "UNLOCALIZED: Copper Ingot", "item.create.copper_nugget": "UNLOCALIZED: Copper Nugget", "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "UNLOCALIZED: Crushed Aluminum Ore", "item.create.crushed_brass": "UNLOCALIZED: Crushed Brass", "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", @@ -479,7 +497,9 @@ "item.create.handheld_worldshaper": "UNLOCALIZED: Creative Worldshaper", "item.create.honey_bucket": "UNLOCALIZED: Honey Bucket", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "UNLOCALIZED: Incomplete Cogwheel", + "item.create.incomplete_large_cogwheel": "UNLOCALIZED: Incomplete Large Cogwheel", + "item.create.incomplete_precision_mechanism": "UNLOCALIZED: Incomplete Precision Mechanism", "item.create.iron_sheet": "Placas de Ferro", "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", @@ -487,6 +507,7 @@ "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.precision_mechanism": "UNLOCALIZED: Precision Mechanism", "item.create.propeller": "Hélice", "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", "item.create.refined_radiance": "UNLOCALIZED: Refined Radiance", @@ -631,8 +652,8 @@ "advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect an engine to the Flywheel.", "advancement.create.overstress_flywheel": "UNLOCALIZED: High levels of Stress", "advancement.create.overstress_flywheel.desc": "UNLOCALIZED: Overstress a Furnace Engine.", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities", + "advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.", "advancement.create.mechanical_arm": "UNLOCALIZED: Busy Hands!", "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch as it does all the work for you.", "advancement.create.musical_arm": "UNLOCALIZED: Play Me My Theme Tune!", @@ -673,13 +694,19 @@ "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", "death.attack.create.crush": "%1$s foi processado pelas Rodas de Moer", + "death.attack.create.crush.player": "UNLOCALIZED: %1$s was thrown into Crushing Wheels by %2$s", "death.attack.create.fan_fire": "%1$s foi queimado por ar quente", + "death.attack.create.fan_fire.player": "UNLOCALIZED: %1$s was thrown into a smoker by %2$s", "death.attack.create.fan_lava": "%1$s foi queimado pelo ventilador de lava", + "death.attack.create.fan_lava.player": "UNLOCALIZED: %1$s was thrown into a smelter by %2$s", "death.attack.create.mechanical_drill": "%1$s foi empalado pela Furadeira Mecânica", + "death.attack.create.mechanical_drill.player": "UNLOCALIZED: %1$s was thrown in front of a Drill by %2$s", "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", + "death.attack.create.mechanical_saw.player": "UNLOCALIZED: %1$s was thrown into a Saw by %2$s", "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + "death.attack.create.cuckoo_clock_explosion.player": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", @@ -725,7 +752,7 @@ "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.assembly.junk": "UNLOCALIZED: Random salvage", "create.recipe.processing.chance": "%1$s%% de chance", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s", + "create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s", + "create.item_attributes.shulker_level.full": "UNLOCALIZED: full", + "create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty", + "create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled", "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", @@ -1134,6 +1166,9 @@ "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "UNLOCALIZED: Currently distributing:", + "create.tooltip.brass_tunnel.contains_entry": "UNLOCALIZED: > %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "UNLOCALIZED: Right-Click to retrieve", "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", @@ -1149,6 +1184,10 @@ "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.potato_cannon.ammo.attack_damage": "UNLOCALIZED: %1$s Attack Damage", + "create.potato_cannon.ammo.reload_ticks": "UNLOCALIZED: %1$s Reload Ticks", + "create.potato_cannon.ammo.knockback": "UNLOCALIZED: %1$s Knockback", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", @@ -1183,15 +1222,17 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", + "create.subtitle.mixing": "UNLOCALIZED: Mixing noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.crushing_1": "UNLOCALIZED: Crushing noises", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel flaps", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.haunted_bell_use": "UNLOCALIZED: Haunted Bell tolls", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", @@ -1202,13 +1243,12 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", @@ -1373,6 +1413,11 @@ "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "UNLOCALIZED: CONTROLLER RAIL", "block.create.controller_rail.tooltip.summary": "UNLOCALIZED: A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", "block.create.controller_rail.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", @@ -1437,12 +1482,12 @@ "item.create.minecart_coupling.tooltip.behaviour1": "UNLOCALIZED: _Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.", "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "UNLOCALIZED: HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "UNLOCALIZED: A _Cursed Bell_ haunted by lost souls of the Nether.", + "block.create.haunted_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", + "block.create.haunted_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1464,41 +1509,41 @@ "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", - "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", - "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", + "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", - "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", - "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", - "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", - "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", - "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", - "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", - "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", - "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", - "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", - "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", - "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", - "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", - "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", - "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", - "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", - "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", - "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", - "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", + "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", + "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", @@ -1729,7 +1774,8 @@ "create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly", "create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines", "create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating", + "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: The flame can be transformed using a soul-infused item", + "create.ponder.empty_blaze_burner.text_6": "UNLOCALIZED: However, without a blaze they are not suitable for industrial heating", "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", @@ -2046,6 +2092,7 @@ "create.ponder.nixie_tube.header": "UNLOCALIZED: Using Nixie Tubes", "create.ponder.nixie_tube.text_1": "UNLOCALIZED: When powered by Redstone, Nixie Tubes will display the redstone signals' strength", "create.ponder.nixie_tube.text_2": "UNLOCALIZED: Using name tags edited with an anvil, custom text can be displayed", + "create.ponder.nixie_tube.text_3": "UNLOCALIZED: Right-Click with Dye to change their display colour", "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 5229d9134..df9b7a838 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 769", + "_": "Missing Localizations: 5", "_": "->------------------------] Game Elements [------------------------<-", @@ -27,11 +27,13 @@ "block.create.basin": "Чаша", "block.create.belt": "Конвейер", "block.create.birch_window": "Берёзовое окно", - "block.create.birch_window_pane": "Панель берёзового окна", + "block.create.birch_window_pane": "Панель из берёзового окна", + "block.create.black_nixie_tube": "Чёрный газоразрядный индикатор", "block.create.black_sail": "Чёрный парус", "block.create.black_seat": "Чёрное сиденье", "block.create.black_valve_handle": "Чёрный ручной вентиль", "block.create.blaze_burner": "Горелка Всполоха", + "block.create.blue_nixie_tube": "Синий газоразрядный индикатор", "block.create.blue_sail": "Синий парус", "block.create.blue_seat": "Синее сиденье", "block.create.blue_valve_handle": "Синий ручной вентиль", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "Вал в латунном корпусе", "block.create.brass_funnel": "Латунная воронка", "block.create.brass_tunnel": "Латунный туннель", + "block.create.brown_nixie_tube": "Коричневый газоразрядный индикатор", "block.create.brown_sail": "Коричневый парус", "block.create.brown_seat": "Коричневое сиденье", "block.create.brown_valve_handle": "Коричневый ручной вентиль", @@ -52,13 +55,13 @@ "block.create.chiseled_scoria": "Резной пепел", "block.create.chiseled_weathered_limestone": "Выветренный резной известняк", "block.create.chocolate": "Шоколад", - "block.create.chute": "Желоб", + "block.create.chute": "Жёлоб", "block.create.clockwork_bearing": "Часовой механизм", "block.create.clutch": "Сцепление", "block.create.cogwheel": "Шестерня", - "block.create.content_observer": "Наблюдетель за содержимым", + "block.create.content_observer": "Наблюдатель за содержимым", "block.create.controller_rail": "Контролирующая рельса", - "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "block.create.copper_backtank": "Медный баллон", "block.create.copper_block": "Медный блок", "block.create.copper_casing": "Медный корпус", "block.create.copper_ore": "Медная руда", @@ -73,9 +76,9 @@ "block.create.crushing_wheel": "Колесо дробления", "block.create.crushing_wheel_controller": "Контроллер колеса дробления", "block.create.cuckoo_clock": "Часы с кукушкой", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "Бирюзовый газоразрядный индикатор", "block.create.cyan_sail": "Бирюзовый парус", - "block.create.cyan_seat": "Бирюзовое сииденье", + "block.create.cyan_seat": "Бирюзовое сиденье", "block.create.cyan_valve_handle": "Бирюзовый ручной вентиль", "block.create.dark_oak_window": "Окно из тёмного дуба", "block.create.dark_oak_window_pane": "Панель из окна из тёмного дуб", @@ -84,11 +87,11 @@ "block.create.dark_scoria_bricks_slab": "Плита из тёмного пепельного кирпича", "block.create.dark_scoria_bricks_stairs": "Ступени из тёмного пепельного кирпича", "block.create.dark_scoria_bricks_wall": "Стена из тёмного пепельного кирпича", - "block.create.dark_scoria_cobblestone": "Ступени из тёмного пепел-булыжника", - "block.create.dark_scoria_cobblestone_slab": "Плита из тёмного пепел-булыжника", - "block.create.dark_scoria_cobblestone_stairs": "Ступени из тёмного пепел-булыжника", - "block.create.dark_scoria_cobblestone_wall": "Стена из тёмного пепел-булыжника", - "block.create.dark_scoria_pillar": "Колонна из тёмного пепел-булыжника", + "block.create.dark_scoria_cobblestone": "Ступени из тёмного пепельного булыжника", + "block.create.dark_scoria_cobblestone_slab": "Плита из тёмного пепельного булыжника", + "block.create.dark_scoria_cobblestone_stairs": "Ступени из тёмного пепельного булыжника", + "block.create.dark_scoria_cobblestone_wall": "Стена из тёмного пепельного булыжника", + "block.create.dark_scoria_pillar": "Колонна из тёмного пепельного булыжника", "block.create.deployer": "Автономный активатор", "block.create.depot": "Депо", "block.create.diorite_bricks": "Диоритовый кирпич", @@ -166,8 +169,8 @@ "block.create.gabbro_cobblestone_stairs": "Ступени из габбро-булыжника", "block.create.gabbro_cobblestone_wall": "Стена из габбро-булыжника", "block.create.gabbro_pillar": "Габбро колонна", - "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", - "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", + "block.create.gantry_carriage": "Шасси портального крана", + "block.create.gantry_shaft": "Вал портального крана", "block.create.gearbox": "Коробка передач", "block.create.gearshift": "Реверсивный механизм", "block.create.glass_fluid_pipe": "Стеклянная жидкостная труба", @@ -180,17 +183,20 @@ "block.create.granite_cobblestone_stairs": "Ступени из гранит-булыжника", "block.create.granite_cobblestone_wall": "Стена из гранит-булыжника", "block.create.granite_pillar": "Гранитная колонна", + "block.create.gray_nixie_tube": "Серый газоразрядный индикатор", "block.create.gray_sail": "Серый парус", "block.create.gray_seat": "Серое сиденье", "block.create.gray_valve_handle": "Серый ручной вентиль", + "block.create.green_nixie_tube": "Зелёный газоразрядный индикатор", "block.create.green_sail": "Зелёный парус", "block.create.green_seat": "Зелёное сиденье", "block.create.green_valve_handle": "Зелёный ручной вентиль", "block.create.hand_crank": "Рукоятка", + "block.create.haunted_bell": "Призрачный колокол", "block.create.honey": "Мёд", "block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло", "block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель", - "block.create.hose_pulley": "Шкив с шлангом", + "block.create.hose_pulley": "Шкив со шлангом", "block.create.item_drain": "Предметный осушитель", "block.create.jungle_window": "Окно из тропического дерева", "block.create.jungle_window_pane": "Панель окна из тропического дерева", @@ -204,13 +210,16 @@ "block.create.layered_limestone": "Слоистый известняк", "block.create.layered_scoria": "Слоистый пепел", "block.create.layered_weathered_limestone": "Слоистый выветренный известняк", - "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.lectern_controller": "Контроллер кафедры", + "block.create.light_blue_nixie_tube": "Голубой газоразрядный индикатор", "block.create.light_blue_sail": "Голубой парус", "block.create.light_blue_seat": "Голубое сиденье", "block.create.light_blue_valve_handle": "Голубой ручной вентиль", + "block.create.light_gray_nixie_tube": "Светло-серый газоразрядный индикатор", "block.create.light_gray_sail": "Светло-серый парус", "block.create.light_gray_seat": "Светло-серое сиденье", "block.create.light_gray_valve_handle": "Светло-серый ручной вентиль", + "block.create.lime_nixie_tube": "Лаймовый газоразрядный индикатор", "block.create.lime_sail": "Лаймовый парус", "block.create.lime_seat": "Лаймовое сиденье", "block.create.lime_valve_handle": "Лаймовый ручной вентиль", @@ -226,7 +235,8 @@ "block.create.limestone_cobblestone_wall": "Стена из известняк-булыжника", "block.create.limestone_pillar": "Известковая колонна", "block.create.linear_chassis": "Линейное шасси", - "block.create.lit_blaze_burner": "Зажжёная горелка Всполоха", + "block.create.lit_blaze_burner": "Зажжённая горелка Всполоха", + "block.create.magenta_nixie_tube": "Пурпурный газоразрядный индикатор", "block.create.magenta_sail": "Пурпурный парус", "block.create.magenta_seat": "Пурпурное сиденье", "block.create.magenta_valve_handle": "Пурпурный ручной вентиль", @@ -310,7 +320,8 @@ "block.create.paved_weathered_limestone_slab": "Плита из мощёного выветренного известняка", "block.create.paved_weathered_limestone_stairs": "Ступени из мощёного выветренного известняка", "block.create.paved_weathered_limestone_wall": "Стена из мощёного выветренного известняка", - "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.peculiar_bell": "Особенный колокол", + "block.create.pink_nixie_tube": "Розовый газоразрядный индикатор", "block.create.pink_sail": "Розовый парус", "block.create.pink_seat": "Розовое сиденье", "block.create.pink_valve_handle": "Розовый ручной вентиль", @@ -323,10 +334,10 @@ "block.create.polished_dolomite_slab": "Плита из полированного доломита", "block.create.polished_dolomite_stairs": "Ступени из полированного доломита", "block.create.polished_dolomite_wall": "Стена из полированного доломита", - "block.create.polished_gabbro": "Полированный габро", - "block.create.polished_gabbro_slab": "Плита из полированного габро", - "block.create.polished_gabbro_stairs": "Ступени из полированного габро", - "block.create.polished_gabbro_wall": "Стена из полированного габро", + "block.create.polished_gabbro": "Полированный габбро", + "block.create.polished_gabbro_slab": "Плита из полированного габбро", + "block.create.polished_gabbro_stairs": "Ступени из полированного габбро", + "block.create.polished_gabbro_wall": "Стена из полированного габбро", "block.create.polished_limestone": "Полированный известняк", "block.create.polished_limestone_slab": "Плита из полированного известняка", "block.create.polished_limestone_stairs": "Ступени из полированного известняка", @@ -341,19 +352,21 @@ "block.create.polished_weathered_limestone_wall": "Стена из полированного выветренного известняка", "block.create.portable_fluid_interface": "Портативный жидкостный интерфейс", "block.create.portable_storage_interface": "Портативный интерфейс хранения", - "block.create.powered_latch": "Механизированная защёлка", - "block.create.powered_toggle_latch": "Механизированная рычаг-защёлка", + "block.create.powered_latch": "Питаемый рычаг", + "block.create.powered_toggle_latch": "Питаемый рычаг-переключатель", "block.create.pulley_magnet": "Магнитный шкив", "block.create.pulse_repeater": "Импульсный повторитель", + "block.create.purple_nixie_tube": "Фиолетовый газоразрядный индикатор", "block.create.purple_sail": "Фиолетовый парус", "block.create.purple_seat": "Фиолетовое сиденье", "block.create.purple_valve_handle": "Фиолетовый ручной вентиль", "block.create.radial_chassis": "Радиальное шасси", + "block.create.red_nixie_tube": "Красный газоразрядный индикатор", "block.create.red_sail": "Красный парус", "block.create.red_seat": "Красное сиденье", "block.create.red_valve_handle": "Красный ручной вентиль", - "block.create.redstone_contact": "Контакт сигнала красного камня", - "block.create.redstone_link": "Беспроводной передатчик сигнала красного камня", + "block.create.redstone_contact": "Контакт редстоун сигнала", + "block.create.redstone_link": "Беспроводной передатчик редстоун сигнала", "block.create.refined_radiance_casing": "Сияющий корпус", "block.create.reinforced_rail": "Усиленные рельсы", "block.create.rope": "Канат", @@ -367,16 +380,16 @@ "block.create.scoria_bricks_slab": "Плита из пепельного кирпича", "block.create.scoria_bricks_stairs": "Ступени из пепельного кирпича", "block.create.scoria_bricks_wall": "Стена из пепельного кирпича", - "block.create.scoria_cobblestone": "Пепел-булыжник", - "block.create.scoria_cobblestone_slab": "Плита из пепел-булыжника", - "block.create.scoria_cobblestone_stairs": "Ступени из пепел-булыжника", - "block.create.scoria_cobblestone_wall": "Стена из пепел-булыжника", + "block.create.scoria_cobblestone": "Пепельный булыжник", + "block.create.scoria_cobblestone_slab": "Плита из пепельного булыжника", + "block.create.scoria_cobblestone_stairs": "Ступени из пепельного булыжника", + "block.create.scoria_cobblestone_wall": "Стена из пепельного булыжника", "block.create.scoria_pillar": "Колонна из пепла", "block.create.secondary_linear_chassis": "Вторичное линейное шасси", "block.create.sequenced_gearshift": "Последовательный переключатель передач", "block.create.shadow_steel_casing": "Теневой корпус", "block.create.shaft": "Вал", - "block.create.smart_chute": "Умный желоб", + "block.create.smart_chute": "Умный жёлоб", "block.create.smart_fluid_pipe": "Умная жидкостная труба", "block.create.speedometer": "Спидометр", "block.create.spout": "Дозатор", @@ -385,7 +398,7 @@ "block.create.sticker": "Блок-липучка", "block.create.sticky_mechanical_piston": "Липкий механический поршень", "block.create.stockpile_switch": "Настраиваемый компаратор", - "block.create.stressometer": "Динамометр", + "block.create.stressometer": "Стрессометр", "block.create.tiled_glass": "Плиточное стекло", "block.create.tiled_glass_pane": "Плиточная стеклянная панель", "block.create.turntable": "Поворотный стол", @@ -405,21 +418,26 @@ "block.create.weathered_limestone_cobblestone_wall": "Стена из известняк-булыжника", "block.create.weathered_limestone_pillar": "Колонна из выветренного известняка", "block.create.weighted_ejector": "Взвешенная катапульта", + "block.create.white_nixie_tube": "Белый газоразрядный индикатор", "block.create.white_sail": "Белый парус", "block.create.white_seat": "Белое сиденье", "block.create.white_valve_handle": "Белый ручной вентиль", "block.create.windmill_bearing": "Подшипник ветряной мельницы", "block.create.wooden_bracket": "Деревянная скоба", + "block.create.yellow_nixie_tube": "Жёлтый газоразрядный индикатор", "block.create.yellow_sail": "Жёлтый парус", "block.create.yellow_seat": "Жёлтое сиденье", "block.create.yellow_valve_handle": "Жёлтый ручной вентиль", "block.create.zinc_block": "Цинковый блок", "block.create.zinc_ore": "Цинковая руда", + "enchantment.create.capacity": "Вместимость", + "enchantment.create.potato_recovery": "Возобновление картофеля", + "entity.create.contraption": "Штуковина", - "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", - "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", - "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", + "entity.create.crafting_blueprint": "Создание чертежа", + "entity.create.gantry_contraption": "Крановая штуковина", + "entity.create.potato_projectile": "Картофельный снаряд", "entity.create.seat": "Сиденье", "entity.create.stationary_contraption": "Стационарная штуковина", "entity.create.super_glue": "Супер-клей", @@ -439,19 +457,19 @@ "item.create.brass_nugget": "Кусочек латуни", "item.create.brass_sheet": "Латунный лист", "item.create.builders_tea": "Чай Строителя", - "item.create.chest_minecart_contraption": "Сундуко-вагонеточная штуковина", + "item.create.chest_minecart_contraption": "Штуковина грузовой вагонетки", "item.create.chocolate_bucket": "Ведро шоколада", "item.create.chocolate_glazed_berries": "Ягоды в шоколадной глазури", "item.create.chromatic_compound": "Хроматический компаунд", "item.create.cinder_flour": "Незераковая пыль", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_backtank": "Медный баллон", "item.create.copper_ingot": "Медный слиток", "item.create.copper_nugget": "Кусочек меди", "item.create.copper_sheet": "Медный лист", "item.create.crafter_slot_cover": "Крышка на слот крафтера", - "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", - "item.create.crushed_aluminum_ore": "Измельчённая алюминиевая руда", + "item.create.crafting_blueprint": "Создание чертежа", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", + "item.create.crushed_aluminum_ore": "Дроблёная алюминиевая руда", "item.create.crushed_brass": "Дроблёная латунь", "item.create.crushed_copper_ore": "Дроблёная медная руда", "item.create.crushed_gold_ore": "Дроблёная золотая руда", @@ -461,32 +479,35 @@ "item.create.crushed_osmium_ore": "Дроблёная осмиевая руда", "item.create.crushed_platinum_ore": "Дроблёная платиновая руда", "item.create.crushed_quicksilver_ore": "Дроблёная ртутная руда", - "item.create.crushed_silver_ore": "Дроблёная серебрянная руда", + "item.create.crushed_silver_ore": "Дроблёная серебряная руда", "item.create.crushed_tin_ore": "Дроблёная оловянная руда", "item.create.crushed_uranium_ore": "Дроблёная урановая руда", "item.create.crushed_zinc_ore": "Дроблёная цинковая руда", - "item.create.diving_boots": "UNLOCALIZED: Diving Boots", - "item.create.diving_helmet": "UNLOCALIZED: Diving Helmet", + "item.create.diving_boots": "Ботинки для дайвинга", + "item.create.diving_helmet": "Шлем для дайвинга", "item.create.dough": "Тесто", "item.create.electron_tube": "Электронная лампа", - "item.create.empty_blaze_burner": "Пустая горелека Всполоха", + "item.create.empty_blaze_burner": "Пустая горелка Всполоха", "item.create.empty_schematic": "Пустая схематика", "item.create.extendo_grip": "Удлинённая рука", "item.create.filter": "Фильтр", - "item.create.furnace_minecart_contraption": "Печно-вагонеточная штуковина", + "item.create.furnace_minecart_contraption": "Штуковина самоходной вагонетки", "item.create.goggles": "Инженерные очки", "item.create.golden_sheet": "Золотой лист", "item.create.handheld_worldshaper": "Ручной редактор мира", "item.create.honey_bucket": "Ведро мёда", "item.create.honeyed_apple": "Яблоко в меду", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "Незаконченная шестерня", + "item.create.incomplete_large_cogwheel": "Незаконченная большая шестерня", + "item.create.incomplete_precision_mechanism": "Незаконченный механизм точности", "item.create.iron_sheet": "Железный лист", - "item.create.linked_controller": "UNLOCALIZED: Linked Controller", + "item.create.linked_controller": "Контроллер связей", "item.create.minecart_contraption": "Вагонеточная штуковина", - "item.create.minecart_coupling": "Связыватель вагонеток", + "item.create.minecart_coupling": "Соединитель вагонеток", "item.create.polished_rose_quartz": "Полированный розовый кварц", - "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", + "item.create.potato_cannon": "Картофельная пушка", "item.create.powdered_obsidian": "Порошкообразный обсидиан", + "item.create.precision_mechanism": "Механизм точности", "item.create.propeller": "Пропеллер", "item.create.red_sand_paper": "Красная наждачная бумага", "item.create.refined_radiance": "Изысканное сияние", @@ -514,9 +535,9 @@ "advancement.create.andesite_alloy": "Повторение - мать учения", "advancement.create.andesite_alloy.desc": "Материалы Create имеют странные названия, одно из них - Андезитовый сплав", "advancement.create.its_alive": "Оно живое!", - "advancement.create.its_alive.desc": "Смастерите ваш первый кинетический компонент вращения.", + "advancement.create.its_alive.desc": "Смастерите ваш первый кинетический вращающийся компонент.", "advancement.create.shifting_gears": "Механизм переключения", - "advancement.create.shifting_gears.desc": "Подсоедините большую шестерню к шестерне, что позволит изменить скорость вращения.", + "advancement.create.shifting_gears.desc": "Подсоедините большую шестерню к обычной шестерне для изменения скорости вращения.", "advancement.create.overstressed": "Перегрузка", "advancement.create.overstressed.desc": "Столкнитесь с предельной перегрузкой лицом к лицу.", "advancement.create.belt": "Передайте за проезд!", @@ -532,9 +553,9 @@ "advancement.create.belt_funnel": "Болтающиеся воронки", "advancement.create.belt_funnel.desc": "Поместите воронку боком, сверху конвейера или депо, чтобы создать её специальный тип.", "advancement.create.belt_funnel_kiss": "Механический ужин", - "advancement.create.belt_funnel_kiss.desc": "Заставте две смонтированные на ремнях воронки поцеловаться.", + "advancement.create.belt_funnel_kiss.desc": "Заставьте две смонтированные на ремнях воронки поцеловаться.", "advancement.create.fan": "Механический маг воздуха", - "advancement.create.fan.desc": "Оседлайте поток воздуха от Венитлятора.", + "advancement.create.fan.desc": "Оседлайте поток воздуха от Вентилятора.", "advancement.create.fan_lava": "Геотермальный пространственный нагреватель", "advancement.create.fan_lava.desc": "Попадите в поток воздуха, плавящего вещи.", "advancement.create.fan_water": "Сумасшедшая мойка", @@ -544,19 +565,19 @@ "advancement.create.wrench": "Конфигурировать удобно", "advancement.create.wrench.desc": "Создайте гаечный ключ, чтобы помочь себе в создании изобретений.", "advancement.create.goggles": "Стресс-о-зрение", - "advancement.create.goggles.desc": "Создайте инженерные очки, чтобы получить больше кинетической информации о компонентах.", + "advancement.create.goggles.desc": "Создайте инженерные очки, чтобы получить больше информации о кинетике компонентов.", "advancement.create.speedometer": "Так быстро?", "advancement.create.speedometer.desc": "Поставьте и подключите спидометр. Посмотрите на спидометр через очки, чтобы прочитать точное значение.", "advancement.create.stressometer": "Так сильно?", - "advancement.create.stressometer.desc": "Поставьте и подключите динамометр. Посмотрите на динамометр через очки, чтобы прочитать точное значение.", + "advancement.create.stressometer.desc": "Поставьте и подключите стрессометр. Посмотрите на стрессометр через очки, чтобы прочитать точное значение.", "advancement.create.aesthetics": "Бах! Эстетично!", - "advancement.create.aesthetics.desc": "Разместите скобы на валу, трубе или шестерне.", + "advancement.create.aesthetics.desc": "Разместите скобы на вал, трубу или шестерню.", "advancement.create.reinforced": "Бах! Усилено!", "advancement.create.reinforced.desc": "Разместите подходящий блок корпуса на вал, трубу и конвейер.", - "advancement.create.water_wheel": "Гидравлика", + "advancement.create.water_wheel": "Обузданная гидравлика", "advancement.create.water_wheel.desc": "Поставьте водяное колесо и попытайтесь заставить его вращаться!", "advancement.create.chocolate_wheel": "Вкусная сила", - "advancement.create.chocolate_wheel.desc": "Зпустите водяное колесо с помощью раплавленного шоколада.", + "advancement.create.chocolate_wheel.desc": "Запустите водяное колесо с помощью расплавленного шоколада.", "advancement.create.lava_wheel": "Адское колесо", "advancement.create.lava_wheel.desc": "Это не должно было работать.", "advancement.create.cuckoo": "Уже?", @@ -569,12 +590,12 @@ "advancement.create.maxed_windmill.desc": "Соберите ветряную мельницу максимальной силы.", "advancement.create.andesite_casing": "Андезитовый век", "advancement.create.andesite_casing.desc": "Используйте немного андезитового сплава и дерева для создания корпуса.", - "advancement.create.mechanical_drill": "Стационарные выключатели", + "advancement.create.mechanical_drill": "Стационарные разрушители", "advancement.create.mechanical_drill.desc": "Установите и приведите в действие механическую дрель", "advancement.create.press": "Пресс делает «Бонк!»", "advancement.create.press.desc": "Приведите механический пресс в действие и используйте его для создания пластин.", "advancement.create.polished_rose_quartz": "Розовый алмаз", - "advancement.create.polished_rose_quartz.desc": "Используйте кусок наждачной бумаги, чтобы отполировать розовый кварц, пока он не станет прозрачным.", + "advancement.create.polished_rose_quartz.desc": "Используйте кусок наждачной бумаги, чтобы отполировать розовый кварц, пока он не станет глянцевым.", "advancement.create.electron_tube": "Бип бип", "advancement.create.electron_tube.desc": "Сделайте несколько электронных ламп, пригодных для изготовления менее примитивных машин.", "advancement.create.mechanical_saw": "Стационарная рубка", @@ -587,7 +608,7 @@ "advancement.create.blaze_burner.desc": "Получить Горелку Всполоха", "advancement.create.compact": "Автоматическое уплотнение", "advancement.create.compact.desc": "Используйте пресс и чашу для уплотнения некоторых предметов.", - "advancement.create.brass": "Действительный сплав", + "advancement.create.brass": "Реальный сплав", "advancement.create.brass.desc": "Используйте дроблёную медь и дроблёный цинк, чтобы создать немного латуни.", "advancement.create.brass_casing": "Бронзовый век", "advancement.create.brass_casing.desc": "Используйте только что полученную латунь и немного дерева, чтобы создать более продвинутый корпус.", @@ -603,7 +624,7 @@ "advancement.create.item_drain.desc": "Посмотрите как жидкость выкачивается из предмета, в Предметном осушителе.", "advancement.create.chained_item_drain": "Поехали!", "advancement.create.chained_item_drain.desc": "Наблюдайте за тем как предмет едет через несколько соединённых предметных осушителей.", - "advancement.create.glass_pipe": "Поточный шпион", + "advancement.create.glass_pipe": "Шпион за потоками", "advancement.create.glass_pipe.desc": "Наблюдайте через окно в трубе за тем как распространяется жидкость. Окно появится на трубе при использовании гаечного ключа.", "advancement.create.pipe_collision": "Никогда не скрещивайте потоки!", "advancement.create.pipe_collision.desc": "Наблюдайте за тем как две жидкости встречаются в вашей сети труб.", @@ -616,7 +637,7 @@ "advancement.create.infinite_lava": "Уничтожение ядра", "advancement.create.infinite_lava.desc": "Выкачивайте лаву из бассейна, считающегося бесконечным.", "advancement.create.infinite_chocolate": "Утопая в воображении", - "advancement.create.infinite_chocolate.desc": "Выкачивайте раславленный шоколад из резервуара, считающегося бесконечным.", + "advancement.create.infinite_chocolate.desc": "Выкачивайте расплавленный шоколад из резервуара, считающегося бесконечным.", "advancement.create.crafter": "Автоматизированная сборка", "advancement.create.crafter.desc": "Поставьте и подключите механический крафтер", "advancement.create.clockwork_bearing": "Хитрые часы", @@ -631,18 +652,18 @@ "advancement.create.flywheel.desc": "Успешно соедините двигатель с маховиком.", "advancement.create.overstress_flywheel": "Перенапряжение", "advancement.create.overstress_flywheel.desc": "Подайте слишком большую нагрузку на печной двигатель.", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "Сложные любопытства.", + "advancement.create.precision_mechanism.desc": "Создайте механизм точности.", "advancement.create.mechanical_arm": "Золотые руки!", - "advancement.create.mechanical_arm.desc": "Создайте Механическую руку, выбирете входы и выходы, установите в мире и запитайте. Затем смотрите как она делает за вас всю работу.", + "advancement.create.mechanical_arm.desc": "Создайте Механическую руку, выберите входы и выходы, установите в мире и запитайте. Затем смотрите как она делает за вас всю работу.", "advancement.create.musical_arm": "Сбацай что-нибудь!", "advancement.create.musical_arm.desc": "Посмотрите как механическая рука меняет пластинки.", - "advancement.create.arm_many_targets": "Организатор", + "advancement.create.arm_many_targets": "Организа-трон", "advancement.create.arm_many_targets.desc": "Запрограммируйте механическую руку на 10 и больше выходов.", - "advancement.create.arm_blaze_burner": "Поджигатель", + "advancement.create.arm_blaze_burner": "Поджигателе-трон", "advancement.create.arm_blaze_burner.desc": "Запрограммируйте механическую руку на кормление Горелки Всполоха.", "advancement.create.fist_bump": "Брось это, братан!", - "advancement.create.fist_bump.desc": "Сделайте два удара кулаком.", + "advancement.create.fist_bump.desc": "Сделайте два удара кулаками Автономных активаторов.", "advancement.create.crushing_wheel": "Пара гигантов", "advancement.create.crushing_wheel.desc": "Создайте несколько дробящих колес, чтобы более эффективно разрушать больше материалов.", "advancement.create.blaze_cake": "Сахарная лихорадка", @@ -657,11 +678,11 @@ "advancement.create.chromatic_age.desc": "Создайте блоки корпуса из света и тьмы.", "advancement.create.wand_of_symmetry": "Сияющие зеркала", "advancement.create.wand_of_symmetry.desc": "Создайте жезл симметрии.", - "advancement.create.extendo_grip": "Кипение!", + "advancement.create.extendo_grip": "Бойоиоинг!", "advancement.create.extendo_grip.desc": "Возьмите в руки удлинённую руку", - "advancement.create.potato_cannon": "UNLOCALIZED: Fwoomp!", - "advancement.create.potato_cannon.desc": "UNLOCALIZED: Defeat an enemy with your Potato Cannon.", - "advancement.create.dual_extendo_grip": "Окончательное выкипание", + "advancement.create.potato_cannon": "Свомп!", + "advancement.create.potato_cannon.desc": "Победите врага с помощью своей картофельной пушки!", + "advancement.create.dual_extendo_grip": "Время ультимативных пружин", "advancement.create.dual_extendo_grip.desc": "Две удлинённых руки для сверхчеловеческого охвата.", "advancement.create.eob": "Конец бета-версии", "advancement.create.eob.desc": "Ожидайте больше контента здесь в будущем. <3", @@ -673,24 +694,30 @@ "itemGroup.create.palettes": "Create: Декор", "death.attack.create.crush": "%1$s был передроблен", + "death.attack.create.crush.player": "%2$s столкнул %1$s в дробящие колёса", "death.attack.create.fan_fire": "%1$s был сожжен до смерти горячим воздухом", + "death.attack.create.fan_fire.player": "%2$s столкнул %1$s в коптильню", "death.attack.create.fan_lava": "%1$s был сожжен до смерти поклонником лавы", - "death.attack.create.mechanical_drill": "%1$s был пронзен с помощью механической дрели", + "death.attack.create.fan_lava.player": "%2$s столкнул %1$s в плавильню", + "death.attack.create.mechanical_drill": "%1$s был пронзён механической дрелью", + "death.attack.create.mechanical_drill.player": "%2$s толкнул %1$s под механическую дрель", "death.attack.create.mechanical_saw": "%1$s был разрезан пополам механической пилой", - "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", - "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", + "death.attack.create.mechanical_saw.player": "%2$s толкнул %1$s под механическую пилу", + "death.attack.create.potato_cannon": "%1$s был застрелен картофельной пушкой %2$s", + "death.attack.create.potato_cannon.item": "%1$s был застрелен %2$s при помощи «%3$s»", "death.attack.create.cuckoo_clock_explosion": "%1$s взорвали подделанные часы с кукушкой", + "death.attack.create.cuckoo_clock_explosion.player": "%1$s был взорван подделанными часами с кукушкой", "create.block.deployer.damage_source_name": "автономным активатором", "create.block.cart_assembler.invalid": "Поместите сборщик вагонеток на блок рельс", - "create.menu.return": "UNLOCALIZED: Return to Menu", - "create.menu.configure": "UNLOCALIZED: Configure...", - "create.menu.ponder_index": "UNLOCALIZED: Ponder Index", - "create.menu.only_ingame": "UNLOCALIZED: Available in the Pause Menu", - "create.menu.project_page": "UNLOCALIZED: Project Page", - "create.menu.report_bugs": "UNLOCALIZED: Report Issues", - "create.menu.support": "UNLOCALIZED: Support Us", + "create.menu.return": "Вернуться в меню", + "create.menu.configure": "Настроить...", + "create.menu.ponder_index": "Содержание размышлений", + "create.menu.only_ingame": "Доступно в меню Паузы", + "create.menu.project_page": "Страница проекта", + "create.menu.report_bugs": "Сообщите об ошибке", + "create.menu.support": "Поддержите нас", "create.recipe.crushing": "Измельчение", "create.recipe.milling": "Помол", @@ -702,7 +729,7 @@ "create.recipe.fan_blasting.fan": "Вентилятор за текущей лавой", "create.recipe.pressing": "Прессование", "create.recipe.mixing": "Смешивание", - "create.recipe.deploying": "UNLOCALIZED: Deploying", + "create.recipe.deploying": "Автономная активация", "create.recipe.automatic_shapeless": "Автоматическая бесформенная сборка", "create.recipe.automatic_brewing": "Автоматическое смешивание", "create.recipe.packing": "Прессование", @@ -711,21 +738,21 @@ "create.recipe.mechanical_crafting": "Механическое создание", "create.recipe.automatic_shaped": "Автоматическая форменная сборка", "create.recipe.block_cutting": "Резка блока", - "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", + "create.recipe.wood_cutting": "Резка древесины", "create.recipe.sandpaper_polishing": "Полировка наждачной бумагой", "create.recipe.mystery_conversion": "Хроматический метаморфоз", "create.recipe.spout_filling": "Заполнение дозатором", "create.recipe.draining": "Осушение предметов", - "create.recipe.sequenced_assembly": "UNLOCALIZED: Sequenced Assembly", - "create.recipe.assembly.next": "UNLOCALIZED: Next: %1$s", - "create.recipe.assembly.step": "UNLOCALIZED: Step %1$s:", - "create.recipe.assembly.progress": "UNLOCALIZED: Progress: %1$s/%2$s", - "create.recipe.assembly.pressing": "UNLOCALIZED: Process in Press", - "create.recipe.assembly.spout_filling_fluid": "UNLOCALIZED: Spout %1$s", - "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", - "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", - "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.sequenced_assembly": "Последовательная сборка", + "create.recipe.assembly.next": "Следующее: %1$s", + "create.recipe.assembly.step": "Шаг %1$s:", + "create.recipe.assembly.progress": "Прогресс: %1$s/%2$s", + "create.recipe.assembly.pressing": "Обработайте в Прессе", + "create.recipe.assembly.spout_filling_fluid": "Долейте %1$s", + "create.recipe.assembly.deploying_item": "Добавьте %1$s", + "create.recipe.assembly.cutting": "Разрежьте пилой", + "create.recipe.assembly.repeat": "Повторите последовательность %1$s раз", + "create.recipe.assembly.junk": "Случайный мусор", "create.recipe.processing.chance": "%1$s%% шанса", "create.recipe.heat_requirement.none": "Не требует нагрева", "create.recipe.heat_requirement.heated": "Нагрето", @@ -742,7 +769,7 @@ "create.generic.unit.seconds": "секунд", "create.generic.unit.minutes": "минут", "create.generic.unit.rpm": "об./мин.", - "create.generic.unit.stress": "Н*м", + "create.generic.unit.stress": "ен", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "%1$smB", "create.generic.clockwise": "По часовой стрелке", @@ -779,15 +806,15 @@ "create.orientation.alongX": "Вдоль X", "create.gui.terrainzapper.title": "Ручной редактор мира", - "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", - "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", - "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", - "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", - "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", - "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", - "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", - "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", - "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", + "create.gui.terrainzapper.searchDiagonal": "Следование диагоналям", + "create.gui.terrainzapper.searchFuzzy": "Игнорировать границы материала", + "create.gui.terrainzapper.patternSection": "Шаблон", + "create.gui.terrainzapper.pattern.solid": "Сплошной", + "create.gui.terrainzapper.pattern.checkered": "Шахматный порядок", + "create.gui.terrainzapper.pattern.inversecheckered": "Обратный шахматный порядок", + "create.gui.terrainzapper.pattern.chance25": "25% заполнение", + "create.gui.terrainzapper.pattern.chance50": "50% заполнение", + "create.gui.terrainzapper.pattern.chance75": "75% заполнение", "create.gui.terrainzapper.placement": "Размещение", "create.gui.terrainzapper.placement.merged": "Слитый", "create.gui.terrainzapper.placement.attached": "Прикреплённый", @@ -796,8 +823,8 @@ "create.gui.terrainzapper.brush.cuboid": "Куб", "create.gui.terrainzapper.brush.sphere": "Сфера", "create.gui.terrainzapper.brush.cylinder": "Цилиндр", - "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", - "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", + "create.gui.terrainzapper.brush.surface": "Поверхность", + "create.gui.terrainzapper.brush.cluster": "Скопление", "create.gui.terrainzapper.tool": "Инструмент", "create.gui.terrainzapper.tool.fill": "Заполнить", "create.gui.terrainzapper.tool.place": "Поставить", @@ -807,12 +834,12 @@ "create.gui.terrainzapper.tool.flatten": "Выравнивание", "create.terrainzapper.shiftRightClickToSet": "ПКМ крадучись, чтобы выбрать форму", - "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", - "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", + "create.terrainzapper.usingBlock": "Используется: %1$s", + "create.terrainzapper.leftClickToSet": "Левый клик по блоку, что бы использовать материал", "create.minecart_coupling.two_couplings_max": "Вагонетки могут иметь только две связи", "create.minecart_coupling.unloaded": "Кажется, часть вашего поезда в незагруженных чанках", - "create.minecart_coupling.no_loops": "Связыватели не могут образовывать петлю", + "create.minecart_coupling.no_loops": "Соединители не могут образовывать петлю", "create.minecart_coupling.removed": "Убраны все связи между вагонетками", "create.minecart_coupling.too_far": "Вагонетки слишком далеко друг от друга", @@ -839,12 +866,12 @@ "create.logistics.firstFrequency": "Частота #1", "create.logistics.secondFrequency": "Частота #2", "create.logistics.filter.apply": "Фильтр применён к %1$s.", - "create.logistics.filter.apply_click_again": "Фильтр применён к %1$s, кликните еще раз чтобы скопировать количество.", + "create.logistics.filter.apply_click_again": "Фильтр применён к %1$s, кликните еще раз, чтобы скопировать количество.", "create.logistics.filter.apply_count": "Применено извлекаемое количество к фильтру.", "create.gui.goggles.generator_stats": "Статистика генератора:", "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", - "create.gui.goggles.at_current_speed": "На текущей скорости", + "create.gui.goggles.at_current_speed": "При текущей скорости", "create.gui.goggles.pole_length": "Длина поршня", "create.gui.goggles.fluid_container": "Информация о жидкостном контейнере:", "create.gui.goggles.fluid_container.capacity": "Ёмкость: ", @@ -852,17 +879,17 @@ "create.gui.assembly.exception.unmovableBlock": "Несдвигаемый блок (%4$s) на [%1$s,%2$s,%3$s]", "create.gui.assembly.exception.chunkNotLoaded": "Блок на [%1$s,%2$s,%3$s] не был в загруженном чанке", "create.gui.assembly.exception.structureTooLarge": "Штуковина состоит из слишком большого количества Блоков.\nТекущий максимум: %1$s", - "create.gui.assembly.exception.tooManyPistonPoles": "Слишком много Удлинителей прикреплено к этому Поршню.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "Слишком много Удлинителей прикреплено к этому поршню.\nТекущий максимум: %1$s", "create.gui.assembly.exception.noPistonPoles": "Поршню нехватает Удлинителей", "create.gui.assembly.exception.not_enough_sails": "Присоединённая структура не содержит достаточно парусопободных блоков: %1$s\nМинимум из %2$s необходим", "create.gui.gauge.info_header": "Калибровочная информация:", "create.gui.speedometer.title": "Скорость вращения", - "create.gui.stressometer.title": "Сетевой момент", - "create.gui.stressometer.capacity": "Оставшаяся емкость", + "create.gui.stressometer.title": "Нагрузка на сеть", + "create.gui.stressometer.capacity": "Оставшаяся ёмкость", "create.gui.stressometer.overstressed": "Перегрузка", "create.gui.stressometer.no_rotation": "Нет вращения", - "create.gui.contraptions.not_fast_enough": "Похоже, что этот %1$s _не_ вращается с_достаточной_ _скоростью_.", - "create.gui.contraptions.network_overstressed": "Похоже, что эта штуковина _перегружена_. Добавьте больше источников или _замедлите_ _скорость_ компонентов с высоким _влиянием_ на _момент_.", + "create.gui.contraptions.not_fast_enough": "Похоже, что этот %1$s _не_ вращается с _достаточной_ _скоростью_.", + "create.gui.contraptions.network_overstressed": "Похоже, что эта штуковина _перегружена_. Добавьте больше источников или _понизьте_ _скорость_ компонентов, _создающих_ высокую _нагрузку_.", "create.gui.adjustable_crate.title": "Регулируемый ящик", "create.gui.adjustable_crate.storageSpace": "Ёмкость", "create.gui.stockpile_switch.title": "Настраиваемый компаратор", @@ -874,7 +901,7 @@ "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "Повернуть на угол", "create.gui.sequenced_gearshift.instruction.turn_angle": "Повернуть", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Угол", - "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "Повернуть для движения Поршня/Шкива/Портала", "create.gui.sequenced_gearshift.instruction.turn_distance": "Поршень", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Расстояние", "create.gui.sequenced_gearshift.instruction.delay.descriptive": "Временная задержка", @@ -882,7 +909,7 @@ "create.gui.sequenced_gearshift.instruction.delay.duration": "Длительность", "create.gui.sequenced_gearshift.instruction.end.descriptive": "Конец", "create.gui.sequenced_gearshift.instruction.end": "Конец", - "create.gui.sequenced_gearshift.instruction.await.descriptive": "Ожидать нового Импульса Редстоун Сигнала", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "Ожидать нового Импульса редстоун Сигнала", "create.gui.sequenced_gearshift.instruction.await": "Ожидать", "create.gui.sequenced_gearshift.speed": "Скорость, Направление", "create.gui.sequenced_gearshift.speed.forward": "Скорость ввода, вперед", @@ -907,11 +934,11 @@ "create.schematic.rotation.cw90": "По час. стрелке 90", "create.schematic.rotation.cw180": "По час. стрелке 180", "create.schematic.rotation.cw270": "По час. стрелке 270", - "create.schematic.mirror": "Зеркало", + "create.schematic.mirror": "Отразить", "create.schematic.mirror.none": "Нет", "create.schematic.mirror.frontBack": "Спереди-сзади", "create.schematic.mirror.leftRight": "Влево-вправо", - "create.schematic.tool.deploy": "Развернуть", + "create.schematic.tool.deploy": "Развёртывание", "create.schematic.tool.move": "Подвинуть XZ", "create.schematic.tool.movey": "Подвинуть Y", "create.schematic.tool.rotate": "Вращать", @@ -937,7 +964,7 @@ "create.schematic.tool.print.description.1": "[ПКМ], чтобы подтвердить размещение в текущем местоположении.", "create.schematic.tool.print.description.2": "Этот инструмент предназначен только для творческого режима.", "create.schematic.tool.print.description.3": "", - "create.schematic.tool.flip.description.0": "Переверните схему вдоль выбранного лица.", + "create.schematic.tool.flip.description.0": "Переверните схему вдоль выбранной стороны.", "create.schematic.tool.flip.description.1": "Наведите курсор на схему и [CTRL] + прокрутка, чтобы перевернуть ее.", "create.schematic.tool.flip.description.2": "", "create.schematic.tool.flip.description.3": "", @@ -968,10 +995,10 @@ "create.gui.schematicannon.option.skipMissing": "Пропускать отсутствующие блоки", "create.gui.schematicannon.option.skipTileEntities": "Защитить имущество", "create.gui.schematicannon.slot.gunpowder": "Добавьте порох чтобы запитать пушку", - "create.gui.schematicannon.slot.listPrinter": "Положите книгу чтобы создать список предметов для схематики", + "create.gui.schematicannon.slot.listPrinter": "Положите книгу, чтобы создать список предметов для схематики", "create.gui.schematicannon.slot.schematic": "Положите свою схематику здесь. Убедитесь что она размещена в правильном месте", "create.gui.schematicannon.option.skipMissing.description": "Если пушка не может найти требуемый блок, она будет строить в следующем месте.", - "create.gui.schematicannon.option.skipTileEntities.description": "Пушка не будет заменять блоки хранения данных, такие как сундуки.", + "create.gui.schematicannon.option.skipTileEntities.description": "Пушка не будет заменять блоки хранения, такие как сундуки.", "create.gui.schematicannon.option.dontReplaceSolid.description": "Пушка никогда не заменит целые блоки, только не целые и воздух.", "create.gui.schematicannon.option.replaceWithSolid.description": "Пушка будет заменять целый блок только в случае, если в схеме в этом месте расположен целый блок.", "create.gui.schematicannon.option.replaceWithAny.description": "Пушка будет заменять целые блоки, если в схеме в этом месте есть что-либо.", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "не принадлежит '%1$s'", "create.item_attributes.added_by": "был добавлен %1$s", "create.item_attributes.added_by.inverted": "не был добавлен %1$s", + "create.item_attributes.shulker_level": "шалкер %1$s", + "create.item_attributes.shulker_level.inverted": "шалкер не %1$s", + "create.item_attributes.shulker_level.full": "полный", + "create.item_attributes.shulker_level.empty": "пустой", + "create.item_attributes.shulker_level.partial": "частично заполнен", "create.item_attributes.has_enchant": "зачарован на %1$s", "create.item_attributes.has_enchant.inverted": "не зачарован на %1$s", "create.item_attributes.color": "Покрашено в %1$s", @@ -1050,7 +1082,7 @@ "create.item_attributes.has_name": "имеет нестандартное имя %1$s", "create.item_attributes.has_name.inverted": "не имеет нестандартное имя%1$s", "create.item_attributes.book_author": "подписана %1$s", - "create.item_attributes.book_author.inverted": "неподписана %1$s", + "create.item_attributes.book_author.inverted": "не подписана %1$s", "create.item_attributes.book_copy_original": "оригинал", "create.item_attributes.book_copy_original.inverted": "не оригинал", "create.item_attributes.book_copy_first": "копия первого порядка", @@ -1088,12 +1120,12 @@ "create.tooltip.speedRequirement.none": "Нет", "create.tooltip.speedRequirement.medium": "Умеренная", "create.tooltip.speedRequirement.high": "Быстрая", - "create.tooltip.stressImpact": "Требование к крутящему моменту: %1$s", - "create.tooltip.stressImpact.low": "Низкий", - "create.tooltip.stressImpact.medium": "Средний", - "create.tooltip.stressImpact.high": "Высокий", + "create.tooltip.stressImpact": "Создаваемая нагрузка: %1$s", + "create.tooltip.stressImpact.low": "Низкая", + "create.tooltip.stressImpact.medium": "Средняя", + "create.tooltip.stressImpact.high": "Высокая", "create.tooltip.stressImpact.overstressed": "Перегрузка", - "create.tooltip.capacityProvided": "Ёмкостный крутящий момент: %1$s", + "create.tooltip.capacityProvided": "Допустимая нагрузка: %1$s", "create.tooltip.capacityProvided.low": "Маленький", "create.tooltip.capacityProvided.medium": "Средний", "create.tooltip.capacityProvided.high": "Большой", @@ -1106,48 +1138,55 @@ "create.mechanical_arm.points_outside_range": "%1$s выбранные точки взаимодействия удалены из-за ограничений диапазона.", "create.weighted_ejector.target_set": "Цель выбрана", - "create.weighted_ejector.target_not_valid": "Бросает до близлежащего блока (Неподходящая Цель)", - "create.weighted_ejector.no_target": "Бросает до близлежащего блока (Цель не была Выбрана)", + "create.weighted_ejector.target_not_valid": "Бросает до ближайшего блока (Неподходящая Цель)", + "create.weighted_ejector.no_target": "Бросает до ближайшего блока (Цель не была Выбрана)", "create.weighted_ejector.targeting": "Бросает до [%1$s,%2$s,%3$s]", - "create.weighted_ejector.stack_size": "Размер Бросаемого Стака", + "create.weighted_ejector.stack_size": "Размер бросаемого стака", "create.logistics.when_multiple_outputs_available": "Когда доступно несколько выходов", "create.mechanical_arm.selection_mode.round_robin": "По кругу", "create.mechanical_arm.selection_mode.forced_round_robin": "Принудительно по кругу", - "create.mechanical_arm.selection_mode.prefer_first": "Предпочтительна первичная цель", + "create.mechanical_arm.selection_mode.prefer_first": "Предпочитать первичную цель", "create.tunnel.selection_mode.split": "Разделить", "create.tunnel.selection_mode.forced_split": "Принудительно разделить", "create.tunnel.selection_mode.round_robin": "По кругу", "create.tunnel.selection_mode.forced_round_robin": "Принудительно по кругу", - "create.tunnel.selection_mode.prefer_nearest": "Придпочтительно ближайшее", + "create.tunnel.selection_mode.prefer_nearest": "Предпочтительно ближайшее", "create.tunnel.selection_mode.randomize": "Случайно", "create.tunnel.selection_mode.synchronize": "Синхронизировать входы", - "create.tooltip.chute.header": "Инвормация о желобе", + "create.tooltip.chute.header": "Информация о желобе", "create.tooltip.chute.items_move_down": "Предметы двигаются вниз", "create.tooltip.chute.items_move_up": "Предметы двигаются вверх", - "create.tooltip.chute.no_fans_attached": "Нет подключеных вентиляторов", + "create.tooltip.chute.no_fans_attached": "Нет подключенных вентиляторов", "create.tooltip.chute.fans_push_up": "Вентилятор толкает снизу", "create.tooltip.chute.fans_push_down": "Вентилятор толкает сверху", "create.tooltip.chute.fans_pull_up": "Вентилятор тянет сверху", "create.tooltip.chute.fans_pull_down": "Вентилятор тянет снизу", "create.tooltip.chute.contains": "Содержит: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "В данный момент раздает(выдает):", + "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "ПКМ, чтобы получить", - "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", - "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", - "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", - "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", - "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.linked_controller.bind_mode": "Режим привязки активирован", + "create.linked_controller.press_keybind": "Нажмите %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, чтобы привязать эту частоту к соответствующей клавише", + "create.linked_controller.key_bound": "Частота привязана к %1$s", + "create.linked_controller.frequency_slot_1": "Клавиша: %1$s, Частота #1", + "create.linked_controller.frequency_slot_2": "Клавиша: %1$s, Частота #2", - "create.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", - "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", - "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", - "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", - "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", - "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", - "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.crafting_blueprint.crafting_slot": "Слот для ингредиентов", + "create.crafting_blueprint.filter_items_viable": "Продвинутые фильтры предметов применимы", + "create.crafting_blueprint.display_slot": "Отображаемая ячейка", + "create.crafting_blueprint.inferred": "Производные от рецепта", + "create.crafting_blueprint.manually_assigned": "Назначен вручную", + "create.crafting_blueprint.secondary_display_slot": "Дополнительная отображаемая ячейка", + "create.crafting_blueprint.optional": "Опциональна", + + "create.potato_cannon.ammo.attack_damage": "%1$s урона от атаки", + "create.potato_cannon.ammo.reload_ticks": "%1$s тиков перезагрузки", + "create.potato_cannon.ammo.knockback": "%1$s отбрасывания", "create.hint.hose_pulley.title": "Безграничное снабжение", "create.hint.hose_pulley": "Целевой водный резервуар считается бесконечным.", @@ -1175,46 +1214,47 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: используйте /killtps start <Время тика>, чтобы искусственно замедлить тик сервера", "create.command.killTPSCommand.argument.tickTime": "Время тика", - "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", - "create.contraption.minecart_contraption_illegal_pickup": "UNLOCALIZED: A mystical force is binding this Cart Contraption to the world", + "create.contraption.minecart_contraption_too_big": "Эта вагонеточная штуковина кажется слишком большой, чтобы ее можно было поднять", + "create.contraption.minecart_contraption_illegal_pickup": "Мистическая сила связывает эту вагонеточную штуковину с миром", "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", - "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", - "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.contraption_disassemble": "Штуковина останавливается", + "create.subtitle.peculiar_bell_use": "Особенный колокол звонит", + "create.subtitle.mixing": "Шум смешивания", + "create.subtitle.mechanical_press_activation_belt": "Механический пресс делает «бонк»", + "create.subtitle.fwoomp": "Картофельная пушка делает «Свомп»", + "create.subtitle.worldshaper_place": "Ручной редактор мира делает «Зап»", + "create.subtitle.crushing_1": "Шум разрушения", + "create.subtitle.depot_slide": "Шелест предметов", + "create.subtitle.saw_activate_stone": "Активируется механическая пила", "create.subtitle.blaze_munch": "Всполох радостно жуёт", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.funnel_flap": "Занавески воронок хлопают", "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", - "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.haunted_bell_use": "Призрачный колокол звонит", + "create.subtitle.scroll_value": "Щелчки колеса прокрутки", + "create.subtitle.crafter_craft": "Крафтер создаёт", + "create.subtitle.controller_put": "Контроллер стучит", + "create.subtitle.cranking": "Вращается рукоятка", + "create.subtitle.wrench_remove": "Компонент ломается", + "create.subtitle.cogs": "Шестерни грохочут", "create.subtitle.slime_added": "Намазывание слизи", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", - "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", - "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", - "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.wrench_rotate": "Использован гаечный ключ", + "create.subtitle.potato_hit": "Овощ врезается", + "create.subtitle.saw_activate_wood": "Активируется механическая пила", + "create.subtitle.haunted_bell_convert": "Призрачный колокол пробуждается", + "create.subtitle.deployer_polish": "Автономный активатор полирует", + "create.subtitle.deny": "Отрицательный «Буп»", + "create.subtitle.controller_click": "Клики контроллера", "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", - "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", + "create.subtitle.copper_armor_equip": "Позвякивание снаряжения для дайвинга", + "create.subtitle.controller_take": "Кафедра опустошается", "create.subtitle.mechanical_press_activation": "Механический пресс активирован", - "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", - "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.contraption_assemble": "Штуковина движется", + "create.subtitle.crafter_click": "Крафтер кликает", + "create.subtitle.depot_plop": "Предмет падает", + "create.subtitle.confirm": "Утвердительный «Динь»", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1228,21 +1268,21 @@ "item.create.example_item.tooltip.control1": "When Ctrl pressed", "item.create.example_item.tooltip.action1": "These controls are displayed.", - "block.create.wooden_bracket.tooltip": "WOODEN BRACKET", + "block.create.wooden_bracket.tooltip": "ДЕРЕВЯННАЯ СКОБА", "block.create.wooden_bracket.tooltip.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя уютное деревянное укрепление.", - "block.create.metal_bracket.tooltip": "METAL BRACKET", + "block.create.metal_bracket.tooltip": "МЕТАЛЛИЧЕСКАЯ СКОБА", "block.create.metal_bracket.tooltip.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя прочное индустриальное укрепление.", - "block.create.seat.tooltip": "SEAT", + "block.create.seat.tooltip": "СИДЕНЬЕ", "block.create.seat.tooltip.summary": "Присядьте и насладитесь поездкой! Привязывает игроков к собранным _устройствам_. Отлично выглядит как простая мебель! Можно окрасить в разные цвета.", "block.create.seat.tooltip.condition1": "ПКМ по сиденью", - "block.create.seat.tooltip.behaviour1": "Сажает игрока на _Сиденье_. Нажмите _кнопку_ _приседания_ чтобы слезть.", + "block.create.seat.tooltip.behaviour1": "Сажает игрока на _Сиденье_. Нажмите _кнопку_ _приседания_ чтобы слезть (Shift по умолчанию).", - "item.create.blaze_cake.tooltip": "BLAZE CAKE", + "item.create.blaze_cake.tooltip": "ТОРТ ВСПОЛОХА", "item.create.blaze_cake.tooltip.summary": "Вкусное угощения для вашей трудяги _Горелки Всполоха_. Зажигает их всех!", - "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", + "item.create.wand_of_symmetry.tooltip": "ЖЕЗЛ СИММЕТРИИ", "item.create.wand_of_symmetry.tooltip.summary": "Идеально отражает размещаемые блоки по настроенным плоскостям.", "item.create.wand_of_symmetry.tooltip.condition1": "На панели быстрого доступа", "item.create.wand_of_symmetry.tooltip.behaviour1": "Остаётся активным", @@ -1253,7 +1293,7 @@ "item.create.wand_of_symmetry.tooltip.control3": "ПКМ крадучись", "item.create.wand_of_symmetry.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", - "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip": "РУЧНОЙ РЕДАКТОР МИРА", "item.create.handheld_worldshaper.tooltip.summary": "Удобный инструмент для создания _ландшафтов_ и _рельефа_ _местности_.", "item.create.handheld_worldshaper.tooltip.control1": "ЛКМ на блок", "item.create.handheld_worldshaper.tooltip.action1": "Устанавливает блоки, помещенные инструментом, в целевой блок.", @@ -1262,50 +1302,50 @@ "item.create.handheld_worldshaper.tooltip.control3": "ПКМ крадучись", "item.create.handheld_worldshaper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", - "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", + "item.create.tree_fertilizer.tooltip": "УДОБРЕНИЕ ДЛЯ ДЕРЕВЬЕВ", "item.create.tree_fertilizer.tooltip.summary": "Мощная комбинация минералов подходит для ускорения роста распространенных типов деревьев.", "item.create.tree_fertilizer.tooltip.condition1": "При использовании на саженце", "item.create.tree_fertilizer.tooltip.behaviour1": "Выращивает деревья,_независимо_ от _условий_ _их_ _расположения_", - "item.create.extendo_grip.tooltip": "EXTENDO GRIP", + "item.create.extendo_grip.tooltip": "УДЛИНЕННАЯ РУКА", "item.create.extendo_grip.tooltip.summary": "Бойоиоинг! Значительно _увеличивает_ _досягаемость_ владельца.", "item.create.extendo_grip.tooltip.condition1": "Находясь в другой руке", - "item.create.extendo_grip.tooltip.behaviour1": "Увеличьте _расстояние_ _досягаемости_ предметов, используемых в _главной_ _руке_.", - "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.extendo_grip.tooltip.behaviour1": "Увеличивает _расстояние_ _досягаемости_ предметов, используемых в _главной_ _руке_.", + "item.create.extendo_grip.tooltip.condition2": "Когда надет Медный баллон", + "item.create.extendo_grip.tooltip.behaviour2": " _НЕ_ тратится _прочность_. Вместо этого будет тратиться _воздух_ из баллона.", - "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", - "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", - "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", - "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.potato_cannon.tooltip": "КАРТОФЕЛЬНАЯ ПУШКА", + "item.create.potato_cannon.tooltip.summary": "Свомп! Запускайте выращенные вами овощи в своих врагов. Может питаться от давления воздуха из _Медного_ _баллона_", + "item.create.potato_cannon.tooltip.condition1": "Нажимая ПКМ", + "item.create.potato_cannon.tooltip.behaviour1": "_Выстреливает_ подходящим предметом из вашего _инвентаря_.", + "item.create.potato_cannon.tooltip.condition2": "Когда надет Медный баллон", + "item.create.potato_cannon.tooltip.behaviour2": "_НЕ_ тратится _прочность_. Вместо этого будет тратиться _воздух_ из баллона.", - "item.create.filter.tooltip": "FILTER", + "item.create.filter.tooltip": "ФИЛЬТР", "item.create.filter.tooltip.summary": "Управляет_ _выходами_ и входами логистических устройств с _большей_ _точностью_, _сопоставляя_ их со _списком_ _предметов_ или несколькими _вложенными_ _фильтрами_.", "item.create.filter.tooltip.condition1": "Когда в слоте фильтра", "item.create.filter.tooltip.behaviour1": "_Управляет_ потоком предметов в соответствии с его _конфигурацией_.", "item.create.filter.tooltip.condition2": "При ПКМ", "item.create.filter.tooltip.behaviour2": "Открывает _интерфейс_ _конфигурации_.", - "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip": "ФИЛЬТР АТРИБУТОВ", "item.create.attribute_filter.tooltip.summary": "_Управляет_ _выходами_ и _входами_ логистических устройств с _большей_ _точностью_, сопоставляя их с набором _атрибутов_ и _категорий предметов_.", "item.create.attribute_filter.tooltip.condition1": "Когда в слоте фильтра", "item.create.attribute_filter.tooltip.behaviour1": "_Управляет_ потоком предметов в соответствии с его _конфигурацией_.", "item.create.attribute_filter.tooltip.condition2": "ПКМ", "item.create.attribute_filter.tooltip.behaviour2": "Открывает _интерфейс_ _конфигурации_.", - "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", + "item.create.empty_schematic.tooltip": "ПУСТАЯ СХЕМАТИКА", "item.create.empty_schematic.tooltip.summary": "Используется в качестве ингредиента рецепта и для записи в _Схематичный столе_", - "item.create.schematic.tooltip": "SCHEMATIC", + "item.create.schematic.tooltip": "СХЕМАТИКА", "item.create.schematic.tooltip.summary": "Содержит структуру, которая будет позиционироваться и помещаться в мир. Расположите голограмму по своему усмотрению и используйте _схематичную пушку_ для ее построения.", "item.create.schematic.tooltip.condition1": "При удерживании", "item.create.schematic.tooltip.behaviour1": "Может быть позиционирован с помощью инструментов на экране.", "item.create.schematic.tooltip.control1": "ПКМ крадучись", "item.create.schematic.tooltip.action1": "Открывает _интерфейс_ для ввода _точных_ _координат_.", - "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", + "item.create.schematic_and_quill.tooltip": "СХЕМАТИКА И ПЕРО", "item.create.schematic_and_quill.tooltip.summary": "Используется для сохранения структуры в вашем мире в файл .nbt.", "item.create.schematic_and_quill.tooltip.condition1": "Шаг 1", "item.create.schematic_and_quill.tooltip.behaviour1": "Выберите две угловые точки, используя ПКМ.", @@ -1318,138 +1358,143 @@ "item.create.schematic_and_quill.tooltip.control3": "ПКМ крадучись", "item.create.schematic_and_quill.tooltip.action3": "_Сбрасывает_ и _удаляет_ выделение.", - "block.create.schematicannon.tooltip": "SCHEMATICANNON", + "block.create.schematicannon.tooltip": "СХЕМАТИЧНАЯ ПУШКА", "block.create.schematicannon.tooltip.summary": "_Ставит блоки_ для воссоздания _схематики_ в мире. Использует предметы из _соседнего_ _инвентаря_ и _порох_ в качестве _топлива_.", "block.create.schematicannon.tooltip.condition1": "ПКМ", "block.create.schematicannon.tooltip.behaviour1": "Открывает _Интерфейс_", - "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", + "block.create.schematic_table.tooltip": "СХЕМАТИЧНЫЙ СТОЛ", "block.create.schematic_table.tooltip.summary": "Записывает сохраненные схематики в _пустые_ _схематики_.", "block.create.schematic_table.tooltip.condition1": "Когда дана пустая схема", "block.create.schematic_table.tooltip.behaviour1": "Загружает выбранный файл из вашей папки Schematics.", - "item.create.goggles.tooltip": "GOGGLES", + "item.create.goggles.tooltip": "ИНЖЕНЕРНЫЕ ОЧКИ", "item.create.goggles.tooltip.summary": "Очки для улучшения зрения с помощью полезной кинетической информации.", "item.create.goggles.tooltip.condition1": "При ношении", - "item.create.goggles.tooltip.behaviour1": "Показывает _цветные_ _индикаторы_, соответствующие _уровню_ _скорости_ размещённого кинетического компонента, а также воздействию момента и мощности отдельных компонентов.", + "item.create.goggles.tooltip.behaviour1": "Показывает _цветные_ _индикаторы_, соответствующие _уровню_ _скорости_ размещённого кинетического компонента, а также _создаваемой нагрузке_ и _мощности_ отдельных компонентов.", "item.create.goggles.tooltip.condition2": "При взгляде на датчик", - "item.create.goggles.tooltip.behaviour2": "Показывает подробную информацию о скорости или моменте сети, к которой подключён датчик.", + "item.create.goggles.tooltip.behaviour2": "Показывает подробную информацию о скорости или нагрузке сети, к которой подключён датчик.", "item.create.goggles.tooltip.condition3": "При взгляде на жидкостные контейнеры", "item.create.goggles.tooltip.behaviour3": "Показывает детализированную информацию о _Ёмкости_ блока и о хранящейся в нём хранится _Жидкости_.", - "item.create.wrench.tooltip": "WRENCH", + "item.create.wrench.tooltip": "ГАЕЧНЫЙ КЛЮЧ", "item.create.wrench.tooltip.summary": "Полезный _инструмент_ для работы с _кинетическими_ штуковинами. Может использоваться для _поворота_, _демонтажа_ и _настройки_ компонентов.", "item.create.wrench.tooltip.control1": "ПКМ по кинетическому блоку", "item.create.wrench.tooltip.action1": "_Поворачивает_ _компонент_ с которым вы взаимодействуете _к_ _лицу_ или _от_ _лица_.", "item.create.wrench.tooltip.control2": "ПКМ крадучись", "item.create.wrench.tooltip.action2": "Разбирает кинетические компоненты и помещает их обратно в ваш инвентарь.", - "block.create.nozzle.tooltip": "NOZZLE", + "block.create.nozzle.tooltip": "ФОРСУНКА", "block.create.nozzle.tooltip.summary": "Прикрепите к передней части _вентилятора_, чтобы распределить его влияние на сущностей _во_ _всех_ _направлениях_.", - "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip": "ЧАСЫ С КУКУШКОЙ", "block.create.cuckoo_clock.tooltip.summary": "_Прекрасное_ _мастерство_ для _украшения_ пространства и _отслеживания_ _времени_.", "block.create.cuckoo_clock.tooltip.condition1": "При вращении", "block.create.cuckoo_clock.tooltip.behaviour1": "Показывает текущее время и напевает мелодию два раза в день. _Активируется_ _один_ _раз_ в _полдень_ и в _сумерках_, как только _игроки_ _могут_ _спать_.", - "block.create.turntable.tooltip": "TURNTABLE", + "block.create.turntable.tooltip": "ПОВОРОТНЫЙ СТОЛ", "block.create.turntable.tooltip.summary": "Преобразует _силу_ _вращения_ прямиком в морскую болезнь.", - "block.create.stockpile_switch.tooltip": "stockpile_switch", - "block.create.stockpile_switch.tooltip.summary": "Подаёт сигнал красного камня в зависимости от _заполниности_ _прикреплённого_ _ящика_.", + "block.create.stockpile_switch.tooltip": "НАСТРАИВАЕМЫЙ КОМПАРАТОР", + "block.create.stockpile_switch.tooltip.summary": "Подаёт сигнал красного камня в зависимости от _заполненности_ _прикреплённого_ _ящика_.", "block.create.stockpile_switch.tooltip.condition1": "Когда ниже нижнего предела", "block.create.stockpile_switch.tooltip.behaviour1": "Не подаёт _сигнал_ _красного_ _камня_.", - "block.create.content_observer.tooltip": "CONTENT OBSERVER", + "block.create.content_observer.tooltip": "НАБЛЮДАТЕЛЬ ЗА СОДЕРЖИМЫМ", "block.create.content_observer.tooltip.summary": "_Обнаруживает элементы_ внутри _контейнеров_ и _конвейеров_, соответствующие настроенному _фильтру_. Если наблюдаемый инвентарь, ремень или шланг содержит совпадающий элемент, этот компонент излучает сигнал красного камня. Когда наблюдаемая _ воронка передает_ соответствующий предмет, этот компонент испускает _импульс_.", - "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", - "block.create.adjustable_crate.tooltip.summary": "Этот контейнер для хранения позволяет вручную контролировать его емкость. Он может вместить до 16 стэков любого предмета. Поддерживает компараторы.", + "block.create.adjustable_crate.tooltip": "РЕГУЛИРУЕМЫЙ ЯЩИК", + "block.create.adjustable_crate.tooltip.summary": "Этот контейнер для хранения позволяет вручную контролировать его емкость. Он может вместить до 16 стаков любого предмета. Поддерживает компараторы.", "block.create.adjustable_crate.tooltip.condition1": "ПКМ", "block.create.adjustable_crate.tooltip.behaviour1": "Открывает _Интерфейс_.", - "block.create.creative_crate.tooltip": "THE ENDLESS CRATE", + "block.create.creative_crate.tooltip": "ТВОРЧЕСКИЙ ЯЩИК", "block.create.creative_crate.tooltip.summary": "Этот _контейнер_ для _хранения_ позволяющий _бесконечную_ _дублировать_ любой предмет. Поместите рядом со схематичной пушкой, чтобы удалить любые требования к материалу.", "block.create.creative_crate.tooltip.condition1": "Когда предмет в слоте фильтра", "block.create.creative_crate.tooltip.behaviour1": "Все, что извлечено из этого контейнера, обеспечит бесконечную поставку указанного предмета. Предметы, _вставленные_ в этот ящик, будут _аннулированы_.", - "block.create.controller_rail.tooltip": "CONTROLLER RAIL", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + + "block.create.controller_rail.tooltip": "КОНТРОЛИРУЮЩАЯ РЕЛЬСА", "block.create.controller_rail.tooltip.summary": "_Все-направленные запитанные рельсы_, позволяющие _точную настройку_ _скорости_ вагонеток.", "block.create.controller_rail.tooltip.condition1": "Когда запитано редстоун-сигналом", - "block.create.controller_rail.tooltip.behaviour1": "_Ускоряет_ или _замедляет_ _прошедшие вагонетки_, на велечину зависящую от _силы сигнала_. Распространая сигнал красного камня на соседние контролирующие рельсы. Питание двух контроллирующих рельс с разной мощностью приведет к тому, что дорожки между ними будут интерполировать свой сигнал.", + "block.create.controller_rail.tooltip.behaviour1": "_Ускоряет_ или _замедляет_ _прошедшие вагонетки_, на величину зависящую от _силы сигнала_. Распространяя сигнал красного камня на соседние контролирующие рельсы. Питание двух контролирующих рельс с разной мощностью приведет к тому, что дорожки между ними будут интерполировать свой сигнал.", - "item.create.sand_paper.tooltip": "SAND PAPER", + "item.create.sand_paper.tooltip": "НАЖДАЧНАЯ БУМАГА", "item.create.sand_paper.tooltip.summary": "Грубая бумага, которую можно использовать для _полировки материалов_. Может применяться автоматически с помощью автономного активатора.", "item.create.sand_paper.tooltip.condition1": "Когда используется", "item.create.sand_paper.tooltip.behaviour1": "Полирует предметы во _второй руке_, или лежащие _на полу_, если _смотреть на них_", - "item.create.builders_tea.tooltip": "BUILDERS TEA", + "item.create.builders_tea.tooltip": "ЧАЙ СТРОИТЕЛЯ", "item.create.builders_tea.tooltip.summary": "Идеальный напиток для начала дня. _Мотивирует и насыщает_.", - "item.create.refined_radiance.tooltip": "REFINED RADIANCE", + "item.create.refined_radiance.tooltip": "ИЗЫСКАННОЕ СИЯНИЕ", "item.create.refined_radiance.tooltip.summary": "Хроматический материал, _добытый_ _из_ _поглощенного_ _света_.", - "item.create.refined_radiance.tooltip.condition1": "UNLOCALIZED: Work In Progress", - "item.create.refined_radiance.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", + "item.create.refined_radiance.tooltip.condition1": "Работа в процессе", + "item.create.refined_radiance.tooltip.behaviour1": "Использование этого материала будет доступно в следующем обновлении.", - "item.create.shadow_steel.tooltip": "SHADOW STEEL", + "item.create.shadow_steel.tooltip": "ВОЗВРАЩЕНИЕ ПУСТОТЫ", "item.create.shadow_steel.tooltip.summary": "Хроматический материал, _добытый_ _в_ _пустоте_.", - "item.create.shadow_steel.tooltip.condition1": "UNLOCALIZED: Work In Progress", - "item.create.shadow_steel.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", + "item.create.shadow_steel.tooltip.condition1": "Работа в процессе", + "item.create.shadow_steel.tooltip.behaviour1": "Использование этого материала будет доступно в следующем обновлении.", - "item.create.linked_controller.tooltip": "UNLOCALIZED: LINKED CONTROLLER", - "item.create.linked_controller.tooltip.summary": "UNLOCALIZED: Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.", - "item.create.linked_controller.tooltip.condition1": "UNLOCALIZED: R-Click", - "item.create.linked_controller.tooltip.behaviour1": "UNLOCALIZED: _Toggles_ the controller. _Movement_ _controls_ are taken over while its active.", - "item.create.linked_controller.tooltip.condition2": "UNLOCALIZED: R-Click while Sneaking", - "item.create.linked_controller.tooltip.behaviour2": "UNLOCALIZED: Opens the manual _Configuration Interface_.", - "item.create.linked_controller.tooltip.condition3": "UNLOCALIZED: R-Click on Redstone Link Receiver", - "item.create.linked_controller.tooltip.behaviour3": "UNLOCALIZED: Enables _Bind Mode_, press one of the _six controls_ to bind it to the _Links' Frequency_.", - "item.create.linked_controller.tooltip.condition4": "UNLOCALIZED: R-Click on Lectern", - "item.create.linked_controller.tooltip.behaviour4": "UNLOCALIZED: Places the Controller into the Lectern for easy activation. (R-Click while Sneaking to retrieve it)", + "item.create.linked_controller.tooltip": "ПОДКЛЮЧАЕМЫЙ КОНТРОЛЛЕР", + "item.create.linked_controller.tooltip.summary": "Предоставляет _ручной_ _контроль_ над частотами _Беспроводного передатчика редстоун сигнала_, присвоенные его _шести_ кнопкам.", + "item.create.linked_controller.tooltip.condition1": "ПКМ", + "item.create.linked_controller.tooltip.behaviour1": "Включает контроллер. _Управление_ _движением_ перехвачено, пока он активен.", + "item.create.linked_controller.tooltip.condition2": "ПКМ крадучись", + "item.create.linked_controller.tooltip.behaviour2": "Открывает _интерфейс_ _конфигурации_.", + "item.create.linked_controller.tooltip.condition3": "ПКМ по приемнику сигнала редстоуна", + "item.create.linked_controller.tooltip.behaviour3": "Включает _режим привязки_, нажмите одну из _шести кнопок_, чтобы привязать его к _частоте передатчика_.", + "item.create.linked_controller.tooltip.condition4": "ПКМ по кафедре", + "item.create.linked_controller.tooltip.behaviour4": "Помещает контроллер на кафедру для удобства использования. (ПКМ крадучись, чтобы забрать его)", - "item.create.diving_helmet.tooltip": "UNLOCALIZED: DIVING HELMET", - "item.create.diving_helmet.tooltip.summary": "UNLOCALIZED: Together with a _Copper_ _Backtank_, allows the wielder to _breathe_ _underwater_ for an extended amount of time.", - "item.create.diving_helmet.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_helmet.tooltip.behaviour1": "UNLOCALIZED: Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.", + "item.create.diving_helmet.tooltip": "ШЛЕМ ДЛЯ ДАЙВИНГА", + "item.create.diving_helmet.tooltip.summary": "Вместе с _медным_ _баллоном_, позволяет владельцу _дышать _ _под водой_ в течение длительного времени.", + "item.create.diving_helmet.tooltip.condition1": "При ношении", + "item.create.diving_helmet.tooltip.behaviour1": "Даёт эффект _Водного Дыхания_, медленно тратя _воздух_ из баллона.", - "item.create.copper_backtank.tooltip": "UNLOCALIZED: COPPER BACKTANK", - "item.create.copper_backtank.tooltip.summary": "UNLOCALIZED: A _Wearable_ _Tank_ for carrying Pressurized Air.", - "item.create.copper_backtank.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.copper_backtank.tooltip.behaviour1": "UNLOCALIZED: Provides _Pressurized_ _Air_ to Equipment that requires it.", - "item.create.copper_backtank.tooltip.condition2": "UNLOCALIZED: When placed, Powered by Kinetics", - "item.create.copper_backtank.tooltip.behaviour2": "UNLOCALIZED: _Collects_ _Pressurized_ _Air_ at a rate depending on the Rotational Speed.", + "item.create.copper_backtank.tooltip": "МЕДНЫЙ БАЛЛОН", + "item.create.copper_backtank.tooltip.summary": "_Носимый_ _резервуар_ для транспортировки воздуха под давлением.", + "item.create.copper_backtank.tooltip.condition1": "При ношении", + "item.create.copper_backtank.tooltip.behaviour1": "Обеспечивает подачу _воздуха_ под _давлением_ к оборудованию, которое в этом нуждается.", + "item.create.copper_backtank.tooltip.condition2": "При размещении и питании от кинетической энергии", + "item.create.copper_backtank.tooltip.behaviour2": "Собирает и сжимает воздух со скоростью, зависящей от скорости вращения.", - "item.create.diving_boots.tooltip": "UNLOCALIZED: DIVING BOOTS", - "item.create.diving_boots.tooltip.summary": "UNLOCALIZED: A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.", - "item.create.diving_boots.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_boots.tooltip.behaviour1": "UNLOCALIZED: Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.", + "item.create.diving_boots.tooltip": "БОТИНКИ ДЛЯ ДАЙВИНГА", + "item.create.diving_boots.tooltip.summary": "Пара _тяжелых_ _ботинок_, позволяющая лучше передвигаться по океанскому дну.", + "item.create.diving_boots.tooltip.condition1": "При ношении", + "item.create.diving_boots.tooltip.behaviour1": "Владелец _тонет_ _быстрее_ и _не_ может _плавать_. Ботинки дают возможность _ходить_ и _прыгать_ под водой. На владельца также больше не влияют механические ремни (передвижение по конвейеру).", - "item.create.crafting_blueprint.tooltip": "UNLOCALIZED: CRAFTING BLUEPRINT", - "item.create.crafting_blueprint.tooltip.summary": "UNLOCALIZED: _Placed_ on a wall, it can be used to _specify_ _ingredient_ _arrangements_ for easier manual crafting. Each slot represents a Recipe.", - "item.create.crafting_blueprint.condition1": "UNLOCALIZED: R-Click empty Slot", - "item.create.crafting_blueprint.behaviour1": "UNLOCALIZED: Opens a _Crafting_ _menu_ allowing you to _configure_ a _recipe_ and items to display.", - "item.create.crafting_blueprint.condition2": "UNLOCALIZED: R-Click configured Slot", - "item.create.crafting_blueprint.behaviour2": "UNLOCALIZED: _Applies_ the _configured_ _recipe_ with matching Ingredients found in your _Inventory_. _Sneak_ to craft up to a _Stack_ of items.", + "item.create.crafting_blueprint.tooltip": "СОЗДАНИЕ ЧЕРТЕЖА", + "item.create.crafting_blueprint.tooltip.summary": "_Разместив_ на стене, его можно использовать для _определения_ _расположения_ _компонентов_ (блоков) для более простого ручного создания предметов. Каждый слот показывает Рецепт.", + "item.create.crafting_blueprint.condition1": "ПКМ по пустому слоту", + "item.create.crafting_blueprint.behaviour1": "Открывает меню _крафта_, позволяющее _настроить_ _рецепт_ и отображаемые предметы.", + "item.create.crafting_blueprint.condition2": "ПКМ по настроенному слоту", + "item.create.crafting_blueprint.behaviour2": "_Применяет_ _заданный_ _рецепт_ с подходящими ингредиентами, из вашего _инвентаря_. _Shift_, чтобы создать целого до _стака_ предметов..", - "item.create.minecart_coupling.tooltip": "MINECART COUPLING", + "item.create.minecart_coupling.tooltip": "СОЕДЕНИТЕЛЬ ВАГОНЕТОК", "item.create.minecart_coupling.tooltip.summary": "_Соединяет_ ваши _вагонетки_ или _Перевозочные устройства_ вместе, чтобы создать великолепный поезд.", "item.create.minecart_coupling.tooltip.condition1": "При использовании на вагонетке", "item.create.minecart_coupling.tooltip.behaviour1": "_Соединяет_ две вагонетки вместе, пытаясь держать их на _определенной дистанции_ при движении.", - "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip": "СТРАННЫЙ КОЛОКОЛ", + "block.create.peculiar_bell.tooltip.summary": "Декоративный _латунный колокол_. Установка его прямо над горящем _Огнем душ_ может вызвать побочные эффекты...с", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "ПРИЗРАЧНЫЙ КОЛОКОЛ", + "block.create.haunted_bell.tooltip.summary": "_Проклятый колокол_ населенный потерянными душами Нижнего мира.", + "block.create.haunted_bell.tooltip.condition1": "При ношении или при звоне", + "block.create.haunted_bell.tooltip.behaviour1": "Подсвечивает ближайшие _места без света_ на которых могут появляться _враждебные мобы_..", "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "Удерживайте [%1$s] для Размышления", + "create.ponder.hold_to_ponder": "Удерживайте [%1$s] для размышления", "create.ponder.subject": "Субъект этой сцены", - "create.ponder.pondering": "Размышляем о...", + "create.ponder.pondering": "Размышляем о/об...", "create.ponder.identify_mode": "Режим Идентификации включён.\nУбрать паузу: [%1$s]", "create.ponder.associated": "Связанные статьи", "create.ponder.close": "Закрыть", @@ -1459,46 +1504,46 @@ "create.ponder.replay": "Воспроизвести снова", "create.ponder.think_back": "Подумать о предыдущем", "create.ponder.slow_text": "Удобное чтение", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "С помощью Суперклея или Шасси, более крупные структуры могут быть сдивинуты.", - "create.ponder.shared.rpm32": "32 об./мин.", - "create.ponder.shared.sneak_and": "Красться +", - "create.ponder.shared.storage_on_contraption": "Присоединённые к Штуковине инвентари будут подбирать вещи автоматически", + "create.ponder.exit": "Выйти", + "create.ponder.welcome": "Добро пожаловать в размышления", + "create.ponder.categories": "Категории, доступные в Create", + "create.ponder.index_description": "Кликните по одной из иконок, чтобы узнать о связанных с ней предметах и блоках.", + "create.ponder.index_title": "Содержание размышлений", + "create.ponder.shared.rpm16": "16 об./мин.", "create.ponder.shared.behaviour_modify_wrench": "Это поведение может быть изменено Ключом", + "create.ponder.shared.storage_on_contraption": "Присоединённые к штуковине инвентари будут подбирать вещи автоматически", + "create.ponder.shared.sneak_and": "Красться +", "create.ponder.shared.rpm8": "8 об./мин.", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm32": "32 об./мин.", "create.ponder.shared.rpm16_source": "Источник: 16 об./мин.", - "create.ponder.shared.rpm16": "16 об./мин.", - "create.ponder.tag.kinetic_sources": "Кинетические источники", - "create.ponder.tag.kinetic_sources.description": "Компоненты, генерирующие Силу Вращения", - "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", - "create.ponder.tag.contraption_actor.description": "Компоненты, проявляющие особое поведение когда прикреплены к двигающейся штуковине", - "create.ponder.tag.arm_targets": "Цели для Механической Руки", - "create.ponder.tag.arm_targets.description": "Компоненты, которые могут быть выбраны входами или выходами для Механической Руки", - "create.ponder.tag.logistics": "Транспортировка Предметов", - "create.ponder.tag.logistics.description": "Компоненты, помогающие перемещать предметы", - "create.ponder.tag.movement_anchor": "Опоры Движения", - "create.ponder.tag.movement_anchor.description": "Компоненты, позволяющие создавать двигающиеся штуковины, оживляя прикрепленную структуру разными способами", - "create.ponder.tag.creative": "Творческий режим", - "create.ponder.tag.creative.description": "Компоненты обычычно недоступные в Режиме Выживания", - "create.ponder.tag.kinetic_relays": "Кинетические блоки", - "create.ponder.tag.kinetic_relays.description": "Компоненты, помогающие передавать Силу Вращения куда-нибудь", - "create.ponder.tag.windmill_sails": "Паруса для Мельничных Подшипников", - "create.ponder.tag.windmill_sails.description": "Блоки, число которых увеличивает силу Мельницы. Каждый из этих блоков имеет одинаковую эффективность в деле.", + "create.ponder.shared.movement_anchors": "С помощью суперклея или шасси, более крупные структуры могут быть сдвинуты.", + "create.ponder.tag.redstone": "Логические компоненты", + "create.ponder.tag.redstone.description": "Компоненты, помогающие с конструированием редстоун схем", "create.ponder.tag.contraption_assembly": "Приспособления для присоединения блоков", "create.ponder.tag.contraption_assembly.description": "Инструменты и Компоненты используемые для сборки структур передвигаемых как движущиеся Штуковины", + "create.ponder.tag.fluids": "Жидкостные манипуляторы", + "create.ponder.tag.fluids.description": "Компоненты, помогающие перемещать и использовать жидкости", "create.ponder.tag.decoration": "Эстетика", "create.ponder.tag.decoration.description": "Компоненты, чаще всего используемые для декоративных целей", - "create.ponder.tag.kinetic_appliances": "Кинетические Приборы", - "create.ponder.tag.kinetic_appliances.description": "Компоненты, использующие Силу Вращения", - "create.ponder.tag.redstone": "Логические Компоненты", - "create.ponder.tag.redstone.description": "Компоненты, помогающие с конструироваением Редстоун Схем", - "create.ponder.tag.fluids": "Жидкостные Манипуляторы", - "create.ponder.tag.fluids.description": "Компоненты, помогающие перемещать и использовать Жидкости", + "create.ponder.tag.windmill_sails": "Паруса для Подшипников ветряной мельницы", + "create.ponder.tag.windmill_sails.description": "Блоки, число которых увеличивает силу Ветряной мельницы. Каждый из этих блоков имеет одинаковую эффективность в деле.", + "create.ponder.tag.arm_targets": "Цели для Механической руки", + "create.ponder.tag.arm_targets.description": "Компоненты, которые могут быть выбраны входами или выходами для Механической руки", + "create.ponder.tag.kinetic_appliances": "Кинетические приборы", + "create.ponder.tag.kinetic_appliances.description": "Компоненты, использующие силу вращения", + "create.ponder.tag.kinetic_sources": "Кинетические источники", + "create.ponder.tag.kinetic_sources.description": "Компоненты, генерирующие силу вращения", + "create.ponder.tag.movement_anchor": "Опоры движения", + "create.ponder.tag.movement_anchor.description": "Компоненты, позволяющие создавать двигающиеся штуковины, оживляя прикрепленную структуру разными способами", + "create.ponder.tag.kinetic_relays": "Кинетические блоки", + "create.ponder.tag.kinetic_relays.description": "Компоненты, помогающие передавать силу вращения куда-нибудь", + "create.ponder.tag.contraption_actor": "Компоненты штуковин", + "create.ponder.tag.contraption_actor.description": "Компоненты, проявляющие особое поведение когда прикреплены к двигающейся штуковине", + "create.ponder.tag.creative": "Творческий режим", + "create.ponder.tag.creative.description": "Компоненты обычно недоступные в Режиме Выживания", + "create.ponder.tag.logistics": "Транспортировка предметов", + "create.ponder.tag.logistics.description": "Компоненты, помогающие перемещать предметы", "create.ponder.adjustable_pulse_repeater.header": "Управлении сигналами с помощью Регулируемого импульсного повторителя", "create.ponder.adjustable_pulse_repeater.text_1": "Регулируемые импульсные повторители испускают короткий импульс с задержкой", @@ -1512,748 +1557,750 @@ "create.ponder.adjustable_repeater.text_4": "Используя колесо мыши, время зарядки может быть настроено", "create.ponder.adjustable_repeater.text_5": "Настраиваемая задержка может достигать 30 минут", - "create.ponder.analog_lever.header": "Управлении сигналами используя Аналоговый Рычаг", - "create.ponder.analog_lever.text_1": "Аналоговый Рычаг создан как компактный и точный источник Редстоун Сигнала", - "create.ponder.analog_lever.text_2": "ПКМ чтобы увеличить силу выходного сигнала", - "create.ponder.analog_lever.text_3": "ПКМ Крадучись чтобы уменьшить силу выходного сигнала снова", - - "create.ponder.andesite_tunnel.header": "UNLOCALIZED: Using Andesite Tunnels", - "create.ponder.andesite_tunnel.text_1": "UNLOCALIZED: Andesite Tunnels can be used to cover up your belts", - "create.ponder.andesite_tunnel.text_2": "UNLOCALIZED: Whenever an Andesite Tunnel has connections to the sides...", - "create.ponder.andesite_tunnel.text_3": "UNLOCALIZED: ...they will split exactly one item off of any passing stacks", - "create.ponder.andesite_tunnel.text_4": "UNLOCALIZED: The remainder will continue on its path", - - "create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin", - "create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing", - "create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them", - "create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet", - "create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here", - "create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below", - "create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing", - "create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients", - "create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin", - "create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items", - - "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", - "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", - "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", - - "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", - - "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", - "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", - "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", - "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", - "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", - "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", - "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", - - "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", - "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", - "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", - "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", - "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", - "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", - "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks", - - "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", - "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", - "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", - - "create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners", - "create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin", - "create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items", - "create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat", - "create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms", - - "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.brass_tunnel.header": "UNLOCALIZED: Using Brass Tunnels", - "create.ponder.brass_tunnel.text_1": "UNLOCALIZED: Brass Tunnels can be used to cover up your belts", - "create.ponder.brass_tunnel.text_2": "UNLOCALIZED: Brass Tunnels have filter slots on each open side", - "create.ponder.brass_tunnel.text_3": "UNLOCALIZED: Filters on inbound connections simply block non-matching items", - "create.ponder.brass_tunnel.text_4": "UNLOCALIZED: Filters on outbound connections can be used to sort items by type", - "create.ponder.brass_tunnel.text_5": "UNLOCALIZED: Whenever a passing item has multiple valid exits, the distribution mode will decide how to handle it", - "create.ponder.brass_tunnel.text_6": "UNLOCALIZED: Brass Tunnels on parallel belts will form a group", - "create.ponder.brass_tunnel.text_7": "UNLOCALIZED: Incoming Items will now be distributed across all connected exits", - "create.ponder.brass_tunnel.text_8": "UNLOCALIZED: For this, items can also be inserted into the Tunnel block directly", - - "create.ponder.brass_tunnel_modes.header": "UNLOCALIZED: Distribution Modes of the Brass Tunnel", - "create.ponder.brass_tunnel_modes.text_1": "UNLOCALIZED: Using a Wrench, the distribution behaviour of Brass Tunnels can be configured", - "create.ponder.brass_tunnel_modes.text_10": "UNLOCALIZED: 'Synchronize Inputs' is a unique setting for Brass Tunnels", - "create.ponder.brass_tunnel_modes.text_11": "UNLOCALIZED: Items are only allowed past if every tunnel in the group has one waiting", - "create.ponder.brass_tunnel_modes.text_12": "UNLOCALIZED: This ensures that all affected belts supply items at the same rate", - "create.ponder.brass_tunnel_modes.text_2": "UNLOCALIZED: 'Split' will attempt to distribute the stack evenly between available outputs", - "create.ponder.brass_tunnel_modes.text_3": "UNLOCALIZED: If an output is unable to take more items, it will be skipped", - "create.ponder.brass_tunnel_modes.text_4": "UNLOCALIZED: 'Forced Split' will never skip outputs, and instead wait until they are free", - "create.ponder.brass_tunnel_modes.text_5": "UNLOCALIZED: 'Round Robin' keeps stacks whole, and cycles through outputs iteratively", - "create.ponder.brass_tunnel_modes.text_6": "UNLOCALIZED: Once Again, if an output is unable to take more items, it will be skipped", - "create.ponder.brass_tunnel_modes.text_7": "UNLOCALIZED: 'Forced Round Robin' never skips outputs", - "create.ponder.brass_tunnel_modes.text_8": "UNLOCALIZED: 'Prefer Nearest' prioritizes the outputs closest to the items' input location", - "create.ponder.brass_tunnel_modes.text_9": "UNLOCALIZED: 'Randomize' will distribute whole stacks to randomly picked outputs", - - "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", - "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", - "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", - "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", - - "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", - "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", - "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", - "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", - - "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", - "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", - "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: This Arrow indicates which side of the Structure will be considered the front", - "create.ponder.cart_assembler_modes.text_3": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", - - "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", - "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", - "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", - "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", - "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", - - "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", - "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", - "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", - "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - - "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", - "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exactly like Chain Drives", - "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", - "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", - "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", - "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", - "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - - "create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", - "create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories", - "create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created", - "create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal", - - "create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes", - "create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward", - "create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction", - "create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides", - - "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", - "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", - "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", - "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", - "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", - "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", - "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", - "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", - "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", - - "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - - "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - - "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - - "create.ponder.creative_fluid_tank.header": "UNLOCALIZED: Creative Fluid Tanks", - "create.ponder.creative_fluid_tank.text_1": "UNLOCALIZED: Creative Fluid Tanks can be used to provide a bottomless supply of fluid", - "create.ponder.creative_fluid_tank.text_2": "UNLOCALIZED: Right-Click with a fluid containing item to configure it", - "create.ponder.creative_fluid_tank.text_3": "UNLOCALIZED: Pipe Networks can now endlessly draw the assigned fluid from the tank", - "create.ponder.creative_fluid_tank.text_4": "UNLOCALIZED: Any Fluids pushed back into a Creative Fluid Tank will be voided", - - "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", - "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", - "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", - - "create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels", - "create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively", - "create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other", - "create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed", - "create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well", - - "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", - "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", - "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", - "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", - "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", - "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", - "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", - "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", - "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", - "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", - "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", - "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", - "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", - "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", - "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", - "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", - - "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", - "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", - "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", - "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", - - "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", - "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", - "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", - - "create.ponder.deployer_processing.header": "UNLOCALIZED: Processing Items using Deployers", - "create.ponder.deployer_processing.text_1": "UNLOCALIZED: With a fitting held item, Deployers can process items provided beneath them", - "create.ponder.deployer_processing.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Deployer", - "create.ponder.deployer_processing.text_3": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.deployer_processing.text_4": "UNLOCALIZED: The Deployer will hold and process them automatically", - - "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", - "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", - "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", - "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", - - "create.ponder.depot.header": "UNLOCALIZED: Using Depots", - "create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements", - "create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it", - "create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing", - "create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms", - - "create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners", - "create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it", - "create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly", - "create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines", - "create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating", - - "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", - "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", - "create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state", - "create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed", - - "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", - "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", - "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", - - "create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans", - "create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated", - "create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted", - "create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated", - "create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them", - "create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup", - "create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it", - "create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range", - "create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts", - - "create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans", - "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", - "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", - - "create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes", - "create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets", - "create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window", - "create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments", - "create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids", - "create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first", - "create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents", - "create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid", - - "create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers", - "create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks", - "create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained", - "create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...", - "create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources", - "create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly", - - "create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank", - "create.ponder.fluid_tank_sizes.text_1": "UNLOCALIZED: Fluid Tanks can be combined to increase the total capacity", - "create.ponder.fluid_tank_sizes.text_2": "UNLOCALIZED: Their base square can be up to 3 blocks wide...", - "create.ponder.fluid_tank_sizes.text_3": "UNLOCALIZED: ...and grow in height by more than 30 additional layers", - "create.ponder.fluid_tank_sizes.text_4": "UNLOCALIZED: Using a Wrench, a tanks' window can be toggled", - - "create.ponder.fluid_tank_storage.header": "UNLOCALIZED: Storing Fluids in Fluid Tanks", - "create.ponder.fluid_tank_storage.text_1": "UNLOCALIZED: Fluid Tanks can be used to store large amounts of fluid", - "create.ponder.fluid_tank_storage.text_2": "UNLOCALIZED: Pipe networks can push and pull fluids from any side", - "create.ponder.fluid_tank_storage.text_3": "UNLOCALIZED: The contained fluid can be measured by a Comparator", - "create.ponder.fluid_tank_storage.text_4": "UNLOCALIZED: However, in Survival Mode Fluids cannot be added or taken manually", - "create.ponder.fluid_tank_storage.text_5": "UNLOCALIZED: You can use Basins, Item Drains and Spouts to drain or fill fluid containing items", - - "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", - "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", - "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", - "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", - - "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", - "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", - "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", - "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting", - - "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", - "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement. A mechanical belt should help here.", - - "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", - "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", - "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", - "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", - - "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - - "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - - "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", - "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", - "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", - "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", - "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", - - "create.ponder.hose_pulley.header": "UNLOCALIZED: Source Filling and Draining using Hose Pulleys", - "create.ponder.hose_pulley.text_1": "UNLOCALIZED: Hose Pulleys can be used to fill or drain large bodies of Fluid", - "create.ponder.hose_pulley.text_2": "UNLOCALIZED: With the Kinetic Input, the height of the pulleys' hose can be controlled", - "create.ponder.hose_pulley.text_3": "UNLOCALIZED: The Pulley retracts while the input rotation is inverted", - "create.ponder.hose_pulley.text_4": "UNLOCALIZED: On the opposite side, pipes can be connected", - "create.ponder.hose_pulley.text_5": "UNLOCALIZED: Attached pipe networks can either provide fluid to the hose...", - "create.ponder.hose_pulley.text_6": "UNLOCALIZED: ...or pull from it, draining the pool instead", - "create.ponder.hose_pulley.text_7": "UNLOCALIZED: Fill and Drain speed of the pulley depends entirely on the fluid networks' throughput", - - "create.ponder.hose_pulley_infinite.header": "UNLOCALIZED: Passively Filling and Draining large bodies of Fluid", - "create.ponder.hose_pulley_infinite.text_1": "UNLOCALIZED: When deploying the Hose Pulley into a large enough ocean...", - "create.ponder.hose_pulley_infinite.text_2": "UNLOCALIZED: It will provide/dispose fluids without affecting the source", - "create.ponder.hose_pulley_infinite.text_3": "UNLOCALIZED: Pipe networks can limitlessly take fluids from/to such pulleys", - - "create.ponder.hose_pulley_level.header": "UNLOCALIZED: Fill and Drain level of Hose Pulleys", - "create.ponder.hose_pulley_level.text_1": "UNLOCALIZED: While fully retracted, the Hose Pulley cannot operate", - "create.ponder.hose_pulley_level.text_2": "UNLOCALIZED: Draining runs from top to bottom", - "create.ponder.hose_pulley_level.text_3": "UNLOCALIZED: The surface level will end up just below where the hose ends", - "create.ponder.hose_pulley_level.text_4": "UNLOCALIZED: Filling runs from bottom to top", - "create.ponder.hose_pulley_level.text_5": "UNLOCALIZED: The filled pool will not grow beyond the layer above the hose end", - - "create.ponder.item_drain.header": "UNLOCALIZED: Emptying Fluid Containers using Item Drains", - "create.ponder.item_drain.text_1": "UNLOCALIZED: Item Drains can extract fluids from items", - "create.ponder.item_drain.text_2": "UNLOCALIZED: Right-click it to pour fluids from your held item into it", - "create.ponder.item_drain.text_3": "UNLOCALIZED: When items are inserted from the side...", - "create.ponder.item_drain.text_4": "UNLOCALIZED: ...they roll across, emptying out their contained fluid", - "create.ponder.item_drain.text_5": "UNLOCALIZED: Pipe Networks can now pull the fluid from the drains' internal buffer", - - "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - - "create.ponder.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", - "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", - "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", - "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", - "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", - "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", - "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", - "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", - "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", - - "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", - "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", - "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", - "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", - - "create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms", - "create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed", - "create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets", - "create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)", - "create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection", - "create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously", - "create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range", - "create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly", - "create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap", - - "create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm", - "create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs", - "create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs", - "create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter", - "create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering", - "create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm", - "create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute", - - "create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm", - "create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input", - "create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs", - "create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...", - "create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting", - "create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it", - "create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available", - "create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped", - "create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free", - "create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm", - - "create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone", - "create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate", - "create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles", - "create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", - - "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", - "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", - "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", - - "create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters", - "create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe", - "create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged", - "create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side", - "create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit", - "create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate", - "create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually", - "create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin", - "create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse", - - "create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters", - "create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically", - "create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined", - "create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location", - - "create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters", - "create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path", - "create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement", - "create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters", - - "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", - "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", - "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", - - "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", - "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", - "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", - - "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", - "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", - "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", - - "create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer", - "create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated", - "create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones", - "create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner", - "create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.", - - "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", - "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", - "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", - "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", - - "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", - "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", - "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", - - "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", - "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", - "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", - "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", - "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", - - "create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press", - "create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it", - "create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press", - "create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically", - - "create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press", - "create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted", - "create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones", - "create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner", - "create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.", - - "create.ponder.mechanical_pump_flow.header": "UNLOCALIZED: Fluid Transportation using Mechanical Pumps", - "create.ponder.mechanical_pump_flow.text_1": "UNLOCALIZED: Mechanical Pumps govern the flow of their attached pipe networks", - "create.ponder.mechanical_pump_flow.text_2": "UNLOCALIZED: When powered, their arrow indicates the direction of flow", - "create.ponder.mechanical_pump_flow.text_3": "UNLOCALIZED: The network behind is now pulling fluids...", - "create.ponder.mechanical_pump_flow.text_4": "UNLOCALIZED: ...while the network in front is transferring it outward", - "create.ponder.mechanical_pump_flow.text_5": "UNLOCALIZED: Reversing the input rotation reverses the direction of flow", - "create.ponder.mechanical_pump_flow.text_6": "UNLOCALIZED: Use a Wrench to reverse the orientation of pumps manually", - - "create.ponder.mechanical_pump_speed.header": "UNLOCALIZED: Throughput of Mechanical Pumps", - "create.ponder.mechanical_pump_speed.text_1": "UNLOCALIZED: Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away", - "create.ponder.mechanical_pump_speed.text_2": "UNLOCALIZED: Speeding up the input rotation changes the speed of flow propagation...", - "create.ponder.mechanical_pump_speed.text_3": "UNLOCALIZED: ...aswell as how quickly fluids are transferred", - "create.ponder.mechanical_pump_speed.text_4": "UNLOCALIZED: Pumps can combine their throughputs within shared pipe networks", - "create.ponder.mechanical_pump_speed.text_5": "UNLOCALIZED: Alternating their orientation can help align their flow directions", - - "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", - "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", - "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", - - "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", - "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", - "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", - - "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", - "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", - "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", - "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", - "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", - "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", - - "create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone", - "create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them", - "create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels", - "create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top", - "create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click", - "create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation", - - "create.ponder.nixie_tube.header": "UNLOCALIZED: Using Nixie Tubes", - "create.ponder.nixie_tube.text_1": "UNLOCALIZED: When powered by Redstone, Nixie Tubes will display the redstone signals' strength", - "create.ponder.nixie_tube.text_2": "UNLOCALIZED: Using name tags edited with an anvil, custom text can be displayed", - - "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", - "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", - "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", - - "create.ponder.portable_fluid_interface.header": "UNLOCALIZED: Contraption Fluid Exchange", - "create.ponder.portable_fluid_interface.text_1": "UNLOCALIZED: Fluid Tanks on moving contraptions cannot be accessed by any pipes", - "create.ponder.portable_fluid_interface.text_2": "UNLOCALIZED: This component can interact with fluid tanks without the need to stop the contraption", - "create.ponder.portable_fluid_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_fluid_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_fluid_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL Tanks on the contraption", - "create.ponder.portable_fluid_interface.text_6": "UNLOCALIZED: Fluid can now be inserted...", - "create.ponder.portable_fluid_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_fluid_interface.text_8": "UNLOCALIZED: After no contents have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - - "create.ponder.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", - "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", - "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", - "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", - "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", - - "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", - "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", - "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", - "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", - "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", - - "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", - "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", - - "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", - "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", - "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", - "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", - "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", - "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", - "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", - "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", - "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", - "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", - - "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", - "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", - "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", - - "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", - "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", - "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", - "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", - "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", - - "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", - "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", - "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", - - "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", - "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", - "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", - "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", - - "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", - "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", - "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", - - "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", - "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", - "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", - - "create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails", - "create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with", - "create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks", - "create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them", - "create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames", - - "create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames", - "create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with", - "create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks", - - "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", - "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", - "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", - "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", - "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", - "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", - - "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes", - "create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control", - "create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer", - "create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size", - "create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.", - - "create.ponder.smart_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Smart Pipes", - "create.ponder.smart_pipe.text_1": "UNLOCALIZED: Smart pipes can help control flows by fluid type", - "create.ponder.smart_pipe.text_2": "UNLOCALIZED: When placed directly at the source, they can specify the type of fluid to extract", - "create.ponder.smart_pipe.text_3": "UNLOCALIZED: Simply Right-Click their filter slot with any item containing the desired fluid", - "create.ponder.smart_pipe.text_4": "UNLOCALIZED: When placed further down a pipe network, smart pipes will only let matching fluids continue", - - "create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer", - "create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components", - "create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge", - "create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements", - - "create.ponder.spout_filling.header": "UNLOCALIZED: Filling Items using a Spout", - "create.ponder.spout_filling.text_1": "UNLOCALIZED: The Spout can fill fluid holding items provided beneath it", - "create.ponder.spout_filling.text_2": "UNLOCALIZED: The content of a Spout cannot be accessed manually", - "create.ponder.spout_filling.text_3": "UNLOCALIZED: Instead, Pipes can be used to supply it with fluids", - "create.ponder.spout_filling.text_4": "UNLOCALIZED: The Input items can be placed on a Depot under the Spout", - "create.ponder.spout_filling.text_5": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.spout_filling.text_6": "UNLOCALIZED: The Spout will hold and process them automatically", - - "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", - "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", - "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", - "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", - "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", - - "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", - "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", - "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", - "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", - "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", - - "create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer", - "create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network", - "create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge", - "create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements", - - "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", - "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", - "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", - "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", - "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", - "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", - - "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", - "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", - "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", - "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", - "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", - "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", - - "create.ponder.valve_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Valves", - "create.ponder.valve_pipe.text_1": "UNLOCALIZED: Valve pipes help control fluids propagating through pipe networks", - "create.ponder.valve_pipe.text_2": "UNLOCALIZED: Their shaft input controls whether fluid is currently allowed through", - "create.ponder.valve_pipe.text_3": "UNLOCALIZED: Given Rotational Force in the opening direction, the valve will open up", - "create.ponder.valve_pipe.text_4": "UNLOCALIZED: It can be closed again by reversing the input rotation", - - "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", - "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", - "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", - "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", - "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", - - "create.ponder.weighted_ejector.header": "UNLOCALIZED: Using Weighted Ejectors", - "create.ponder.weighted_ejector.text_1": "UNLOCALIZED: Sneak and Right-Click holding an Ejector to select its target location", - "create.ponder.weighted_ejector.text_10": "UNLOCALIZED: It is now limited to this stack size, and only activates when its held stack reaches this amount", - "create.ponder.weighted_ejector.text_11": "UNLOCALIZED: Other Entities will always trigger an Ejector when stepping on it", - "create.ponder.weighted_ejector.text_2": "UNLOCALIZED: The placed ejector will now launch objects to the marked location", - "create.ponder.weighted_ejector.text_3": "UNLOCALIZED: A valid target can be at any height or distance within range", - "create.ponder.weighted_ejector.text_4": "UNLOCALIZED: They cannot however be off to a side", - "create.ponder.weighted_ejector.text_5": "UNLOCALIZED: If no valid Target was selected, it will simply target the block directly in front", - "create.ponder.weighted_ejector.text_6": "UNLOCALIZED: Supply Rotational Force in order to charge it up", - "create.ponder.weighted_ejector.text_7": "UNLOCALIZED: Items placed on the ejector cause it to trigger", - "create.ponder.weighted_ejector.text_8": "UNLOCALIZED: If Inventories are targeted, the ejector will wait until there is space", - "create.ponder.weighted_ejector.text_9": "UNLOCALIZED: Using the Wrench, a required Stack Size can be configured", - - "create.ponder.weighted_ejector_redstone.header": "UNLOCALIZED: Controlling Weighted Ejectors with Redstone", - "create.ponder.weighted_ejector_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Ejectors will not activate", - "create.ponder.weighted_ejector_redstone.text_2": "UNLOCALIZED: Furthermore, Observers can detect when Ejectors activate", - - "create.ponder.weighted_ejector_tunnel.header": "UNLOCALIZED: Splitting item stacks using Weighted Ejectors", - "create.ponder.weighted_ejector_tunnel.text_1": "UNLOCALIZED: Combined with Brass Tunnels, Ejectors can split item stacks by specific amounts", - "create.ponder.weighted_ejector_tunnel.text_2": "UNLOCALIZED: First, configure the Brass Tunnel to 'Prefer Nearest', in order to prioritize its side output", - "create.ponder.weighted_ejector_tunnel.text_3": "UNLOCALIZED: The Stack Size set on the Ejector now determines the amount to be split off", - "create.ponder.weighted_ejector_tunnel.text_4": "UNLOCALIZED: While a new stack of the configured size exits the side output...", - "create.ponder.weighted_ejector_tunnel.text_5": "UNLOCALIZED: ...the remainder will continue on its path", - - "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", - "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", - "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", - "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", - "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", - "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", - "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", - - "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", - "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "create.ponder.analog_lever.header": "Управлении сигналами используя Аналоговый рычаг", + "create.ponder.analog_lever.text_1": "Аналоговый рычаг создан как компактный и точный источник Редстоун сигнала", + "create.ponder.analog_lever.text_2": "ПКМ, чтобы увеличить силу выходного сигнала", + "create.ponder.analog_lever.text_3": "ПКМ крадучись, чтобы уменьшить силу выходного сигнала снова", + + "create.ponder.andesite_tunnel.header": "Использовании Андезитовых туннелей", + "create.ponder.andesite_tunnel.text_1": "Андезитовые туннели могут быть использованы, чтобы накрывать Конвейеры", + "create.ponder.andesite_tunnel.text_2": "Всегда, когда у Андезитового туннеля есть соединения сбоку...", + "create.ponder.andesite_tunnel.text_3": "...он будет отделять ровно один предмет из любых проходящих мимо стаков", + "create.ponder.andesite_tunnel.text_4": "Остаток продолжит свой путь", + + "create.ponder.basin.header": "Обработке предметов в Чаше", + "create.ponder.basin.text_1": "Чаша может хранить предметы и жидкости для обработки", + "create.ponder.basin.text_2": "После обработки, чаши пытаются вывести результат под любой из их сторон", + "create.ponder.basin.text_3": "Когда предоставлен подходящий компонент, у Чаши появится выходящий кран", + "create.ponder.basin.text_4": "Несколько вариантов применимы здесь", + "create.ponder.basin.text_5": "Вывод чаши будет пойман инвентарём ниже", + "create.ponder.basin.text_6": "Без выходящего крана, Чаша будет оставлять предметы, полученные в результате обработки", + "create.ponder.basin.text_7": "Это может быть полезно, если продукт должен быть использован повторно как ингредиент", + "create.ponder.basin.text_8": "Желаемые продукты должны быть в таком случае извлечены из чаши", + "create.ponder.basin.text_9": "Фильтр может быть необходим для избежания извлечения необработанных предметов", + + "create.ponder.bearing_modes.header": "Режимах движения Механического подшипника", + "create.ponder.bearing_modes.text_1": "Когда остановлен, подшипник установит структуру на ближайшем выровненным по сетке блоков углу", + "create.ponder.bearing_modes.text_2": "Он может быть настроен никогда не возвращать структуру в твёрдое состояние, или только возле начального угла", + + "create.ponder.belt_casing.header": "Обрамлении ремней", + "create.ponder.belt_casing.text_1": "Латунный или Андезитовый корпус может быть использован для декорации Механических ремней (конвейера)", + "create.ponder.belt_casing.text_2": "Используйте Ключ, чтобы убрать обрамление", + + "create.ponder.belt_connector.header": "Использовании Механических ремней", + "create.ponder.belt_connector.text_1": "ПКМ по двум валам предметом ремня соединит их вместе в конвейер", + "create.ponder.belt_connector.text_2": "Случайные выделения могут быть отменены нажатием ПКМ Крадучись", + "create.ponder.belt_connector.text_3": "Дополнительные валы могут быть добавлены по всей длине конвейера", + "create.ponder.belt_connector.text_4": "Валы, соединённые через ремни, будут вращаться с той же скоростью и направлением", + "create.ponder.belt_connector.text_5": "Добавленные Валы могут быть убраны Ключом", + "create.ponder.belt_connector.text_6": "Механические ремни могут быть окрашены в эстетических целях", + + "create.ponder.belt_directions.header": "Возможных расположениях Механических ремней", + "create.ponder.belt_directions.text_1": "Ремни не могут соединяться в произвольных направлениях", + "create.ponder.belt_directions.text_2": "1. Они могут соединяться горизонтально", + "create.ponder.belt_directions.text_3": "2. Они могут соединяться по диагонали", + "create.ponder.belt_directions.text_4": "3. Они могут соединяться вертикально", + "create.ponder.belt_directions.text_5": "4. И они могут соединять вертикальные валы горизонтально", + "create.ponder.belt_directions.text_6": "Это все возможные направления. Ремни могут достигать Длины от 2 до 20 блоков", + + "create.ponder.belt_transport.header": "Использовании Механических ремней для логистики", + "create.ponder.belt_transport.text_1": "Двигающиеся ремни будут перемещать Предметы и другие Сущности", + "create.ponder.belt_transport.text_2": "ПКМ пустой рукой, чтобы забрать предметы с ремня", + + "create.ponder.blaze_burner.header": "Кормлении Горелок всполохов", + "create.ponder.blaze_burner.text_1": "Горелки всполохов дают тепло предметам, обрабатывающимся в Чаше", + "create.ponder.blaze_burner.text_2": "Для этого, Всполох должен быть накормлен воспламеняемыми предметами", + "create.ponder.blaze_burner.text_3": "С Тортом всполоха, горелка может достигать еще большего уровня жара", + "create.ponder.blaze_burner.text_4": "Процесс кормления может быть автоматизирован, используя Автономный активатор или Механическую руку", + + "create.ponder.brass_funnel.header": "Латунной Воронке", + "create.ponder.brass_funnel.text_1": "Андезитовая Воронка может извлекать только одиночные предметы", + "create.ponder.brass_funnel.text_2": "Латунная Воронка может извлекать до целого стака", + "create.ponder.brass_funnel.text_3": "Прокрутка на слоте фильтра позволяет точно регулировать размер извлекаемого стака", + "create.ponder.brass_funnel.text_4": "Используя предмет на слоте фильтра ограничит воронку до передачи только совпадающих стаков", + + "create.ponder.brass_tunnel.header": "Использовании Латунных туннелей", + "create.ponder.brass_tunnel.text_1": "Латунные туннели могут быть использованы, чтобы накрывать конвейеры", + "create.ponder.brass_tunnel.text_2": "Латунные туннели имеют слот для фильтра на каждой открытой стороне", + "create.ponder.brass_tunnel.text_3": "Фильтр на входящих соединениях блокирует неподходящие предметы", + "create.ponder.brass_tunnel.text_4": "Фильтр на выходящих соединениях может быть использован для сортировки предметов по типу", + "create.ponder.brass_tunnel.text_5": "Всегда, когда у проходящего предмета есть несколько доступных выходов, режим распределения решит что с ним делать", + "create.ponder.brass_tunnel.text_6": "Латунные туннели на параллельных конвейерах формируют группы", + "create.ponder.brass_tunnel.text_7": "Входящие предметы будут распределены между всеми соединёнными выходами", + "create.ponder.brass_tunnel.text_8": "Для этого предметы также могут быть вложены в блок туннеля напрямую", + + "create.ponder.brass_tunnel_modes.header": "Режимах распределения Латунных туннелей", + "create.ponder.brass_tunnel_modes.text_1": "Используя Ключ, вы можете настроить поведение распределения у Латунного туннеля", + "create.ponder.brass_tunnel_modes.text_10": "«Синхронизировать входы» - уникальная настройка для Латунных туннелей", + "create.ponder.brass_tunnel_modes.text_11": "Предметы могут пройти только если у каждого туннеля в группе есть ожидающий у входа предмет", + "create.ponder.brass_tunnel_modes.text_12": "Это подразумевает, что все конвейеры поставляют предметы с равной скоростью", + "create.ponder.brass_tunnel_modes.text_2": "«Разделить» попытается распределить стак поровну между доступными выходами", + "create.ponder.brass_tunnel_modes.text_3": "Если выход не может принять больше предметов, он будет пропущен", + "create.ponder.brass_tunnel_modes.text_4": "«Принудительно разделить» никогда не пропустит выходы и вместо этого будет ждать пока они не освободятся", + "create.ponder.brass_tunnel_modes.text_5": "«По Кругу» сохраняет цельные стаки и отдаёт их выходам по очереди", + "create.ponder.brass_tunnel_modes.text_6": "Опять же, если выход не может принять больше предметов, он будет пропущен", + "create.ponder.brass_tunnel_modes.text_7": "«Принудительно по кругу» никогда не пропускает выходы", + "create.ponder.brass_tunnel_modes.text_8": "«Предпочтительно ближайшее» приоритизирует ближайшие выходы от места подачи предметов", + "create.ponder.brass_tunnel_modes.text_9": "«Случайно» будет отдавать целые стаки случайно выбранным выходам", + + "create.ponder.cart_assembler.header": "Движении структур при помощи Сборщика вагонеток", + "create.ponder.cart_assembler.text_1": "Активированные Сборщики вагонеток устанавливают прикреплённые структуры к проходящим мимо вагонеткам", + "create.ponder.cart_assembler.text_2": "Без редстоун сигнала они разбирают вагонеточные штуковины обратно в блоки", + "create.ponder.cart_assembler.text_3": "Использование Ключа на вагонетке позволит вам унести Штуковину куда-то ещё", + + "create.ponder.cart_assembler_dual.header": "Сборке Штуковин-экипажей", + "create.ponder.cart_assembler_dual.text_1": "Всегда, когда два Сборщика вагонеток имеют общую прикреплённую структуру...", + "create.ponder.cart_assembler_dual.text_2": "активация любого из них создаст Штуковину-экипаж", + "create.ponder.cart_assembler_dual.text_3": "Эти вагонетки будут вести себя так, будто они соединены Соединителем вагонеток", + + "create.ponder.cart_assembler_modes.header": "Настройках ориентации Вагонеточных штуковин", + "create.ponder.cart_assembler_modes.text_1": "Вагонеточные штуковины будут поворачиваться в сторону движения их вагонеток", + "create.ponder.cart_assembler_modes.text_2": "Стрелкой показано, какая сторона конструкции будет считаться передней", + "create.ponder.cart_assembler_modes.text_3": "Если сборщик настроен на блокировку вращения, то ориентация штуковин никогда не изменится", + + "create.ponder.cart_assembler_rails.header": "Других типах вагонеток и рельс", + "create.ponder.cart_assembler_rails.text_1": "Сборщики вагонеток на обычных рельсах не будут влиять на движение проходящих вагонеток", + "create.ponder.cart_assembler_rails.text_2": "На активных Контролирующих рельсах или Энергорельсах вагонетки будут стоять на месте до тех, пока Сборщик не будет активирован", + "create.ponder.cart_assembler_rails.text_3": "Другие типы вагонеток могут быть использованы как основание", + "create.ponder.cart_assembler_rails.text_4": "Самоходные вагонетки будут поддерживать себя запитанными, используя топливо из присоединённых инвентарей", + + "create.ponder.chain_drive.header": "Передаче силы вращения Цепными приводами", + "create.ponder.chain_drive.text_1": "Цепные приводы передают силу вращения друг другу", + "create.ponder.chain_drive.text_2": "Все валы соединённые таким образом будут вращаться в одном направлении", + "create.ponder.chain_drive.text_3": "Любая часть в ряду может быть повёрнута на 90 градусов", + + "create.ponder.chain_gearshift.header": "Управлении скоростью вращения Регулируемыми цепными механизмами", + "create.ponder.chain_gearshift.text_1": "Неактивные Цепные механизмы ведут себя точно так же, как Цепные приводы", + "create.ponder.chain_gearshift.text_2": "Когда активирован, скорость, передаваемая другим Цепным механизмам в ряду удваивается", + "create.ponder.chain_gearshift.text_3": "Когда активированный Цепной механизм не является источником, его скорость будет снижена вдвое", + "create.ponder.chain_gearshift.text_4": "В обоих случаях Цепные приводы в ряду всегда вращаются с 2x скоростью активированного Цепного механизма", + "create.ponder.chain_gearshift.text_5": "Используя аналоговые сигналы, это умножение может быть настроено более точно между 1 и 2", + "create.ponder.chain_gearshift.text_6": "12 об./мин.", + + "create.ponder.chute.header": "Транспортировке предметов вниз через Желоба", + "create.ponder.chute.text_1": "Желоба могут транспортировать предметы вертикально из и в инвентари", + "create.ponder.chute.text_2": "Используя Ключ, вы можете создать окно", + "create.ponder.chute.text_3": "Установка желобов на стороны других желобов сделает их диагональными", + + "create.ponder.chute_upward.header": "Транспортировке предметов вверх через Желоба", + "create.ponder.chute_upward.text_1": "Используя Вентилятор в корпусе внизу или наверху, Желоб может перемещать предметы вверх", + "create.ponder.chute_upward.text_2": "Осмотр желобов в Инженерных очках открывает информацию о направлении движения", + "create.ponder.chute_upward.text_3": "На «заблокированном» конце предметы должны быть введены/выведены сбоку", + + "create.ponder.clockwork_bearing.header": "Оживлении структур Часовым механизмом", + "create.ponder.clockwork_bearing.text_1": "Часовые механизмы прикрепляются к блокам спереди", + "create.ponder.clockwork_bearing.text_2": "При получении силы вращения структура повернётся в зависимости от текущего часа", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "ПКМ по механизму, чтобы остановить или вновь запустить структуру", + "create.ponder.clockwork_bearing.text_6": "Вторая структура может быть добавлена спереди Часовой стрелки", + "create.ponder.clockwork_bearing.text_7": "Убедитесь, что две структуры не соединены между собой супер-клеем или чем-то схожим", + "create.ponder.clockwork_bearing.text_8": "Вторая структура станет вращаться как Минутная стрелка", + + "create.ponder.clutch.header": "Управлении силой вращения с помощью Сцепления", + "create.ponder.clutch.text_1": "Сцепление передаёт вращение по прямой", + "create.ponder.clutch.text_2": "При активации Редстоуном оно разрывает соединение", + + "create.ponder.cog_speedup.header": "Переключении передач Шестернями", + "create.ponder.cog_speedup.text_1": "Большие и Маленькие шестерни могут соединяться по диагонали", + "create.ponder.cog_speedup.text_2": "Переходя с больших на маленькие шестерни, переданная скорость удвоится", + "create.ponder.cog_speedup.text_3": "Переходя в обратном направлении, переданная скорость сократится вдвое", + + "create.ponder.cogwheel.header": "Передаче силы вращения Шестернями", + "create.ponder.cogwheel.text_1": "Шестерни передают вращение другим соседним шестерням", + "create.ponder.cogwheel.text_2": "Соседние валы соединённые таким образом будут вращаться в противоположных направлениях", + + "create.ponder.creative_fluid_tank.header": "Творческом жидкостном баке", + "create.ponder.creative_fluid_tank.text_1": "Творческий жидкостный бак может использоваться для обеспечения бесконечного запаса жидкости", + "create.ponder.creative_fluid_tank.text_2": "Щелкните ПКМ предметом, содержащим жидкость, чтобы настроить его", + "create.ponder.creative_fluid_tank.text_3": "Сети труб могут бесконечно вытягивать заданную жидкость из резервуара", + "create.ponder.creative_fluid_tank.text_4": "Любые жидкости, закачанные обратно в творческий жидкостный бак, будут уничтожены", + + "create.ponder.creative_motor.header": "Генерации силы вращения творческими моторами", + "create.ponder.creative_motor.text_1": "Творческие моторы - это компактные и настраиваемые источники Силы Вращения", + "create.ponder.creative_motor.text_2": "Прокрутка по задней панели изменяет кол-во об./мин. у вращающегося вала мотора", + + "create.ponder.crushing_wheels.header": "Обработке предметов Колёсами дробления", + "create.ponder.crushing_wheels.text_1": "Пара Колёс дробления может молоть предметы очень эффективно", + "create.ponder.crushing_wheels.text_2": "Сила вращения должна вращать их друг в друга", + "create.ponder.crushing_wheels.text_3": "Предметы брошенные или введённые в них сверху будут обработаны", + "create.ponder.crushing_wheels.text_4": "Предметы также могут быть введены и подобраны автоматическим способом", + + "create.ponder.deployer.header": "Использовании автономного активатора", + "create.ponder.deployer.text_1": "При наличии силы вращения автономный активатор может имитировать действия игрока", + "create.ponder.deployer.text_10": "ПКМ спереди, чтобы дать ему предмет для использования", + "create.ponder.deployer.text_11": "Предметы также могут быть введены автоматически", + "create.ponder.deployer.text_12": "Автономные активаторы имеют слот для фильтра", + "create.ponder.deployer.text_13": "Когда фильтр установлен, Активатор работает только держа подходящий предмет", + "create.ponder.deployer.text_14": "Только предметы подходящие по фильтру могут быть введены...", + "create.ponder.deployer.text_15": "...и только неподходящие предметы будут выведены", + "create.ponder.deployer.text_2": "Он всегда будет взаимодействовать с местом на два блока перед ним", + "create.ponder.deployer.text_3": "Блоки прямо перед ним не будут мешать ему", + "create.ponder.deployer.text_4": "Автономные активаторы умеют:", + "create.ponder.deployer.text_5": "Ставить блоки,", + "create.ponder.deployer.text_6": "Использовать предметы,", + "create.ponder.deployer.text_7": "Активировать блоки,", + "create.ponder.deployer.text_8": "Собирать блоки", + "create.ponder.deployer.text_9": "и Атаковать мобов", + + "create.ponder.deployer_contraption.header": "Использовании автономных активаторов на штуковинах", + "create.ponder.deployer_contraption.text_1": "Всегда, когда автономные активаторы движутся как часть движимой штуковины...", + "create.ponder.deployer_contraption.text_2": "Они активируются на каждом посещённом месте, используя предметы из любых инвентарей на штуковине", + "create.ponder.deployer_contraption.text_3": "Слот для Фильтра может быть использован, чтобы уточнить, какие предметы ему брать", + + "create.ponder.deployer_modes.header": "Режимах автономного активатора", + "create.ponder.deployer_modes.text_1": "По умолчанию, активатор имитирует ПКМ-взаимодейстие", + "create.ponder.deployer_modes.text_2": "Используя Ключ, вы можете установить его на имитацию ЛКМ", + + "create.ponder.deployer_processing.header": "Обработке элементов с помощью автономных активаторов", + "create.ponder.deployer_processing.text_1": "Держа подходящий предмет/инструмент, автономные активаторы могут обрабатывать предметы под собой", + "create.ponder.deployer_processing.text_2": "Принимаемые предметы можно бросить или положить на депо под автономным активатором", + "create.ponder.deployer_processing.text_3": "Когда предметы находятся на конвейере...", + "create.ponder.deployer_processing.text_4": "автономный активатор будет удерживать и обрабатывать их автоматически", + + "create.ponder.deployer_redstone.header": "Управлении автономными активаторами редстоуном", + "create.ponder.deployer_redstone.text_1": "При активации Редстоуном активатор перестанет работать", + "create.ponder.deployer_redstone.text_2": "Перед остановкой, Активатор завершит все начатые действия", + "create.ponder.deployer_redstone.text_3": "Таким образом, инвертированный импульс может быть использован для вызова ровно одного срабатывания", + + "create.ponder.depot.header": "Использовании Депо", + "create.ponder.depot.text_1": "Депо могут служить как «стационарный» элемент конвейера", + "create.ponder.depot.text_2": "ПКМ, что бы самостоятельно положить или забрать предметы с них", + "create.ponder.depot.text_3": "Так же, как Механические ремни, оно может предоставлять предметы для обработки", + "create.ponder.depot.text_4": "...а также поставлять предметы Механическим рукам", + + "create.ponder.empty_blaze_burner.header": "Использовании Пустых горелок всполохов", + "create.ponder.empty_blaze_burner.text_1": "ПКМ по Всполоху с пустой горелкой, чтобы захватить его", + "create.ponder.empty_blaze_burner.text_2": "Также Всполохи могут быть захвачены из спавнера напрямую", + "create.ponder.empty_blaze_burner.text_3": "Теперь у вас есть идеальный источник тепла для ряда машин", + "create.ponder.empty_blaze_burner.text_4": "В эстетических целях, Пустые горелки могут быть зажжены огнивом", + "create.ponder.empty_blaze_burner.text_5": "Пламя можно трансформировать, используя наполненный душой предмет.", + "create.ponder.empty_blaze_burner.text_6": "Однако они не будут подходить для промышленного нагрева", + + "create.ponder.encased_fluid_pipe.header": "Обрамлении Жидкостных труб", + "create.ponder.encased_fluid_pipe.text_1": "Медный корпус можно использовать для украшения декорации труб.", + "create.ponder.encased_fluid_pipe.text_2": "Помимо того, что они скрываются, заключенные в обрамление трубы блокируются в текущем состоянии", + "create.ponder.encased_fluid_pipe.text_3": "Они больше не будут реагировать на добавление или удаление каких-либо соседних блоков", + + "create.ponder.fan_direction.header": "Воздушном потоке Вентиляторов в корпусе", + "create.ponder.fan_direction.text_1": "Вентиляторы в корпусе используют силу вращения для создания Воздушного потока", + "create.ponder.fan_direction.text_2": "Сила и направление потока зависят от подаваемого вращения", + + "create.ponder.fan_processing.header": "Обработке предметов используя Вентиляторы в корпусе", + "create.ponder.fan_processing.text_1": "Проходя через лаву, Воздушный поток становится Горячим", + "create.ponder.fan_processing.text_2": "Предметы в этой области будут переплавлены", + "create.ponder.fan_processing.text_3": "Съедобные предметы брошенные сюда будут сожжены", + "create.ponder.fan_processing.text_4": "Вместо этого, для них должна быть использована установка для Копчения с огнём", + "create.ponder.fan_processing.text_5": "Поток, проходящий через Воду, создаёт Промывающую установку", + "create.ponder.fan_processing.text_6": "Несколько новых вариантов обработки делаются с её помощью", + "create.ponder.fan_processing.text_7": "Скорость вентилятора НЕ влияет на скорость обработки, а только на дальность", + "create.ponder.fan_processing.text_8": "Обработка Вентиляторами может быть применена к предметам на конвейерах или депо", + + "create.ponder.fan_source.header": "Генерации силы вращения Вентиляторами в корпусе", + "create.ponder.fan_source.text_1": "Вентиляторы направленные вниз на источник тепла могут создавать силу вращения", + "create.ponder.fan_source.text_2": "При сигнале редстоуна Вентилятор начнёт отдавать энергию", + + "create.ponder.fluid_pipe_flow.header": "Перемещении жидкостей при помощи медных труб.", + "create.ponder.fluid_pipe_flow.text_1": "Жидкостные трубы могут соединять два или более источников и потребителей жидкости", + "create.ponder.fluid_pipe_flow.text_2": "При помощи гаечного ключа можно создать окно прямому отрезку трубы", + "create.ponder.fluid_pipe_flow.text_3": "Трубы с окнами не будут соединяться ни с какими другими рядом идущими отрезками труб", + "create.ponder.fluid_pipe_flow.text_4": "Приводимые в действие механическими помпами, трубы могут транспортировать жидкости", + "create.ponder.fluid_pipe_flow.text_5": "Сначала жидкость не выкачивается", + "create.ponder.fluid_pipe_flow.text_6": "Как только поток соединит концы, они постепенно перекачают свое содержимое", + "create.ponder.fluid_pipe_flow.text_7": "Таким образом, сами блоки труб никогда «физически» не содержат никакой жидкости", + + "create.ponder.fluid_pipe_interaction.header": "Опустошении и наполнении жидкостных контейнеров", + "create.ponder.fluid_pipe_interaction.text_1": "Концы сети труб могут взаимодействовать с различными блоками", + "create.ponder.fluid_pipe_interaction.text_2": "Любой блок с возможностью хранения жидкости может быть заполнен или опустошен", + "create.ponder.fluid_pipe_interaction.text_3": "Источники прямо перед открытым концом можно откачать...", + "create.ponder.fluid_pipe_interaction.text_4": "...в то время как выливание в незаполненное пространство может создать источники", + "create.ponder.fluid_pipe_interaction.text_5": "Трубы также могут извлекать жидкости непосредственно из нескольких других блоков", + + "create.ponder.fluid_tank_sizes.header": "Размерах жидкостного бака", + "create.ponder.fluid_tank_sizes.text_1": "Жидкостные баки можно объединить для увеличения общей вместимости", + "create.ponder.fluid_tank_sizes.text_2": "Их площадь основания может составлять до 3 блоков в ширину...", + "create.ponder.fluid_tank_sizes.text_3": "...и увеличиваются в высоту более чем на 30 дополнительных уровней", + "create.ponder.fluid_tank_sizes.text_4": "При помощи гаечного ключа можно создать окно на резервуаре", + + "create.ponder.fluid_tank_storage.header": "Хранении жидкостей в жидкостных баках", + "create.ponder.fluid_tank_storage.text_1": "Жидкостные баки можно использовать для хранения большого количества жидкости", + "create.ponder.fluid_tank_storage.text_2": "Трубы могут закачивать и выкачивать жидкости с любой стороны", + "create.ponder.fluid_tank_storage.text_3": "Содержащаяся жидкость может быть измерена с помощью компаратора", + "create.ponder.fluid_tank_storage.text_4": "Однако в режиме выживания жидкость нельзя добавлять или извлекать вручную", + "create.ponder.fluid_tank_storage.text_5": "Вы можете использовать чаши, предметные осушители и дозаторы для опустошения или наполнения содерж. жидкость предметов", + + "create.ponder.flywheel.header": "Генерации силы вращения Маховиком", + "create.ponder.flywheel.text_1": "Маховики необходимы для генерации силы вращения при помощи Печных двигателей", + "create.ponder.flywheel.text_2": "Отдаваемая сила вращения имеет очень значительную устойчивость к нагрузкам", + "create.ponder.flywheel.text_3": "Использование Плавильной печи удвоит эффективность двигателя", + + "create.ponder.funnel_compat.header": "Совместимости Воронок", + "create.ponder.funnel_compat.text_1": "Воронки должны хорошо взаимодействовать с многими компонентами:", + "create.ponder.funnel_compat.text_2": "Вертикальные пилы", + "create.ponder.funnel_compat.text_3": "Депо", + "create.ponder.funnel_compat.text_4": "Предметные осушители", + + "create.ponder.funnel_direction.header": "Направлении передачи", + "create.ponder.funnel_direction.text_1": "Поставленная обычным образом, она забирает предметы из инвентаря", + "create.ponder.funnel_direction.text_2": "Поставленная крадучись, она кладёт предметы в инвентарь", + "create.ponder.funnel_direction.text_3": "Используя Ключ, вы можете изменить направление воронки", + "create.ponder.funnel_direction.text_4": "Те же правила применяются для большинства направлений", + "create.ponder.funnel_direction.text_5": "Воронки на конвейерах будут извлекать/вводить предметы в зависимости от направления их движения", + + "create.ponder.funnel_intro.header": "Использовании Воронок", + "create.ponder.funnel_intro.text_1": "Воронки идеально подходят для перемещения предметов из и в инвентари", + + "create.ponder.funnel_redstone.header": "Редстоун управлении", + "create.ponder.funnel_redstone.text_1": "Редстоун сигнал не даст любой воронке работать", + + "create.ponder.funnel_transfer.header": "Передаче напрямую", + "create.ponder.funnel_transfer.text_1": "Воронки не могут перемещать предметы напрямую между закрытыми инвентарями", + "create.ponder.funnel_transfer.text_2": "Желоба или Умные желоба могут лучше подходить для этих целей", + "create.ponder.funnel_transfer.text_3": "То же касается и горизонтального перемещения. Механический ремень должен здесь помочь", + + "create.ponder.furnace_engine.header": "Генерации силы вращения Печными двигателями", + "create.ponder.furnace_engine.text_1": "Печные двигатели создают силу вращения пока присоединённая к ним печь работает", + "create.ponder.furnace_engine.text_2": "Создаваемая сила вращения имеет очень высокую устойчивость к нагрузкам", + "create.ponder.furnace_engine.text_3": "Использование Плавильной печи удвоит эффективность Двигателя", + + "create.ponder.gantry_carriage.header": "Использовании шасси портального крана", + "create.ponder.gantry_carriage.text_1": "Шасси портального крана могут прикрепляться и двигаться вдоль Вала портального крана", + "create.ponder.gantry_carriage.text_2": "Крановые установки могут двигать присоединённые Блоки", + + "create.ponder.gantry_cascaded.header": "Многоступенчатом портальном кране", + "create.ponder.gantry_cascaded.text_1": "Валы портального крана прикрепляются к шасси без нужды в супер-клее", + "create.ponder.gantry_cascaded.text_2": "То же относится и к шасси на движущихся Валах портального крана", + "create.ponder.gantry_cascaded.text_3": "Таким образом крановая система может покрывать несколько осей движения", + + "create.ponder.gantry_direction.header": "Направлении движения крана", + "create.ponder.gantry_direction.text_1": "Валы портального крана могут иметь два противоположных направления", + "create.ponder.gantry_direction.text_2": "Направление движения шасси зависит от ориентации их валов", + "create.ponder.gantry_direction.text_3": "...а также от направления вращения вала", + "create.ponder.gantry_direction.text_4": "Те же правила относятся к передаваемому вращению", + + "create.ponder.gantry_redstone.header": "Подаче энергии на кран", + "create.ponder.gantry_redstone.text_1": "Активированные редстоуном валы крана перестают двигать шасси", + "create.ponder.gantry_redstone.text_2": "Вместо этого сила вращения передаётся выходному валу шасси", + + "create.ponder.gantry_shaft.header": "Использовании валов портального крана", + "create.ponder.gantry_shaft.text_1": "Валы портального крана составляют основу крановой установки. По ним будут двигаться присоединённые шасси", + "create.ponder.gantry_shaft.text_2": "Крановые установки могут двигать присоединённые Блоки", + + "create.ponder.gearbox.header": "Передаче силы вращения с помощью Коробок передач", + "create.ponder.gearbox.text_1": "Переходы между осями вращения могут быстро стать громоздкими", + "create.ponder.gearbox.text_2": "Коробка Передач - это более компактный эквивалент этой установки", + "create.ponder.gearbox.text_3": "Валы по углам поворачиваются в зеркальных направлениях", + "create.ponder.gearbox.text_4": "Прямые соединения будут реверсированы", + + "create.ponder.gearshift.header": "Управлении силой вращения при помощи Реверсивного механизма", + "create.ponder.gearshift.text_1": "Реверсивные механизмы передают вращение по прямой", + "create.ponder.gearshift.text_2": "При активации редстоуном, они реверсируют передачу", + + "create.ponder.hand_crank.header": "Генерации силы вращения при помощи Рукояток", + "create.ponder.hand_crank.text_1": "Рукоятки могут быть использованы игроками для приложения силы вращения вручную", + "create.ponder.hand_crank.text_2": "Держите ПКМ, чтобы повернуть их против Часовой стрелки", + "create.ponder.hand_crank.text_3": "Их скорость вращения относительно высока", + "create.ponder.hand_crank.text_4": "Держите ПКМ крадучись, чтобы повернуть её по Часовой стрелке", + + "create.ponder.hose_pulley.header": "Наполнении и осушении источников с помощью Шкива со шлангом", + "create.ponder.hose_pulley.text_1": "Шкивы со шлангом можно использовать для заполнения или осушения больших объёмов жидкости.", + "create.ponder.hose_pulley.text_2": "С помощью кинетической энергии можно регулировать длину шланга", + "create.ponder.hose_pulley.text_3": "Шкив сматывается, если обратить вращение", + "create.ponder.hose_pulley.text_4": "С противоположной стороны можно подключать трубы", + "create.ponder.hose_pulley.text_5": "Присоединённые сети труб могут либо подавать жидкость в шланг...", + "create.ponder.hose_pulley.text_6": "...либо вытягивать её, осушая водоем", + "create.ponder.hose_pulley.text_7": "Скорость заполнения и осушения шкивом полностью зависит от пропускной способности жидкостной сети", + + "create.ponder.hose_pulley_infinite.header": "Пассивном заполнении и осушении больших объёмов жидкости", + "create.ponder.hose_pulley_infinite.text_1": "При развертывании Шкива со шлангом в достаточно большой океан...", + "create.ponder.hose_pulley_infinite.text_2": "Он будет предоставлять/поглощать жидкости без влияния на источник", + "create.ponder.hose_pulley_infinite.text_3": "Сети труб могут неограниченно передавать жидкости из/в такие шкивы", + + "create.ponder.hose_pulley_level.header": "Уровне заполнения и осушения Шкива со шлангом", + "create.ponder.hose_pulley_level.text_1": "При полностью убранном рукаве шланга - он не может работать", + "create.ponder.hose_pulley_level.text_2": "Осушение происходит сверху вниз", + "create.ponder.hose_pulley_level.text_3": "Уровень поверхности окажется чуть ниже того места, где заканчивается шланг", + "create.ponder.hose_pulley_level.text_4": "Наполнение происходит снизу вверх", + "create.ponder.hose_pulley_level.text_5": "Заполняемый бассейн не будет наполняться выше уровня конца шланга", + + "create.ponder.item_drain.header": "Опустошении жидкостных резервуаров с помощью предметных осушителей", + "create.ponder.item_drain.text_1": "Предметные осушители могут извлекать жидкости из предметов", + "create.ponder.item_drain.text_2": "Щелкните ПКМ по нему, чтобы перелить в него жидкость из предмета в ваших руках", + "create.ponder.item_drain.text_3": "Когда предметы подаются со стороны...", + "create.ponder.item_drain.text_4": "...они переворачиваются, выливая содержащуюся в них жидкость", + "create.ponder.item_drain.text_5": "Сети труб теперь могут вытягивать жидкость из внутреннего хранилища осушителей", + + "create.ponder.large_cogwheel.header": "Передаче силы вращения при помощи Больших шестерней", + "create.ponder.large_cogwheel.text_1": "Большие шестерни могут соединяться между собой под прямым углом", + "create.ponder.large_cogwheel.text_2": "Это поможет передавать скорость на другие оси вращения", + + "create.ponder.linear_chassis_attachment.header": "Прикреплении блоков при помощи Линейных шасси", + "create.ponder.linear_chassis_attachment.text_1": "Открытые грани Линейных шасси можно сделать Липкими", + "create.ponder.linear_chassis_attachment.text_2": "Кликните ещё раз, чтобы сделать противоположную сторону липкой", + "create.ponder.linear_chassis_attachment.text_3": "ПКМ крадучись, пустой рукой, чтобы убрать слизь", + "create.ponder.linear_chassis_attachment.text_4": "Липкие грани Линейных шасси будут прикреплять ряд блоков перед ним", + "create.ponder.linear_chassis_attachment.text_5": "Используйте Ключ, чтобы настроить радиус для этого шасси", + "create.ponder.linear_chassis_attachment.text_6": "Прокрутка при Удерживании CTRL настраивает радиус всех присоединённых шасси", + "create.ponder.linear_chassis_attachment.text_7": "Прикрепление блоков на другие стороны требует использования Супер-клея", + "create.ponder.linear_chassis_attachment.text_8": "При помощи этих механик, структуры любой формы могут двигаться как Штуковина", + + "create.ponder.linear_chassis_group.header": "Движении Линейных шасси группами", + "create.ponder.linear_chassis_group.text_1": "Линейные шасси соединяются с такими же блоками Шасси рядом с ними", + "create.ponder.linear_chassis_group.text_2": "Когда один блок перемещается Штуковиной, другие двигаются с ним", + "create.ponder.linear_chassis_group.text_3": "Шасси других типов или направленные в другом направлении не будут прикрепляться", + + "create.ponder.mechanical_arm.header": "Настройке Механических рук", + "create.ponder.mechanical_arm.text_1": "Входы и выходы для Механических рук должны быть назначены перед их установкой", + "create.ponder.mechanical_arm.text_2": "ПКМ по инвентарям, держа руку, чтобы назначить их целями", + "create.ponder.mechanical_arm.text_3": "ПКМ ещё раз, для переключения между Входом (Синий) и Выходом (Оранжевый)", + "create.ponder.mechanical_arm.text_4": "ЛКМ по компонентам, чтобы убрать выделение с них", + "create.ponder.mechanical_arm.text_5": "После установки, Механические руки будут нацелены на ранее выбранные блоки", + "create.ponder.mechanical_arm.text_6": "У них может быть неограниченное кол-во входов и выходов в зоне их досягаемости", + "create.ponder.mechanical_arm.text_7": "Однако, не каждый вид Инвентаря может взаимодействовать с ними напрямую", + "create.ponder.mechanical_arm.text_8": "Воронки и Депо могут помочь заполнить этот пробел", + + "create.ponder.mechanical_arm_filtering.header": "Фильтрации выходов Механической руки", + "create.ponder.mechanical_arm_filtering.text_1": "Входы", + "create.ponder.mechanical_arm_filtering.text_2": "Выходы", + "create.ponder.mechanical_arm_filtering.text_3": "Иногда желательно ограничить цели руки фильтром", + "create.ponder.mechanical_arm_filtering.text_4": "Сами Механические руки не имеют возможности фильтрации", + "create.ponder.mechanical_arm_filtering.text_5": "Однако, Латунные воронки как цели сообщают свой фильтр руке", + "create.ponder.mechanical_arm_filtering.text_6": "Рука достаточно умна, чтобы не подбирать предметы, которые она не сможет распределить", + + "create.ponder.mechanical_arm_modes.header": "Режимах распределения Механической руки", + "create.ponder.mechanical_arm_modes.text_1": "Входы", + "create.ponder.mechanical_arm_modes.text_2": "Выходы", + "create.ponder.mechanical_arm_modes.text_3": "Когда рука выбирает между несколькими доступными выходами...", + "create.ponder.mechanical_arm_modes.text_4": "...она сделает выбор исходя из своей настройки", + "create.ponder.mechanical_arm_modes.text_5": "Прокрутка с Ключом позволит вам настроить это", + "create.ponder.mechanical_arm_modes.text_6": "Режим «по Кругу» переключается между всеми доступными выходами по очереди", + "create.ponder.mechanical_arm_modes.text_7": "Если выход не может принять больше предметов, он будет пропущен", + "create.ponder.mechanical_arm_modes.text_8": "«Принудительно по кругу» никогда не пропускает выходы, а ждёт пока они не освободятся", + "create.ponder.mechanical_arm_modes.text_9": "«Предпочитать первичную цель» приоритизирует выходы, выбранные ранее при настройке этой Руки", + + "create.ponder.mechanical_arm_redstone.header": "Управлении Механическими руками редстоуном", + "create.ponder.mechanical_arm_redstone.text_1": "При активации редстоуном, Механические руки перестают работать", + "create.ponder.mechanical_arm_redstone.text_2": "Перед остановкой, они завершат все начатые действия", + "create.ponder.mechanical_arm_redstone.text_3": "Таким образом, инвертированный импульс может использоваться для вызова ровно одного срабатывания", + + "create.ponder.mechanical_bearing.header": "Передвижении структур при помощи Механического подшипника", + "create.ponder.mechanical_bearing.text_1": "Механические подшипники прикрепляют блоки перед ними", + "create.ponder.mechanical_bearing.text_2": "При получении силы вращения, они соберутся во Вращающуюся штуковину", + + "create.ponder.mechanical_crafter.header": "Настройке Механических крафтеров", + "create.ponder.mechanical_crafter.text_1": "Массив из Механических крафтеров можно использовать для автоматизации создания любого рецепта", + "create.ponder.mechanical_crafter.text_2": "Можно настроить пути крафтеров при помощи Ключа", + "create.ponder.mechanical_crafter.text_3": "Для правильной установки все пути должны сходиться в один выход с любой стороны", + "create.ponder.mechanical_crafter.text_4": "Продукты будут помещены в инвентарь у выхода", + "create.ponder.mechanical_crafter.text_5": "Механическим крафтерам нужна сила вращения для работы", + "create.ponder.mechanical_crafter.text_6": "ПКМ спереди, чтобы вставить предметы вручную", + "create.ponder.mechanical_crafter.text_7": "Когда каждый слот на пути содержит предмет, процесс создания начнётся", + "create.ponder.mechanical_crafter.text_8": "Для рецептов, не полностью занимающих крафтер-установку, старт можно спровоцировать Редстоун импульсом", + + "create.ponder.mechanical_crafter_connect.header": "Объединении инвентарей Механических крафтеров", + "create.ponder.mechanical_crafter_connect.text_1": "Предметы можно поместить в крафтеры автоматически", + "create.ponder.mechanical_crafter_connect.text_2": "При помощи ключа сзади крафтеров, их инвентари можно объединить", + "create.ponder.mechanical_crafter_connect.text_3": "Все соединённые крафтеры теперь будут доступны из одного места ввода", + + "create.ponder.mechanical_crafter_covers.header": "Закрытии слотов Механических крафтеров", + "create.ponder.mechanical_crafter_covers.text_1": "Некоторые рецепты требуют дополнительных крафтеров, чтобы закрыть пробелы на пути", + "create.ponder.mechanical_crafter_covers.text_2": "При помощи Крышек на слоты, крафтеры могут играть роль пустых слотов в схеме", + "create.ponder.mechanical_crafter_covers.text_3": "Общие входы созданные ключом сзади также могут быть доступны через закрытые крафтеры", + + "create.ponder.mechanical_drill.header": "Ломании блоков Механической Дрелью", + "create.ponder.mechanical_drill.text_1": "При подаче вращения, Механическая дрель будет ломать блоки перед ней", + "create.ponder.mechanical_drill.text_2": "Скорость добычи зависит от подаваемой скорости", + + "create.ponder.mechanical_drill_contraption.header": "Использовании Механических дрелей на штуковинах", + "create.ponder.mechanical_drill_contraption.text_1": "Когда дрели движутся как часть движимой штуковины...", + "create.ponder.mechanical_drill_contraption.text_2": "...они будут ломать блоки, на которые они натыкаются", + + "create.ponder.mechanical_harvester.header": "Использование Механических комбайнов на штуковинах", + "create.ponder.mechanical_harvester.text_1": "Когда комбайны движутся как часть движимой штуковины...", + "create.ponder.mechanical_harvester.text_2": "Они будут убирать зрелый урожай на своём пути и высаживать его снова", + + "create.ponder.mechanical_mixer.header": "Обработке предметов Механическим миксером", + "create.ponder.mechanical_mixer.text_1": "При помощи Миксера и Чаши можно автоматизировать некоторые рецепты крафта", + "create.ponder.mechanical_mixer.text_2": "Доступные рецепты включают любые бесформенные рецепты крафта плюс ещё немного", + "create.ponder.mechanical_mixer.text_3": "Некоторые из них требуют тепло от Горелки всполоха", + "create.ponder.mechanical_mixer.text_4": "Слот для фильтра можно использовать в случае конфликта двух рецептов", + + "create.ponder.mechanical_piston.header": "Перемещении структур при помощи Механических поршней", + "create.ponder.mechanical_piston.text_1": "Механические поршни могут двигать блоки перед ними", + "create.ponder.mechanical_piston.text_2": "Скорость и Направление движения зависят от исходного вращения", + "create.ponder.mechanical_piston.text_3": "Липкие Механические поршни могут тянуть назад присоединённые блоки", + + "create.ponder.mechanical_piston_modes.header": "Режимах движения Механического поршня", + "create.ponder.mechanical_piston_modes.text_1": "Когда поршень останавливается, сдвинутая структура обратно становится блоками", + "create.ponder.mechanical_piston_modes.text_2": "Можно настроить его так, чтобы структура никогда не становилась блоками или только на начальной позиции", + + "create.ponder.mechanical_plough.header": "Использование Механических плугов на штуковинах", + "create.ponder.mechanical_plough.text_1": "Когда плуги движутся как часть движимой штуковины...", + "create.ponder.mechanical_plough.text_2": "...они будут ломать блоки без твёрдого хитбокса", + "create.ponder.mechanical_plough.text_3": "К тому же, плуги могут создавать пашню", + "create.ponder.mechanical_plough.text_4": "...они также могут толкать сущностей не причиняя им вреда", + + "create.ponder.mechanical_press.header": "Обработке предметов Механическим прессом", + "create.ponder.mechanical_press.text_1": "Механический пресс может обрабатывать предметы под собой", + "create.ponder.mechanical_press.text_2": "Подаваемые предметы должны быть брошены или помещены на Депо под Прессом", + "create.ponder.mechanical_press.text_3": "Когда предметы подаются на конвейере...", + "create.ponder.mechanical_press.text_4": "Пресс будет задерживать и обрабатывать их автоматически", + + "create.ponder.mechanical_press_compacting.header": "Упаковке предметов Механическим прессом", + "create.ponder.mechanical_press_compacting.text_1": "Спрессовывание предметов в Чаше упакует их", + "create.ponder.mechanical_press_compacting.text_2": "Упаковка включает любые заполненные 2x2 или 3x3 рецепты крафта плюс ещё немного", + "create.ponder.mechanical_press_compacting.text_3": "Некоторым рецептам может потребоваться тепло от Горелки всполоха", + "create.ponder.mechanical_press_compacting.text_4": "Слот для фильтра можно использовать в случае конфликта двух рецептов", + + "create.ponder.mechanical_pump_flow.header": "Транспортировке жидкости при помощи Механических помп", + "create.ponder.mechanical_pump_flow.text_1": "Механические помпы направляют поток в присоединённые сети из труб", + "create.ponder.mechanical_pump_flow.text_2": "Когда работает, стрелка указывает направление потока", + "create.ponder.mechanical_pump_flow.text_3": "Часть сети сзади теперь качает жидкости...", + "create.ponder.mechanical_pump_flow.text_4": "...в то время как часть сети спереди передаёт их наружу", + "create.ponder.mechanical_pump_flow.text_5": "Смена направления вращения изменяет направление потока", + "create.ponder.mechanical_pump_flow.text_6": "Используйте гаечный ключ, чтобы изменить направление помпы вручную", + + "create.ponder.mechanical_pump_speed.header": "Производительности механических помп", + "create.ponder.mechanical_pump_speed.text_1": "Независимо от скорости, Механические помпы оказывают влияние на трубы в радиусе 16 блоков", + "create.ponder.mechanical_pump_speed.text_2": "Ускорение подаваемого вращения изменяет скорость распространения потоков...", + "create.ponder.mechanical_pump_speed.text_3": "...также, как и скорость передачи жидкостей", + "create.ponder.mechanical_pump_speed.text_4": "Помпы могут объединять свою производительность в общих сетях труб", + "create.ponder.mechanical_pump_speed.text_5": "Изменение их направления может помочь сонаправить направление их потоков", + + "create.ponder.mechanical_saw_breaker.header": "Резке деревьев Механической пилой", + "create.ponder.mechanical_saw_breaker.text_1": "При подаче вращения, Механическая пила будет пилить деревья прямо перед ней", + "create.ponder.mechanical_saw_breaker.text_2": "Для спиливания дерева полностью пила должна ломать последний блок дерева, соединённый с землёй", + + "create.ponder.mechanical_saw_contraption.header": "Использовании Механических пил на штуковинах", + "create.ponder.mechanical_saw_contraption.text_1": "Когда пилы движутся как часть движимой штуковины...", + "create.ponder.mechanical_saw_contraption.text_2": "...они будут ломать блоки, на которые они натыкаются", + + "create.ponder.mechanical_saw_processing.header": "Обработке предметов на Механической пиле", + "create.ponder.mechanical_saw_processing.text_1": "Направленные вверх Механические пилы могут обрабатывать множество предметов", + "create.ponder.mechanical_saw_processing.text_2": "Обработанные предметы всегда движутся против подаваемого на пилу вращения", + "create.ponder.mechanical_saw_processing.text_3": "Пилы могут работать с Механическими ремнями (конвейером)", + "create.ponder.mechanical_saw_processing.text_4": "Когда из ингредиента можно получить несколько результатов, фильтр может уточнить его", + "create.ponder.mechanical_saw_processing.text_5": "Без фильтра пила будет выбирать все возможные результаты по очереди", + + "create.ponder.millstone.header": "Обработке предметов в Жерновах", + "create.ponder.millstone.text_1": "Жернова обрабатывают предметы перемалывая их", + "create.ponder.millstone.text_2": "Их можно запустить при помощи шестерней с любой стороны", + "create.ponder.millstone.text_3": "Бросьте или внесите предметы сверху", + "create.ponder.millstone.text_4": "После некоторого времени результат можно забрать при помощи ПКМ", + "create.ponder.millstone.text_5": "Продукты также можно вывести автоматически", + + "create.ponder.nixie_tube.header": "Использовании Газоразрядных индикаторов", + "create.ponder.nixie_tube.text_1": "При подаче редстоун сигнала, Газоразрядные индикаторы отобразят его силу.", + "create.ponder.nixie_tube.text_2": "С помощью бирок, отредактированных на наковальне, вы можете отобразить любой текст.", + "create.ponder.nixie_tube.text_3": "Щелкните ПКМ с красителем, чтобы изменить цвет их дисплея", + + "create.ponder.piston_pole.header": "Удлинителях Поршня", + "create.ponder.piston_pole.text_1": "Без присоединённых Удлинителей, Механический поршень не может двигаться", + "create.ponder.piston_pole.text_2": "Длина стержня, добавленного к его задней части, определяет Диапазон выдвижения.", + + "create.ponder.portable_fluid_interface.header": "Портативном жидкостном интерфейсе на штуковинах", + "create.ponder.portable_fluid_interface.text_1": "Жидкостные баки на движущихся штуковинах не могут быть доступны ни каким трубам", + "create.ponder.portable_fluid_interface.text_2": "Этот интерфейс может взаимодействовать с жидкостными баками без необходимости останавливать штуковину", + "create.ponder.portable_fluid_interface.text_3": "Установите второй с промежутком в 1 или 2 блока между ними", + "create.ponder.portable_fluid_interface.text_4": "Они установят соединение, когда встретятся", + "create.ponder.portable_fluid_interface.text_5": "Пока они соединены, стационарный интерфейс будет представлять собой ВСЕ баки на штуковине", + "create.ponder.portable_fluid_interface.text_6": "Теперь можно закачать жидкости...", + "create.ponder.portable_fluid_interface.text_7": "...или выкачать их из штуковины", + "create.ponder.portable_fluid_interface.text_8": "Если на какое-то время прекратится обмен содержимым - штуковина продолжит свой путь", + + "create.ponder.portable_storage_interface.header": "Портативном интерфейсе хранения на штуковинах", + "create.ponder.portable_storage_interface.text_1": "Инвентари на двигающихся штуковинах не могут быть открыты игроками", + "create.ponder.portable_storage_interface.text_2": "Этот компонент может взаимодействовать с хранилищем без необходимости останавливать штуковину", + "create.ponder.portable_storage_interface.text_3": "Установите второй с промежутком в 1 или 2 блока между ними", + "create.ponder.portable_storage_interface.text_4": "Когда они проходят мимо друг друга, они соединятся", + "create.ponder.portable_storage_interface.text_5": "Пока они соединены, стационарный интерфейс будет представлять собой ВСЕ инвентари на штуковине", + "create.ponder.portable_storage_interface.text_6": "Теперь можно положить предметы...", + "create.ponder.portable_storage_interface.text_7": "...или вывести их из штуковины", + "create.ponder.portable_storage_interface.text_8": "Если на какое-то время прекратится обмен предметами - штуковина продолжит свой путь", + + "create.ponder.portable_storage_interface_redstone.header": "Управлении редстоуном", + "create.ponder.portable_storage_interface_redstone.text_1": "Редстоун сигнал предотвратит включение стационарного интерфейса", + + "create.ponder.powered_latch.header": "Управлении сигналами при помощи Питаемого рычага", + "create.ponder.powered_latch.text_1": "Питаемый рычаг - управляемый редстоуном рычаг", + "create.ponder.powered_latch.text_2": "Сигнал сзади включает его", + "create.ponder.powered_latch.text_3": "Сигналы сбоку обратно выключают его", + "create.ponder.powered_latch.text_4": "Питаемые рычаги можно переключать и вручную", + + "create.ponder.powered_toggle_latch.header": "Управлении сигналами при помощи Питаемого рычаг-переключателя", + "create.ponder.powered_toggle_latch.text_1": "Питаемый рычаг-переключатель - управляемый редстоуном рычаг", + "create.ponder.powered_toggle_latch.text_2": "Сигналы сзади переключают его состояние", + "create.ponder.powered_toggle_latch.text_3": "...включают и снова выключают", + "create.ponder.powered_toggle_latch.text_4": "Питаемые рычаги-переключатели также можно переключать вручную", + + "create.ponder.pulse_repeater.header": "Управлении сигналами при помощи Импульсных повторителей", + "create.ponder.pulse_repeater.text_1": "Импульсные повторители укоротят любой редстуон сигнал до одного импульса.", + + "create.ponder.radial_chassis.header": "Присоединении блоков при помощи Радиальных шасси", + "create.ponder.radial_chassis.text_1": "Радиальное шасси соединяются с идентичными блоками шасси в ряд", + "create.ponder.radial_chassis.text_2": "Когда один блок перемещается штуковиной, остальные двигаются с ним", + "create.ponder.radial_chassis.text_3": "Боковые грани Радиального шасси можно сделать липкими", + "create.ponder.radial_chassis.text_4": "Кликните ещё раз, чтобы сделать все остальные грани липкими", + "create.ponder.radial_chassis.text_5": "ПКМ пустой рукой крадучись, чтобы убрать слизь", + "create.ponder.radial_chassis.text_6": "Когда блок находится рядом с липкой гранью...", + "create.ponder.radial_chassis.text_7": "он присоединит все достижимые блоки в пределах радиуса на этом слое", + "create.ponder.radial_chassis.text_8": "При помощи ключа можно указать точный радиус для этого шасси", + "create.ponder.radial_chassis.text_9": "Блоки не достижимые ни одной липкой гранью не прикрепятся", + + "create.ponder.redstone_contact.header": "Контактах редстоун сигнала", + "create.ponder.redstone_contact.text_1": "Контакты редстоун сигнала направленные друг на друга будут излучать редстоун сигнал", + "create.ponder.redstone_contact.text_2": "Также применимо, когда один из них - часть двигающейся штуковины", + + "create.ponder.redstone_link.header": "Использовании Беспроводного передатчика редстоун сигнала", + "create.ponder.redstone_link.text_1": "Беспроводные передатчики редстоун сигнала могут передавать редстоун сигнал без проводов", + "create.ponder.redstone_link.text_2": "ПКМ крадучись, чтобы переключить режим приёмника", + "create.ponder.redstone_link.text_3": "ПКМ ключом сделает то же самое", + "create.ponder.redstone_link.text_4": "Приёмники испускают редстоун сигнал передатчиков в 128 блоках", + "create.ponder.redstone_link.text_5": "Положите предметы в два слота, чтобы указать частоту", + "create.ponder.redstone_link.text_6": "Передатчики только одной частоты могут сообщаться", + + "create.ponder.rope_pulley.header": "Перемещении структур при помощи Лебёдки", + "create.ponder.rope_pulley.text_1": "Лебёдки могут двигать блоки вертикально при подаче вращения", + "create.ponder.rope_pulley.text_2": "Направление и скорость движения зависят от исходного вращения", + + "create.ponder.rope_pulley_attachment.header": "Перемещении Лебёдок как частей штуковины", + "create.ponder.rope_pulley_attachment.text_1": "Когда лебёдки перемещаются штуковиной...", + "create.ponder.rope_pulley_attachment.text_2": "...их присоединённая структура движется с ними", + "create.ponder.rope_pulley_attachment.text_3": "Учитывайте, что лебёдки можно двигать только пока они простаивают", + + "create.ponder.rope_pulley_modes.header": "Режимах движения Лебёдки", + "create.ponder.rope_pulley_modes.text_1": "Когда лебёдка останавливается, сдвинутая структура обратно становится блоками", + "create.ponder.rope_pulley_modes.text_2": "Можно настроить её так, чтобы структура никогда не становилась блоками или только на начальной позиции", + + "create.ponder.rotation_speed_controller.header": "Использовании Регулятора скорости вращения", + "create.ponder.rotation_speed_controller.text_1": "Регуляторы ск. вращения передают вращение от своих осей на Большую шестерню выше них", + "create.ponder.rotation_speed_controller.text_2": "Можно настроить передаваемую скорость при помощи прокрутки по соответствующему месту сбоку", + + "create.ponder.sail.header": "Сборке Мельниц при помощи Парусов", + "create.ponder.sail.text_1": "Паруса - удобные блоки для создания мельниц", + "create.ponder.sail.text_2": "Они будут прикрепляться к блокам и друг к другу без использования суперклея или блоков шасси", + "create.ponder.sail.text_3": "ПКМ красителем, чтобы покрасить их", + "create.ponder.sail.text_4": "ПКМ ножницами, чтобы превратить их снова в раму", + + "create.ponder.sail_frame.header": "Сборке Мельниц при помощи Рам парусов", + "create.ponder.sail_frame.text_1": "Рамы парусов - удобные блоки для создания мельниц", + "create.ponder.sail_frame.text_2": "Они будут прикрепляться к блокам и друг к другу без использования суперклея или блоков шасси", + + "create.ponder.sequenced_gearshift.header": "Управлении скоростью вращения при помощи Последовательного переключателя передач", + "create.ponder.sequenced_gearshift.text_1": "Посл. перекл. передач передают вращение следуя временному списку инструкций", + "create.ponder.sequenced_gearshift.text_2": "ПКМ, чтобы отрыть интерфейс настройки", + "create.ponder.sequenced_gearshift.text_3": "При получении Редстоун сигнала, он начнёт выполнять заданные инструкции", + "create.ponder.sequenced_gearshift.text_4": "По завершению он будет дожидаться следующего Редстоун сигнала и начнёт сначала", + "create.ponder.sequenced_gearshift.text_5": "Редстоун компаратор можно использовать для считывания текущего прогресса", + + "create.ponder.shaft.header": "Передаче вращения при помощи Валов", + "create.ponder.shaft.text_1": "Валы передают вращение по прямой", + + "create.ponder.shaft_casing.header": "Обрамлении Валов", + "create.ponder.shaft_casing.text_1": "Латунный или андезитовый корпус можно использовать для декорации Валов", + + "create.ponder.smart_chute.header": "Фильтрации предметов при помощи Умных желобов", + "create.ponder.smart_chute.text_1": "Умные желоба - вертикальные желоба с дополнительным контролем", + "create.ponder.smart_chute.text_2": "Предметы в слоте фильтра уточняют, что они могут забирать и передавать", + "create.ponder.smart_chute.text_3": "Используйте Колесо Мыши для уточнения размера забираемого стака", + "create.ponder.smart_chute.text_4": "Редстоун сигнал выключает их", + + "create.ponder.smart_pipe.header": "Управлении жидкостным потоком с помощью Умных труб", + "create.ponder.smart_pipe.text_1": "Умные трубы могут помочь управлять потоками по типам жидкостей", + "create.ponder.smart_pipe.text_2": "Размещенные непосредственно у источника, они могут указывать тип извлекаемой жидкости", + "create.ponder.smart_pipe.text_3": "Просто щелкните ПКМ на слоте фильтра с любым предметом, содержащим нужную жидкость", + "create.ponder.smart_pipe.text_4": "И при размещении глубже по сети труб умные трубы будут пропускать только подходящие жидкости.", + + "create.ponder.speedometer.header": "Мониторинге Кинетической информации при помощи Спидометра", + "create.ponder.speedometer.text_1": "Спидометры отображают текущую скорость присоединённых компонентов", + "create.ponder.speedometer.text_2": "При ношении Инженерных очков игрок может получить более полную информацию от прибора", + "create.ponder.speedometer.text_3": "Компараторы могут испускать аналоговый Редстоун сигнал относительно измерений спидометра", + + "create.ponder.spout_filling.header": "Наполнении предметов при помощи дозатора", + "create.ponder.spout_filling.text_1": "Дозатор может заполнять подходящие предметы, расположенные под ним", + "create.ponder.spout_filling.text_2": "К содержимому дозатора невозможно получить доступ вручную.", + "create.ponder.spout_filling.text_3": "Вместо этого можно использовать трубы для подачи в него жидкостей", + "create.ponder.spout_filling.text_4": "Наполняемые предметы могут быть размещены на депо под дозатором", + "create.ponder.spout_filling.text_5": "Когда предметы подаются конвейером...", + "create.ponder.spout_filling.text_6": "Дозатор будет удерживать и обрабатывать их автоматически", + + "create.ponder.stabilized_bearings.header": "Стабилизации Штуковин", + "create.ponder.stabilized_bearings.text_1": "Когда Механические подшипники являются частью двигающейся структуры...", + "create.ponder.stabilized_bearings.text_2": "...они будут пытаться держаться ровно", + "create.ponder.stabilized_bearings.text_3": "Опять же, подшипники присоединяют блоки перед ними", + "create.ponder.stabilized_bearings.text_4": "И в результате целая под-структура будет держаться ровно", + + "create.ponder.sticker.header": "Прикреплении блоков при помощи Липучки", + "create.ponder.sticker.text_1": "Липучки идеально подходят для Редстоун-управляемого присоединения блоков", + "create.ponder.sticker.text_2": "При получении сигнала они переключают своё состояние", + "create.ponder.sticker.text_3": "Если он теперь движется в штуковине, то блок будет двигаться с ним", + "create.ponder.sticker.text_4": "При повторном переключении блок больше не будет прикреплён", + + "create.ponder.stressometer.header": "Мониторинге кинетической информации при помощи Стрессометра", + "create.ponder.stressometer.text_1": "Стрессометр отображает текущую допустимую нагрузку присоединённой кинетической сети", + "create.ponder.stressometer.text_2": "При ношении Инженерных очков игрок может получить более полную информацию от прибора", + "create.ponder.stressometer.text_3": "Компараторы могут испускать аналоговый редстоун сигнал относительно измерений стрессометра", + + "create.ponder.super_glue.header": "Присоединении блоков при помощи Супер-клея", + "create.ponder.super_glue.text_1": "Супер-клей можно использовать между двумя любыми блоками", + "create.ponder.super_glue.text_2": "Скреплённые блоки будут двигаться вместе при сборке в штуковну", + "create.ponder.super_glue.text_3": "Когда вы супер-клей во второй руке...", + "create.ponder.super_glue.text_4": "...добавленные блоки будут сразу приклеены к грани, на которую они были поставлены", + "create.ponder.super_glue.text_5": "Супер-клей можно удалить левым кликом", + + "create.ponder.valve_handle.header": "Генерации силы вращения при помощи Вентилей", + "create.ponder.valve_handle.text_1": "Игроки могут использовать вентили для применения силы вращения вручную", + "create.ponder.valve_handle.text_2": "Держите ПКМ для вращения его против Часовой стрелки", + "create.ponder.valve_handle.text_3": "Передаваемая ими скорость медленная и точная", + "create.ponder.valve_handle.text_4": "Держите ПКМ крадучись для вращения его по Часовой стрелке", + "create.ponder.valve_handle.text_5": "Вентили можно окрашивать в эстетических целях", + + "create.ponder.valve_pipe.header": "Управлении потоком жидкости с помощью вентилей", + "create.ponder.valve_pipe.text_1": "Жидкостные вентили помогают контролировать распространение жидкостей по сетям труб", + "create.ponder.valve_pipe.text_2": "Их входной вал контролирует, разрешена ли подача жидкости в данный момент", + "create.ponder.valve_pipe.text_3": "При вращении в направлении открытия - клапан откроется", + "create.ponder.valve_pipe.text_4": "Его можно снова закрыть, изменив направление входного вращения", + + "create.ponder.water_wheel.header": "Генерации силы вращения при помощи Водяных колёс", + "create.ponder.water_wheel.text_1": "Водяные колёса берут силу соседних потоков воды", + "create.ponder.water_wheel.text_2": "Чем больше сторон запитано, тем быстрее будет вращаться Водяное колесо", + "create.ponder.water_wheel.text_3": "Лопасти колеса должны быть направлены против течения", + "create.ponder.water_wheel.text_4": "Направленная в противоположную сторону, она не будет так же эффективна", + + "create.ponder.weighted_ejector.header": "Использовании Взвешенных катапульт", + "create.ponder.weighted_ejector.text_1": "ПКМ крадучись и держа катапульту, чтобы выбрать место цели", + "create.ponder.weighted_ejector.text_10": "Теперь она ограниченна этим размера стака и будет активироваться только тогда, когда удерживаемый стак достигнет этого количества", + "create.ponder.weighted_ejector.text_11": "Другие сущности, встав на катапульту, будут всегда активировать её", + "create.ponder.weighted_ejector.text_2": "Установленная катапульта будет запускать объекты до отмеченного места", + "create.ponder.weighted_ejector.text_3": "Подходящая цель может быть на любой дистанции и высоте в радиусе", + "create.ponder.weighted_ejector.text_4": "Однако они не могут быть сбоку", + "create.ponder.weighted_ejector.text_5": "Если не было выбрано подходящей цели, она будет целиться в блок перед ней", + "create.ponder.weighted_ejector.text_6": "Предоставьте силу вращения, чтобы зарядить её", + "create.ponder.weighted_ejector.text_7": "Установка предметов на катапульту вызывают её срабатывание", + "create.ponder.weighted_ejector.text_8": "Если инвентарь выбран целью, то катапульта будет ждать, пока в нём не появится место.", + "create.ponder.weighted_ejector.text_9": "При помощи ключа можно настроить необходимый размер стака", + + "create.ponder.weighted_ejector_redstone.header": "Управлении Взвешенными катапультами редстоуном", + "create.ponder.weighted_ejector_redstone.text_1": "При подаче редстоун сигнала катапульты не будут активироваться", + "create.ponder.weighted_ejector_redstone.text_2": "Кроме того, наблюдатели могут определить, когда катапульты срабатывают", + + "create.ponder.weighted_ejector_tunnel.header": "Разделении стаков предметов при помощи Взвешенных катапульт", + "create.ponder.weighted_ejector_tunnel.text_1": "Объединённые с Латунными туннелями, катапульты могут делить стаки предметов по определённому количеству", + "create.ponder.weighted_ejector_tunnel.text_2": "Сперва, настройте Латунный туннель на «Предпочтительно ближайшее», чтобы приоритизировать выход сбоку", + "create.ponder.weighted_ejector_tunnel.text_3": "Размер стака, установленный на катапульте, теперь определяет отделяемое количество", + "create.ponder.weighted_ejector_tunnel.text_4": "Пока новый стак нужного количества лежит на боковом выходе...", + "create.ponder.weighted_ejector_tunnel.text_5": "...остаток продолжит свой путь", + + "create.ponder.windmill_source.header": "Генерации силы вращения при помощи Подшипников ветряной мельницы", + "create.ponder.windmill_source.text_1": "Подшипники ветр. мельницы прикрепляются к блокам перед ними", + "create.ponder.windmill_source.text_2": "Если прикреплено достаточно парусоподобных блоков, он может стать мельницей", + "create.ponder.windmill_source.text_3": "Активированный при помощи ПКМ, Подшипник ветр. мельницы начнёт вырабатывать силу вращения", + "create.ponder.windmill_source.text_4": "Количество парусов определяет скорость вращения", + "create.ponder.windmill_source.text_5": "Используйте ключ, чтобы настроить направление вращения", + "create.ponder.windmill_source.text_6": "ПКМ по подшипнику в любое время, чтобы остановить его и отредактировать структуру", + + "create.ponder.windmill_structure.header": "Штуковинах Мельницах", + "create.ponder.windmill_structure.text_1": "Любая структура может считаться мельницей, пока она содержит как минимум 8 парусоподобных блоков", "_": "Thank you for translating Create!" diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 42177778b..eeaab51f2 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 253", + "_": "Missing Localizations: 5", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,10 +28,12 @@ "block.create.belt": "传送带", "block.create.birch_window": "白桦窗户", "block.create.birch_window_pane": "白桦窗户板", + "block.create.black_nixie_tube": "黑色辉光管", "block.create.black_sail": "黑色风帆", "block.create.black_seat": "黑色坐垫", "block.create.black_valve_handle": "黑色阀门手轮", "block.create.blaze_burner": "烈焰人燃烧室", + "block.create.blue_nixie_tube": "蓝色辉光管", "block.create.blue_sail": "蓝色风帆", "block.create.blue_seat": "蓝色坐垫", "block.create.blue_valve_handle": "蓝色阀门手轮", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "黄铜传动杆箱", "block.create.brass_funnel": "黄铜漏斗", "block.create.brass_tunnel": "黄铜隧道", + "block.create.brown_nixie_tube": "棕色辉光管", "block.create.brown_sail": "棕色风帆", "block.create.brown_seat": "棕色坐垫", "block.create.brown_valve_handle": "棕色阀门手轮", @@ -58,7 +61,7 @@ "block.create.cogwheel": "齿轮", "block.create.content_observer": "物品侦测器", "block.create.controller_rail": "控制铁轨", - "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "block.create.copper_backtank": "铜制背罐", "block.create.copper_block": "铜块", "block.create.copper_casing": "铜机壳", "block.create.copper_ore": "铜矿石", @@ -73,7 +76,7 @@ "block.create.crushing_wheel": "粉碎轮", "block.create.crushing_wheel_controller": "粉碎轮控制器", "block.create.cuckoo_clock": "布谷鸟闹钟", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "青色辉光管", "block.create.cyan_sail": "青色风帆", "block.create.cyan_seat": "青色坐垫", "block.create.cyan_valve_handle": "青色阀门手轮", @@ -180,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "花岗岩圆石楼梯", "block.create.granite_cobblestone_wall": "花岗岩圆石墙", "block.create.granite_pillar": "竖纹花岗岩", + "block.create.gray_nixie_tube": "灰色辉光管", "block.create.gray_sail": "灰色风帆", "block.create.gray_seat": "灰色坐垫", "block.create.gray_valve_handle": "灰色阀门手轮", + "block.create.green_nixie_tube": "绿色辉光管", "block.create.green_sail": "绿色风帆", "block.create.green_seat": "绿色坐垫", "block.create.green_valve_handle": "绿色阀门手轮", "block.create.hand_crank": "手摇曲柄", + "block.create.haunted_bell": "怪异钟", "block.create.honey": "蜂蜜", "block.create.horizontal_framed_glass": "竖直边框玻璃", "block.create.horizontal_framed_glass_pane": "竖直边框玻璃板", @@ -204,13 +210,16 @@ "block.create.layered_limestone": "层叠石灰岩", "block.create.layered_scoria": "层叠熔渣", "block.create.layered_weathered_limestone": "层叠风化石灰岩", - "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.lectern_controller": "遥控器讲台", + "block.create.light_blue_nixie_tube": "淡蓝色辉光管", "block.create.light_blue_sail": "淡蓝色风帆", "block.create.light_blue_seat": "淡蓝色坐垫", "block.create.light_blue_valve_handle": "淡蓝色阀门手轮", + "block.create.light_gray_nixie_tube": "淡灰色辉光管", "block.create.light_gray_sail": "淡灰色风帆", "block.create.light_gray_seat": "淡灰色坐垫", "block.create.light_gray_valve_handle": "淡灰色阀门手轮", + "block.create.lime_nixie_tube": "黄绿色辉光管", "block.create.lime_sail": "黄绿色风帆", "block.create.lime_seat": "黄绿色坐垫", "block.create.lime_valve_handle": "黄绿色阀门手轮", @@ -227,6 +236,7 @@ "block.create.limestone_pillar": "竖纹石灰岩", "block.create.linear_chassis": "机壳底盘", "block.create.lit_blaze_burner": "烈焰人燃烧室(已点燃)", + "block.create.magenta_nixie_tube": "品红色辉光管", "block.create.magenta_sail": "品红色风帆", "block.create.magenta_seat": "品红色坐垫", "block.create.magenta_valve_handle": "品红色阀门手轮", @@ -310,7 +320,8 @@ "block.create.paved_weathered_limestone_slab": "风化石灰岩铺路石台阶", "block.create.paved_weathered_limestone_stairs": "风化石灰岩铺路石楼梯", "block.create.paved_weathered_limestone_wall": "风化石灰岩铺路石墙", - "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.peculiar_bell": "奇异钟", + "block.create.pink_nixie_tube": "粉色辉光管", "block.create.pink_sail": "粉红色风帆", "block.create.pink_seat": "粉红色坐垫", "block.create.pink_valve_handle": "粉红色阀门手轮", @@ -345,10 +356,12 @@ "block.create.powered_toggle_latch": "转换锁存器", "block.create.pulley_magnet": "滑轮磁铁", "block.create.pulse_repeater": "脉冲中继器", + "block.create.purple_nixie_tube": "紫色辉光管", "block.create.purple_sail": "紫色风帆", "block.create.purple_seat": "紫色坐垫", "block.create.purple_valve_handle": "紫色阀门手轮", "block.create.radial_chassis": "旋转底盘", + "block.create.red_nixie_tube": "红色辉光管", "block.create.red_sail": "红色风帆", "block.create.red_seat": "红色坐垫", "block.create.red_valve_handle": "红色阀门手轮", @@ -405,21 +418,26 @@ "block.create.weathered_limestone_cobblestone_wall": "风化石灰岩圆石墙", "block.create.weathered_limestone_pillar": "竖纹风化石灰岩", "block.create.weighted_ejector": "弹射置物台", + "block.create.white_nixie_tube": "白色辉光管", "block.create.white_sail": "白色风帆", "block.create.white_seat": "白色坐垫", "block.create.white_valve_handle": "白色阀门手轮", "block.create.windmill_bearing": "风车轴承", "block.create.wooden_bracket": "木质支架", + "block.create.yellow_nixie_tube": "黄色辉光管", "block.create.yellow_sail": "黄色风帆", "block.create.yellow_seat": "黄色坐垫", "block.create.yellow_valve_handle": "黄色阀门手轮", "block.create.zinc_block": "锌块", "block.create.zinc_ore": "锌矿石", + "enchantment.create.capacity": "扩容", + "enchantment.create.potato_recovery": "土豆回收", + "entity.create.contraption": "装置", - "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.crafting_blueprint": "合成蓝图", "entity.create.gantry_contraption": "起重机装置", - "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", + "entity.create.potato_projectile": "被发射的土豆", "entity.create.seat": "坐垫", "entity.create.stationary_contraption": "固定装置", "entity.create.super_glue": "强力胶", @@ -444,13 +462,13 @@ "item.create.chocolate_glazed_berries": "巧克力包层浆果", "item.create.chromatic_compound": "异彩化合物", "item.create.cinder_flour": "下界面粉", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_backtank": "铜制背罐", "item.create.copper_ingot": "铜锭", "item.create.copper_nugget": "铜粒", "item.create.copper_sheet": "铜板", "item.create.crafter_slot_cover": "合成器盖板", - "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crafting_blueprint": "合成蓝图", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "粉碎铝矿石", "item.create.crushed_brass": "粉碎黄铜", "item.create.crushed_copper_ore": "粉碎铜矿石", @@ -465,8 +483,8 @@ "item.create.crushed_tin_ore": "粉碎锡矿石", "item.create.crushed_uranium_ore": "粉碎铀矿石", "item.create.crushed_zinc_ore": "粉碎锌矿石", - "item.create.diving_boots": "UNLOCALIZED: Diving Boots", - "item.create.diving_helmet": "UNLOCALIZED: Diving Helmet", + "item.create.diving_boots": "潜水靴", + "item.create.diving_helmet": "潜水头盔", "item.create.dough": "面团", "item.create.electron_tube": "电子管", "item.create.empty_blaze_burner": "空的烈焰人燃烧室", @@ -479,14 +497,17 @@ "item.create.handheld_worldshaper": "手持式环境塑形器", "item.create.honey_bucket": "蜂蜜桶", "item.create.honeyed_apple": "蜜渍苹果", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "齿轮(半成品)", + "item.create.incomplete_large_cogwheel": "大齿轮(半成品)", + "item.create.incomplete_precision_mechanism": "精密机构(半成品)", "item.create.iron_sheet": "铁板", - "item.create.linked_controller": "UNLOCALIZED: Linked Controller", + "item.create.linked_controller": "无线红石遥控器", "item.create.minecart_contraption": "装配过的矿车", "item.create.minecart_coupling": "矿车连轴器", "item.create.polished_rose_quartz": "磨制玫瑰石英", - "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", + "item.create.potato_cannon": "土豆加农炮", "item.create.powdered_obsidian": "黑曜石粉末", + "item.create.precision_mechanism": "精密机构", "item.create.propeller": "扇叶", "item.create.red_sand_paper": "红沙砂纸", "item.create.refined_radiance": "光辉石", @@ -631,8 +652,8 @@ "advancement.create.flywheel.desc": "将引擎成功连接到飞轮。", "advancement.create.overstress_flywheel": "高压", "advancement.create.overstress_flywheel.desc": "过载熔炉引擎。", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "高新技术", + "advancement.create.precision_mechanism.desc": "装配一个精密机构。", "advancement.create.mechanical_arm": "忙碌的手!", "advancement.create.mechanical_arm.desc": "制作机械臂,选择输入和输出,放置并给予它动力,然后看着它为你完成所有工作。", "advancement.create.musical_arm": "没人能在我的 BGM 里打败我!", @@ -659,8 +680,8 @@ "advancement.create.wand_of_symmetry.desc": "制作一个对称之杖", "advancement.create.extendo_grip": "biu biu biu!", "advancement.create.extendo_grip.desc": "获得一个伸缩机械手", - "advancement.create.potato_cannon": "UNLOCALIZED: Fwoomp!", - "advancement.create.potato_cannon.desc": "UNLOCALIZED: Defeat an enemy with your Potato Cannon.", + "advancement.create.potato_cannon": "Fwoomp!", + "advancement.create.potato_cannon.desc": "用土豆加农炮击杀一个生物。", "advancement.create.dual_extendo_grip": "biu——biu——biu——", "advancement.create.dual_extendo_grip.desc": "双持伸缩机械手,超人般的触碰距离。", "advancement.create.eob": "Beta 版结束", @@ -673,24 +694,30 @@ "itemGroup.create.palettes": "机械动力建筑方块", "death.attack.create.crush": "%1$s被压扁了", + "death.attack.create.crush.player": "%1$s被%2$s推进了粉碎机", "death.attack.create.fan_fire": "%1$s试图接受热风的洗礼", + "death.attack.create.fan_fire.player": "%2$s给了%1$s一次热风的洗礼", "death.attack.create.fan_lava": "%1$s在接受热风的洗礼中浴火焚身", + "death.attack.create.fan_lava.player": "%1$s被%2$s火化了", "death.attack.create.mechanical_drill": "%1$s被钻头钻的坏掉了", + "death.attack.create.mechanical_drill.player": "%1$s因为%2$s和钻头来了一次亲密接触", "death.attack.create.mechanical_saw": "%1$s被圆锯切成了两截", - "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", - "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", + "death.attack.create.mechanical_saw.player": "%1$s被%2$s按在圆锯上切碎了", + "death.attack.create.potato_cannon": "%1$s被%2$s的土豆糊了一脸", + "death.attack.create.potato_cannon.item": "%1$s被%2$s用%3$s射死了", "death.attack.create.cuckoo_clock_explosion": "%1$s被布谷鸟钟炸得粉身碎骨", + "death.attack.create.cuckoo_clock_explosion.player": "%1$s被布谷鸟钟炸得粉身碎骨", "create.block.deployer.damage_source_name": "二五仔机械手", "create.block.cart_assembler.invalid": "请将矿车装配器放置在铁轨上", - "create.menu.return": "UNLOCALIZED: Return to Menu", - "create.menu.configure": "UNLOCALIZED: Configure...", - "create.menu.ponder_index": "UNLOCALIZED: Ponder Index", - "create.menu.only_ingame": "UNLOCALIZED: Available in the Pause Menu", - "create.menu.project_page": "UNLOCALIZED: Project Page", - "create.menu.report_bugs": "UNLOCALIZED: Report Issues", - "create.menu.support": "UNLOCALIZED: Support Us", + "create.menu.return": "返回上一级菜单", + "create.menu.configure": "配置...", + "create.menu.ponder_index": "思索内容清单", + "create.menu.only_ingame": "仅在游戏内暂停菜单中可用", + "create.menu.project_page": "在CurseForge上查看", + "create.menu.report_bugs": "报告Create的漏洞", + "create.menu.support": "支持我们", "create.recipe.crushing": "粉碎", "create.recipe.milling": "研磨", @@ -702,7 +729,7 @@ "create.recipe.fan_blasting.fan": "在熔岩后放置鼓风机", "create.recipe.pressing": "金属压片", "create.recipe.mixing": "混合搅拌", - "create.recipe.deploying": "UNLOCALIZED: Deploying", + "create.recipe.deploying": "自动使用", "create.recipe.automatic_shapeless": "自动搅拌", "create.recipe.automatic_brewing": "自动酿造", "create.recipe.packing": "压块塑形", @@ -716,16 +743,16 @@ "create.recipe.mystery_conversion": "神秘转化", "create.recipe.spout_filling": "注液", "create.recipe.draining": "分液", - "create.recipe.sequenced_assembly": "UNLOCALIZED: Sequenced Assembly", - "create.recipe.assembly.next": "UNLOCALIZED: Next: %1$s", - "create.recipe.assembly.step": "UNLOCALIZED: Step %1$s:", - "create.recipe.assembly.progress": "UNLOCALIZED: Progress: %1$s/%2$s", - "create.recipe.assembly.pressing": "UNLOCALIZED: Process in Press", - "create.recipe.assembly.spout_filling_fluid": "UNLOCALIZED: Spout %1$s", - "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", - "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", - "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.sequenced_assembly": "流水线装配", + "create.recipe.assembly.next": "下一步:%1$s", + "create.recipe.assembly.step": "第%1$s步:", + "create.recipe.assembly.progress": "组装进度:%1$s/%2$s", + "create.recipe.assembly.pressing": "用辊压机辊压", + "create.recipe.assembly.spout_filling_fluid": "注入%1$s", + "create.recipe.assembly.deploying_item": "安装%1$s", + "create.recipe.assembly.cutting": "用动力锯切割", + "create.recipe.assembly.repeat": "该序列需要重复%1$s次", + "create.recipe.assembly.junk": "随机废料", "create.recipe.processing.chance": "%1$s%%概率", "create.recipe.heat_requirement.none": "无需加热", "create.recipe.heat_requirement.heated": "加热", @@ -779,15 +806,15 @@ "create.orientation.alongX": "以x轴对齐", "create.gui.terrainzapper.title": "手持式环境塑形器", - "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", - "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", - "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", - "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", - "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", - "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", - "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", - "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", - "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", + "create.gui.terrainzapper.searchDiagonal": "对角线延伸", + "create.gui.terrainzapper.searchFuzzy": "模糊模式(忽略材料分界)", + "create.gui.terrainzapper.patternSection": "样式", + "create.gui.terrainzapper.pattern.solid": "填满", + "create.gui.terrainzapper.pattern.checkered": "棋盘格", + "create.gui.terrainzapper.pattern.inversecheckered": "反转棋盘格", + "create.gui.terrainzapper.pattern.chance25": "随机填充25%", + "create.gui.terrainzapper.pattern.chance50": "随机填充50%", + "create.gui.terrainzapper.pattern.chance75": "随机填充75%", "create.gui.terrainzapper.placement": "放置模式", "create.gui.terrainzapper.placement.merged": "结合", "create.gui.terrainzapper.placement.attached": "依附", @@ -796,8 +823,8 @@ "create.gui.terrainzapper.brush.cuboid": "矩形体", "create.gui.terrainzapper.brush.sphere": "球体", "create.gui.terrainzapper.brush.cylinder": "圆柱体", - "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", - "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", + "create.gui.terrainzapper.brush.surface": "连接的面", + "create.gui.terrainzapper.brush.cluster": "连接的立体区域", "create.gui.terrainzapper.tool": "填充类型", "create.gui.terrainzapper.tool.fill": "填充", "create.gui.terrainzapper.tool.place": "复写", @@ -807,8 +834,8 @@ "create.gui.terrainzapper.tool.flatten": "平整", "create.terrainzapper.shiftRightClickToSet": "Shift+鼠标右击以设置塑形类型", - "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", - "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", + "create.terrainzapper.usingBlock": "填充材料:%1$s", + "create.terrainzapper.leftClickToSet": "鼠标左击一个方块以设置填充材料", "create.minecart_coupling.two_couplings_max": "矿车无法被连接两个以上的矿车连轴器", "create.minecart_coupling.unloaded": "有一部分火车存在于未加载区块中", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "不属于%1$s", "create.item_attributes.added_by": "由%1$s添加", "create.item_attributes.added_by.inverted": "不是由%1$s添加", + "create.item_attributes.shulker_level": "潜影盒是%1$s的", + "create.item_attributes.shulker_level.inverted": "潜影盒不是%1$s的", + "create.item_attributes.shulker_level.full": "满", + "create.item_attributes.shulker_level.empty": "空", + "create.item_attributes.shulker_level.partial": "半满", "create.item_attributes.has_enchant": "有附魔效果%1$s", "create.item_attributes.has_enchant.inverted": "没有附魔效果%1$s", "create.item_attributes.color": "染色为%1$s", @@ -1134,20 +1166,27 @@ "create.tooltip.chute.fans_pull_up": "鼓风机从上方进行吸引", "create.tooltip.chute.fans_pull_down": "鼓风机从下方进行吸引", "create.tooltip.chute.contains": "内含物品:%1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "等待分配的物品:", + "create.tooltip.brass_tunnel.contains_entry": "> %2$s个%1$s", + "create.tooltip.brass_tunnel.retrieve": "鼠标右击取出", - "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", - "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", - "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", - "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", - "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.linked_controller.bind_mode": "绑定模式激活", + "create.linked_controller.press_keybind": "按%1$s,%2$s,%3$s,%4$s,%5$s或%6$s选择要将该频率绑定到哪个按键。", + "create.linked_controller.key_bound": "该频率已绑定到%1$s", + "create.linked_controller.frequency_slot_1": "按键:%1$s,频道 #1", + "create.linked_controller.frequency_slot_2": "按键:%1$s,频道 #2", - "create.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", - "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", - "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", - "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", - "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", - "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", - "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.crafting_blueprint.crafting_slot": "合成材料格", + "create.crafting_blueprint.filter_items_viable": "可以使用过滤器", + "create.crafting_blueprint.display_slot": "展示的图标", + "create.crafting_blueprint.inferred": "已根据合成配方自动设定", + "create.crafting_blueprint.manually_assigned": "手动设定", + "create.crafting_blueprint.secondary_display_slot": "展示的图标角标", + "create.crafting_blueprint.optional": "可选", + + "create.potato_cannon.ammo.attack_damage": "%1$s 攻击伤害", + "create.potato_cannon.ammo.reload_ticks": "%1$s 装弹时间(Ticks)", + "create.potato_cannon.ammo.knockback": "%1$s 击退", "create.hint.hose_pulley.title": "无限供应", "create.hint.hose_pulley": "目标液体对象被视为无限量的。", @@ -1176,45 +1215,46 @@ "create.command.killTPSCommand.argument.tickTime": "tickTime", "create.contraption.minecart_contraption_too_big": "这一矿车装置似乎太大了,无法变为拾捡状态", - "create.contraption.minecart_contraption_illegal_pickup": "UNLOCALIZED: A mystical force is binding this Cart Contraption to the world", + "create.contraption.minecart_contraption_illegal_pickup": "神秘的力量阻止你拾取这个矿车装置。", "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", - "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", - "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.contraption_disassemble": "结构:停止移动", + "create.subtitle.peculiar_bell_use": "奇异钟:鸣响", + "create.subtitle.mixing": "搅拌器:搅拌声", + "create.subtitle.mechanical_press_activation_belt": "辊压机:撞击传送带", + "create.subtitle.fwoomp": "土豆加农炮:发射", + "create.subtitle.worldshaper_place": "环境塑型器:放置方块", + "create.subtitle.crushing_1": "磨碎声", + "create.subtitle.depot_slide": "物品:滑入", + "create.subtitle.saw_activate_stone": "动力锯:切割", "create.subtitle.blaze_munch": "烈焰人:咀嚼", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.funnel_flap": "漏斗:垂帘碰撞", "create.subtitle.schematicannon_finish": "蓝图加农炮:叮", - "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.haunted_bell_use": "怪异钟:鸣响", + "create.subtitle.scroll_value": "拨码输入:咔哒", + "create.subtitle.crafter_craft": "动力合成器:合成中", + "create.subtitle.controller_put": "遥控器:放进讲台", + "create.subtitle.cranking": "手摇曲柄:转动", + "create.subtitle.wrench_remove": "部件:被破坏", + "create.subtitle.cogs": "齿轮:嘎吱作响", "create.subtitle.slime_added": "粘液:挤碎声", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", - "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", - "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", - "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.wrench_rotate": "扳手:拧动", + "create.subtitle.potato_hit": "土豆:击中", + "create.subtitle.saw_activate_wood": "动力锯:切割", + "create.subtitle.haunted_bell_convert": "奇异钟:转化", + "create.subtitle.deployer_polish": "机械手:打磨物品", + "create.subtitle.deny": "提示声:出错", + "create.subtitle.controller_click": "遥控器:按下按钮", "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", - "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", + "create.subtitle.copper_armor_equip": "潜水装备:铿锵", + "create.subtitle.controller_take": "讲台:取走物品", "create.subtitle.mechanical_press_activation": "辊压机:工作中", - "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", - "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.contraption_assemble": "结构:开始移动", + "create.subtitle.crafter_click": "动力合成器:咔哒声", + "create.subtitle.depot_plop": "物品:着地", + "create.subtitle.confirm": "提示声:接受", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1271,15 +1311,15 @@ "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_触碰距离_。", "item.create.extendo_grip.tooltip.condition1": "放置于副手栏时", "item.create.extendo_grip.tooltip.behaviour1": "增加_主手_所使用物品的_接触距离_。", - "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.extendo_grip.tooltip.condition2": "当装备铜制背罐时", + "item.create.extendo_grip.tooltip.behaviour2": "使用罐中_气压_来_抵消_伸缩机械手的_耐久_损耗。", - "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", - "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", - "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", - "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.potato_cannon.tooltip": "土豆加农炮", + "item.create.potato_cannon.tooltip.summary": "噗!把你亲手栽培的蔬菜砸向你的敌人。可以使用_铜制背罐_供能。", + "item.create.potato_cannon.tooltip.condition1": "当右击时", + "item.create.potato_cannon.tooltip.behaviour1": "_发射_你_物品栏_中任一可做弹药的物品。", + "item.create.potato_cannon.tooltip.condition2": "当装备铜制背罐时", + "item.create.potato_cannon.tooltip.behaviour2": "使用罐中_气压_来_抵消_土豆加农炮的_耐久_损耗。", "item.create.filter.tooltip": "过滤器", "item.create.filter.tooltip.summary": "可用于_精确_控制物流设备的_输出_以及_输入_,使得通过的物品流与_一组_物品或者数个_相嵌套的过滤器_相匹配。", @@ -1320,8 +1360,8 @@ "block.create.schematicannon.tooltip": "蓝图加农炮", "block.create.schematicannon.tooltip.summary": "发射方块,重新构建已在世界中部署的_蓝图_,会使用相邻箱子中的物品进行填充,_火药_作为燃料。", - "block.create.schematicannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "block.create.schematicannon.tooltip.behaviour1": "UNLOCALIZED: Opens the _Interface_", + "block.create.schematicannon.tooltip.condition1": "当右击时", + "block.create.schematicannon.tooltip.behaviour1": "打开_配置面板_。", "block.create.schematic_table.tooltip": "蓝图桌", "block.create.schematic_table.tooltip.summary": "将保存的蓝图图写入_空白蓝图_", @@ -1365,14 +1405,19 @@ "block.create.adjustable_crate.tooltip": "可调节板条箱", "block.create.adjustable_crate.tooltip.summary": "该箱子支持玩家对其容量进行调整,最大可以容纳_16组_物品。支持_红石比较器_。", - "block.create.adjustable_crate.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "block.create.adjustable_crate.tooltip.behaviour1": "UNLOCALIZED: Opens the _Interface_.", + "block.create.adjustable_crate.tooltip.condition1": "当右击时", + "block.create.adjustable_crate.tooltip.behaviour1": "打开_配置面板_。", "block.create.creative_crate.tooltip": "创造板条箱", "block.create.creative_crate.tooltip.summary": "这种_储存容器_可以无限地复制任何物品。它还可以移除附近的_蓝图加农炮_的材料需求。", "block.create.creative_crate.tooltip.condition1": "当标记了物品时", "block.create.creative_crate.tooltip.behaviour1": "任何从容器中_提取_的物品都是_无限量的_,而任何_放置_到容器中的物品都会被_送入虚空_", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "控制铁轨", "block.create.controller_rail.tooltip.summary": "一种_汇流的,受红石信号影响的_铁轨,可以_较好地控制_经过矿车的_移动速度_。", "block.create.controller_rail.tooltip.condition1": "通入红石信号时时", @@ -1388,61 +1433,61 @@ "item.create.refined_radiance.tooltip": "光辉石", "item.create.refined_radiance.tooltip.summary": "一种用_光辉_锻造的化合物材料。", - "item.create.refined_radiance.tooltip.condition1": "UNLOCALIZED: Work In Progress", - "item.create.refined_radiance.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", + "item.create.refined_radiance.tooltip.condition1": "尚未完工", + "item.create.refined_radiance.tooltip.behaviour1": "该材料在未来可能会有更多的用途。", "item.create.shadow_steel.tooltip": "暗影钢", "item.create.shadow_steel.tooltip.summary": "一种用_虚空_锻造的化合物材料。", - "item.create.shadow_steel.tooltip.condition1": "UNLOCALIZED: Work In Progress", - "item.create.shadow_steel.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", + "item.create.shadow_steel.tooltip.condition1": "尚未完工", + "item.create.shadow_steel.tooltip.behaviour1": "该材料在未来可能会有更多的用途。", - "item.create.linked_controller.tooltip": "UNLOCALIZED: LINKED CONTROLLER", - "item.create.linked_controller.tooltip.summary": "UNLOCALIZED: Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.", - "item.create.linked_controller.tooltip.condition1": "UNLOCALIZED: R-Click", - "item.create.linked_controller.tooltip.behaviour1": "UNLOCALIZED: _Toggles_ the controller. _Movement_ _controls_ are taken over while its active.", - "item.create.linked_controller.tooltip.condition2": "UNLOCALIZED: R-Click while Sneaking", - "item.create.linked_controller.tooltip.behaviour2": "UNLOCALIZED: Opens the manual _Configuration Interface_.", - "item.create.linked_controller.tooltip.condition3": "UNLOCALIZED: R-Click on Redstone Link Receiver", - "item.create.linked_controller.tooltip.behaviour3": "UNLOCALIZED: Enables _Bind Mode_, press one of the _six controls_ to bind it to the _Links' Frequency_.", - "item.create.linked_controller.tooltip.condition4": "UNLOCALIZED: R-Click on Lectern", - "item.create.linked_controller.tooltip.behaviour4": "UNLOCALIZED: Places the Controller into the Lectern for easy activation. (R-Click while Sneaking to retrieve it)", + "item.create.linked_controller.tooltip": "无线红石遥控器", + "item.create.linked_controller.tooltip.summary": "提供_六个_可以绑定_无线红石_频道的按钮,用于_遥控_附近的_无线红石信号终端_。", + "item.create.linked_controller.tooltip.condition1": "右击时", + "item.create.linked_controller.tooltip.behaviour1": "_拿起_或_放下_遥控器。拿起遥控器时,_移动_按键将被用来_操作遥控器_而不是移动玩家。", + "item.create.linked_controller.tooltip.condition2": "潜行右击时", + "item.create.linked_controller.tooltip.behaviour2": "打开手动_配置界面_。", + "item.create.linked_controller.tooltip.condition3": "右击无线红石信号终端时", + "item.create.linked_controller.tooltip.behaviour3": "启用_配对模式_,按_六个按键_中的一个来配对_无线红石信号终端_的_频率_。", + "item.create.linked_controller.tooltip.condition4": "右击讲台时", + "item.create.linked_controller.tooltip.behaviour4": "将遥控器放在讲台上以便使用。(潜行右击来取回遥控器。)", - "item.create.diving_helmet.tooltip": "UNLOCALIZED: DIVING HELMET", - "item.create.diving_helmet.tooltip.summary": "UNLOCALIZED: Together with a _Copper_ _Backtank_, allows the wielder to _breathe_ _underwater_ for an extended amount of time.", - "item.create.diving_helmet.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_helmet.tooltip.behaviour1": "UNLOCALIZED: Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.", + "item.create.diving_helmet.tooltip": "潜水头盔", + "item.create.diving_helmet.tooltip.summary": "与_铜制背罐_配合使用,为穿戴者提供在_水下_行动一段时间所需的_空气_。", + "item.create.diving_helmet.tooltip.condition1": "戴在头上时", + "item.create.diving_helmet.tooltip.behaviour1": "提供_水下呼吸_效果。缓慢消耗背罐中的_压缩空气_。", - "item.create.copper_backtank.tooltip": "UNLOCALIZED: COPPER BACKTANK", - "item.create.copper_backtank.tooltip.summary": "UNLOCALIZED: A _Wearable_ _Tank_ for carrying Pressurized Air.", - "item.create.copper_backtank.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.copper_backtank.tooltip.behaviour1": "UNLOCALIZED: Provides _Pressurized_ _Air_ to Equipment that requires it.", - "item.create.copper_backtank.tooltip.condition2": "UNLOCALIZED: When placed, Powered by Kinetics", - "item.create.copper_backtank.tooltip.behaviour2": "UNLOCALIZED: _Collects_ _Pressurized_ _Air_ at a rate depending on the Rotational Speed.", + "item.create.copper_backtank.tooltip": "铜制背罐", + "item.create.copper_backtank.tooltip.summary": "一个可以_背在背上_的_铜罐_,用于携带一定量的压缩空气。", + "item.create.copper_backtank.tooltip.condition1": "背在背上时", + "item.create.copper_backtank.tooltip.behaviour1": "为其他需要_压缩空气_的装备提供所需的空气。", + "item.create.copper_backtank.tooltip.condition2": "当放下并接入动力时", + "item.create.copper_backtank.tooltip.behaviour2": "基于转速从周围环境中_收集_并_加压空气_。", - "item.create.diving_boots.tooltip": "UNLOCALIZED: DIVING BOOTS", - "item.create.diving_boots.tooltip.summary": "UNLOCALIZED: A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.", - "item.create.diving_boots.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_boots.tooltip.behaviour1": "UNLOCALIZED: Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.", + "item.create.diving_boots.tooltip": "潜水靴", + "item.create.diving_boots.tooltip.summary": "一双_沉重的靴子_,让穿戴者可以更方便的探索海底。", + "item.create.diving_boots.tooltip.condition1": "穿在脚上时", + "item.create.diving_boots.tooltip.behaviour1": "穿戴者_下沉更快_并_无法游泳_。穿戴者可以在水下_行走_和_跳跃_。穿戴者不会被_传送带_移走。", - "item.create.crafting_blueprint.tooltip": "UNLOCALIZED: CRAFTING BLUEPRINT", - "item.create.crafting_blueprint.tooltip.summary": "UNLOCALIZED: _Placed_ on a wall, it can be used to _specify_ _ingredient_ _arrangements_ for easier manual crafting. Each slot represents a Recipe.", - "item.create.crafting_blueprint.condition1": "UNLOCALIZED: R-Click empty Slot", - "item.create.crafting_blueprint.behaviour1": "UNLOCALIZED: Opens a _Crafting_ _menu_ allowing you to _configure_ a _recipe_ and items to display.", - "item.create.crafting_blueprint.condition2": "UNLOCALIZED: R-Click configured Slot", - "item.create.crafting_blueprint.behaviour2": "UNLOCALIZED: _Applies_ the _configured_ _recipe_ with matching Ingredients found in your _Inventory_. _Sneak_ to craft up to a _Stack_ of items.", + "item.create.crafting_blueprint.tooltip": "合成蓝图", + "item.create.crafting_blueprint.tooltip.summary": "_放在_墙上。设置特定的_原料排布_以便更快地手搓物品。每个格子都可以设定一个配方。", + "item.create.crafting_blueprint.condition1": "当右击空的格子时", + "item.create.crafting_blueprint.behaviour1": "打开一个_配方设置界面_,用于_设置_一个_合成配方_以及设置显示的图标。", + "item.create.crafting_blueprint.condition2": "当右击设置好的格子时", + "item.create.crafting_blueprint.behaviour2": "使用_物品栏_中的物品制作_设置的配方_。_潜行_以一次合成_一组_。", "item.create.minecart_coupling.tooltip": "矿车连轴器", "item.create.minecart_coupling.tooltip.summary": "将多个_矿车_或运输结构链接在一起,构成雄伟的火车。", "item.create.minecart_coupling.tooltip.condition1": "作用与矿车时", "item.create.minecart_coupling.tooltip.behaviour1": "将两个矿车耦合在一起,在移动时将它们保持_恒定的距离_。", - "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip": "奇异钟", + "block.create.peculiar_bell.tooltip.summary": "装饰用的_黄铜质钟_。放在_灵魂火_的正上方可能会产生意料之外的后果……", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "怪异钟", + "block.create.haunted_bell.tooltip.summary": "_被诅咒_的钟,其中充满了来自下界的迷失的灵魂。", + "block.create.haunted_bell.tooltip.condition1": "当手持或鸣响时", + "block.create.haunted_bell.tooltip.behaviour1": "标识出附近可能生成_敌对生物_的_黑暗_的地方。", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1459,46 +1504,46 @@ "create.ponder.replay": "重放", "create.ponder.think_back": "回想", "create.ponder.slow_text": "舒适阅读", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "有了底盘和强力胶,移动起大型结构轻轻松松。", - "create.ponder.shared.rpm32": "32 RPM", - "create.ponder.shared.sneak_and": "潜行 +", - "create.ponder.shared.storage_on_contraption": "与装置相接的存储空间,会自动将装置遇到的掉落物拾取到空间内。", + "create.ponder.exit": "退出", + "create.ponder.welcome": "欢迎来到思索项目列表", + "create.ponder.categories": "机械动力中包含的条目", + "create.ponder.index_description": "点击一个图标来查看相关的物品和方块。", + "create.ponder.index_title": "思索项目列表", + "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "可以用扳手调整它的行为。", + "create.ponder.shared.storage_on_contraption": "与装置相接的存储空间,会自动将装置遇到的掉落物拾取到空间内。", + "create.ponder.shared.sneak_and": "潜行 +", "create.ponder.shared.rpm8": "8 RPM", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "动力源:16 R", - "create.ponder.shared.rpm16": "16 RPM", - "create.ponder.tag.kinetic_sources": "动力源", - "create.ponder.tag.kinetic_sources.description": "能够发生动力的组件。", - "create.ponder.tag.contraption_actor": "装置执行组件", - "create.ponder.tag.contraption_actor.description": "能在移动的装置上执行特殊功能的组件", - "create.ponder.tag.arm_targets": "机械臂的工作目标", - "create.ponder.tag.arm_targets.description": "该组件可做为机械臂的输入或者输出点。", - "create.ponder.tag.logistics": "物品运输", - "create.ponder.tag.logistics.description": "该组件可以协助物品运输", - "create.ponder.tag.movement_anchor": "运动源泉", - "create.ponder.tag.movement_anchor.description": "有了它,运动装置才得以可能,它可以以数种方式使相接的结构运动起来。", - "create.ponder.tag.creative": "创造模式", - "create.ponder.tag.creative.description": "总有些东西是生存模式得不到的。", - "create.ponder.tag.kinetic_relays": "动力方块", - "create.ponder.tag.kinetic_relays.description": "用于传递旋转力的组件。", - "create.ponder.tag.windmill_sails": "风车轴承的帆", - "create.ponder.tag.windmill_sails.description": "在进行风车组装时会被算入风车旋转力的方块,这些方块的效能都是一样的。", - "create.ponder.tag.contraption_assembly": "方块连接物件", - "create.ponder.tag.contraption_assembly.description": "将各个组件连接以便同时运动的物件", - "create.ponder.tag.decoration": "装饰", - "create.ponder.tag.decoration.description": "装饰是这些组件的常见用法。", - "create.ponder.tag.kinetic_appliances": "动力设备", - "create.ponder.tag.kinetic_appliances.description": "这些组件可以利用旋转力进行工作。", + "create.ponder.shared.movement_anchors": "有了底盘和强力胶,移动起大型结构轻轻松松。", "create.ponder.tag.redstone": "逻辑组件", "create.ponder.tag.redstone.description": "这些组件会在红石工程中发挥大用处。", + "create.ponder.tag.contraption_assembly": "方块连接物件", + "create.ponder.tag.contraption_assembly.description": "将各个组件连接以便同时运动的物件", "create.ponder.tag.fluids": "流体操纵器械", "create.ponder.tag.fluids.description": "这些组件可以用于传递流体,以及利用流体进行工作。", + "create.ponder.tag.decoration": "装饰", + "create.ponder.tag.decoration.description": "装饰是这些组件的常见用法。", + "create.ponder.tag.windmill_sails": "风车轴承的帆", + "create.ponder.tag.windmill_sails.description": "在进行风车组装时会被算入风车旋转力的方块,这些方块的效能都是一样的。", + "create.ponder.tag.arm_targets": "机械臂的工作目标", + "create.ponder.tag.arm_targets.description": "该组件可做为机械臂的输入或者输出点。", + "create.ponder.tag.kinetic_appliances": "动力设备", + "create.ponder.tag.kinetic_appliances.description": "这些组件可以利用旋转力进行工作。", + "create.ponder.tag.kinetic_sources": "动力源", + "create.ponder.tag.kinetic_sources.description": "能够发生动力的组件。", + "create.ponder.tag.movement_anchor": "运动源泉", + "create.ponder.tag.movement_anchor.description": "有了它,运动装置才得以可能,它可以以数种方式使相接的结构运动起来。", + "create.ponder.tag.kinetic_relays": "动力方块", + "create.ponder.tag.kinetic_relays.description": "用于传递旋转力的组件。", + "create.ponder.tag.contraption_actor": "装置执行组件", + "create.ponder.tag.contraption_actor.description": "能在移动的装置上执行特殊功能的组件", + "create.ponder.tag.creative": "创造模式", + "create.ponder.tag.creative.description": "总有些东西是生存模式得不到的。", + "create.ponder.tag.logistics": "物品运输", + "create.ponder.tag.logistics.description": "该组件可以协助物品运输", "create.ponder.adjustable_pulse_repeater.header": "使用可调节脉冲中继器控制信号发送", "create.ponder.adjustable_pulse_repeater.text_1": "可调节脉冲中继器在一段延时之后会发出一道短时脉冲", @@ -1610,8 +1655,8 @@ "create.ponder.cart_assembler_modes.header": "矿车装置的方向设定", "create.ponder.cart_assembler_modes.text_1": "矿车装置会随着矿车的运动而发生转向", - "create.ponder.cart_assembler_modes.text_2": "如果装配结构的方向锁定了,那么结构的方向将不再改变", - "create.ponder.cart_assembler_modes.text_3": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + "create.ponder.cart_assembler_modes.text_2": "矿车装置上的箭头表明了哪一侧是“前面”", + "create.ponder.cart_assembler_modes.text_3": "如果装配结构的方向锁定了,那么结构的方向将不再改变", "create.ponder.cart_assembler_rails.header": "另外几种矿车以及铁轨", "create.ponder.cart_assembler_rails.text_1": "放置在普通轨道上的矿车装配站并不会影响路过矿车装置的运动", @@ -1665,11 +1710,11 @@ "create.ponder.cogwheel.text_1": "齿轮会将动力传递至临近的齿轮", "create.ponder.cogwheel.text_2": "以此方式连接的齿轮,旋转方向相反", - "create.ponder.creative_fluid_tank.header": "UNLOCALIZED: Creative Fluid Tanks", - "create.ponder.creative_fluid_tank.text_1": "UNLOCALIZED: Creative Fluid Tanks can be used to provide a bottomless supply of fluid", - "create.ponder.creative_fluid_tank.text_2": "UNLOCALIZED: Right-Click with a fluid containing item to configure it", - "create.ponder.creative_fluid_tank.text_3": "UNLOCALIZED: Pipe Networks can now endlessly draw the assigned fluid from the tank", - "create.ponder.creative_fluid_tank.text_4": "UNLOCALIZED: Any Fluids pushed back into a Creative Fluid Tank will be voided", + "create.ponder.creative_fluid_tank.header": "创造流体储罐", + "create.ponder.creative_fluid_tank.text_1": "创造流体储罐可以提供无限数量的流体", + "create.ponder.creative_fluid_tank.text_2": "使用一个含有流体的容器右击它来设置它提供的流体", + "create.ponder.creative_fluid_tank.text_3": "流体管道可以从中无限提取设置的流体", + "create.ponder.creative_fluid_tank.text_4": "任何被输入创造流体储罐的液体都将被销毁", "create.ponder.creative_motor.header": "使用创造马达发生旋转", "create.ponder.creative_motor.text_1": "创造马达不仅能够手动调配输出旋转力,而且体积相当小巧", @@ -1707,11 +1752,11 @@ "create.ponder.deployer_modes.text_1": "在默认情况下,机械手模仿玩家的右击交互", "create.ponder.deployer_modes.text_2": "使用扳手可以将模式调整为模仿玩家的左击交互", - "create.ponder.deployer_processing.header": "UNLOCALIZED: Processing Items using Deployers", - "create.ponder.deployer_processing.text_1": "UNLOCALIZED: With a fitting held item, Deployers can process items provided beneath them", - "create.ponder.deployer_processing.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Deployer", - "create.ponder.deployer_processing.text_3": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.deployer_processing.text_4": "UNLOCALIZED: The Deployer will hold and process them automatically", + "create.ponder.deployer_processing.header": "使用机械手处理物品", + "create.ponder.deployer_processing.text_1": "当机械手持有合适的物品时,它可以自动处理下方的物品", + "create.ponder.deployer_processing.text_2": "物品可以被丢在机械手下方,或放在置物台上", + "create.ponder.deployer_processing.text_3": "当传送带上的物品经过机械手下方时...", + "create.ponder.deployer_processing.text_4": "...机械手会使物品停下,然后处理这个物品", "create.ponder.deployer_redstone.header": "使用红石控制机械手", "create.ponder.deployer_redstone.text_1": "当被红石充能时,机械手会停止工作", @@ -1729,12 +1774,13 @@ "create.ponder.empty_blaze_burner.text_2": "或者,也可以通过右击烈焰人刷怪笼来填充激活烈焰人燃烧室", "create.ponder.empty_blaze_burner.text_3": "这样,你便有了一个可供部分机器加工的热源", "create.ponder.empty_blaze_burner.text_4": "如果是为了美观,空的烈焰人燃烧室也可以被打火石点燃", - "create.ponder.empty_blaze_burner.text_5": "但是,这样的热源不足以给机器提加工供足够的热量", + "create.ponder.empty_blaze_burner.text_5": "使用包含灵魂的物品可以将火焰变为灵魂火", + "create.ponder.empty_blaze_burner.text_6": "但是,这样的热源不足以给机器提加工供足够的热量", - "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", - "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", - "create.ponder.encased_fluid_pipe.text_2": "UNLOCALIZED: Aside from being conceiled, Encased Pipes are locked into their connectivity state", - "create.ponder.encased_fluid_pipe.text_3": "UNLOCALIZED: It will no longer react to any neighbouring blocks being added or removed", + "create.ponder.encased_fluid_pipe.header": "遮掩流体管道", + "create.ponder.encased_fluid_pipe.text_1": "铜机壳可以用于装饰流体管道", + "create.ponder.encased_fluid_pipe.text_2": "除了遮掩流体管道之外,装有铜机壳的流体管道将不会改变其连接状态", + "create.ponder.encased_fluid_pipe.text_3": "它将不会对旁边新增加或移除的管道做出反应", "create.ponder.fan_direction.header": "鼓风机的气流", "create.ponder.fan_direction.text_1": "鼓风机使用旋转力来制造气流", @@ -1754,34 +1800,34 @@ "create.ponder.fan_source.text_1": "如鼓风机的扇叶向下朝着热源放置,鼓风机可以借此产生旋转力", "create.ponder.fan_source.text_2": "当鼓风机接受红石信号后,它便会向外供给旋转力", - "create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes", - "create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets", - "create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window", - "create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments", - "create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids", - "create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first", - "create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents", - "create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid", + "create.ponder.fluid_pipe_flow.header": "使用管道运输流体", + "create.ponder.fluid_pipe_flow.text_1": "流体管道可以用于连接两个或多个流体容器", + "create.ponder.fluid_pipe_flow.text_2": "使用扳手为直的管道增加观察窗", + "create.ponder.fluid_pipe_flow.text_3": "带有观察窗的管道不会建立侧向连接", + "create.ponder.fluid_pipe_flow.text_4": "通过使用动力泵,流体管道可以传输流体", + "create.ponder.fluid_pipe_flow.text_5": "一开始,流体不会真正被消耗", + "create.ponder.fluid_pipe_flow.text_6": "当管道内的液体流彻底联通之后,流体才会开始逐渐从一个容器中转移到另一个", + "create.ponder.fluid_pipe_flow.text_7": "这意味着流体管道本身并不真正存储任何流体", - "create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers", - "create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks", - "create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained", - "create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...", - "create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources", - "create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly", + "create.ponder.fluid_pipe_interaction.header": "抽取和填充流体容器", + "create.ponder.fluid_pipe_interaction.text_1": "流体管道的末端可以与许多种容器连接", + "create.ponder.fluid_pipe_interaction.text_2": "任何可以容纳流体的容器都可以被填充或从中抽取", + "create.ponder.fluid_pipe_interaction.text_3": "开放的管道口可以吸走流体源块...", + "create.ponder.fluid_pipe_interaction.text_4": "...或者将流体源排放出来", + "create.ponder.fluid_pipe_interaction.text_5": "管道也可以从许多其他方块中直接抽取流体", - "create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank", - "create.ponder.fluid_tank_sizes.text_1": "UNLOCALIZED: Fluid Tanks can be combined to increase the total capacity", - "create.ponder.fluid_tank_sizes.text_2": "UNLOCALIZED: Their base square can be up to 3 blocks wide...", - "create.ponder.fluid_tank_sizes.text_3": "UNLOCALIZED: ...and grow in height by more than 30 additional layers", - "create.ponder.fluid_tank_sizes.text_4": "UNLOCALIZED: Using a Wrench, a tanks' window can be toggled", + "create.ponder.fluid_tank_sizes.header": "流体储罐的大小", + "create.ponder.fluid_tank_sizes.text_1": "多格流体储罐可以被放置在一起来提供更大的容量", + "create.ponder.fluid_tank_sizes.text_2": "流体储罐最大可以有3x3的横截面...", + "create.ponder.fluid_tank_sizes.text_3": "...并且可以有超过30格高", + "create.ponder.fluid_tank_sizes.text_4": "使用扳手可以打开或关闭观察窗", - "create.ponder.fluid_tank_storage.header": "UNLOCALIZED: Storing Fluids in Fluid Tanks", - "create.ponder.fluid_tank_storage.text_1": "UNLOCALIZED: Fluid Tanks can be used to store large amounts of fluid", - "create.ponder.fluid_tank_storage.text_2": "UNLOCALIZED: Pipe networks can push and pull fluids from any side", - "create.ponder.fluid_tank_storage.text_3": "UNLOCALIZED: The contained fluid can be measured by a Comparator", - "create.ponder.fluid_tank_storage.text_4": "UNLOCALIZED: However, in Survival Mode Fluids cannot be added or taken manually", - "create.ponder.fluid_tank_storage.text_5": "UNLOCALIZED: You can use Basins, Item Drains and Spouts to drain or fill fluid containing items", + "create.ponder.fluid_tank_storage.header": "使用流体储罐存储流体", + "create.ponder.fluid_tank_storage.text_1": "流体储罐可以存储大量的流体", + "create.ponder.fluid_tank_storage.text_2": "流体管道可以从任何一面将流体输入/输出流体储罐", + "create.ponder.fluid_tank_storage.text_3": "使用比较器可以检测储罐中的流体储量", + "create.ponder.fluid_tank_storage.text_4": "在生存模式中,无法直接用容器将流体装入或取出储罐", + "create.ponder.fluid_tank_storage.text_5": "要装满/倒空流体容器,可以使用工作盆,分液池或注液器。", "create.ponder.flywheel.header": "使用飞轮来产生旋转力", "create.ponder.flywheel.text_1": "飞轮和熔炉引擎必须配套使用,方可产生旋转力", @@ -1856,33 +1902,33 @@ "create.ponder.hand_crank.text_3": "它产生的转速相对较高", "create.ponder.hand_crank.text_4": "潜行长按右键可以顺时针旋转它", - "create.ponder.hose_pulley.header": "UNLOCALIZED: Source Filling and Draining using Hose Pulleys", - "create.ponder.hose_pulley.text_1": "UNLOCALIZED: Hose Pulleys can be used to fill or drain large bodies of Fluid", - "create.ponder.hose_pulley.text_2": "UNLOCALIZED: With the Kinetic Input, the height of the pulleys' hose can be controlled", - "create.ponder.hose_pulley.text_3": "UNLOCALIZED: The Pulley retracts while the input rotation is inverted", - "create.ponder.hose_pulley.text_4": "UNLOCALIZED: On the opposite side, pipes can be connected", - "create.ponder.hose_pulley.text_5": "UNLOCALIZED: Attached pipe networks can either provide fluid to the hose...", - "create.ponder.hose_pulley.text_6": "UNLOCALIZED: ...or pull from it, draining the pool instead", - "create.ponder.hose_pulley.text_7": "UNLOCALIZED: Fill and Drain speed of the pulley depends entirely on the fluid networks' throughput", + "create.ponder.hose_pulley.header": "使用软管滑轮抽取或排放流体", + "create.ponder.hose_pulley.text_1": "软管滑轮可以用于方便的抽取或填满一个较大区域中的流体", + "create.ponder.hose_pulley.text_2": "通过输入动力可以调节软管末端的高度", + "create.ponder.hose_pulley.text_3": "翻转动力输入的方向可以收起软管", + "create.ponder.hose_pulley.text_4": "管道可以连接在另一侧", + "create.ponder.hose_pulley.text_5": "连接的管道可以将流体输入软管滑轮以在下方放置流体源...", + "create.ponder.hose_pulley.text_6": "...或者提供吸力来抽取世界中的流体", + "create.ponder.hose_pulley.text_7": "软管滑轮的抽取/排放速度取决于连接管道中流体的流速", - "create.ponder.hose_pulley_infinite.header": "UNLOCALIZED: Passively Filling and Draining large bodies of Fluid", - "create.ponder.hose_pulley_infinite.text_1": "UNLOCALIZED: When deploying the Hose Pulley into a large enough ocean...", - "create.ponder.hose_pulley_infinite.text_2": "UNLOCALIZED: It will provide/dispose fluids without affecting the source", - "create.ponder.hose_pulley_infinite.text_3": "UNLOCALIZED: Pipe networks can limitlessly take fluids from/to such pulleys", + "create.ponder.hose_pulley_infinite.header": "从大型水体中抽取或向其排放", + "create.ponder.hose_pulley_infinite.text_1": "当软管被放进足够大的水体中时...", + "create.ponder.hose_pulley_infinite.text_2": "...它在抽取或排放液体时将不会影响流体源", + "create.ponder.hose_pulley_infinite.text_3": "可以从这些软管滑轮中无限的抽取或向其排放流体", - "create.ponder.hose_pulley_level.header": "UNLOCALIZED: Fill and Drain level of Hose Pulleys", - "create.ponder.hose_pulley_level.text_1": "UNLOCALIZED: While fully retracted, the Hose Pulley cannot operate", - "create.ponder.hose_pulley_level.text_2": "UNLOCALIZED: Draining runs from top to bottom", - "create.ponder.hose_pulley_level.text_3": "UNLOCALIZED: The surface level will end up just below where the hose ends", - "create.ponder.hose_pulley_level.text_4": "UNLOCALIZED: Filling runs from bottom to top", - "create.ponder.hose_pulley_level.text_5": "UNLOCALIZED: The filled pool will not grow beyond the layer above the hose end", + "create.ponder.hose_pulley_level.header": "软管滑轮的排水/抽水机制", + "create.ponder.hose_pulley_level.text_1": "当软管彻底收回时,软管滑轮无法工作。", + "create.ponder.hose_pulley_level.text_2": "流体会由上至下被抽取", + "create.ponder.hose_pulley_level.text_3": "流体表面最终将会被抽取到刚好低于软管开口", + "create.ponder.hose_pulley_level.text_4": "流体将会由下至上被填充", + "create.ponder.hose_pulley_level.text_5": "流体最多只能被填充至软管开口所在的高度", - "create.ponder.item_drain.header": "UNLOCALIZED: Emptying Fluid Containers using Item Drains", - "create.ponder.item_drain.text_1": "UNLOCALIZED: Item Drains can extract fluids from items", - "create.ponder.item_drain.text_2": "UNLOCALIZED: Right-click it to pour fluids from your held item into it", - "create.ponder.item_drain.text_3": "UNLOCALIZED: When items are inserted from the side...", - "create.ponder.item_drain.text_4": "UNLOCALIZED: ...they roll across, emptying out their contained fluid", - "create.ponder.item_drain.text_5": "UNLOCALIZED: Pipe Networks can now pull the fluid from the drains' internal buffer", + "create.ponder.item_drain.header": "使用分液池提取物品中的流体", + "create.ponder.item_drain.text_1": "分液池可以提取容器中的流体", + "create.ponder.item_drain.text_2": "右键点击可以将手持的容器中的流体倒入分液池", + "create.ponder.item_drain.text_3": "当物品从侧面输入时...", + "create.ponder.item_drain.text_4": "...物品将会经过分液池顶部,并在过程中将其包含的液体排入分液池", + "create.ponder.item_drain.text_5": "流体管到可以从分液池中抽取液体", "create.ponder.large_cogwheel.header": "使用大齿轮传递旋转力", "create.ponder.large_cogwheel.text_1": "大齿轮可以以特定的角度相互连接", @@ -1994,32 +2040,32 @@ "create.ponder.mechanical_plough.text_3": "此外,动力犁可以耕地", "create.ponder.mechanical_plough.text_4": "...它也可以在不伤害实体的情况下推动它们", - "create.ponder.mechanical_press.header": "使用动力辊轧机处理物品", - "create.ponder.mechanical_press.text_1": "动力辊轧机可以处理位于其下方的物品", + "create.ponder.mechanical_press.header": "使用动力辊压机处理物品", + "create.ponder.mechanical_press.text_1": "动力辊压机可以处理位于其下方的物品", "create.ponder.mechanical_press.text_2": "在其下方丢入物品,或者将物品放在置物台上,都算作有效的物品输入", - "create.ponder.mechanical_press.text_3": "若物品被输入时正位于传送带上...", - "create.ponder.mechanical_press.text_4": "辊轧机会使物品停下,然后自动处理这一物品", + "create.ponder.mechanical_press.text_3": "当传送带上的物品经过辊压机下方时....", + "create.ponder.mechanical_press.text_4": "辊压机会使物品停下,然后自动处理这一物品", - "create.ponder.mechanical_press_compacting.header": "使用动力辊轧机压缩物品", + "create.ponder.mechanical_press_compacting.header": "使用动力辊压机压缩物品", "create.ponder.mechanical_press_compacting.text_1": "对放置于工作盆内的物品进行辊轧,可以将这些物品压缩在一起", "create.ponder.mechanical_press_compacting.text_2": "压缩意指任何同种物品填满了 2x2 或者 3x3 网格的配方,以及一些额外的配方", "create.ponder.mechanical_press_compacting.text_3": "一些配方可能需要烈焰人燃烧室提供热量", "create.ponder.mechanical_press_compacting.text_4": "过滤槽可用于解决两个配方相互冲突的情况", - "create.ponder.mechanical_pump_flow.header": "UNLOCALIZED: Fluid Transportation using Mechanical Pumps", - "create.ponder.mechanical_pump_flow.text_1": "UNLOCALIZED: Mechanical Pumps govern the flow of their attached pipe networks", - "create.ponder.mechanical_pump_flow.text_2": "UNLOCALIZED: When powered, their arrow indicates the direction of flow", - "create.ponder.mechanical_pump_flow.text_3": "UNLOCALIZED: The network behind is now pulling fluids...", - "create.ponder.mechanical_pump_flow.text_4": "UNLOCALIZED: ...while the network in front is transferring it outward", - "create.ponder.mechanical_pump_flow.text_5": "UNLOCALIZED: Reversing the input rotation reverses the direction of flow", - "create.ponder.mechanical_pump_flow.text_6": "UNLOCALIZED: Use a Wrench to reverse the orientation of pumps manually", + "create.ponder.mechanical_pump_flow.header": "使用动力泵传输流体", + "create.ponder.mechanical_pump_flow.text_1": "动力泵可以控制管道中的液体流向", + "create.ponder.mechanical_pump_flow.text_2": "当接入动力时,其上的箭头指示液体流向", + "create.ponder.mechanical_pump_flow.text_3": "后方的管道中将会产生吸力...", + "create.ponder.mechanical_pump_flow.text_4": "...而液体将被输入前方的管道", + "create.ponder.mechanical_pump_flow.text_5": "反转动力方向将会改变液体流向", + "create.ponder.mechanical_pump_flow.text_6": "使用扳手可以手动改变动力泵的朝向", - "create.ponder.mechanical_pump_speed.header": "UNLOCALIZED: Throughput of Mechanical Pumps", - "create.ponder.mechanical_pump_speed.text_1": "UNLOCALIZED: Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away", - "create.ponder.mechanical_pump_speed.text_2": "UNLOCALIZED: Speeding up the input rotation changes the speed of flow propagation...", - "create.ponder.mechanical_pump_speed.text_3": "UNLOCALIZED: ...aswell as how quickly fluids are transferred", - "create.ponder.mechanical_pump_speed.text_4": "UNLOCALIZED: Pumps can combine their throughputs within shared pipe networks", - "create.ponder.mechanical_pump_speed.text_5": "UNLOCALIZED: Alternating their orientation can help align their flow directions", + "create.ponder.mechanical_pump_speed.header": "动力泵的传输机制", + "create.ponder.mechanical_pump_speed.text_1": "动力泵的压力最多沿管线传递16格,与输入动力无关", + "create.ponder.mechanical_pump_speed.text_2": "输入动力将会影响压力改变速度...", + "create.ponder.mechanical_pump_speed.text_3": "...以及流体的传输速度", + "create.ponder.mechanical_pump_speed.text_4": "多个并联动力泵的传输量可以叠加", + "create.ponder.mechanical_pump_speed.text_5": "交替摆放动力泵可以方便的控制液体流动", "create.ponder.mechanical_saw_breaker.header": "使用动力锯伐木", "create.ponder.mechanical_saw_breaker.text_1": "向其通入旋转力后,动力锯可以直接砍伐掉它面前的树木", @@ -2032,7 +2078,7 @@ "create.ponder.mechanical_saw_processing.header": "使用动力锯处理物品", "create.ponder.mechanical_saw_processing.text_1": "面向朝上的动力锯可以将物品处理为其变种", "create.ponder.mechanical_saw_processing.text_2": "处理过后的物品的弹出方向始终与通入锯中的旋转转向相反", - "create.ponder.mechanical_saw_processing.text_3": "锯子可以", + "create.ponder.mechanical_saw_processing.text_3": "锯子可以配合其两侧的传送带输入输出", "create.ponder.mechanical_saw_processing.text_4": "若输入原料有多种可能产物,你可以用动力锯上的过滤槽指定只产出某种产物", "create.ponder.mechanical_saw_processing.text_5": "若没有使用过滤槽,动力锯会在各产物中按顺序循环输出", @@ -2045,21 +2091,22 @@ "create.ponder.nixie_tube.header": "使用辉光管", "create.ponder.nixie_tube.text_1": "通入红石信号后,辉光管会显示出红石信号的强度", - "create.ponder.nixie_tube.text_2": "使用命名牌在铁砧上为其命名,可以自定义它的显示文本", + "create.ponder.nixie_tube.text_2": "在其上右键使用更改过名称的命名牌,可以自定义它的显示文本", + "create.ponder.nixie_tube.text_3": "使用染料右键以更改辉光管的显示颜色", "create.ponder.piston_pole.header": "活塞延长杆", "create.ponder.piston_pole.text_1": "若无相接的延长杆,动力活塞无法移动其他方块", "create.ponder.piston_pole.text_2": "在其背面安装的延长杆长度,决定了活塞的推动范围", - "create.ponder.portable_fluid_interface.header": "UNLOCALIZED: Contraption Fluid Exchange", - "create.ponder.portable_fluid_interface.text_1": "UNLOCALIZED: Fluid Tanks on moving contraptions cannot be accessed by any pipes", - "create.ponder.portable_fluid_interface.text_2": "UNLOCALIZED: This component can interact with fluid tanks without the need to stop the contraption", - "create.ponder.portable_fluid_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_fluid_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_fluid_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL Tanks on the contraption", - "create.ponder.portable_fluid_interface.text_6": "UNLOCALIZED: Fluid can now be inserted...", - "create.ponder.portable_fluid_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_fluid_interface.text_8": "UNLOCALIZED: After no contents have been exchanged for a while, the contraption will continue on its way", + "create.ponder.portable_fluid_interface.header": "装置流体交换", + "create.ponder.portable_fluid_interface.text_1": "管道无法与运动装置内的流体储罐直接交互", + "create.ponder.portable_fluid_interface.text_2": "这一组件可以在不停止装置的情况下与装置内的流体存储进行交互", + "create.ponder.portable_fluid_interface.text_3": "放置第二个接口时,记得要与装置接口相隔 1 格或者 2 格的距离", + "create.ponder.portable_fluid_interface.text_4": "当它们彼此经过时,它们会连接在一起", + "create.ponder.portable_fluid_interface.text_5": "连接状态下,固定侧接口便会作为整个装置的流体存储代理", + "create.ponder.portable_fluid_interface.text_6": "流体可被泵入到装置内....", + "create.ponder.portable_fluid_interface.text_7": "...或是从装置中抽取出来", + "create.ponder.portable_fluid_interface.text_8": "如果一小段时间内没有流体交换,接口将会断开连接,然后装置重新开始运动", "create.ponder.portable_storage_interface.header": "装置存储交换", "create.ponder.portable_storage_interface.text_1": "玩家无法与运动装置内的存储空间进行交互", @@ -2067,9 +2114,9 @@ "create.ponder.portable_storage_interface.text_3": "放置第二个接口时,记得要与装置接口相隔 1 格或者 2 格的距离", "create.ponder.portable_storage_interface.text_4": "当它们彼此经过时,它们会连接在一起", "create.ponder.portable_storage_interface.text_5": "连接状态下,固定侧接口便会作为整个装置的存储空间代理", - "create.ponder.portable_storage_interface.text_6": "物品会被输入到装置内...", + "create.ponder.portable_storage_interface.text_6": "物品可被输入到装置内...", "create.ponder.portable_storage_interface.text_7": "...或是从装置中提取出来", - "create.ponder.portable_storage_interface.text_8": "物品交换完毕后,装置仍然会停留在原地一小会,然后才会继续前行", + "create.ponder.portable_storage_interface.text_8": "如果一小段时间内没有物品交换,接口将会断开连接,然后装置重新开始运动", "create.ponder.portable_storage_interface_redstone.header": "红石控制", "create.ponder.portable_storage_interface_redstone.text_1": "通入红石信号可以阻止固定侧接口的连接行为", @@ -2158,24 +2205,24 @@ "create.ponder.smart_chute.text_3": "使用鼠标滚轮可以指定被过滤的物品数量", "create.ponder.smart_chute.text_4": "通入红石信号,智能溜槽将会完全暂停工作", - "create.ponder.smart_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Smart Pipes", - "create.ponder.smart_pipe.text_1": "UNLOCALIZED: Smart pipes can help control flows by fluid type", - "create.ponder.smart_pipe.text_2": "UNLOCALIZED: When placed directly at the source, they can specify the type of fluid to extract", - "create.ponder.smart_pipe.text_3": "UNLOCALIZED: Simply Right-Click their filter slot with any item containing the desired fluid", - "create.ponder.smart_pipe.text_4": "UNLOCALIZED: When placed further down a pipe network, smart pipes will only let matching fluids continue", + "create.ponder.smart_pipe.header": "使用智能流体管道控制液体流动", + "create.ponder.smart_pipe.text_1": "智能流体管道可以限制通过它的流体种类", + "create.ponder.smart_pipe.text_2": "当紧邻流体源放置时,管道只会抽取设置的流体种类", + "create.ponder.smart_pipe.text_3": "使用任何包含流体的容器右键过滤槽来标记过滤的流体", + "create.ponder.smart_pipe.text_4": "当放在管线中时,只有匹配过滤器的流体才能流入它后方的管道", "create.ponder.speedometer.header": "使用速度表来监测转速", "create.ponder.speedometer.text_1": "速度表能显示相接组件的转速", "create.ponder.speedometer.text_2": "当佩戴工程师护目镜时,可以看到仪表所显示的更详细的数据", "create.ponder.speedometer.text_3": "红石比较器可以根据速度表的数值输出不同强弱的红石信号", - "create.ponder.spout_filling.header": "UNLOCALIZED: Filling Items using a Spout", - "create.ponder.spout_filling.text_1": "UNLOCALIZED: The Spout can fill fluid holding items provided beneath it", - "create.ponder.spout_filling.text_2": "UNLOCALIZED: The content of a Spout cannot be accessed manually", - "create.ponder.spout_filling.text_3": "UNLOCALIZED: Instead, Pipes can be used to supply it with fluids", - "create.ponder.spout_filling.text_4": "UNLOCALIZED: The Input items can be placed on a Depot under the Spout", - "create.ponder.spout_filling.text_5": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.spout_filling.text_6": "UNLOCALIZED: The Spout will hold and process them automatically", + "create.ponder.spout_filling.header": "使用注液器填充物品", + "create.ponder.spout_filling.text_1": "注液器可以将流体装入下方经过的,可以接受该流体的物品", + "create.ponder.spout_filling.text_2": "注液器的流体存储无法直接手动交互", + "create.ponder.spout_filling.text_3": "使用管线可以将流体输入注液器", + "create.ponder.spout_filling.text_4": "要被处理的物品可以被放置在其下方的置物台上", + "create.ponder.spout_filling.text_5": "当传送带上的物品经过注液器下方时...", + "create.ponder.spout_filling.text_6": "注液器会使物品停下,然后自动处理这一物品", "create.ponder.stabilized_bearings.header": "装置固定朝向", "create.ponder.stabilized_bearings.text_1": "当动力轴承在结构被带动时...", @@ -2208,11 +2255,11 @@ "create.ponder.valve_handle.text_4": "潜行右击可使它顺时针旋转", "create.ponder.valve_handle.text_5": "可以通过染色来美化阀门手轮", - "create.ponder.valve_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Valves", - "create.ponder.valve_pipe.text_1": "UNLOCALIZED: Valve pipes help control fluids propagating through pipe networks", - "create.ponder.valve_pipe.text_2": "UNLOCALIZED: Their shaft input controls whether fluid is currently allowed through", - "create.ponder.valve_pipe.text_3": "UNLOCALIZED: Given Rotational Force in the opening direction, the valve will open up", - "create.ponder.valve_pipe.text_4": "UNLOCALIZED: It can be closed again by reversing the input rotation", + "create.ponder.valve_pipe.header": "使用阀门管道控制液体流", + "create.ponder.valve_pipe.text_1": "阀门管道可以控制管道网中液体的去处", + "create.ponder.valve_pipe.text_2": "通过其上的传动杆输入动力可以控制它的开关", + "create.ponder.valve_pipe.text_3": "提供旋转向‘打开’方向的力会打开阀门,使得流体可以通过", + "create.ponder.valve_pipe.text_4": "提供另一方向的旋转力可以关闭阀门,阻止流体通过", "create.ponder.water_wheel.header": "使用水车产生旋转力", "create.ponder.water_wheel.text_1": "水车利用临近的水流来进行应力发生", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index a33475dc0..06cf61e51 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 248", + "_": "Missing Localizations: 19", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,10 +28,12 @@ "block.create.belt": "輸送帶", "block.create.birch_window": "白樺木窗戶", "block.create.birch_window_pane": "白樺木窗戶片", + "block.create.black_nixie_tube": "黑色真空管", "block.create.black_sail": "黑色風帆", "block.create.black_seat": "黑色坐墊", "block.create.black_valve_handle": "黑色閥門開關", "block.create.blaze_burner": "烈焰使者動力爐", + "block.create.blue_nixie_tube": "藍色真空管", "block.create.blue_sail": "藍色風帆", "block.create.blue_seat": "藍色坐墊", "block.create.blue_valve_handle": "藍色閥門開關", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "黃銅傳動軸箱", "block.create.brass_funnel": "黃銅漏斗", "block.create.brass_tunnel": "黃銅物品隧道", + "block.create.brown_nixie_tube": "棕色真空管", "block.create.brown_sail": "棕色風帆", "block.create.brown_seat": "棕色坐墊", "block.create.brown_valve_handle": "棕色閥門開關", @@ -58,7 +61,7 @@ "block.create.cogwheel": "齒輪", "block.create.content_observer": "物品偵測器", "block.create.controller_rail": "控制鐵軌", - "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "block.create.copper_backtank": "銅製後背包", "block.create.copper_block": "銅磚", "block.create.copper_casing": "銅機殼", "block.create.copper_ore": "銅礦石", @@ -73,7 +76,7 @@ "block.create.crushing_wheel": "粉碎輪", "block.create.crushing_wheel_controller": "粉碎輪控制器", "block.create.cuckoo_clock": "布穀鳥鐘", - "block.create.cursed_bell": "UNLOCALIZED: Cursed Bell", + "block.create.cyan_nixie_tube": "青色真空管", "block.create.cyan_sail": "藍綠色風帆", "block.create.cyan_seat": "藍綠色坐墊", "block.create.cyan_valve_handle": "藍綠色閥門開關", @@ -180,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "碎花崗岩樓梯", "block.create.granite_cobblestone_wall": "碎花崗岩牆", "block.create.granite_pillar": "豎紋花崗岩", + "block.create.gray_nixie_tube": "灰色真空管", "block.create.gray_sail": "灰色風帆", "block.create.gray_seat": "灰色坐墊", "block.create.gray_valve_handle": "灰色閥門開關", + "block.create.green_nixie_tube": "綠色真空管", "block.create.green_sail": "綠色風帆", "block.create.green_seat": "綠色坐墊", "block.create.green_valve_handle": "綠色閥門開關", "block.create.hand_crank": "手搖把手", + "block.create.haunted_bell": "靈魂鐘", "block.create.honey": "蜂蜜", "block.create.horizontal_framed_glass": "豎直邊框玻璃", "block.create.horizontal_framed_glass_pane": "豎直邊框玻璃片", @@ -204,13 +210,16 @@ "block.create.layered_limestone": "疊層石灰岩", "block.create.layered_scoria": "疊層火成岩", "block.create.layered_weathered_limestone": "疊層風化石灰岩", - "block.create.lectern_controller": "UNLOCALIZED: Lectern Controller", + "block.create.lectern_controller": "講台遙控器", + "block.create.light_blue_nixie_tube": "亮藍色真空管", "block.create.light_blue_sail": "淡藍色風帆", "block.create.light_blue_seat": "淡藍色坐墊", "block.create.light_blue_valve_handle": "淡藍色閥門開關", + "block.create.light_gray_nixie_tube": "亮灰色真空管", "block.create.light_gray_sail": "淡灰色風帆", "block.create.light_gray_seat": "淡灰色坐墊", "block.create.light_gray_valve_handle": "淡灰色閥門開關", + "block.create.lime_nixie_tube": "淺綠色真空管", "block.create.lime_sail": "黃綠色風帆", "block.create.lime_seat": "黃綠色坐墊", "block.create.lime_valve_handle": "黃綠色閥門開關", @@ -227,6 +236,7 @@ "block.create.limestone_pillar": "豎紋石灰岩", "block.create.linear_chassis": "機殼底盤", "block.create.lit_blaze_burner": "烈焰使者動力爐(已啟動)", + "block.create.magenta_nixie_tube": "洋紅色真空管", "block.create.magenta_sail": "洋紅色風帆", "block.create.magenta_seat": "洋紅色坐墊", "block.create.magenta_valve_handle": "洋紅色閥門開關", @@ -310,7 +320,8 @@ "block.create.paved_weathered_limestone_slab": "風化石灰岩鋪路石半磚", "block.create.paved_weathered_limestone_stairs": "風化石灰岩鋪路石樓梯", "block.create.paved_weathered_limestone_wall": "風化石灰岩鋪路石牆", - "block.create.peculiar_bell": "UNLOCALIZED: Peculiar Bell", + "block.create.peculiar_bell": "黃銅鐘", + "block.create.pink_nixie_tube": "粉紅色真空管", "block.create.pink_sail": "粉紅色風帆", "block.create.pink_seat": "粉紅色坐墊", "block.create.pink_valve_handle": "粉紅色閥門開關", @@ -345,10 +356,12 @@ "block.create.powered_toggle_latch": "T型正反器", "block.create.pulley_magnet": "滑輪磁鐵", "block.create.pulse_repeater": "脈衝中繼器", + "block.create.purple_nixie_tube": "紫色真空管", "block.create.purple_sail": "紫色風帆", "block.create.purple_seat": "紫色坐墊", "block.create.purple_valve_handle": "紫色閥門開關", "block.create.radial_chassis": "旋轉底盤", + "block.create.red_nixie_tube": "紅色真空管", "block.create.red_sail": "紅色風帆", "block.create.red_seat": "紅色坐墊", "block.create.red_valve_handle": "紅色閥門開關", @@ -405,21 +418,26 @@ "block.create.weathered_limestone_cobblestone_wall": "碎風化石灰岩牆", "block.create.weathered_limestone_pillar": "豎紋風化石灰岩", "block.create.weighted_ejector": "物品彈射器", + "block.create.white_nixie_tube": "白色真空管", "block.create.white_sail": "白色風帆", "block.create.white_seat": "白色坐墊", "block.create.white_valve_handle": "白色閥門開關", "block.create.windmill_bearing": "風車軸承", "block.create.wooden_bracket": "木製支架", + "block.create.yellow_nixie_tube": "黃色真空管", "block.create.yellow_sail": "黃色風帆", "block.create.yellow_seat": "黃色坐墊", "block.create.yellow_valve_handle": "黃色閥門開關", "block.create.zinc_block": "鋅磚", "block.create.zinc_ore": "鋅礦石", + "enchantment.create.capacity": "容量", + "enchantment.create.potato_recovery": "馬鈴薯恢復", + "entity.create.contraption": "結構", - "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "entity.create.crafting_blueprint": "合成藍圖", "entity.create.gantry_contraption": "門式結構", - "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", + "entity.create.potato_projectile": "馬鈴薯彈藥", "entity.create.seat": "坐墊", "entity.create.stationary_contraption": "固定結構", "entity.create.super_glue": "強力膠", @@ -444,13 +462,13 @@ "item.create.chocolate_glazed_berries": "巧克力甜莓", "item.create.chromatic_compound": "異彩化合物", "item.create.cinder_flour": "地獄麵粉", - "item.create.clockwork_component": "UNLOCALIZED: Clockwork Component", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_backtank": "銅製後背包", "item.create.copper_ingot": "銅錠", "item.create.copper_nugget": "銅粒", "item.create.copper_sheet": "銅板", "item.create.crafter_slot_cover": "合成器蓋板", - "item.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", + "item.create.crafting_blueprint": "合成藍圖", + "item.create.creative_blaze_cake": "UNLOCALIZED: Creative Blaze Cake", "item.create.crushed_aluminum_ore": "碎狀鋁礦石", "item.create.crushed_brass": "碎狀黃銅", "item.create.crushed_copper_ore": "碎狀銅礦石", @@ -465,8 +483,8 @@ "item.create.crushed_tin_ore": "碎狀錫礦石", "item.create.crushed_uranium_ore": "碎狀鈾礦石", "item.create.crushed_zinc_ore": "碎狀鋅礦石", - "item.create.diving_boots": "UNLOCALIZED: Diving Boots", - "item.create.diving_helmet": "UNLOCALIZED: Diving Helmet", + "item.create.diving_boots": "潛水鞋", + "item.create.diving_helmet": "潛水頭盔", "item.create.dough": "麵團", "item.create.electron_tube": "真空管", "item.create.empty_blaze_burner": "空的烈焰使者動力爐", @@ -479,14 +497,17 @@ "item.create.handheld_worldshaper": "地形雕塑器", "item.create.honey_bucket": "蜂蜜桶", "item.create.honeyed_apple": "蜂蜜蘋果", - "item.create.incomplete_clockwork_component": "UNLOCALIZED: Incomplete Clockwork Component", + "item.create.incomplete_cogwheel": "未完成的小齒輪", + "item.create.incomplete_large_cogwheel": "未完成的大齒輪", + "item.create.incomplete_precision_mechanism": "未完成的精確控制器", "item.create.iron_sheet": "鐵板", - "item.create.linked_controller": "UNLOCALIZED: Linked Controller", + "item.create.linked_controller": "遙控器", "item.create.minecart_contraption": "裝修過的礦車", "item.create.minecart_coupling": "礦車連結器", "item.create.polished_rose_quartz": "磨製玫瑰石英", - "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", + "item.create.potato_cannon": "馬鈴薯大砲", "item.create.powdered_obsidian": "黑曜石粉末", + "item.create.precision_mechanism": " 精確控制器", "item.create.propeller": "扇葉", "item.create.red_sand_paper": "紅砂紙", "item.create.refined_radiance": "光輝石", @@ -631,8 +652,8 @@ "advancement.create.flywheel.desc": "將引擎成功連接到飛輪。", "advancement.create.overstress_flywheel": "壓力過大", "advancement.create.overstress_flywheel.desc": "超載熔爐引擎。", - "advancement.create.clockwork_component": "UNLOCALIZED: Complex Curiosities", - "advancement.create.clockwork_component.desc": "UNLOCALIZED: Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "複雜的好奇心", + "advancement.create.precision_mechanism.desc": "組裝一個精確控制器", "advancement.create.mechanical_arm": "忙碌的手!", "advancement.create.mechanical_arm.desc": "製作機械手臂,選擇輸入和輸出,放置並給它動能; 然後看著它完成所有你交代的工作。", "advancement.create.musical_arm": "沒人能在我的BGM裡打敗我!", @@ -659,8 +680,8 @@ "advancement.create.wand_of_symmetry.desc": "製作一個對稱杖", "advancement.create.extendo_grip": "piu piu piu!", "advancement.create.extendo_grip.desc": "拿到一個伸縮機械手", - "advancement.create.potato_cannon": "UNLOCALIZED: Fwoomp!", - "advancement.create.potato_cannon.desc": "UNLOCALIZED: Defeat an enemy with your Potato Cannon.", + "advancement.create.potato_cannon": "噗~碰", + "advancement.create.potato_cannon.desc": "用馬鈴薯大砲擊殺一隻怪物", "advancement.create.dual_extendo_grip": "piu——piu——piu——", "advancement.create.dual_extendo_grip.desc": "雙持伸縮機械手進一步加長觸碰距離", "advancement.create.eob": "Beta版結束", @@ -673,24 +694,30 @@ "itemGroup.create.palettes": "動力機械建築與裝飾方塊", "death.attack.create.crush": "%1$s被壓扁了", + "death.attack.create.crush.player": "%1$s 被 %2$s 打包丟進粉碎輪", "death.attack.create.fan_fire": "%1$s想接受熱風的洗禮", + "death.attack.create.fan_fire.player": "%1$s 被 %2$s 推入火坑", "death.attack.create.fan_lava": "%1$s想接受熱風的洗禮但走火入魔", + "death.attack.create.fan_lava.player": "%1$s 被 %2$s 推進岩漿", "death.attack.create.mechanical_drill": "%1$s被鑽頭鑽爆腦袋", + "death.attack.create.mechanical_drill.player": "%1$s 被 %2$s 當成礦物放在鑽頭前面而死", "death.attack.create.mechanical_saw": "%1$s被鋸切成了兩半", - "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", - "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", + "death.attack.create.mechanical_saw.player": "%1$s 被 %2$s 鋸掉了", + "death.attack.create.potato_cannon": "%1$s 被 %2$s 的馬鈴薯大砲餵飽了", + "death.attack.create.potato_cannon.item": "%1$s 被 %2$s 用馬鈴薯大砲塞了滿肚子 %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s 被布穀鳥鐘炸得粉身碎骨", + "death.attack.create.cuckoo_clock_explosion.player": "%1$s 被布穀鳥鐘炸得粉身碎骨", "create.block.deployer.damage_source_name": "機械手", "create.block.cart_assembler.invalid": "將您的礦車裝修站放在鐵軌上", - "create.menu.return": "UNLOCALIZED: Return to Menu", - "create.menu.configure": "UNLOCALIZED: Configure...", - "create.menu.ponder_index": "UNLOCALIZED: Ponder Index", + "create.menu.return": "回到選單", + "create.menu.configure": "設定", + "create.menu.ponder_index": "示範目錄", "create.menu.only_ingame": "UNLOCALIZED: Available in the Pause Menu", - "create.menu.project_page": "UNLOCALIZED: Project Page", - "create.menu.report_bugs": "UNLOCALIZED: Report Issues", - "create.menu.support": "UNLOCALIZED: Support Us", + "create.menu.project_page": "專案頁面", + "create.menu.report_bugs": "回報問題", + "create.menu.support": "支持我們", "create.recipe.crushing": "粉碎", "create.recipe.milling": "研磨", @@ -716,16 +743,16 @@ "create.recipe.mystery_conversion": "神秘轉化", "create.recipe.spout_filling": "注液", "create.recipe.draining": "分液", - "create.recipe.sequenced_assembly": "UNLOCALIZED: Sequenced Assembly", - "create.recipe.assembly.next": "UNLOCALIZED: Next: %1$s", - "create.recipe.assembly.step": "UNLOCALIZED: Step %1$s:", - "create.recipe.assembly.progress": "UNLOCALIZED: Progress: %1$s/%2$s", + "create.recipe.sequenced_assembly": "排序中的步驟", + "create.recipe.assembly.next": "下一步:%1$s", + "create.recipe.assembly.step": "步驟 %1$s:", + "create.recipe.assembly.progress": "進度:%1$s/%2$s", "create.recipe.assembly.pressing": "UNLOCALIZED: Process in Press", - "create.recipe.assembly.spout_filling_fluid": "UNLOCALIZED: Spout %1$s", - "create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s", - "create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw", - "create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "UNLOCALIZED: Random junk", + "create.recipe.assembly.spout_filling_fluid": "注入:%1$s", + "create.recipe.assembly.deploying_item": "使用:%1$s", + "create.recipe.assembly.cutting": "用鋸子切", + "create.recipe.assembly.repeat": "重複 %1$s 次", + "create.recipe.assembly.junk": "有機率得到垃圾", "create.recipe.processing.chance": "%1$s%%概率", "create.recipe.heat_requirement.none": "不需要加熱", "create.recipe.heat_requirement.heated": "普通加熱", @@ -779,15 +806,15 @@ "create.orientation.alongX": "以x軸對齊", "create.gui.terrainzapper.title": "地形雕塑器", - "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", - "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.searchDiagonal": "跟隨對角線", + "create.gui.terrainzapper.searchFuzzy": "忽略材質邊界", "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", - "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", - "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", - "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", - "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", - "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", - "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", + "create.gui.terrainzapper.pattern.solid": "填滿", + "create.gui.terrainzapper.pattern.checkered": "棋盤狀", + "create.gui.terrainzapper.pattern.inversecheckered": "反轉棋盤狀", + "create.gui.terrainzapper.pattern.chance25": "隨機填滿 25% 的面積", + "create.gui.terrainzapper.pattern.chance50": "隨機填滿 50% 的面積", + "create.gui.terrainzapper.pattern.chance75": "隨機填滿 75% 的面積", "create.gui.terrainzapper.placement": "放置模式", "create.gui.terrainzapper.placement.merged": "結合", "create.gui.terrainzapper.placement.attached": "依附", @@ -796,8 +823,8 @@ "create.gui.terrainzapper.brush.cuboid": "矩形體", "create.gui.terrainzapper.brush.sphere": "球體", "create.gui.terrainzapper.brush.cylinder": "圓柱體", - "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", - "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", + "create.gui.terrainzapper.brush.surface": "表面", + "create.gui.terrainzapper.brush.cluster": "群組", "create.gui.terrainzapper.tool": "填充類型", "create.gui.terrainzapper.tool.fill": "填充", "create.gui.terrainzapper.tool.place": "覆寫", @@ -807,8 +834,8 @@ "create.gui.terrainzapper.tool.flatten": "平整", "create.terrainzapper.shiftRightClickToSet": "Shift+滑鼠右鍵 以設定雕塑類型", - "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", - "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", + "create.terrainzapper.usingBlock": "使用:%1$s", + "create.terrainzapper.leftClickToSet": "左鍵點擊方塊可以設定材質", "create.minecart_coupling.two_couplings_max": "礦車無法被連接兩個以上的礦車連結器", "create.minecart_coupling.unloaded": "有一部份礦車存在於未讀取區塊中", @@ -1039,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "不屬於%1$s", "create.item_attributes.added_by": "由%1$s添加", "create.item_attributes.added_by.inverted": "不是由%1$s添加", + "create.item_attributes.shulker_level": "界伏盒是 %1$s", + "create.item_attributes.shulker_level.inverted": "界伏盒不是 %1$s", + "create.item_attributes.shulker_level.full": "滿的", + "create.item_attributes.shulker_level.empty": "空的", + "create.item_attributes.shulker_level.partial": "有裝東西但沒滿", "create.item_attributes.has_enchant": "有附魔效果%1$s", "create.item_attributes.has_enchant.inverted": "沒有附魔效果%1$s", "create.item_attributes.color": "已被染色成 %1$s", @@ -1134,20 +1166,27 @@ "create.tooltip.chute.fans_pull_up": "鼓風機從下方進行吸引", "create.tooltip.chute.fans_pull_down": "鼓風機從上方進行吸引", "create.tooltip.chute.contains": "物品: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "正在處理", + "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "右鍵取回", - "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", - "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", - "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", - "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", - "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.linked_controller.bind_mode": "綁定模式", + "create.linked_controller.press_keybind": "按 %1$s, %2$s, %3$s, %4$s, %5$s 或 %6$s 來綁定這個頻率到對應按鍵上", + "create.linked_controller.key_bound": "頻率綁定到 %1$s 鍵", + "create.linked_controller.frequency_slot_1": "按鍵:%1$s 頻道 #1", + "create.linked_controller.frequency_slot_2": "按鍵:%1$s 頻道 #2", - "create.crafting_blueprint.crafting_slot": "UNLOCALIZED: Ingredient Slot", + "create.crafting_blueprint.crafting_slot": "材料格", "create.crafting_blueprint.filter_items_viable": "UNLOCALIZED: Advanced filter items are viable", - "create.crafting_blueprint.display_slot": "UNLOCALIZED: Display Slot", - "create.crafting_blueprint.inferred": "UNLOCALIZED: Inferred from recipe", - "create.crafting_blueprint.manually_assigned": "UNLOCALIZED: Manually assigned", - "create.crafting_blueprint.secondary_display_slot": "UNLOCALIZED: Secondary Display Slot", - "create.crafting_blueprint.optional": "UNLOCALIZED: Optional", + "create.crafting_blueprint.display_slot": "顯示格", + "create.crafting_blueprint.inferred": "根據配方推論", + "create.crafting_blueprint.manually_assigned": "手動設定", + "create.crafting_blueprint.secondary_display_slot": "次要顯示格", + "create.crafting_blueprint.optional": "可選的", + + "create.potato_cannon.ammo.attack_damage": "%1$s 攻擊傷害", + "create.potato_cannon.ammo.reload_ticks": "%1$s 攻擊速度", + "create.potato_cannon.ammo.knockback": "%1$s 擊退", "create.hint.hose_pulley.title": "無限供應", "create.hint.hose_pulley": "目標液體為無限供應", @@ -1176,43 +1215,44 @@ "create.command.killTPSCommand.argument.tickTime": "tickTime", "create.contraption.minecart_contraption_too_big": "這個礦車結構太大了而無法撿取", - "create.contraption.minecart_contraption_illegal_pickup": "UNLOCALIZED: A mystical force is binding this Cart Contraption to the world", + "create.contraption.minecart_contraption_illegal_pickup": "一股神秘的力量將這個礦車結構與世界綁在一起", "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", + "create.subtitle.contraption_disassemble": "結構停止", + "create.subtitle.peculiar_bell_use": "黃銅鐘聲", + "create.subtitle.mixing": "攪拌機噪音", "create.subtitle.mechanical_press_activation_belt": "液壓機工作", - "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", - "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.fwoomp": "馬鈴薯大砲發射", + "create.subtitle.worldshaper_place": "地形塑造器發射聲", + "create.subtitle.crushing_1": "粉碎機咀嚼聲", + "create.subtitle.depot_slide": "物品滑動聲", + "create.subtitle.saw_activate_stone": "機械鋸子聲", "create.subtitle.blaze_munch": "烈焰使者開心地吃著", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel flaps", "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", - "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.controller_put": "UNLOCALIZED: Controller thumps", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.haunted_bell_use": "靈魂鐘敲響", + "create.subtitle.scroll_value": "滾動輸入聲", + "create.subtitle.crafter_craft": "機械合成器合成聲", + "create.subtitle.controller_put": "遙控器放置聲", + "create.subtitle.cranking": "手搖把手轉動聲", + "create.subtitle.wrench_remove": "零件移除聲", + "create.subtitle.cogs": "齒輪隆隆聲", "create.subtitle.slime_added": "黏液擠壓", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", - "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", - "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.potato_hit": "食物撞擊聲", + "create.subtitle.saw_activate_wood": "機械鋸子運作聲", + "create.subtitle.haunted_bell_convert": "靈魂鐘轉化聲", + "create.subtitle.deployer_polish": "機械手拋光聲", "create.subtitle.deny": "UNLOCALIZED: Declining boop", - "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.controller_click": "遙控器按鍵聲", "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", - "create.subtitle.cursed_bell_use": "UNLOCALIZED: Cursed Bell tolls", - "create.subtitle.cursed_bell_convert": "UNLOCALIZED: Cursed Bell awakens", - "create.subtitle.controller_take": "UNLOCALIZED: Lectern empties", + "create.subtitle.copper_armor_equip": "潛水裝裝備聲", + "create.subtitle.controller_take": "拿下遙控器", "create.subtitle.mechanical_press_activation": "液壓機工作", - "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.contraption_assemble": "結構移動", + "create.subtitle.crafter_click": "機械合成器工作聲", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", @@ -1271,15 +1311,15 @@ "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_觸碰距離_。", "item.create.extendo_grip.tooltip.condition1": "放置於副手欄時", "item.create.extendo_grip.tooltip.behaviour1": "大幅增加_主手_的觸碰距離,與_主手_的伸縮機械手攜同使用,可進一步增加_觸碰距離_。", - "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.extendo_grip.tooltip.condition2": "當裝備銅製後背包時", + "item.create.extendo_grip.tooltip.behaviour2": "_不會消耗耐久_ 但是會抽取銅製後背包裡的_壓縮空氣_", - "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", - "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", - "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", - "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", - "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + "item.create.potato_cannon.tooltip": "馬鈴薯大砲", + "item.create.potato_cannon.tooltip.summary": "噗~碰!用你種的蔬菜來攻擊敵人。可以用_銅製後背包_的壓縮空氣驅動", + "item.create.potato_cannon.tooltip.condition1": "當點擊右鍵時", + "item.create.potato_cannon.tooltip.behaviour1": "從_物品欄_中_發射_一顆彈藥", + "item.create.potato_cannon.tooltip.condition2": "當裝備銅製後背包時", + "item.create.potato_cannon.tooltip.behaviour2": "_不會消耗耐久_ 但是會抽取銅製後背包裡的_壓縮空氣_", "item.create.filter.tooltip": "過濾器", "item.create.filter.tooltip.summary": "將物品更精確地進行_篩選分類_,可以同時_篩選_多個物品或者將已標記的_過濾器_放在另一個_過濾器_里_嵌套_使用。", @@ -1373,6 +1413,11 @@ "block.create.creative_crate.tooltip.condition1": "當標記了物品時", "block.create.creative_crate.tooltip.behaviour1": "容器將會從虛空中提供_無限量_的標記物品,並且任何放置到容器中的物品都會被_送入虛空_", + "item.create.creative_blaze_cake.tooltip": "UNLOCALIZED: CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "UNLOCALIZED: A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "UNLOCALIZED: R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "UNLOCALIZED: _Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "控制鐵軌", "block.create.controller_rail.tooltip.summary": "單向電動導軌,能夠精細控制礦車的移動速度。", "block.create.controller_rail.tooltip.condition1": "被紅石激活時", @@ -1388,117 +1433,117 @@ "item.create.refined_radiance.tooltip": "光輝石", "item.create.refined_radiance.tooltip.summary": "一種用_光輝_鍛造的化合物材料。", - "item.create.refined_radiance.tooltip.condition1": "UNLOCALIZED: Work In Progress", - "item.create.refined_radiance.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", + "item.create.refined_radiance.tooltip.condition1": "工作進度", + "item.create.refined_radiance.tooltip.behaviour1": "在未來的更新中會更新更多用途", "item.create.shadow_steel.tooltip": "暗影鋼", "item.create.shadow_steel.tooltip.summary": "一種用_虛空_鍛造的化合物材料。", - "item.create.shadow_steel.tooltip.condition1": "UNLOCALIZED: Work In Progress", - "item.create.shadow_steel.tooltip.behaviour1": "UNLOCALIZED: Usages for this material will be available in a future release.", + "item.create.shadow_steel.tooltip.condition1": "工作進度", + "item.create.shadow_steel.tooltip.behaviour1": "在未來的更新中會更新更多用途", - "item.create.linked_controller.tooltip": "UNLOCALIZED: LINKED CONTROLLER", - "item.create.linked_controller.tooltip.summary": "UNLOCALIZED: Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.", - "item.create.linked_controller.tooltip.condition1": "UNLOCALIZED: R-Click", - "item.create.linked_controller.tooltip.behaviour1": "UNLOCALIZED: _Toggles_ the controller. _Movement_ _controls_ are taken over while its active.", - "item.create.linked_controller.tooltip.condition2": "UNLOCALIZED: R-Click while Sneaking", - "item.create.linked_controller.tooltip.behaviour2": "UNLOCALIZED: Opens the manual _Configuration Interface_.", - "item.create.linked_controller.tooltip.condition3": "UNLOCALIZED: R-Click on Redstone Link Receiver", - "item.create.linked_controller.tooltip.behaviour3": "UNLOCALIZED: Enables _Bind Mode_, press one of the _six controls_ to bind it to the _Links' Frequency_.", - "item.create.linked_controller.tooltip.condition4": "UNLOCALIZED: R-Click on Lectern", - "item.create.linked_controller.tooltip.behaviour4": "UNLOCALIZED: Places the Controller into the Lectern for easy activation. (R-Click while Sneaking to retrieve it)", + "item.create.linked_controller.tooltip": "遙控器", + "item.create.linked_controller.tooltip.summary": "提供_六個_連接到相對應_按鍵_的_無線紅石訊號機_ _手持的控制_", + "item.create.linked_controller.tooltip.condition1": "點擊右鍵時", + "item.create.linked_controller.tooltip.behaviour1": "_切換_遙控器,當遙控器啟動時你會失去_移動控制_", + "item.create.linked_controller.tooltip.condition2": "當右鍵時", + "item.create.linked_controller.tooltip.behaviour2": "打開_設定面板_", + "item.create.linked_controller.tooltip.condition3": "當對無線紅石訊號機點右鍵時", + "item.create.linked_controller.tooltip.behaviour3": "開啟_綁定模式_。按_六個控制鍵_的其中一個來綁定_頻率_到遙控器上", + "item.create.linked_controller.tooltip.condition4": "當對講台按右鍵時", + "item.create.linked_controller.tooltip.behaviour4": "把遙控器放到講台上,可以更方便的控制它。(蹲下右鍵取回)", - "item.create.diving_helmet.tooltip": "UNLOCALIZED: DIVING HELMET", - "item.create.diving_helmet.tooltip.summary": "UNLOCALIZED: Together with a _Copper_ _Backtank_, allows the wielder to _breathe_ _underwater_ for an extended amount of time.", - "item.create.diving_helmet.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_helmet.tooltip.behaviour1": "UNLOCALIZED: Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.", + "item.create.diving_helmet.tooltip": "潛水頭盔", + "item.create.diving_helmet.tooltip.summary": "和_銅製後背包_一起裝備時可以延長在_水下呼吸_的時間", + "item.create.diving_helmet.tooltip.condition1": "當裝備時", + "item.create.diving_helmet.tooltip.behaviour1": "提昇_水下呼吸效果_,會緩慢的抽取銅製後背包中的_壓縮空氣_", - "item.create.copper_backtank.tooltip": "UNLOCALIZED: COPPER BACKTANK", - "item.create.copper_backtank.tooltip.summary": "UNLOCALIZED: A _Wearable_ _Tank_ for carrying Pressurized Air.", - "item.create.copper_backtank.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.copper_backtank.tooltip.behaviour1": "UNLOCALIZED: Provides _Pressurized_ _Air_ to Equipment that requires it.", - "item.create.copper_backtank.tooltip.condition2": "UNLOCALIZED: When placed, Powered by Kinetics", - "item.create.copper_backtank.tooltip.behaviour2": "UNLOCALIZED: _Collects_ _Pressurized_ _Air_ at a rate depending on the Rotational Speed.", + "item.create.copper_backtank.tooltip": "銅製後背包", + "item.create.copper_backtank.tooltip.summary": "可裝備的氣罐,用來攜帶壓縮空氣", + "item.create.copper_backtank.tooltip.condition1": "當裝備時", + "item.create.copper_backtank.tooltip.behaviour1": "提供_壓縮空氣_給需要的裝備", + "item.create.copper_backtank.tooltip.condition2": "當放置時,由轉動來補充驅動", + "item.create.copper_backtank.tooltip.behaviour2": "旋轉的速度決定收集_壓縮空氣_的速率", - "item.create.diving_boots.tooltip": "UNLOCALIZED: DIVING BOOTS", - "item.create.diving_boots.tooltip.summary": "UNLOCALIZED: A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.", - "item.create.diving_boots.tooltip.condition1": "UNLOCALIZED: When Worn", - "item.create.diving_boots.tooltip.behaviour1": "UNLOCALIZED: Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.", + "item.create.diving_boots.tooltip": "潛水鞋", + "item.create.diving_boots.tooltip.summary": "一雙_沈重的鞋子_,提供更好的水下移動", + "item.create.diving_boots.tooltip.condition1": "當裝備時", + "item.create.diving_boots.tooltip.behaviour1": "你可以在水下走得更快而且可以跳躍,但是不能游泳。穿著者不會被輸送帶移動。", - "item.create.crafting_blueprint.tooltip": "UNLOCALIZED: CRAFTING BLUEPRINT", - "item.create.crafting_blueprint.tooltip.summary": "UNLOCALIZED: _Placed_ on a wall, it can be used to _specify_ _ingredient_ _arrangements_ for easier manual crafting. Each slot represents a Recipe.", - "item.create.crafting_blueprint.condition1": "UNLOCALIZED: R-Click empty Slot", - "item.create.crafting_blueprint.behaviour1": "UNLOCALIZED: Opens a _Crafting_ _menu_ allowing you to _configure_ a _recipe_ and items to display.", - "item.create.crafting_blueprint.condition2": "UNLOCALIZED: R-Click configured Slot", - "item.create.crafting_blueprint.behaviour2": "UNLOCALIZED: _Applies_ the _configured_ _recipe_ with matching Ingredients found in your _Inventory_. _Sneak_ to craft up to a _Stack_ of items.", + "item.create.crafting_blueprint.tooltip": "合成藍圖", + "item.create.crafting_blueprint.tooltip.summary": "可以被放置在牆上、地上和天花板。指定一個合成配方,你可以更快速的合成物品。每一格代表一個合成配方", + "item.create.crafting_blueprint.condition1": "右鍵點擊空格", + "item.create.crafting_blueprint.behaviour1": "打開_合成界面_讓你_指定配方_和要顯示的物品", + "item.create.crafting_blueprint.condition2": "右鍵點擊編輯過的格子", + "item.create.crafting_blueprint.behaviour2": "根據_物品欄_內的物品_使用_這個_配方_合成。_蹲下_點擊可以一次合成_一組_的物品", "item.create.minecart_coupling.tooltip": "礦車連軸器", "item.create.minecart_coupling.tooltip.summary": "將多個_礦車_或運輸結構鏈接在一起,構成雄偉的火車。", "item.create.minecart_coupling.tooltip.condition1": "作用與礦車時", "item.create.minecart_coupling.tooltip.behaviour1": "將兩個礦車耦合在一起,在移動時將它們保持_恒定的距離_。", - "block.create.peculiar_bell.tooltip": "UNLOCALIZED: PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "UNLOCALIZED: A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip": "黃銅鐘", + "block.create.peculiar_bell.tooltip.summary": "一個裝飾性的_鐘_,放在_靈魂火_正上方會有意想不到的副作用", - "block.create.cursed_bell.tooltip": "UNLOCALIZED: CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "UNLOCALIZED: A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "UNLOCALIZED: When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "UNLOCALIZED: Highlights nearby dark spots on which Hostile Mobs could spawn.", + "block.create.haunted_bell.tooltip": "靈魂鐘", + "block.create.haunted_bell.tooltip.summary": "一個受到地獄亡魂_詛咒的鐘_", + "block.create.haunted_bell.tooltip.condition1": "當拿者或是被敲響時", + "block.create.haunted_bell.tooltip.behaviour1": "標示附近_不夠亮_、會生成_敵對生物_的地方", "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "按住 [%1$s] 來思考此物品", + "create.ponder.hold_to_ponder": "按住 [%1$s] 來查看此物品的教學", "create.ponder.subject": "本場景的主題", - "create.ponder.pondering": "思考有關於...", + "create.ponder.pondering": "有關於...", "create.ponder.identify_mode": "暫停模式已啟動\n按 [%1$s] 來取消暫停模式", "create.ponder.associated": "相關物品", "create.ponder.close": "關閉", "create.ponder.identify": "暫停", "create.ponder.next": "下個場景", "create.ponder.previous": "上個場景", - "create.ponder.replay": "重放", + "create.ponder.replay": "重播", "create.ponder.think_back": "返回", - "create.ponder.slow_text": "降低文字顯示速度", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", - "create.ponder.shared.movement_anchors": "有了機殼底盤和強力膠就可以移動大型結構", - "create.ponder.shared.rpm32": "32 RPM", - "create.ponder.shared.sneak_and": "潛行 +", - "create.ponder.shared.storage_on_contraption": "與結構相連的儲物空間會自動撿取物品", + "create.ponder.slow_text": "放慢文字顯示速度", + "create.ponder.exit": "離開", + "create.ponder.welcome": "歡迎來到教學", + "create.ponder.categories": "Create 中的分類", + "create.ponder.index_description": "點擊其中一個圖像查看和他相關的物品以及方塊", + "create.ponder.index_title": "教學首頁", + "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "使用扳手來調整這個動作", + "create.ponder.shared.storage_on_contraption": "與結構相連的儲物空間會自動撿取物品", + "create.ponder.shared.sneak_and": "潛行 +", "create.ponder.shared.rpm8": "8 RPM", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "轉速: 16 RPM", - "create.ponder.shared.rpm16": "16 RPM", - "create.ponder.tag.kinetic_sources": "動能產生裝置", - "create.ponder.tag.kinetic_sources.description": "該裝置能夠產生動能", - "create.ponder.tag.contraption_actor": "Contraption Actors", - "create.ponder.tag.contraption_actor.description": "Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "機械手臂的目標物", - "create.ponder.tag.arm_targets.description": "該裝置可作為機械手臂的工作目標", - "create.ponder.tag.logistics": "傳輸物品", - "create.ponder.tag.logistics.description": "該裝置用於物品的傳輸", - "create.ponder.tag.movement_anchor": "Movement Anchors", - "create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "創造模式", - "create.ponder.tag.creative.description": "該裝置無法在生存模式中獲得", - "create.ponder.tag.kinetic_relays": "動能傳遞方塊", - "create.ponder.tag.kinetic_relays.description": "該裝置用於傳遞動能", - "create.ponder.tag.windmill_sails": "風車軸承的帆", - "create.ponder.tag.windmill_sails.description": "建造風車時用於產生動能的帆,每個帆對風車產生的效果都是同等的", - "create.ponder.tag.contraption_assembly": "方塊連接物件", - "create.ponder.tag.contraption_assembly.description": "此物件用於連接各個零件以便組成一個成品", - "create.ponder.tag.decoration": "裝飾", - "create.ponder.tag.decoration.description": "這些零件通常用於裝飾", - "create.ponder.tag.kinetic_appliances": "動能利用裝置", - "create.ponder.tag.kinetic_appliances.description": "這些裝置利用動能運作", + "create.ponder.shared.movement_anchors": "有了機殼底盤和強力膠就可以移動大型結構", "create.ponder.tag.redstone": "邏輯控制裝置", "create.ponder.tag.redstone.description": "這些裝置會在紅石電路中發揮用處", + "create.ponder.tag.contraption_assembly": "方塊連接物件", + "create.ponder.tag.contraption_assembly.description": "此物件用於連接各個零件以便組成一個成品", "create.ponder.tag.fluids": "液體控制裝置", "create.ponder.tag.fluids.description": "這些裝置可傳輸並利用液體", + "create.ponder.tag.decoration": "裝飾", + "create.ponder.tag.decoration.description": "這些零件通常用於裝飾", + "create.ponder.tag.windmill_sails": "風車軸承的帆", + "create.ponder.tag.windmill_sails.description": "建造風車時用於產生動能的帆,每個帆對風車產生的效果都是同等的", + "create.ponder.tag.arm_targets": "機械手臂的目標物", + "create.ponder.tag.arm_targets.description": "該裝置可作為機械手臂的工作目標", + "create.ponder.tag.kinetic_appliances": "動能利用裝置", + "create.ponder.tag.kinetic_appliances.description": "這些裝置利用動能運作", + "create.ponder.tag.kinetic_sources": "動能產生裝置", + "create.ponder.tag.kinetic_sources.description": "該裝置能夠產生動能", + "create.ponder.tag.movement_anchor": "運動錨點", + "create.ponder.tag.movement_anchor.description": "允許建立移動裝置的元件,以各種方式為連接的結構設置動畫", + "create.ponder.tag.kinetic_relays": "動能傳遞方塊", + "create.ponder.tag.kinetic_relays.description": "該裝置用於傳遞動能", + "create.ponder.tag.contraption_actor": "特殊方塊", + "create.ponder.tag.contraption_actor.description": "附加到移動裝置上時表現出特殊行為的方塊", + "create.ponder.tag.creative": "創造模式", + "create.ponder.tag.creative.description": "該裝置無法在生存模式中獲得", + "create.ponder.tag.logistics": "傳輸物品", + "create.ponder.tag.logistics.description": "該裝置用於物品的傳輸", "create.ponder.adjustable_pulse_repeater.header": "使用可調式脈衝中繼器來控制訊號", "create.ponder.adjustable_pulse_repeater.text_1": "可調式脈衝中繼器每次運作時會產生一個短脈衝", @@ -1611,7 +1656,7 @@ "create.ponder.cart_assembler_modes.header": "礦車結構的方向設定", "create.ponder.cart_assembler_modes.text_1": "礦車結構會隨著礦車方向改變", "create.ponder.cart_assembler_modes.text_2": "如果在裝修站鎖定其方向,則結構方向不會隨礦車方向改變", - "create.ponder.cart_assembler_modes.text_3": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + "create.ponder.cart_assembler_modes.text_3": "如果在裝修站鎖定其方向,則結構方向不會隨礦車方向改變", "create.ponder.cart_assembler_rails.header": "其他種類的礦車和鐵軌", "create.ponder.cart_assembler_rails.text_1": "放在普通鐵軌上的礦車裝修站不會影響礦車的動作", @@ -1665,11 +1710,11 @@ "create.ponder.cogwheel.text_1": "齒輪會將動力傳遞至臨近的齒輪", "create.ponder.cogwheel.text_2": "以此方式連接的齒輪,旋轉方向相反", - "create.ponder.creative_fluid_tank.header": "UNLOCALIZED: Creative Fluid Tanks", - "create.ponder.creative_fluid_tank.text_1": "UNLOCALIZED: Creative Fluid Tanks can be used to provide a bottomless supply of fluid", - "create.ponder.creative_fluid_tank.text_2": "UNLOCALIZED: Right-Click with a fluid containing item to configure it", - "create.ponder.creative_fluid_tank.text_3": "UNLOCALIZED: Pipe Networks can now endlessly draw the assigned fluid from the tank", - "create.ponder.creative_fluid_tank.text_4": "UNLOCALIZED: Any Fluids pushed back into a Creative Fluid Tank will be voided", + "create.ponder.creative_fluid_tank.header": "創造液體除存罐", + "create.ponder.creative_fluid_tank.text_1": "創造液體除存罐可以提供無限的液體", + "create.ponder.creative_fluid_tank.text_2": "拿著一個液體物品點擊可以設定它", + "create.ponder.creative_fluid_tank.text_3": "現在管線網路可以無限制的從它抽取液體", + "create.ponder.creative_fluid_tank.text_4": "任何被抽進創造液體除存罐的液體都會消失", "create.ponder.creative_motor.header": "使用創造馬達產生動能", "create.ponder.creative_motor.text_1": "創造馬達不僅能夠手動設定輸出動能,而且體積相當小巧", @@ -1707,11 +1752,11 @@ "create.ponder.deployer_modes.text_1": "在設設情況下,機械手模仿玩家的右鍵", "create.ponder.deployer_modes.text_2": "使用扳手可以將模式調整為模仿玩家的左鍵", - "create.ponder.deployer_processing.header": "UNLOCALIZED: Processing Items using Deployers", - "create.ponder.deployer_processing.text_1": "UNLOCALIZED: With a fitting held item, Deployers can process items provided beneath them", - "create.ponder.deployer_processing.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Deployer", - "create.ponder.deployer_processing.text_3": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.deployer_processing.text_4": "UNLOCALIZED: The Deployer will hold and process them automatically", + "create.ponder.deployer_processing.header": "用機器手處理物品", + "create.ponder.deployer_processing.text_1": "拿著適當物品的機器手可以處理下面的物品", + "create.ponder.deployer_processing.text_2": "待處理的物品可以是掉落狀態或是被放在置物台上", + "create.ponder.deployer_processing.text_3": "當物品被放在輸送帶上時...", + "create.ponder.deployer_processing.text_4": "機器手會抓住他並且自動處理", "create.ponder.deployer_redstone.header": "使用紅石控制機械手", "create.ponder.deployer_redstone.text_1": "當機械手收到紅時訊號時會停止工作", @@ -1729,7 +1774,8 @@ "create.ponder.empty_blaze_burner.text_2": "或者,也可以透過右擊烈焰人刷怪籠來填充啟動烈焰人燃燒室", "create.ponder.empty_blaze_burner.text_3": "這樣,你便有了一個可供部分機器加工的熱源", "create.ponder.empty_blaze_burner.text_4": "如果是為了美觀,空的烈焰人燃燒室也可以被打火石點燃", - "create.ponder.empty_blaze_burner.text_5": "但是,這樣的熱源不足以給機器提加工供足夠的熱量", + "create.ponder.empty_blaze_burner.text_5": "可以放入靈魂物品將火焰轉化成靈魂火", + "create.ponder.empty_blaze_burner.text_6": "但是,這樣的熱源不足以給機器提加工供足夠的熱量", "create.ponder.encased_fluid_pipe.header": "UNLOCALIZED: Encasing Fluid Pipes", "create.ponder.encased_fluid_pipe.text_1": "UNLOCALIZED: Copper Casing can be used to decorate Fluid Pipes", @@ -1754,34 +1800,34 @@ "create.ponder.fan_source.text_1": "如鼓風機的扇葉向下朝著熱源放置,鼓風機可以藉此產生動能", "create.ponder.fan_source.text_2": "當鼓風機接受紅石訊號後,它便會向外供給動能", - "create.ponder.fluid_pipe_flow.header": "UNLOCALIZED: Moving Fluids using Copper Pipes", - "create.ponder.fluid_pipe_flow.text_1": "UNLOCALIZED: Fluid Pipes can connect two or more fluid sources and targets", - "create.ponder.fluid_pipe_flow.text_2": "UNLOCALIZED: Using a wrench, a straight pipe segment can be given a window", - "create.ponder.fluid_pipe_flow.text_3": "UNLOCALIZED: Windowed pipes will not connect to any other adjacent pipe segments", - "create.ponder.fluid_pipe_flow.text_4": "UNLOCALIZED: Powered by Mechanical Pumps, the Pipes can transport Fluids", - "create.ponder.fluid_pipe_flow.text_5": "UNLOCALIZED: No fluid is being extracted at first", - "create.ponder.fluid_pipe_flow.text_6": "UNLOCALIZED: Once the flow connects them, the endpoints gradually transfer their contents", - "create.ponder.fluid_pipe_flow.text_7": "UNLOCALIZED: Thus, the Pipe blocks themselves never 'physically' contain any fluid", + "create.ponder.fluid_pipe_flow.header": "始用銅製管道來移動液體", + "create.ponder.fluid_pipe_flow.text_1": "液體管可以連接兩個或更多的液體來源與目標", + "create.ponder.fluid_pipe_flow.text_2": "使用扳手可以在一段直管線上開窗戶", + "create.ponder.fluid_pipe_flow.text_3": "有窗戶的管線側面不會連接到其他管線", + "create.ponder.fluid_pipe_flow.text_4": "機械幫浦可以讓管線運輸液體", + "create.ponder.fluid_pipe_flow.text_5": "一開始不會有液體被抽出來", + "create.ponder.fluid_pipe_flow.text_6": "直到兩端被連接起來,才會有液體被抽過去", + "create.ponder.fluid_pipe_flow.text_7": "因此,管線裡不會『物理上的』含有液體", - "create.ponder.fluid_pipe_interaction.header": "UNLOCALIZED: Draining and Filling fluid containers", - "create.ponder.fluid_pipe_interaction.text_1": "UNLOCALIZED: Endpoints of a pipe network can interact with a variety of blocks", - "create.ponder.fluid_pipe_interaction.text_2": "UNLOCALIZED: Any block with fluid storage capabilities can be filled or drained", - "create.ponder.fluid_pipe_interaction.text_3": "UNLOCALIZED: Source blocks right in front of an open end can be picked up...", - "create.ponder.fluid_pipe_interaction.text_4": "UNLOCALIZED: ...while spilling into empty spaces can create fluid sources", - "create.ponder.fluid_pipe_interaction.text_5": "UNLOCALIZED: Pipes can also extract fluids from a handful of other blocks directly", + "create.ponder.fluid_pipe_interaction.header": "抽取並填滿液體罐", + "create.ponder.fluid_pipe_interaction.text_1": "管線網路的終端可以和很多東西互動", + "create.ponder.fluid_pipe_interaction.text_2": "任何有意體容量的方塊都可以被抽取和填滿", + "create.ponder.fluid_pipe_interaction.text_3": "在開放端口前的液體源方塊可以被抽走", + "create.ponder.fluid_pipe_interaction.text_4": "當液體被排放出來時會產生新的液體源方塊", + "create.ponder.fluid_pipe_interaction.text_5": "管線也可以直接從其他方塊中抽取流體", - "create.ponder.fluid_tank_sizes.header": "UNLOCALIZED: Dimensions of a Fluid tank", - "create.ponder.fluid_tank_sizes.text_1": "UNLOCALIZED: Fluid Tanks can be combined to increase the total capacity", - "create.ponder.fluid_tank_sizes.text_2": "UNLOCALIZED: Their base square can be up to 3 blocks wide...", - "create.ponder.fluid_tank_sizes.text_3": "UNLOCALIZED: ...and grow in height by more than 30 additional layers", - "create.ponder.fluid_tank_sizes.text_4": "UNLOCALIZED: Using a Wrench, a tanks' window can be toggled", + "create.ponder.fluid_tank_sizes.header": "液體罐的尺寸", + "create.ponder.fluid_tank_sizes.text_1": "可以組合液體罐以增加總容量", + "create.ponder.fluid_tank_sizes.text_2": "底部最多可以是 3x3 的正方形 ......", + "create.ponder.fluid_tank_sizes.text_3": "...... 最多可以堆疊 30 層", + "create.ponder.fluid_tank_sizes.text_4": "扳手可以用來開關窗戶", - "create.ponder.fluid_tank_storage.header": "UNLOCALIZED: Storing Fluids in Fluid Tanks", - "create.ponder.fluid_tank_storage.text_1": "UNLOCALIZED: Fluid Tanks can be used to store large amounts of fluid", - "create.ponder.fluid_tank_storage.text_2": "UNLOCALIZED: Pipe networks can push and pull fluids from any side", - "create.ponder.fluid_tank_storage.text_3": "UNLOCALIZED: The contained fluid can be measured by a Comparator", - "create.ponder.fluid_tank_storage.text_4": "UNLOCALIZED: However, in Survival Mode Fluids cannot be added or taken manually", - "create.ponder.fluid_tank_storage.text_5": "UNLOCALIZED: You can use Basins, Item Drains and Spouts to drain or fill fluid containing items", + "create.ponder.fluid_tank_storage.header": "在液體罐中儲存液體", + "create.ponder.fluid_tank_storage.text_1": "液體罐中可儲存大量的液體", + "create.ponder.fluid_tank_storage.text_2": "管線體網路可以從任何一邊抽取或是輸入液體", + "create.ponder.fluid_tank_storage.text_3": "紅石比較器可以輸出液體容量", + "create.ponder.fluid_tank_storage.text_4": "但是,在生存模式你不能直接存入、取出液體", + "create.ponder.fluid_tank_storage.text_5": "你可以用作業盆、分液池或液體灌注器和管線網路互動", "create.ponder.flywheel.header": "使用飛輪來產生動能", "create.ponder.flywheel.text_1": "飛輪和熔爐引擎必須配套使用,方可產生動能", @@ -1856,33 +1902,33 @@ "create.ponder.hand_crank.text_3": "它產生的轉速相對較高", "create.ponder.hand_crank.text_4": "潛行長按右鍵可以順時針旋轉它", - "create.ponder.hose_pulley.header": "UNLOCALIZED: Source Filling and Draining using Hose Pulleys", - "create.ponder.hose_pulley.text_1": "UNLOCALIZED: Hose Pulleys can be used to fill or drain large bodies of Fluid", - "create.ponder.hose_pulley.text_2": "UNLOCALIZED: With the Kinetic Input, the height of the pulleys' hose can be controlled", - "create.ponder.hose_pulley.text_3": "UNLOCALIZED: The Pulley retracts while the input rotation is inverted", - "create.ponder.hose_pulley.text_4": "UNLOCALIZED: On the opposite side, pipes can be connected", - "create.ponder.hose_pulley.text_5": "UNLOCALIZED: Attached pipe networks can either provide fluid to the hose...", - "create.ponder.hose_pulley.text_6": "UNLOCALIZED: ...or pull from it, draining the pool instead", - "create.ponder.hose_pulley.text_7": "UNLOCALIZED: Fill and Drain speed of the pulley depends entirely on the fluid networks' throughput", + "create.ponder.hose_pulley.header": "使用軟管滑輪抽取、填滿液體", + "create.ponder.hose_pulley.text_1": "軟管滑輪可以用來抽取、填滿大量的液體", + "create.ponder.hose_pulley.text_2": "你可以透過輸入轉動來控制軟管的高度", + "create.ponder.hose_pulley.text_3": "反轉時可以收回軟管", + "create.ponder.hose_pulley.text_4": "另一邊可以連接管線", + "create.ponder.hose_pulley.text_5": "相連的管線網路可以提供液體 ......", + "create.ponder.hose_pulley.text_6": "...... 或是從池子裡抽取液體", + "create.ponder.hose_pulley.text_7": "抽取或填滿的速度取決於管線系統的吞吐量", - "create.ponder.hose_pulley_infinite.header": "UNLOCALIZED: Passively Filling and Draining large bodies of Fluid", - "create.ponder.hose_pulley_infinite.text_1": "UNLOCALIZED: When deploying the Hose Pulley into a large enough ocean...", - "create.ponder.hose_pulley_infinite.text_2": "UNLOCALIZED: It will provide/dispose fluids without affecting the source", - "create.ponder.hose_pulley_infinite.text_3": "UNLOCALIZED: Pipe networks can limitlessly take fluids from/to such pulleys", + "create.ponder.hose_pulley_infinite.header": "被動填充和排放大量液體", + "create.ponder.hose_pulley_infinite.text_1": "將軟管滑輪接觸到足夠大的海洋中時 ......", + "create.ponder.hose_pulley_infinite.text_2": "海洋會被視為無限液體源", + "create.ponder.hose_pulley_infinite.text_3": "管線網路可以無限的抽取、排放液體到海洋中而不影響海洋", - "create.ponder.hose_pulley_level.header": "UNLOCALIZED: Fill and Drain level of Hose Pulleys", - "create.ponder.hose_pulley_level.text_1": "UNLOCALIZED: While fully retracted, the Hose Pulley cannot operate", - "create.ponder.hose_pulley_level.text_2": "UNLOCALIZED: Draining runs from top to bottom", - "create.ponder.hose_pulley_level.text_3": "UNLOCALIZED: The surface level will end up just below where the hose ends", - "create.ponder.hose_pulley_level.text_4": "UNLOCALIZED: Filling runs from bottom to top", - "create.ponder.hose_pulley_level.text_5": "UNLOCALIZED: The filled pool will not grow beyond the layer above the hose end", + "create.ponder.hose_pulley_level.header": "軟管滑輪抽取、填滿水平面", + "create.ponder.hose_pulley_level.text_1": "完全縮回時,軟管滑輪無法操作", + "create.ponder.hose_pulley_level.text_2": "抽取工作將由上而下進行", + "create.ponder.hose_pulley_level.text_3": "水平面將停在軟管末端的正下方", + "create.ponder.hose_pulley_level.text_4": "而填充工作將由下而上進行將由上而下進行", + "create.ponder.hose_pulley_level.text_5": "水平面不會超過軟管末端", - "create.ponder.item_drain.header": "UNLOCALIZED: Emptying Fluid Containers using Item Drains", - "create.ponder.item_drain.text_1": "UNLOCALIZED: Item Drains can extract fluids from items", - "create.ponder.item_drain.text_2": "UNLOCALIZED: Right-click it to pour fluids from your held item into it", - "create.ponder.item_drain.text_3": "UNLOCALIZED: When items are inserted from the side...", - "create.ponder.item_drain.text_4": "UNLOCALIZED: ...they roll across, emptying out their contained fluid", - "create.ponder.item_drain.text_5": "UNLOCALIZED: Pipe Networks can now pull the fluid from the drains' internal buffer", + "create.ponder.item_drain.header": "使用分液池清空液體容器", + "create.ponder.item_drain.text_1": "分液池可以從液體容器中清空抽取液體", + "create.ponder.item_drain.text_2": "點擊右鍵可以把你手上的液體倒進去", + "create.ponder.item_drain.text_3": "當從旁邊輸入物品 ......", + "create.ponder.item_drain.text_4": "...... 他會從上方滑過,並清空裡面的液體", + "create.ponder.item_drain.text_5": "現在液體網路可以抽取分液池中的液體了", "create.ponder.large_cogwheel.header": "使用大齒輪傳遞動能", "create.ponder.large_cogwheel.text_1": "大齒輪可以以特定的角度相互連接", @@ -2006,20 +2052,20 @@ "create.ponder.mechanical_press_compacting.text_3": "一些配方可能需要烈焰人燃燒室提供熱量", "create.ponder.mechanical_press_compacting.text_4": "過濾槽可用於解決兩個配方相互衝突的情況", - "create.ponder.mechanical_pump_flow.header": "UNLOCALIZED: Fluid Transportation using Mechanical Pumps", - "create.ponder.mechanical_pump_flow.text_1": "UNLOCALIZED: Mechanical Pumps govern the flow of their attached pipe networks", - "create.ponder.mechanical_pump_flow.text_2": "UNLOCALIZED: When powered, their arrow indicates the direction of flow", - "create.ponder.mechanical_pump_flow.text_3": "UNLOCALIZED: The network behind is now pulling fluids...", - "create.ponder.mechanical_pump_flow.text_4": "UNLOCALIZED: ...while the network in front is transferring it outward", - "create.ponder.mechanical_pump_flow.text_5": "UNLOCALIZED: Reversing the input rotation reverses the direction of flow", - "create.ponder.mechanical_pump_flow.text_6": "UNLOCALIZED: Use a Wrench to reverse the orientation of pumps manually", + "create.ponder.mechanical_pump_flow.header": "使用機械幫浦抽運送液體", + "create.ponder.mechanical_pump_flow.text_1": "機械幫浦為與其連接的管線提供動力", + "create.ponder.mechanical_pump_flow.text_2": "轉動時,箭頭指向液體的方向", + "create.ponder.mechanical_pump_flow.text_3": "在他後面的網路現在可以抽取液體 ......", + "create.ponder.mechanical_pump_flow.text_4": "...... 當前面的網絡向外傳輸時", + "create.ponder.mechanical_pump_flow.text_5": "反轉輸入的動力可以反轉液體的方向", + "create.ponder.mechanical_pump_flow.text_6": "扳手可以手動調整方向", - "create.ponder.mechanical_pump_speed.header": "UNLOCALIZED: Throughput of Mechanical Pumps", - "create.ponder.mechanical_pump_speed.text_1": "UNLOCALIZED: Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away", - "create.ponder.mechanical_pump_speed.text_2": "UNLOCALIZED: Speeding up the input rotation changes the speed of flow propagation...", - "create.ponder.mechanical_pump_speed.text_3": "UNLOCALIZED: ...aswell as how quickly fluids are transferred", - "create.ponder.mechanical_pump_speed.text_4": "UNLOCALIZED: Pumps can combine their throughputs within shared pipe networks", - "create.ponder.mechanical_pump_speed.text_5": "UNLOCALIZED: Alternating their orientation can help align their flow directions", + "create.ponder.mechanical_pump_speed.header": "機械幫浦的吞吐量", + "create.ponder.mechanical_pump_speed.text_1": "無論轉速如何,機械幫浦都只能影響相連的 16 個方塊以內的管線", + "create.ponder.mechanical_pump_speed.text_2": "加快旋轉速度會改變液動傳播的速度 ......", + "create.ponder.mechanical_pump_speed.text_3": "...... 以及流體轉移的速度", + "create.ponder.mechanical_pump_speed.text_4": "在同一個管線網路中機械幫浦可以結合他們的吞吐量", + "create.ponder.mechanical_pump_speed.text_5": "改變它們的方向可以對齊它們的流動方向", "create.ponder.mechanical_saw_breaker.header": "使用動力鋸伐木", "create.ponder.mechanical_saw_breaker.text_1": "向其通入動能後,動力鋸可以直接砍伐掉它面前的樹木", @@ -2046,20 +2092,21 @@ "create.ponder.nixie_tube.header": "使用真空管顯示器", "create.ponder.nixie_tube.text_1": "通入紅石訊號後,真空管顯示器會顯示出紅石訊號的強度", "create.ponder.nixie_tube.text_2": "使用命名牌在鐵砧上為其命名,可以自訂它的顯示文本", + "create.ponder.nixie_tube.text_3": "使用染料右鍵點擊可以上色", "create.ponder.piston_pole.header": "活塞延長杆", "create.ponder.piston_pole.text_1": "若無相接的延長杆,動力活塞無法移動其他方塊", "create.ponder.piston_pole.text_2": "在其背面安裝的延長杆長度,決定了活塞的推動範圍", - "create.ponder.portable_fluid_interface.header": "UNLOCALIZED: Contraption Fluid Exchange", - "create.ponder.portable_fluid_interface.text_1": "UNLOCALIZED: Fluid Tanks on moving contraptions cannot be accessed by any pipes", - "create.ponder.portable_fluid_interface.text_2": "UNLOCALIZED: This component can interact with fluid tanks without the need to stop the contraption", - "create.ponder.portable_fluid_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_fluid_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_fluid_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL Tanks on the contraption", - "create.ponder.portable_fluid_interface.text_6": "UNLOCALIZED: Fluid can now be inserted...", - "create.ponder.portable_fluid_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_fluid_interface.text_8": "UNLOCALIZED: After no contents have been exchanged for a while, the contraption will continue on its way", + "create.ponder.portable_fluid_interface.header": "移動式液體口", + "create.ponder.portable_fluid_interface.text_1": "任何管道線都無法與移動裝置上的液體罐連接", + "create.ponder.portable_fluid_interface.text_2": "該元件可以與液體罐相互作用,而無需停止裝置", + "create.ponder.portable_fluid_interface.text_3": "放置第二個,中間間隔 1 或 2 個方塊", + "create.ponder.portable_fluid_interface.text_4": "每當他們擦身而過時,他們就會建立聯繫", + "create.ponder.portable_fluid_interface.text_5": "啟用時,移動式液體口將代表裝置上的『所有』水箱", + "create.ponder.portable_fluid_interface.text_6": "現在可以輸入液體 ......", + "create.ponder.portable_fluid_interface.text_7": "...... 或從裝置中抽取", + "create.ponder.portable_fluid_interface.text_8": "一段時間沒有液體交換後,裝置將繼續前進", "create.ponder.portable_storage_interface.header": "裝置存儲交換", "create.ponder.portable_storage_interface.text_1": "玩家無法與運動裝置內的存儲空間進行互動", @@ -2158,24 +2205,24 @@ "create.ponder.smart_chute.text_3": "使用滑鼠滾輪可以指定被過濾的物品數量", "create.ponder.smart_chute.text_4": "通入紅石訊號,智慧溜槽將會完全暫停工作", - "create.ponder.smart_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Smart Pipes", - "create.ponder.smart_pipe.text_1": "UNLOCALIZED: Smart pipes can help control flows by fluid type", - "create.ponder.smart_pipe.text_2": "UNLOCALIZED: When placed directly at the source, they can specify the type of fluid to extract", - "create.ponder.smart_pipe.text_3": "UNLOCALIZED: Simply Right-Click their filter slot with any item containing the desired fluid", - "create.ponder.smart_pipe.text_4": "UNLOCALIZED: When placed further down a pipe network, smart pipes will only let matching fluids continue", + "create.ponder.smart_pipe.header": "使用智慧液體管道控制液體", + "create.ponder.smart_pipe.text_1": "智慧液體管道可以按照液體類型控制液體流", + "create.ponder.smart_pipe.text_2": "當直接放置在源頭時,他們可以指定要提取的液體類型", + "create.ponder.smart_pipe.text_3": "只需用包含所需液體的任何項目右鍵點擊其過濾槽", + "create.ponder.smart_pipe.text_4": "在管網裡時,智慧液體管道只會讓匹配的液體經過", "create.ponder.speedometer.header": "使用速度計來監測轉速", "create.ponder.speedometer.text_1": "速度計能顯示相接組件的轉速", "create.ponder.speedometer.text_2": "當佩戴MR護目鏡時,可以看到儀表所顯示的更詳細的數據", "create.ponder.speedometer.text_3": "紅石比較器可以根據速度計的數值輸出不同強弱的紅石訊號", - "create.ponder.spout_filling.header": "UNLOCALIZED: Filling Items using a Spout", - "create.ponder.spout_filling.text_1": "UNLOCALIZED: The Spout can fill fluid holding items provided beneath it", - "create.ponder.spout_filling.text_2": "UNLOCALIZED: The content of a Spout cannot be accessed manually", - "create.ponder.spout_filling.text_3": "UNLOCALIZED: Instead, Pipes can be used to supply it with fluids", - "create.ponder.spout_filling.text_4": "UNLOCALIZED: The Input items can be placed on a Depot under the Spout", - "create.ponder.spout_filling.text_5": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.spout_filling.text_6": "UNLOCALIZED: The Spout will hold and process them automatically", + "create.ponder.spout_filling.header": "使用液體灌注器填充物品", + "create.ponder.spout_filling.text_1": "液體灌注器可以填充下方的液體容器", + "create.ponder.spout_filling.text_2": "無法手動接觸液體灌注器中的液體", + "create.ponder.spout_filling.text_3": "管道可用於為其提供液體", + "create.ponder.spout_filling.text_4": "輸入物品可以是掉落狀態或是被放在置物台上", + "create.ponder.spout_filling.text_5": "當物品放在輸送帶上時 ......", + "create.ponder.spout_filling.text_6": "液體灌注器會停下他並且自動填滿", "create.ponder.stabilized_bearings.header": "裝置固定朝向", "create.ponder.stabilized_bearings.text_1": "當動力軸承在結構被帶動時...", @@ -2208,11 +2255,11 @@ "create.ponder.valve_handle.text_4": "潛行右擊可使它順時針旋轉", "create.ponder.valve_handle.text_5": "可以透過染色來美化閥門手輪", - "create.ponder.valve_pipe.header": "UNLOCALIZED: Controlling Fluid flow using Valves", - "create.ponder.valve_pipe.text_1": "UNLOCALIZED: Valve pipes help control fluids propagating through pipe networks", - "create.ponder.valve_pipe.text_2": "UNLOCALIZED: Their shaft input controls whether fluid is currently allowed through", - "create.ponder.valve_pipe.text_3": "UNLOCALIZED: Given Rotational Force in the opening direction, the valve will open up", - "create.ponder.valve_pipe.text_4": "UNLOCALIZED: It can be closed again by reversing the input rotation", + "create.ponder.valve_pipe.header": "使用液體閥門控制液體流量", + "create.ponder.valve_pipe.text_1": "閥門管道有助於控制通過管線網路傳播的液體", + "create.ponder.valve_pipe.text_2": "用轉動輸入控制現在是否允許液體通過", + "create.ponder.valve_pipe.text_3": "打開方向旋轉,液體閥門將會打開", + "create.ponder.valve_pipe.text_4": "反方向的旋轉會關閉閥門", "create.ponder.water_wheel.header": "使用水車產生動能", "create.ponder.water_wheel.text_1": "水車利用臨近的水流來進行應力發生", diff --git a/src/generated/resources/assets/create/models/block/black_nixie_tube.json b/src/generated/resources/assets/create/models/block/black_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/black_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/blue_nixie_tube.json b/src/generated/resources/assets/create/models/block/blue_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/blue_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brown_nixie_tube.json b/src/generated/resources/assets/create/models/block/brown_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brown_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cyan_nixie_tube.json b/src/generated/resources/assets/create/models/block/cyan_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cyan_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gray_nixie_tube.json b/src/generated/resources/assets/create/models/block/gray_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gray_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/green_nixie_tube.json b/src/generated/resources/assets/create/models/block/green_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/green_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/haunted_bell_ceiling.json b/src/generated/resources/assets/create/models/block/haunted_bell_ceiling.json new file mode 100644 index 000000000..8953c2bde --- /dev/null +++ b/src/generated/resources/assets/create/models/block/haunted_bell_ceiling.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/bell_base/block_ceiling" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/haunted_bell_double_wall.json b/src/generated/resources/assets/create/models/block/haunted_bell_double_wall.json new file mode 100644 index 000000000..b3a17b341 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/haunted_bell_double_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/bell_base/block_double_wall" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/haunted_bell_floor.json b/src/generated/resources/assets/create/models/block/haunted_bell_floor.json new file mode 100644 index 000000000..987b55e26 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/haunted_bell_floor.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/bell_base/block_floor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/haunted_bell_single_wall.json b/src/generated/resources/assets/create/models/block/haunted_bell_single_wall.json new file mode 100644 index 000000000..a6bacf266 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/haunted_bell_single_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/bell_base/block_single_wall" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_blue_nixie_tube.json b/src/generated/resources/assets/create/models/block/light_blue_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_blue_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_gray_nixie_tube.json b/src/generated/resources/assets/create/models/block/light_gray_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_gray_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/lime_nixie_tube.json b/src/generated/resources/assets/create/models/block/lime_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/lime_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/magenta_nixie_tube.json b/src/generated/resources/assets/create/models/block/magenta_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/magenta_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/nixie_tube.json b/src/generated/resources/assets/create/models/block/nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/peculiar_bell_ceiling.json b/src/generated/resources/assets/create/models/block/peculiar_bell_ceiling.json new file mode 100644 index 000000000..8953c2bde --- /dev/null +++ b/src/generated/resources/assets/create/models/block/peculiar_bell_ceiling.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/bell_base/block_ceiling" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/peculiar_bell_double_wall.json b/src/generated/resources/assets/create/models/block/peculiar_bell_double_wall.json new file mode 100644 index 000000000..b3a17b341 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/peculiar_bell_double_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/bell_base/block_double_wall" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/peculiar_bell_floor.json b/src/generated/resources/assets/create/models/block/peculiar_bell_floor.json new file mode 100644 index 000000000..987b55e26 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/peculiar_bell_floor.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/bell_base/block_floor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/peculiar_bell_single_wall.json b/src/generated/resources/assets/create/models/block/peculiar_bell_single_wall.json new file mode 100644 index 000000000..a6bacf266 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/peculiar_bell_single_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/bell_base/block_single_wall" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/pink_nixie_tube.json b/src/generated/resources/assets/create/models/block/pink_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/pink_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/purple_nixie_tube.json b/src/generated/resources/assets/create/models/block/purple_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/purple_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/red_nixie_tube.json b/src/generated/resources/assets/create/models/block/red_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/red_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/white_nixie_tube.json b/src/generated/resources/assets/create/models/block/white_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/white_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/yellow_nixie_tube.json b/src/generated/resources/assets/create/models/block/yellow_nixie_tube.json new file mode 100644 index 000000000..79f550f05 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/yellow_nixie_tube.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/nixie_tube/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/clockwork_component.json b/src/generated/resources/assets/create/models/item/creative_blaze_cake.json similarity index 56% rename from src/generated/resources/assets/create/models/item/clockwork_component.json rename to src/generated/resources/assets/create/models/item/creative_blaze_cake.json index 6f6237a26..810fb81b9 100644 --- a/src/generated/resources/assets/create/models/item/clockwork_component.json +++ b/src/generated/resources/assets/create/models/item/creative_blaze_cake.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "create:item/clockwork_component" + "layer0": "create:item/creative_blaze_cake" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cursed_bell.json b/src/generated/resources/assets/create/models/item/cursed_bell.json deleted file mode 100644 index 91c68bdc6..000000000 --- a/src/generated/resources/assets/create/models/item/cursed_bell.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/cursed_bell/item" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/haunted_bell.json b/src/generated/resources/assets/create/models/item/haunted_bell.json new file mode 100644 index 000000000..c0f602bc8 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/haunted_bell.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/haunted_bell" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/incomplete_clockwork_component.json b/src/generated/resources/assets/create/models/item/incomplete_precision_mechanism.json similarity index 51% rename from src/generated/resources/assets/create/models/item/incomplete_clockwork_component.json rename to src/generated/resources/assets/create/models/item/incomplete_precision_mechanism.json index 9dad96684..a8d39ded4 100644 --- a/src/generated/resources/assets/create/models/item/incomplete_clockwork_component.json +++ b/src/generated/resources/assets/create/models/item/incomplete_precision_mechanism.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "create:item/incomplete_clockwork_component" + "layer0": "create:item/incomplete_precision_mechanism" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/peculiar_bell.json b/src/generated/resources/assets/create/models/item/peculiar_bell.json index 686bce88e..4cc9e1942 100644 --- a/src/generated/resources/assets/create/models/item/peculiar_bell.json +++ b/src/generated/resources/assets/create/models/item/peculiar_bell.json @@ -1,3 +1,3 @@ { - "parent": "create:block/peculiar_bell/item" + "parent": "create:block/peculiar_bell" } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/precision_mechanism.json b/src/generated/resources/assets/create/models/item/precision_mechanism.json new file mode 100644 index 000000000..18694533b --- /dev/null +++ b/src/generated/resources/assets/create/models/item/precision_mechanism.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/precision_mechanism" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index 134c2f29f..5e22450ae 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -128,17 +128,30 @@ } ] }, - "cursed_bell_convert": { + "crushing_1": { "sounds": [ - "create:cursed_bell_convert" + { + "name": "minecraft:block.netherrack.hit", + "type": "event" + } ], - "subtitle": "create.subtitle.cursed_bell_convert" + "subtitle": "create.subtitle.crushing_1" }, - "cursed_bell_use": { + "crushing_2": { "sounds": [ - "create:cursed_bell_use" - ], - "subtitle": "create.subtitle.cursed_bell_use" + { + "name": "minecraft:block.gravel.place", + "type": "event" + } + ] + }, + "crushing_3": { + "sounds": [ + { + "name": "minecraft:block.netherite_block.break", + "type": "event" + } + ] }, "deny": { "sounds": [ @@ -199,6 +212,18 @@ ], "subtitle": "create.subtitle.fwoomp" }, + "haunted_bell_convert": { + "sounds": [ + "create:haunted_bell_convert" + ], + "subtitle": "create.subtitle.haunted_bell_convert" + }, + "haunted_bell_use": { + "sounds": [ + "create:haunted_bell_use" + ], + "subtitle": "create.subtitle.haunted_bell_use" + }, "mechanical_press_activation": { "sounds": [ { diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index 59a86f429..d723cbe38 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:large_cogwheel", - "create:cogwheel" + "create:cogwheel", + "create:large_cogwheel" ] } }, diff --git a/src/generated/resources/data/create/advancements/clockwork_component_eob.json b/src/generated/resources/data/create/advancements/clockwork_component_eob.json index fb730aff8..667bb88c4 100644 --- a/src/generated/resources/data/create/advancements/clockwork_component_eob.json +++ b/src/generated/resources/data/create/advancements/clockwork_component_eob.json @@ -1,5 +1,5 @@ { - "parent": "create:clockwork_component", + "parent": "create:precision_mechanism", "display": { "icon": { "item": "minecraft:oak_sapling" @@ -21,7 +21,7 @@ "conditions": { "items": [ { - "item": "create:clockwork_component" + "item": "create:precision_mechanism" } ] } diff --git a/src/generated/resources/data/create/advancements/extendo_grip.json b/src/generated/resources/data/create/advancements/extendo_grip.json index 94a9af017..bb4882b2b 100644 --- a/src/generated/resources/data/create/advancements/extendo_grip.json +++ b/src/generated/resources/data/create/advancements/extendo_grip.json @@ -1,5 +1,5 @@ { - "parent": "create:clockwork_component", + "parent": "create:precision_mechanism", "display": { "icon": { "item": "create:extendo_grip", diff --git a/src/generated/resources/data/create/advancements/potato_cannon.json b/src/generated/resources/data/create/advancements/potato_cannon.json index eccdc4cfb..9e1da2e5e 100644 --- a/src/generated/resources/data/create/advancements/potato_cannon.json +++ b/src/generated/resources/data/create/advancements/potato_cannon.json @@ -1,5 +1,5 @@ { - "parent": "create:clockwork_component", + "parent": "create:precision_mechanism", "display": { "icon": { "item": "create:potato_cannon", diff --git a/src/generated/resources/data/create/advancements/clockwork_component.json b/src/generated/resources/data/create/advancements/precision_mechanism.json similarity index 66% rename from src/generated/resources/data/create/advancements/clockwork_component.json rename to src/generated/resources/data/create/advancements/precision_mechanism.json index 0acda4115..a39f61f11 100644 --- a/src/generated/resources/data/create/advancements/clockwork_component.json +++ b/src/generated/resources/data/create/advancements/precision_mechanism.json @@ -2,13 +2,13 @@ "parent": "create:deployer", "display": { "icon": { - "item": "create:clockwork_component" + "item": "create:precision_mechanism" }, "title": { - "translate": "advancement.create.clockwork_component" + "translate": "advancement.create.precision_mechanism" }, "description": { - "translate": "advancement.create.clockwork_component.desc" + "translate": "advancement.create.precision_mechanism.desc" }, "frame": "task", "show_toast": true, @@ -21,7 +21,7 @@ "conditions": { "items": [ { - "item": "create:clockwork_component" + "item": "create:precision_mechanism" } ] } diff --git a/src/generated/resources/data/create/advancements/speed_controller.json b/src/generated/resources/data/create/advancements/speed_controller.json index b3cf5f1f0..38632e7d1 100644 --- a/src/generated/resources/data/create/advancements/speed_controller.json +++ b/src/generated/resources/data/create/advancements/speed_controller.json @@ -1,5 +1,5 @@ { - "parent": "create:clockwork_component", + "parent": "create:precision_mechanism", "display": { "icon": { "item": "create:rotation_speed_controller" diff --git a/src/generated/resources/data/create/loot_tables/blocks/cursed_bell.json b/src/generated/resources/data/create/loot_tables/blocks/black_nixie_tube.json similarity index 87% rename from src/generated/resources/data/create/loot_tables/blocks/cursed_bell.json rename to src/generated/resources/data/create/loot_tables/blocks/black_nixie_tube.json index ce719523e..68e7a85d0 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/cursed_bell.json +++ b/src/generated/resources/data/create/loot_tables/blocks/black_nixie_tube.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:cursed_bell" + "name": "create:nixie_tube" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/blue_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/blue_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/blue_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brown_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/brown_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brown_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json b/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json index b5466bfc9..d1903f132 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json +++ b/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json @@ -21,6 +21,17 @@ "op": "replace" } ] + }, + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "Enchantments", + "target": "Enchantments", + "op": "replace" + } + ] } ], "name": "create:copper_backtank" diff --git a/src/generated/resources/data/create/loot_tables/blocks/cyan_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/cyan_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/cyan_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/gray_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/gray_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/gray_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/green_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/green_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/green_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/haunted_bell.json b/src/generated/resources/data/create/loot_tables/blocks/haunted_bell.json new file mode 100644 index 000000000..ec8bd3826 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/haunted_bell.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:haunted_bell" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_blue_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/light_blue_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_blue_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_gray_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/light_gray_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_gray_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/lime_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/lime_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/lime_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/magenta_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/magenta_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/magenta_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/pink_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/pink_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/pink_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/purple_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/purple_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/purple_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/red_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/red_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/red_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/white_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/white_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/white_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/yellow_nixie_tube.json b/src/generated/resources/data/create/loot_tables/blocks/yellow_nixie_tube.json new file mode 100644 index 000000000..68e7a85d0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/yellow_nixie_tube.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:nixie_tube" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_arm.json b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_arm.json index 2b924aa87..5a64f5c23 100644 --- a/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_arm.json +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/mechanical_arm.json @@ -10,7 +10,7 @@ "tag": "forge:plates/brass" }, "I": { - "item": "create:clockwork_component" + "item": "create:precision_mechanism" }, "A": { "item": "create:andesite_alloy" diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/rotation_speed_controller.json b/src/generated/resources/data/create/recipes/crafting/kinetics/rotation_speed_controller.json index ad8bfbdff..76a4949f5 100644 --- a/src/generated/resources/data/create/recipes/crafting/kinetics/rotation_speed_controller.json +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/rotation_speed_controller.json @@ -6,7 +6,7 @@ ], "key": { "B": { - "item": "create:clockwork_component" + "item": "create:precision_mechanism" }, "C": { "item": "create:brass_casing" diff --git a/src/generated/resources/data/create/recipes/mechanical_crafting/extendo_grip.json b/src/generated/resources/data/create/recipes/mechanical_crafting/extendo_grip.json index 3973118fd..c7fc84b1c 100644 --- a/src/generated/resources/data/create/recipes/mechanical_crafting/extendo_grip.json +++ b/src/generated/resources/data/create/recipes/mechanical_crafting/extendo_grip.json @@ -12,7 +12,7 @@ "tag": "forge:ingots/brass" }, "R": { - "item": "create:clockwork_component" + "item": "create:precision_mechanism" }, "H": { "item": "create:brass_hand" diff --git a/src/generated/resources/data/create/recipes/mechanical_crafting/potato_cannon.json b/src/generated/resources/data/create/recipes/mechanical_crafting/potato_cannon.json index 0a5b41b44..fffb05d24 100644 --- a/src/generated/resources/data/create/recipes/mechanical_crafting/potato_cannon.json +++ b/src/generated/resources/data/create/recipes/mechanical_crafting/potato_cannon.json @@ -1,20 +1,20 @@ { "type": "create:mechanical_crafting", "pattern": [ - "L", - "R", - "S", - "S", - "S" + "LRSSS", + "CC " ], "key": { "L": { "item": "create:andesite_alloy" }, "R": { - "item": "create:clockwork_component" + "item": "create:precision_mechanism" }, "S": { + "item": "create:fluid_pipe" + }, + "C": { "tag": "forge:ingots/copper" } }, diff --git a/src/generated/resources/data/create/recipes/sequenced_assembly/cogwheel.json b/src/generated/resources/data/create/recipes/sequenced_assembly/cogwheel.json new file mode 100644 index 000000000..3815a5bdc --- /dev/null +++ b/src/generated/resources/data/create/recipes/sequenced_assembly/cogwheel.json @@ -0,0 +1,65 @@ +{ + "type": "create:sequenced_assembly", + "ingredient": { + "item": "create:andesite_alloy" + }, + "transitionalItem": { + "item": "create:incomplete_cogwheel" + }, + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "create:incomplete_cogwheel" + }, + { + "tag": "minecraft:wooden_buttons" + } + ], + "results": [ + { + "item": "create:incomplete_cogwheel" + } + ] + }, + { + "type": "create:cutting", + "ingredients": [ + { + "item": "create:incomplete_cogwheel" + } + ], + "results": [ + { + "item": "create:incomplete_cogwheel" + } + ], + "processingTime": 50 + } + ], + "results": [ + { + "item": "create:cogwheel", + "count": 12, + "chance": 32.0 + }, + { + "item": "create:andesite_alloy", + "chance": 2.0 + }, + { + "item": "minecraft:andesite" + }, + { + "item": "create:large_cogwheel" + }, + { + "item": "minecraft:stick" + }, + { + "item": "minecraft:iron_nugget" + } + ], + "loops": 4 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/sequenced_assembly/large_cogwheel.json b/src/generated/resources/data/create/recipes/sequenced_assembly/large_cogwheel.json new file mode 100644 index 000000000..6c80cc515 --- /dev/null +++ b/src/generated/resources/data/create/recipes/sequenced_assembly/large_cogwheel.json @@ -0,0 +1,81 @@ +{ + "type": "create:sequenced_assembly", + "ingredient": { + "item": "create:andesite_alloy" + }, + "transitionalItem": { + "item": "create:incomplete_large_cogwheel" + }, + "sequence": [ + { + "type": "create:deploying", + "ingredients": [ + { + "item": "create:incomplete_large_cogwheel" + }, + { + "tag": "minecraft:planks" + } + ], + "results": [ + { + "item": "create:incomplete_large_cogwheel" + } + ] + }, + { + "type": "create:deploying", + "ingredients": [ + { + "item": "create:incomplete_large_cogwheel" + }, + { + "tag": "minecraft:wooden_buttons" + } + ], + "results": [ + { + "item": "create:incomplete_large_cogwheel" + } + ] + }, + { + "type": "create:cutting", + "ingredients": [ + { + "item": "create:incomplete_large_cogwheel" + } + ], + "results": [ + { + "item": "create:incomplete_large_cogwheel" + } + ], + "processingTime": 50 + } + ], + "results": [ + { + "item": "create:large_cogwheel", + "count": 6, + "chance": 32.0 + }, + { + "item": "create:andesite_alloy", + "chance": 2.0 + }, + { + "item": "minecraft:andesite" + }, + { + "item": "create:cogwheel" + }, + { + "item": "minecraft:stick" + }, + { + "item": "minecraft:iron_nugget" + } + ], + "loops": 3 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/sequenced_assembly/clockwork_component.json b/src/generated/resources/data/create/recipes/sequenced_assembly/precision_mechanism.json similarity index 53% rename from src/generated/resources/data/create/recipes/sequenced_assembly/clockwork_component.json rename to src/generated/resources/data/create/recipes/sequenced_assembly/precision_mechanism.json index a48decec0..c130de722 100644 --- a/src/generated/resources/data/create/recipes/sequenced_assembly/clockwork_component.json +++ b/src/generated/resources/data/create/recipes/sequenced_assembly/precision_mechanism.json @@ -4,14 +4,14 @@ "tag": "forge:plates/gold" }, "transitionalItem": { - "item": "create:incomplete_clockwork_component" + "item": "create:incomplete_precision_mechanism" }, "sequence": [ { "type": "create:deploying", "ingredients": [ { - "item": "create:incomplete_clockwork_component" + "item": "create:incomplete_precision_mechanism" }, { "item": "create:cogwheel" @@ -19,7 +19,7 @@ ], "results": [ { - "item": "create:incomplete_clockwork_component" + "item": "create:incomplete_precision_mechanism" } ] }, @@ -27,7 +27,7 @@ "type": "create:deploying", "ingredients": [ { - "item": "create:incomplete_clockwork_component" + "item": "create:incomplete_precision_mechanism" }, { "item": "create:large_cogwheel" @@ -35,7 +35,7 @@ ], "results": [ { - "item": "create:incomplete_clockwork_component" + "item": "create:incomplete_precision_mechanism" } ] }, @@ -43,7 +43,7 @@ "type": "create:deploying", "ingredients": [ { - "item": "create:incomplete_clockwork_component" + "item": "create:incomplete_precision_mechanism" }, { "tag": "forge:nuggets/iron" @@ -51,26 +51,45 @@ ], "results": [ { - "item": "create:incomplete_clockwork_component" + "item": "create:incomplete_precision_mechanism" } ] } ], "results": [ { - "item": "create:clockwork_component", - "chance": 12.0 + "item": "create:precision_mechanism", + "chance": 120.0 }, { "item": "create:golden_sheet", - "chance": 2.0 + "chance": 8.0 }, { "item": "create:andesite_alloy", + "chance": 8.0 + }, + { + "item": "create:cogwheel", + "chance": 5.0 + }, + { + "item": "create:shaft", "chance": 2.0 }, { - "item": "create:cogwheel" + "item": "create:crushed_gold_ore", + "chance": 2.0 + }, + { + "item": "minecraft:gold_nugget", + "chance": 2.0 + }, + { + "item": "minecraft:iron_ingot" + }, + { + "item": "minecraft:clock" } ], "loops": 5 diff --git a/src/generated/resources/data/create/tags/blocks/brittle.json b/src/generated/resources/data/create/tags/blocks/brittle.json index 9372a9a4f..4cc8d6e48 100644 --- a/src/generated/resources/data/create/tags/blocks/brittle.json +++ b/src/generated/resources/data/create/tags/blocks/brittle.json @@ -25,7 +25,7 @@ "create:furnace_engine", "create:redstone_link", "create:peculiar_bell", - "create:cursed_bell", + "create:haunted_bell", "#minecraft:doors", "#minecraft:beds", "minecraft:flower_pot", diff --git a/src/generated/resources/data/create/tags/items/upright_on_belt.json b/src/generated/resources/data/create/tags/items/upright_on_belt.json index 0aa3286d8..1f236d151 100644 --- a/src/generated/resources/data/create/tags/items/upright_on_belt.json +++ b/src/generated/resources/data/create/tags/items/upright_on_belt.json @@ -3,6 +3,7 @@ "values": [ "create:blaze_cake_base", "create:blaze_cake", + "create:creative_blaze_cake", "create:builders_tea", "minecraft:glass_bottle", "minecraft:potion", diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index c198f1bc3..8fb10077e 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -93,8 +93,8 @@ public class AllBlockPartials { SPOUT_TOP = get("spout/top"), SPOUT_MIDDLE = get("spout/middle"), SPOUT_BOTTOM = get("spout/bottom"), - PECULIAR_BELL = get("peculiar_bell/bell"), - CURSED_BELL = get("cursed_bell/bell"), + PECULIAR_BELL = get("peculiar_bell"), + HAUNTED_BELL = get("haunted_bell"), SPEED_CONTROLLER_BRACKET = get("rotation_speed_controller/bracket"), @@ -127,14 +127,14 @@ public class AllBlockPartials { Map map = new HashMap<>(); for (Direction d : Iterate.directions) { String asId = Lang.asId(type.name()); - map.put(d, get("fluid_pipe/" + asId + "/" + Lang.asId(d.getString()))); + map.put(d, get("fluid_pipe/" + asId + "/" + Lang.asId(d.getSerializedName()))); } PIPE_ATTACHMENTS.put(type, map); } for (BlazeBurnerBlock.HeatLevel heat : BlazeBurnerBlock.HeatLevel.values()) { if (heat == BlazeBurnerBlock.HeatLevel.NONE) continue; - BLAZES.put(heat, get("blaze_burner/blaze/" + heat.getString())); + BLAZES.put(heat, get("blaze_burner/blaze/" + heat.getSerializedName())); } } diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 5a7c66cd7..9cde1a86d 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -13,6 +13,7 @@ import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.AllSections; import com.simibubi.create.content.contraptions.base.CasingBlock; +import com.simibubi.create.content.contraptions.components.AssemblyOperatorBlockItem; import com.simibubi.create.content.contraptions.components.actors.BellMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.DrillBlock; import com.simibubi.create.content.contraptions.components.actors.DrillMovementBehaviour; @@ -40,7 +41,6 @@ import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBloc import com.simibubi.create.content.contraptions.components.flywheel.FlywheelGenerator; import com.simibubi.create.content.contraptions.components.flywheel.engine.FurnaceEngineBlock; import com.simibubi.create.content.contraptions.components.millstone.MillstoneBlock; -import com.simibubi.create.content.contraptions.components.mixer.BasinOperatorBlockItem; import com.simibubi.create.content.contraptions.components.mixer.MechanicalMixerBlock; import com.simibubi.create.content.contraptions.components.motor.CreativeMotorBlock; import com.simibubi.create.content.contraptions.components.motor.CreativeMotorGenerator; @@ -115,8 +115,8 @@ import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock; import com.simibubi.create.content.contraptions.relays.gauge.GaugeGenerator; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock; import com.simibubi.create.content.curiosities.armor.CopperBacktankBlock; -import com.simibubi.create.content.curiosities.bell.CursedBellBlock; -import com.simibubi.create.content.curiosities.bell.CursedBellMovementBehaviour; +import com.simibubi.create.content.curiosities.bell.HauntedBellBlock; +import com.simibubi.create.content.curiosities.bell.HauntedBellMovementBehaviour; import com.simibubi.create.content.curiosities.bell.PeculiarBellBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelBlock; @@ -221,14 +221,14 @@ public class AllBlocks { .initialProperties(() -> Blocks.DISPENSER) .blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.partialBaseModel(ctx, prov))) .loot((lt, block) -> { - Builder builder = LootTable.builder(); - IBuilder survivesExplosion = SurvivesExplosion.builder(); - lt.registerLootTable(block, builder.addLootPool(LootPool.builder() - .acceptCondition(survivesExplosion) - .rolls(ConstantRange.of(1)) - .addEntry(ItemLootEntry.builder(AllBlocks.SCHEMATICANNON.get().asItem()) - .acceptFunction(CopyNbt.func_215881_a(CopyNbt.Source.BLOCK_ENTITY) - .func_216056_a("Options", "BlockEntityTag.Options"))))); + Builder builder = LootTable.lootTable(); + IBuilder survivesExplosion = SurvivesExplosion.survivesExplosion(); + lt.add(block, builder.withPool(LootPool.lootPool() + .when(survivesExplosion) + .setRolls(ConstantRange.exactly(1)) + .add(ItemLootEntry.lootTableItem(AllBlocks.SCHEMATICANNON.get().asItem()) + .apply(CopyNbt.copyData(CopyNbt.Source.BLOCK_ENTITY) + .copy("Options", "BlockEntityTag.Options"))))); }) .item() .transform(customItemModel()) @@ -289,11 +289,11 @@ public class AllBlocks { public static final BlockEntry GEARBOX = REGISTRATE.block("gearbox", GearboxBlock::new) .initialProperties(SharedProperties::stone) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .transform(StressConfigDefaults.setNoImpact()) .onRegister(CreateRegistrate.connectedTextures(new EncasedCTBehaviour(AllSpriteShifts.ANDESITE_CASING))) .onRegister(CreateRegistrate.casingConnectivity((block, cc) -> cc.make(block, AllSpriteShifts.ANDESITE_CASING, - (s, f) -> f.getAxis() == s.get(GearboxBlock.AXIS)))) + (s, f) -> f.getAxis() == s.getValue(GearboxBlock.AXIS)))) .blockstate((c, p) -> axisBlock(c, p, $ -> AssetLookup.partialBaseModel(c, p), true)) .item() .transform(customItemModel()) @@ -301,7 +301,7 @@ public class AllBlocks { public static final BlockEntry CLUTCH = REGISTRATE.block("clutch", ClutchBlock::new) .initialProperties(SharedProperties::stone) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .transform(StressConfigDefaults.setNoImpact()) .blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p))) .item() @@ -310,7 +310,7 @@ public class AllBlocks { public static final BlockEntry GEARSHIFT = REGISTRATE.block("gearshift", GearshiftBlock::new) .initialProperties(SharedProperties::stone) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .transform(StressConfigDefaults.setNoImpact()) .blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p))) .item() @@ -320,7 +320,7 @@ public class AllBlocks { public static final BlockEntry ENCASED_CHAIN_DRIVE = REGISTRATE.block("encased_chain_drive", EncasedBeltBlock::new) .initialProperties(SharedProperties::stone) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .transform(StressConfigDefaults.setNoImpact()) .blockstate((c, p) -> new EncasedBeltGenerator((state, suffix) -> p.models() .getExistingFile(p.modLoc("block/" + c.getName() + "/" + suffix))).generate(c, p)) @@ -331,10 +331,10 @@ public class AllBlocks { public static final BlockEntry ADJUSTABLE_CHAIN_GEARSHIFT = REGISTRATE.block("adjustable_chain_gearshift", AdjustablePulleyBlock::new) .initialProperties(SharedProperties::stone) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .transform(StressConfigDefaults.setNoImpact()) .blockstate((c, p) -> new EncasedBeltGenerator((state, suffix) -> { - String powered = state.get(AdjustablePulleyBlock.POWERED) ? "_powered" : ""; + String powered = state.getValue(AdjustablePulleyBlock.POWERED) ? "_powered" : ""; return p.models() .withExistingParent(c.getName() + "_" + suffix + powered, p.modLoc("block/encased_chain_drive/" + suffix)) @@ -347,9 +347,9 @@ public class AllBlocks { .register(); public static final BlockEntry BELT = REGISTRATE.block("belt", BeltBlock::new) - .initialProperties(SharedProperties.beltMaterial, MaterialColor.GRAY) - .properties(p -> p.sound(SoundType.CLOTH)) - .properties(p -> p.hardnessAndResistance(0.8F)) + .initialProperties(SharedProperties.beltMaterial, MaterialColor.COLOR_GRAY) + .properties(p -> p.sound(SoundType.WOOL)) + .properties(p -> p.strength(0.8F)) .blockstate(new BeltGenerator()::generate) .transform(StressConfigDefaults.setImpact(1.0)) .onRegister(CreateRegistrate.blockModel(() -> BeltModel::new)) @@ -368,9 +368,9 @@ public class AllBlocks { public static final BlockEntry WATER_WHEEL = REGISTRATE.block("water_wheel", WaterWheelBlock::new) .initialProperties(SharedProperties::wooden) - .properties(AbstractBlock.Properties::nonOpaque) - .blockstate(BlockStateGen.horizontalWheelProvider(false)) - .addLayer(() -> RenderType::getCutoutMipped) + .properties(AbstractBlock.Properties::noOcclusion) + .blockstate(BlockStateGen.directionalBlockProviderIgnoresWaterlogged(false)) + .addLayer(() -> RenderType::cutoutMipped) .transform(StressConfigDefaults.setCapacity(16.0)) .simpleItem() .register(); @@ -378,7 +378,7 @@ public class AllBlocks { public static final BlockEntry ENCASED_FAN = REGISTRATE.block("encased_fan", EncasedFanBlock::new) .initialProperties(SharedProperties::stone) .blockstate(BlockStateGen.directionalBlockProvider(true)) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .transform(StressConfigDefaults.setCapacity(16.0)) .transform(StressConfigDefaults.setImpact(2.0)) .item() @@ -389,7 +389,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .tag(AllBlockTags.BRITTLE.tag) .blockstate(BlockStateGen.directionalBlockProvider(true)) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .item() .transform(customItemModel()) .register(); @@ -434,9 +434,9 @@ public class AllBlocks { public static final BlockEntry CRUSHING_WHEEL = REGISTRATE.block("crushing_wheel", CrushingWheelBlock::new) .initialProperties(SharedProperties::stone) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(BlockStateGen.axisBlockProvider(false)) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .transform(StressConfigDefaults.setImpact(8.0)) .simpleItem() .register(); @@ -454,27 +454,27 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_PRESS = REGISTRATE.block("mechanical_press", MechanicalPressBlock::new) .initialProperties(SharedProperties::stone) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(BlockStateGen.horizontalBlockProvider(true)) .transform(StressConfigDefaults.setImpact(8.0)) - .item(BasinOperatorBlockItem::new) + .item(AssemblyOperatorBlockItem::new) .transform(customItemModel()) .register(); public static final BlockEntry MECHANICAL_MIXER = REGISTRATE.block("mechanical_mixer", MechanicalMixerBlock::new) .initialProperties(SharedProperties::stone) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .transform(StressConfigDefaults.setImpact(4.0)) - .item(BasinOperatorBlockItem::new) + .item(AssemblyOperatorBlockItem::new) .transform(customItemModel()) .register(); public static final BlockEntry BASIN = REGISTRATE.block("basin", BasinBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.sound(SoundType.NETHERITE)) + .properties(p -> p.sound(SoundType.NETHERITE_BLOCK)) .blockstate(new BasinGenerator()::generate) .onRegister(addMovementBehaviour(new BasinMovementBehaviour())) .item() @@ -484,10 +484,10 @@ public class AllBlocks { public static final BlockEntry BLAZE_BURNER = REGISTRATE.block("blaze_burner", BlazeBurnerBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.luminance($ -> 12)) - .addLayer(() -> RenderType::getCutoutMipped) + .properties(p -> p.lightLevel(BlazeBurnerBlock::getLight)) + .addLayer(() -> RenderType::cutoutMipped) .tag(AllBlockTags.FAN_TRANSPARENT.tag, AllBlockTags.FAN_HEATERS.tag) - .loot((lt, block) -> lt.registerLootTable(block, BlazeBurnerBlock.buildLootTable())) + .loot((lt, block) -> lt.add(block, BlazeBurnerBlock.buildLootTable())) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .item(BlazeBurnerBlockItem::withBlaze) .model(AssetLookup.customBlockItemModel("blaze_burner", "block_with_blaze")) @@ -497,12 +497,16 @@ public class AllBlocks { public static final BlockEntry LIT_BLAZE_BURNER = REGISTRATE.block("lit_blaze_burner", LitBlazeBurnerBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.luminance($ -> 12)) - .addLayer(() -> RenderType::getCutoutMipped) + .properties(p -> p.lightLevel(LitBlazeBurnerBlock::getLight)) + .addLayer(() -> RenderType::cutoutMipped) .tag(AllBlockTags.FAN_TRANSPARENT.tag, AllBlockTags.FAN_HEATERS.tag) - .loot((lt, block) -> lt.registerDropping(block, AllItems.EMPTY_BLAZE_BURNER.get())) - .blockstate((c, p) -> p.simpleBlock(c.getEntry(), p.models() - .getExistingFile(p.modLoc("block/blaze_burner/block_with_fire")))) + .loot((lt, block) -> lt.dropOther(block, AllItems.EMPTY_BLAZE_BURNER.get())) + .blockstate((c, p) -> p.getVariantBuilder(c.get()).forAllStates(state -> + ConfiguredModel.builder() + .modelFile(p.models().getExistingFile(p.modLoc( + "block/blaze_burner/" + (state.getValue(LitBlazeBurnerBlock.FLAME_TYPE) == LitBlazeBurnerBlock.FlameType.SOUL ? "block_with_soul_fire" : "block_with_fire") + ))) + .build())) .register(); public static final BlockEntry DEPOT = REGISTRATE.block("depot", DepotBlock::new) @@ -515,7 +519,7 @@ public class AllBlocks { public static final BlockEntry WEIGHTED_EJECTOR = REGISTRATE.block("weighted_ejector", EjectorBlock::new) .initialProperties(SharedProperties::stone) - .properties(Block.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate((c, p) -> p.horizontalBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p), 180)) .transform(StressConfigDefaults.setImpact(2.0)) .item(EjectorItem::new) @@ -524,8 +528,8 @@ public class AllBlocks { public static final BlockEntry CHUTE = REGISTRATE.block("chute", ChuteBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.sound(SoundType.NETHERITE)) - .addLayer(() -> RenderType::getCutoutMipped) + .properties(p -> p.sound(SoundType.NETHERITE_BLOCK)) + .addLayer(() -> RenderType::cutoutMipped) .blockstate(new ChuteGenerator()::generate) .item(ChuteItem::new) .transform(customItemModel("_", "block")) @@ -533,7 +537,7 @@ public class AllBlocks { public static final BlockEntry SMART_CHUTE = REGISTRATE.block("smart_chute", SmartChuteBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.sound(SoundType.NETHERITE)) + .properties(p -> p.sound(SoundType.NETHERITE_BLOCK)) .blockstate((c, p) -> BlockStateGen.simpleBlock(c, p, AssetLookup.forPowered(c, p))) .item() .transform(customItemModel("_", "block")) @@ -580,23 +584,23 @@ public class AllBlocks { public static final BlockEntry ENCASED_FLUID_PIPE = REGISTRATE.block("encased_fluid_pipe", EncasedPipeBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(Block.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(BlockStateGen.encasedPipe()) .onRegister(CreateRegistrate.connectedTextures(new EncasedCTBehaviour(AllSpriteShifts.COPPER_CASING))) .onRegister(CreateRegistrate.casingConnectivity((block, cc) -> cc.make(block, AllSpriteShifts.COPPER_CASING, - (s, f) -> !s.get(EncasedPipeBlock.FACING_TO_PROPERTY_MAP.get(f))))) + (s, f) -> !s.getValue(EncasedPipeBlock.FACING_TO_PROPERTY_MAP.get(f))))) .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) - .loot((p, b) -> p.registerDropping(b, FLUID_PIPE.get())) + .loot((p, b) -> p.dropOther(b, FLUID_PIPE.get())) .register(); public static final BlockEntry GLASS_FLUID_PIPE = REGISTRATE.block("glass_fluid_pipe", GlassFluidPipeBlock::new) .initialProperties(SharedProperties::softMetal) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .blockstate((c, p) -> BlockStateGen.axisBlock(c, p, s -> p.models() - .getExistingFile(p.modLoc("block/fluid_pipe/window" + (s.get(GlassFluidPipeBlock.ALT) ? "_alt" : ""))))) + .getExistingFile(p.modLoc("block/fluid_pipe/window" + (s.getValue(GlassFluidPipeBlock.ALT) ? "_alt" : ""))))) .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) - .loot((p, b) -> p.registerDropping(b, FLUID_PIPE.get())) + .loot((p, b) -> p.dropOther(b, FLUID_PIPE.get())) .register(); public static final BlockEntry MECHANICAL_PUMP = REGISTRATE.block("mechanical_pump", PumpBlock::new) @@ -621,7 +625,7 @@ public class AllBlocks { .initialProperties(SharedProperties::softMetal) .blockstate((c, p) -> BlockStateGen.directionalAxisBlock(c, p, (state, vertical) -> AssetLookup.partialBaseModel(c, p, vertical ? "vertical" : "horizontal", - state.get(FluidValveBlock.ENABLED) ? "open" : "closed"))) + state.getValue(FluidValveBlock.ENABLED) ? "open" : "closed"))) .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) .item() .transform(customItemModel()) @@ -633,25 +637,25 @@ public class AllBlocks { .register(); public static final DyedBlockList DYED_VALVE_HANDLES = new DyedBlockList<>(colour -> { - String colourName = colour.getString(); + String colourName = colour.getSerializedName(); return REGISTRATE.block(colourName + "_valve_handle", ValveHandleBlock::dyed) .transform(BuilderTransformers.valveHandle(colour)) - .recipe((c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get()) - .patternLine("#") - .patternLine("-") - .key('#', DyeHelper.getTagOfDye(colour)) - .key('-', AllItemTags.VALVE_HANDLES.tag) - .addCriterion("has_valve", RegistrateRecipeProvider.hasItem(AllItemTags.VALVE_HANDLES.tag)) - .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_valve_handle"))) + .recipe((c, p) -> ShapedRecipeBuilder.shaped(c.get()) + .pattern("#") + .pattern("-") + .define('#', DyeHelper.getTagOfDye(colour)) + .define('-', AllItemTags.VALVE_HANDLES.tag) + .unlockedBy("has_valve", RegistrateRecipeProvider.hasItem(AllItemTags.VALVE_HANDLES.tag)) + .save(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_valve_handle"))) .register(); }); public static final BlockEntry FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::regular) .initialProperties(SharedProperties::softMetal) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(new FluidTankGenerator()::generate) .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::standard)) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .item(FluidTankItem::new) .model(AssetLookup.customBlockItemModel("_", "block_single_window")) .build() @@ -661,10 +665,10 @@ public class AllBlocks { REGISTRATE.block("creative_fluid_tank", FluidTankBlock::creative) .initialProperties(SharedProperties::softMetal) .tag(AllBlockTags.SAFE_NBT.tag) - .properties(Block.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(new FluidTankGenerator("creative_")::generate) .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::creative)) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .item(FluidTankItem::new) .properties(p -> p.rarity(Rarity.EPIC)) .model((c, p) -> p.withExistingParent(c.getName(), p.modLoc("block/fluid_tank/block_single_window")) @@ -684,7 +688,7 @@ public class AllBlocks { public static final BlockEntry ITEM_DRAIN = REGISTRATE.block("item_drain", ItemDrainBlock::new) .initialProperties(SharedProperties::softMetal) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .blockstate((c, p) -> p.simpleBlock(c.get(), AssetLookup.standardModel(c, p))) .simpleItem() .register(); @@ -692,8 +696,8 @@ public class AllBlocks { public static final BlockEntry SPOUT = REGISTRATE.block("spout", SpoutBlock::new) .initialProperties(SharedProperties::softMetal) .blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.partialBaseModel(ctx, prov))) - .addLayer(() -> RenderType::getCutoutMipped) - .item(BasinOperatorBlockItem::new) + .addLayer(() -> RenderType::cutoutMipped) + .item(AssemblyOperatorBlockItem::new) .transform(customItemModel()) .register(); @@ -730,16 +734,16 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_PISTON_HEAD = REGISTRATE.block("mechanical_piston_head", MechanicalPistonHeadBlock::new) .initialProperties(() -> Blocks.PISTON_HEAD) - .loot((p, b) -> p.registerDropping(b, PISTON_EXTENSION_POLE.get())) + .loot((p, b) -> p.dropOther(b, PISTON_EXTENSION_POLE.get())) .blockstate((c, p) -> BlockStateGen.directionalBlockIgnoresWaterlogged(c, p, state -> p.models() - .getExistingFile(p.modLoc("block/mechanical_piston/" + state.get(MechanicalPistonHeadBlock.TYPE) - .getString() + "/head")))) + .getExistingFile(p.modLoc("block/mechanical_piston/" + state.getValue(MechanicalPistonHeadBlock.TYPE) + .getSerializedName() + "/head")))) .register(); public static final BlockEntry GANTRY_CARRIAGE = REGISTRATE.block("gantry_carriage", GantryCarriageBlock::new) .initialProperties(SharedProperties::stone) - .properties(Block.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(BlockStateGen.directionalAxisBlockProvider()) .item() .transform(customItemModel()) @@ -749,11 +753,11 @@ public class AllBlocks { REGISTRATE.block("gantry_shaft", GantryShaftBlock::new) .initialProperties(SharedProperties::stone) .blockstate((c, p) -> p.directionalBlock(c.get(), s -> { - boolean isPowered = s.get(GantryShaftBlock.POWERED); - boolean isFlipped = s.get(GantryShaftBlock.FACING) + boolean isPowered = s.getValue(GantryShaftBlock.POWERED); + boolean isFlipped = s.getValue(GantryShaftBlock.FACING) .getAxisDirection() == AxisDirection.NEGATIVE; - String partName = s.get(GantryShaftBlock.PART) - .getString(); + String partName = s.getValue(GantryShaftBlock.PART) + .getSerializedName(); String flipped = isFlipped ? "_flipped" : ""; String powered = isPowered ? "_powered" : ""; ModelFile existing = AssetLookup.partialBaseModel(c, p, partName); @@ -800,9 +804,9 @@ public class AllBlocks { .register(); public static final BlockEntry ROPE = REGISTRATE.block("rope", PulleyBlock.RopeBlock::new) - .initialProperties(SharedProperties.beltMaterial, MaterialColor.BROWN) + .initialProperties(SharedProperties.beltMaterial, MaterialColor.COLOR_BROWN) .tag(AllBlockTags.BRITTLE.tag) - .properties(p -> p.sound(SoundType.CLOTH)) + .properties(p -> p.sound(SoundType.WOOL)) .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() .getExistingFile(p.modLoc("block/rope_pulley/" + c.getName())))) .register(); @@ -818,9 +822,9 @@ public class AllBlocks { public static final BlockEntry CART_ASSEMBLER = REGISTRATE.block("cart_assembler", CartAssemblerBlock::new) .initialProperties(SharedProperties::stone) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(BlockStateGen.cartAssembler()) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .tag(BlockTags.RAILS, AllBlockTags.SAFE_NBT.tag) .item(CartAssemblerBlockItem::new) .transform(customItemModel()) @@ -829,9 +833,9 @@ public class AllBlocks { public static final BlockEntry REINFORCED_RAIL = REGISTRATE.block("reinforced_rail", ReinforcedRailBlock::new) .initialProperties(SharedProperties::stone) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(BlockStateGen.reinforcedRail()) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .tag(BlockTags.RAILS) .item() .model((c, p) -> p.blockItem(() -> c.getEntry() @@ -843,7 +847,7 @@ public class AllBlocks { REGISTRATE.block("controller_rail", ControllerRailBlock::new) .initialProperties(() -> Blocks.POWERED_RAIL) .blockstate(new ControllerRailGenerator()::generate) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .color(() -> ColorHandlers::getRedstonePower) .tag(BlockTags.RAILS) .item() @@ -892,8 +896,8 @@ public class AllBlocks { public static final BlockEntry STICKER = REGISTRATE.block("sticker", StickerBlock::new) .initialProperties(SharedProperties::stone) - .properties(Block.Properties::nonOpaque) - .addLayer(() -> RenderType::getCutoutMipped) + .properties(AbstractBlock.Properties::noOcclusion) + .addLayer(() -> RenderType::cutoutMipped) .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) .item() .transform(customItemModel()) @@ -913,7 +917,7 @@ public class AllBlocks { .blockstate(new SawGenerator()::generate) .transform(StressConfigDefaults.setImpact(4.0)) .onRegister(addMovementBehaviour(new SawMovementBehaviour())) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .item() .transform(customItemModel()) .register(); @@ -923,7 +927,7 @@ public class AllBlocks { .blockstate(BlockStateGen.directionalAxisBlockProvider()) .transform(StressConfigDefaults.setImpact(4.0)) .onRegister(addMovementBehaviour(new DeployerMovementBehaviour())) - .item() + .item(AssemblyOperatorBlockItem::new) .transform(customItemModel()) .register(); @@ -950,7 +954,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .onRegister(addMovementBehaviour(new HarvesterMovementBehaviour())) .blockstate(BlockStateGen.horizontalBlockProvider(true)) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .item() .transform(customItemModel()) .register(); @@ -964,7 +968,7 @@ public class AllBlocks { .register(); public static final DyedBlockList SEATS = new DyedBlockList<>(colour -> { - String colourName = colour.getString(); + String colourName = colour.getSerializedName(); SeatMovementBehaviour movementBehaviour = new SeatMovementBehaviour(); return REGISTRATE.block(colourName + "_seat", p -> new SeatBlock(p, colour == DyeColor.RED)) .initialProperties(SharedProperties::wooden) @@ -976,20 +980,20 @@ public class AllBlocks { .texture("2", p.modLoc("block/seat/side_" + colourName))); }) .recipe((c, p) -> { - ShapedRecipeBuilder.shapedRecipe(c.get()) - .patternLine("#") - .patternLine("-") - .key('#', DyeHelper.getWoolOfDye(colour)) - .key('-', ItemTags.WOODEN_SLABS) - .addCriterion("has_wool", RegistrateRecipeProvider.hasItem(ItemTags.WOOL)) - .build(p, Create.asResource("crafting/kinetics/" + c.getName())); - ShapedRecipeBuilder.shapedRecipe(c.get()) - .patternLine("#") - .patternLine("-") - .key('#', DyeHelper.getTagOfDye(colour)) - .key('-', AllItemTags.SEATS.tag) - .addCriterion("has_seat", RegistrateRecipeProvider.hasItem(AllItemTags.SEATS.tag)) - .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_seat")); + ShapedRecipeBuilder.shaped(c.get()) + .pattern("#") + .pattern("-") + .define('#', DyeHelper.getWoolOfDye(colour)) + .define('-', ItemTags.WOODEN_SLABS) + .unlockedBy("has_wool", RegistrateRecipeProvider.hasItem(ItemTags.WOOL)) + .save(p, Create.asResource("crafting/kinetics/" + c.getName())); + ShapedRecipeBuilder.shaped(c.get()) + .pattern("#") + .pattern("-") + .define('#', DyeHelper.getTagOfDye(colour)) + .define('-', AllItemTags.SEATS.tag) + .unlockedBy("has_seat", RegistrateRecipeProvider.hasItem(AllItemTags.SEATS.tag)) + .save(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_seat")); }) .onRegisterAfter(Item.class, v -> TooltipHelper.referTo(v, "block.create.seat")) .tag(AllBlockTags.SEATS.tag) @@ -1001,7 +1005,7 @@ public class AllBlocks { public static final BlockEntry SAIL_FRAME = REGISTRATE.block("sail_frame", p -> SailBlock.frame(p)) .initialProperties(SharedProperties::wooden) - .properties(Block.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(BlockStateGen.directionalBlockProvider(false)) .tag(AllBlockTags.WINDMILL_SAILS.tag) .tag(AllBlockTags.FAN_TRANSPARENT.tag) @@ -1010,7 +1014,7 @@ public class AllBlocks { public static final BlockEntry SAIL = REGISTRATE.block("white_sail", p -> SailBlock.withCanvas(p)) .initialProperties(SharedProperties::wooden) - .properties(Block.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(BlockStateGen.directionalBlockProvider(false)) .tag(AllBlockTags.WINDMILL_SAILS.tag) .simpleItem() @@ -1020,16 +1024,16 @@ public class AllBlocks { if (colour == DyeColor.WHITE) { return SAIL; } - String colourName = colour.getString(); + String colourName = colour.getSerializedName(); return REGISTRATE.block(colourName + "_sail", p -> SailBlock.withCanvas(p)) - .properties(Block.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .initialProperties(SharedProperties::wooden) .blockstate((c, p) -> p.directionalBlock(c.get(), p.models() .withExistingParent(colourName + "_sail", p.modLoc("block/white_sail")) .texture("0", p.modLoc("block/sail/canvas_" + colourName)))) .tag(AllBlockTags.WINDMILL_SAILS.tag) .tag(AllBlockTags.SAILS.tag) - .loot((p, b) -> p.registerDropping(b, SAIL.get())) + .loot((p, b) -> p.dropOther(b, SAIL.get())) .register(); }); @@ -1054,18 +1058,18 @@ public class AllBlocks { public static final BlockEntry REFINED_RADIANCE_CASING = REGISTRATE.block("refined_radiance_casing", CasingBlock::new) .transform(BuilderTransformers.casing(AllSpriteShifts.REFINED_RADIANCE_CASING)) - .properties(p -> p.luminance($ -> 12)) + .properties(p -> p.lightLevel($ -> 12)) .lang("Radiant Casing") .register(); public static final BlockEntry MECHANICAL_CRAFTER = REGISTRATE.block("mechanical_crafter", MechanicalCrafterBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate(BlockStateGen.horizontalBlockProvider(true)) .transform(StressConfigDefaults.setImpact(2.0)) .onRegister(CreateRegistrate.connectedTextures(new CrafterCTBehaviour())) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .item() .transform(customItemModel()) .register(); @@ -1074,7 +1078,7 @@ public class AllBlocks { REGISTRATE.block("sequenced_gearshift", SequencedGearshiftBlock::new) .initialProperties(SharedProperties::stone) .tag(AllBlockTags.SAFE_NBT.tag) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .transform(StressConfigDefaults.setNoImpact()) .blockstate(new SequencedGearshiftGenerator()::generate) .item() @@ -1083,7 +1087,7 @@ public class AllBlocks { public static final BlockEntry FLYWHEEL = REGISTRATE.block("flywheel", FlywheelBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(AbstractBlock.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .transform(StressConfigDefaults.setNoImpact()) .blockstate(new FlywheelGenerator()::generate) .item() @@ -1121,7 +1125,7 @@ public class AllBlocks { .blockstate((c, p) -> p.getVariantBuilder(c.get()) .forAllStates(s -> ConfiguredModel.builder() .modelFile(AssetLookup.partialBaseModel(c, p)) - .rotationX(s.get(ArmBlock.CEILING) ? 180 : 0) + .rotationX(s.getValue(ArmBlock.CEILING) ? 180 : 0) .build())) .transform(StressConfigDefaults.setImpact(2.0)) .item(ArmItem::new) @@ -1144,7 +1148,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new BeltFunnelGenerator("andesite", new ResourceLocation("block/polished_andesite"))::generate) - .loot((p, b) -> p.registerDropping(b, ANDESITE_FUNNEL.get())) + .loot((p, b) -> p.dropOther(b, ANDESITE_FUNNEL.get())) .register(); public static final BlockEntry BRASS_FUNNEL = @@ -1163,7 +1167,7 @@ public class AllBlocks { .initialProperties(SharedProperties::softMetal) .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new BeltFunnelGenerator("brass", Create.asResource("block/brass_block"))::generate) - .loot((p, b) -> p.registerDropping(b, BRASS_FUNNEL.get())) + .loot((p, b) -> p.dropOther(b, BRASS_FUNNEL.get())) .register(); public static final BlockEntry ANDESITE_TUNNEL = @@ -1204,21 +1208,35 @@ public class AllBlocks { .tag(AllBlockTags.SAFE_NBT.tag) .register(); - public static final BlockEntry NIXIE_TUBE = REGISTRATE.block("nixie_tube", NixieTubeBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.luminance($ -> 5)) - .blockstate(new NixieTubeGenerator()::generate) - .addLayer(() -> RenderType::getTranslucent) - .item() - .transform(customItemModel()) - .register(); + public static final BlockEntry ORANGE_NIXIE_TUBE = + REGISTRATE.block("nixie_tube", p -> new NixieTubeBlock(p, DyeColor.ORANGE)) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.lightLevel($ -> 5)) + .blockstate(new NixieTubeGenerator()::generate) + .addLayer(() -> RenderType::translucent) + .item() + .transform(customItemModel()) + .register(); + + public static final DyedBlockList NIXIE_TUBES = new DyedBlockList<>(colour -> { + if (colour == DyeColor.ORANGE) + return ORANGE_NIXIE_TUBE; + String colourName = colour.getSerializedName(); + return REGISTRATE.block(colourName + "_nixie_tube", p -> new NixieTubeBlock(p, colour)) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.lightLevel($ -> 5)) + .blockstate(new NixieTubeGenerator()::generate) + .loot((p, b) -> p.dropOther(b, ORANGE_NIXIE_TUBE.get())) + .addLayer(() -> RenderType::translucent) + .register(); + }); public static final BlockEntry REDSTONE_LINK = REGISTRATE.block("redstone_link", RedstoneLinkBlock::new) .initialProperties(SharedProperties::wooden) .tag(AllBlockTags.BRITTLE.tag, AllBlockTags.SAFE_NBT.tag) .blockstate(new RedstoneLinkGenerator()::generate) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .item() .transform(customItemModel("_", "transmitter")) .register(); @@ -1237,7 +1255,7 @@ public class AllBlocks { REGISTRATE.block("pulse_repeater", PulseRepeaterBlock::new) .initialProperties(() -> Blocks.REPEATER) .blockstate(new PulseRepeaterGenerator()::generate) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .item() .transform(customItemModel("diodes", "pulse_repeater")) .register(); @@ -1257,7 +1275,7 @@ public class AllBlocks { .initialProperties(() -> Blocks.REPEATER) .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new AdjustableRepeaterGenerator()::generate) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .item() .model(AbstractDiodeGenerator.diodeItemModel(true)) .build() @@ -1267,7 +1285,7 @@ public class AllBlocks { REGISTRATE.block("powered_latch", PoweredLatchBlock::new) .initialProperties(() -> Blocks.REPEATER) .blockstate(new PoweredLatchGenerator()::generate) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .simpleItem() .register(); @@ -1275,7 +1293,7 @@ public class AllBlocks { REGISTRATE.block("powered_toggle_latch", ToggleLatchBlock::new) .initialProperties(() -> Blocks.REPEATER) .blockstate(new ToggleLatchGenerator()::generate) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .item() .transform(customItemModel("diodes", "latch_off")) .register(); @@ -1285,7 +1303,7 @@ public class AllBlocks { .initialProperties(() -> Blocks.LECTERN) .blockstate((c,p) -> p.horizontalBlock(c.get(), p.models() .getExistingFile(p.mcLoc("block/lectern")))) - .loot((lt, block) -> lt.registerDropping(block, Blocks.LECTERN)) + .loot((lt, block) -> lt.dropOther(block, Blocks.LECTERN)) .register(); @@ -1299,18 +1317,20 @@ public class AllBlocks { REGISTRATE.block("copper_backtank", CopperBacktankBlock::new) .initialProperties(SharedProperties::softMetal) .blockstate((c, p) -> p.horizontalBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .transform(StressConfigDefaults.setImpact(4.0)) .loot((lt, block) -> { - Builder builder = LootTable.builder(); - IBuilder survivesExplosion = SurvivesExplosion.builder(); - lt.registerLootTable(block, builder.addLootPool(LootPool.builder() - .acceptCondition(survivesExplosion) - .rolls(ConstantRange.of(1)) - .addEntry(ItemLootEntry.builder(AllItems.COPPER_BACKTANK.get()) - .acceptFunction(CopyName.builder(CopyName.Source.BLOCK_ENTITY)) - .acceptFunction(CopyNbt.func_215881_a(CopyNbt.Source.BLOCK_ENTITY) - .func_216056_a("Air", "Air"))))); + Builder builder = LootTable.lootTable(); + IBuilder survivesExplosion = SurvivesExplosion.survivesExplosion(); + lt.add(block, builder.withPool(LootPool.lootPool() + .when(survivesExplosion) + .setRolls(ConstantRange.exactly(1)) + .add(ItemLootEntry.lootTableItem(AllItems.COPPER_BACKTANK.get()) + .apply(CopyName.copyName(CopyName.Source.BLOCK_ENTITY)) + .apply(CopyNbt.copyData(CopyNbt.Source.BLOCK_ENTITY) + .copy("Air", "Air")) + .apply(CopyNbt.copyData(CopyNbt.Source.BLOCK_ENTITY) + .copy("Enchantments", "Enchantments"))))); }) .register(); @@ -1320,10 +1340,10 @@ public class AllBlocks { .onRegister(addMovementBehaviour(new BellMovementBehaviour())) .register(); - public static final BlockEntry CURSED_BELL = - REGISTRATE.block("cursed_bell", CursedBellBlock::new) + public static final BlockEntry HAUNTED_BELL = + REGISTRATE.block("haunted_bell", HauntedBellBlock::new) .transform(BuilderTransformers.bell()) - .onRegister(addMovementBehaviour(new CursedBellMovementBehaviour())) + .onRegister(addMovementBehaviour(new HauntedBellMovementBehaviour())) .register(); // Materials diff --git a/src/main/java/com/simibubi/create/AllColorHandlers.java b/src/main/java/com/simibubi/create/AllColorHandlers.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/java/com/simibubi/create/AllEnchantments.java b/src/main/java/com/simibubi/create/AllEnchantments.java new file mode 100644 index 000000000..eae8bf6e0 --- /dev/null +++ b/src/main/java/com/simibubi/create/AllEnchantments.java @@ -0,0 +1,32 @@ +package com.simibubi.create; + +import com.simibubi.create.content.curiosities.armor.CapacityEnchantment; +import com.simibubi.create.content.curiosities.weapons.PotatoRecoveryEnchantment; +import com.simibubi.create.foundation.data.CreateRegistrate; +import com.tterrag.registrate.util.entry.RegistryEntry; + +import net.minecraft.enchantment.Enchantment.Rarity; +import net.minecraft.enchantment.EnchantmentType; +import net.minecraft.inventory.EquipmentSlotType; + +public class AllEnchantments { + + private static final CreateRegistrate REGISTRATE = Create.registrate(); + + public static final RegistryEntry POTATO_RECOVERY = REGISTRATE.object("potato_recovery") + .enchantment(EnchantmentType.BOW, PotatoRecoveryEnchantment::new) + .addSlots(EquipmentSlotType.MAINHAND, EquipmentSlotType.OFFHAND) + .lang("Potato Recovery") + .rarity(Rarity.UNCOMMON) + .register(); + + public static final RegistryEntry CAPACITY = REGISTRATE.object("capacity") + .enchantment(EnchantmentType.ARMOR_CHEST, CapacityEnchantment::new) + .addSlots(EquipmentSlotType.CHEST) + .lang("Capacity") + .rarity(Rarity.COMMON) + .register(); + + public static void register() {} + +} diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index bb6268498..c67800ab2 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -47,7 +47,7 @@ public class AllEntityTypes { public static final EntityEntry POTATO_PROJECTILE = register("potato_projectile", PotatoProjectileEntity::new, () -> PotatoProjectileRenderer::new, - EntityClassification.MISC, 4, 20, true, true, PotatoProjectileEntity::build).register(); + EntityClassification.MISC, 4, 20, true, false, PotatoProjectileEntity::build).register(); public static final EntityEntry SEAT = register("seat", SeatEntity::new, () -> SeatEntity.Render::new, EntityClassification.MISC, 0, Integer.MAX_VALUE, false, true, SeatEntity::build).register(); @@ -72,7 +72,7 @@ public class AllEntityTypes { .properties(propertyBuilder) .properties(b -> { if (immuneToFire) - b.immuneToFire(); + b.fireImmune(); }) .renderer(renderer); } diff --git a/src/main/java/com/simibubi/create/AllFluids.java b/src/main/java/com/simibubi/create/AllFluids.java index c8c13b8bb..db39eaaeb 100644 --- a/src/main/java/com/simibubi/create/AllFluids.java +++ b/src/main/java/com/simibubi/create/AllFluids.java @@ -53,7 +53,7 @@ public class AllFluids { .explosionResistance(100f)) .tag(AllFluidTags.HONEY.tag) .bucket() - .properties(p -> p.maxStackSize(1)) + .properties(p -> p.stacksTo(1)) .build() .register(); @@ -68,7 +68,7 @@ public class AllFluids { .slopeFindDistance(3) .explosionResistance(100f)) .bucket() - .properties(p -> p.maxStackSize(1)) + .properties(p -> p.stacksTo(1)) .build() .register(); @@ -82,18 +82,18 @@ public class AllFluids { @OnlyIn(Dist.CLIENT) private static void makeTranslucent(FluidEntry entry) { ForgeFlowingFluid fluid = entry.get(); - RenderTypeLookup.setRenderLayer(fluid, RenderType.getTranslucent()); - RenderTypeLookup.setRenderLayer(fluid.getStillFluid(), RenderType.getTranslucent()); + RenderTypeLookup.setRenderLayer(fluid, RenderType.translucent()); + RenderTypeLookup.setRenderLayer(fluid.getSource(), RenderType.translucent()); } @Nullable public static BlockState getLavaInteraction(FluidState fluidState) { - Fluid fluid = fluidState.getFluid(); - if (fluid.isEquivalentTo(HONEY.get())) + Fluid fluid = fluidState.getType(); + if (fluid.isSame(HONEY.get())) return fluidState.isSource() ? AllPaletteBlocks.LIMESTONE.getDefaultState() : AllPaletteBlocks.LIMESTONE_VARIANTS.registeredBlocks.get(0) .getDefaultState(); - if (fluid.isEquivalentTo(CHOCOLATE.get())) + if (fluid.isSame(CHOCOLATE.get())) return fluidState.isSource() ? AllPaletteBlocks.SCORIA.getDefaultState() : AllPaletteBlocks.SCORIA_VARIANTS.registeredBlocks.get(0) .getDefaultState(); diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index aecc4270a..5103e0aa6 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -1,10 +1,10 @@ package com.simibubi.create; +import static com.simibubi.create.AllTags.forgeItemTag; import static com.simibubi.create.AllTags.AllItemTags.CREATE_INGOTS; import static com.simibubi.create.AllTags.AllItemTags.CRUSHED_ORES; import static com.simibubi.create.AllTags.AllItemTags.NUGGETS; import static com.simibubi.create.AllTags.AllItemTags.PLATES; -import static com.simibubi.create.AllTags.forgeItemTag; import static com.simibubi.create.content.AllSections.CURIOSITIES; import static com.simibubi.create.content.AllSections.KINETICS; import static com.simibubi.create.content.AllSections.LOGISTICS; @@ -82,11 +82,21 @@ public class AllItems { PROPELLER = ingredient("propeller"), WHISK = ingredient("whisk"), BRASS_HAND = ingredient("brass_hand"), CRAFTER_SLOT_COVER = ingredient("crafter_slot_cover"), ELECTRON_TUBE = ingredient("electron_tube"); - public static final ItemEntry INCOMPLETE_CLOCKWORK_COMPONENT = - REGISTRATE.item("incomplete_clockwork_component", SequencedAssemblyItem::new) + public static final ItemEntry INCOMPLETE_PRECISION_MECHANISM = + REGISTRATE.item("incomplete_precision_mechanism", SequencedAssemblyItem::new) .register(); - public static final ItemEntry CLOCKWORK_COMPONENT = ingredient("clockwork_component"); + public static final ItemEntry PRECISION_MECHANISM = ingredient("precision_mechanism"); + + public static final ItemEntry INCOMPLETE_COGWHEEL = + REGISTRATE.item("incomplete_cogwheel", SequencedAssemblyItem::new) + .model(AssetLookup.existingItemModel()) + .register(); + + public static final ItemEntry INCOMPLETE_LARGE_COGWHEEL = + REGISTRATE.item("incomplete_large_cogwheel", SequencedAssemblyItem::new) + .model(AssetLookup.existingItemModel()) + .register(); public static final ItemEntry BLAZE_CAKE_BASE = REGISTRATE.item("blaze_cake_base", HiddenIngredientItem::new) @@ -95,36 +105,43 @@ public class AllItems { public static final ItemEntry BLAZE_CAKE = REGISTRATE.item("blaze_cake", CombustibleItem::new) .tag(AllItemTags.UPRIGHT_ON_BELT.tag) + .onRegister(i -> i.setBurnTime(6400)) + .register(); + + public static final ItemEntry CREATIVE_BLAZE_CAKE = REGISTRATE.item("creative_blaze_cake", CombustibleItem::new) + .properties(p -> p.rarity(Rarity.EPIC)) + .tag(AllItemTags.UPRIGHT_ON_BELT.tag) + .onRegister(i -> i.setBurnTime(Integer.MAX_VALUE)) .register(); public static final ItemEntry BAR_OF_CHOCOLATE = REGISTRATE.item("bar_of_chocolate", Item::new) - .properties(p -> p.food(new Food.Builder().hunger(6) - .saturation(0.3F) + .properties(p -> p.food(new Food.Builder().nutrition(6) + .saturationMod(0.3F) .build())) .lang("Bar of Chocolate") .register(); public static final ItemEntry SWEET_ROLL = REGISTRATE.item("sweet_roll", Item::new) - .properties(p -> p.food(new Food.Builder().hunger(6) - .saturation(0.8F) + .properties(p -> p.food(new Food.Builder().nutrition(6) + .saturationMod(0.8F) .build())) .register(); public static final ItemEntry CHOCOLATE_BERRIES = REGISTRATE.item("chocolate_glazed_berries", Item::new) - .properties(p -> p.food(new Food.Builder().hunger(7) - .saturation(0.8F) + .properties(p -> p.food(new Food.Builder().nutrition(7) + .saturationMod(0.8F) .build())) .register(); public static final ItemEntry HONEYED_APPLE = REGISTRATE.item("honeyed_apple", Item::new) - .properties(p -> p.food(new Food.Builder().hunger(8) - .saturation(0.8F) + .properties(p -> p.food(new Food.Builder().nutrition(8) + .saturationMod(0.8F) .build())) .register(); public static final ItemEntry BUILDERS_TEA = REGISTRATE.item("builders_tea", BuildersTeaItem::new) .tag(AllItemTags.UPRIGHT_ON_BELT.tag) - .properties(p -> p.maxStackSize(16)) + .properties(p -> p.stacksTo(16)) .lang("Builder's Tea") .register(); @@ -193,7 +210,7 @@ public class AllItems { .register(); public static final ItemEntry GOGGLES = REGISTRATE.item("goggles", GogglesItem::new) - .properties(p -> p.maxStackSize(1)) + .properties(p -> p.stacksTo(1)) .onRegister(CreateRegistrate.itemModel(() -> GogglesModel::new)) .lang("Engineer's Goggles") .register(); @@ -219,7 +236,7 @@ public class AllItems { .register(); public static final ItemEntry WRENCH = REGISTRATE.item("wrench", WrenchItem::new) - .properties(p -> p.maxStackSize(1)) + .properties(p -> p.stacksTo(1)) .transform(CreateRegistrate.customRenderedItem(() -> WrenchModel::new)) .model(AssetLookup.itemModelWithPartials()) .register(); @@ -242,24 +259,24 @@ public class AllItems { REGISTRATE.startSection(CURIOSITIES); } - public static final ItemEntry EXTENDO_GRIP = REGISTRATE.item("extendo_grip", ExtendoGripItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> ExtendoGripModel::new)) - .model(AssetLookup.itemModelWithPartials()) - .register(); - public static final ItemEntry LINKED_CONTROLLER = REGISTRATE.item("linked_controller", LinkedControllerItem::new) - .properties(p -> p.maxStackSize(1)) + .properties(p -> p.stacksTo(1)) .transform(CreateRegistrate.customRenderedItem(() -> LinkedControllerModel::new)) .model(AssetLookup.itemModelWithPartials()) .register(); public static final ItemEntry POTATO_CANNON = REGISTRATE.item("potato_cannon", PotatoCannonItem::new) - .properties(p -> p.maxStackSize(1)) + .properties(p -> p.stacksTo(1)) .transform(CreateRegistrate.customRenderedItem(() -> PotatoCannonModel::new)) .model(AssetLookup.itemModelWithPartials()) .register(); + + public static final ItemEntry EXTENDO_GRIP = REGISTRATE.item("extendo_grip", ExtendoGripItem::new) + .transform(CreateRegistrate.customRenderedItem(() -> ExtendoGripModel::new)) + .model(AssetLookup.itemModelWithPartials()) + .register(); public static final ItemEntry WAND_OF_SYMMETRY = REGISTRATE.item("wand_of_symmetry", SymmetryWandItem::new) @@ -315,16 +332,16 @@ public class AllItems { } public static final ItemEntry EMPTY_SCHEMATIC = REGISTRATE.item("empty_schematic", Item::new) - .properties(p -> p.maxStackSize(1)) + .properties(p -> p.stacksTo(1)) .register(); public static final ItemEntry SCHEMATIC_AND_QUILL = REGISTRATE.item("schematic_and_quill", SchematicAndQuillItem::new) - .properties(p -> p.maxStackSize(1)) + .properties(p -> p.stacksTo(1)) .register(); public static final ItemEntry SCHEMATIC = REGISTRATE.item("schematic", SchematicItem::new) - .properties(p -> p.maxStackSize(1)) + .properties(p -> p.stacksTo(1)) .register(); // Shortcuts @@ -334,10 +351,10 @@ public class AllItems { .register(); } - private static ItemEntry hiddenIngredient(String name) { - return REGISTRATE.item(name, HiddenIngredientItem::new) - .register(); - } +// private static ItemEntry hiddenIngredient(String name) { +// return REGISTRATE.item(name, HiddenIngredientItem::new) +// .register(); +// } @SafeVarargs private static ItemEntry taggedIngredient(String name, ITag.INamedTag... tags) { diff --git a/src/main/java/com/simibubi/create/AllKeys.java b/src/main/java/com/simibubi/create/AllKeys.java index 3877f1026..6253094c1 100644 --- a/src/main/java/com/simibubi/create/AllKeys.java +++ b/src/main/java/com/simibubi/create/AllKeys.java @@ -42,24 +42,24 @@ public enum AllKeys { public boolean isPressed() { if (!modifiable) return isKeyDown(key); - return keybind.isKeyDown(); + return keybind.isDown(); } public String getBoundKey() { - return keybind.getBoundKeyLocalizedText() + return keybind.getTranslatedKeyMessage() .getString() .toUpperCase(); } public int getBoundCode() { return keybind.getKey() - .getKeyCode(); + .getValue(); } public static boolean isKeyDown(int key) { return GLFW.glfwGetKey(Minecraft.getInstance() .getWindow() - .getHandle(), key) != 0; + .getWindow(), key) != 0; } public static boolean ctrlDown() { diff --git a/src/main/java/com/simibubi/create/AllParticleTypes.java b/src/main/java/com/simibubi/create/AllParticleTypes.java index 23b3fdf0a..d2ceade86 100644 --- a/src/main/java/com/simibubi/create/AllParticleTypes.java +++ b/src/main/java/com/simibubi/create/AllParticleTypes.java @@ -35,7 +35,9 @@ public enum AllParticleTypes { BASIN_FLUID(FluidParticleData::new), FLUID_DRIP(FluidParticleData::new), SOUL(SoulParticle.Data::new), - SOUL_BASE(SoulBaseParticle.Data::new) + SOUL_BASE(SoulBaseParticle.Data::new), + SOUL_PERIMETER(SoulParticle.PerimeterData::new), + SOUL_EXPANDING_PERIMETER(SoulParticle.ExpandingPerimeterData::new) ; private ParticleEntry entry; @@ -52,7 +54,7 @@ public enum AllParticleTypes { @OnlyIn(Dist.CLIENT) public static void registerFactories(ParticleFactoryRegisterEvent event) { - ParticleManager particles = Minecraft.getInstance().particles; + ParticleManager particles = Minecraft.getInstance().particleEngine; for (AllParticleTypes particle : values()) particle.entry.registerFactory(particles); } diff --git a/src/main/java/com/simibubi/create/AllRecipeTypes.java b/src/main/java/com/simibubi/create/AllRecipeTypes.java index d3731470c..ee9ccfb2d 100644 --- a/src/main/java/com/simibubi/create/AllRecipeTypes.java +++ b/src/main/java/com/simibubi/create/AllRecipeTypes.java @@ -17,11 +17,11 @@ import com.simibubi.create.content.contraptions.fluids.actors.FillingRecipe; import com.simibubi.create.content.contraptions.itemAssembly.SequencedAssemblyRecipeSerializer; import com.simibubi.create.content.contraptions.processing.BasinRecipe; import com.simibubi.create.content.contraptions.processing.EmptyingRecipe; -import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeFactory; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer; import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe; import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; import net.minecraft.inventory.IInventory; import net.minecraft.item.crafting.IRecipe; @@ -33,74 +33,97 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.World; import net.minecraftforge.event.RegistryEvent; -public enum AllRecipeTypes { +public enum AllRecipeTypes implements IRecipeTypeInfo { MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new), - CONVERSION(processingSerializer(ConversionRecipe::new)), - CRUSHING(processingSerializer(CrushingRecipe::new)), - CUTTING(processingSerializer(CuttingRecipe::new)), - MILLING(processingSerializer(MillingRecipe::new)), - BASIN(processingSerializer(BasinRecipe::new)), - MIXING(processingSerializer(MixingRecipe::new)), - COMPACTING(processingSerializer(CompactingRecipe::new)), - PRESSING(processingSerializer(PressingRecipe::new)), - SANDPAPER_POLISHING(processingSerializer(SandPaperPolishingRecipe::new)), - SPLASHING(processingSerializer(SplashingRecipe::new)), - DEPLOYING(processingSerializer(DeployerApplicationRecipe::new)), - FILLING(processingSerializer(FillingRecipe::new)), - EMPTYING(processingSerializer(EmptyingRecipe::new)), + CONVERSION(ConversionRecipe::new), + CRUSHING(CrushingRecipe::new), + CUTTING(CuttingRecipe::new), + MILLING(MillingRecipe::new), + BASIN(BasinRecipe::new), + MIXING(MixingRecipe::new), + COMPACTING(CompactingRecipe::new), + PRESSING(PressingRecipe::new), + SANDPAPER_POLISHING(SandPaperPolishingRecipe::new), + SPLASHING(SplashingRecipe::new), + DEPLOYING(DeployerApplicationRecipe::new), + FILLING(FillingRecipe::new), + EMPTYING(EmptyingRecipe::new), SEQUENCED_ASSEMBLY(SequencedAssemblyRecipeSerializer::new), ; - public IRecipeSerializer serializer; - public Supplier> supplier; - public IRecipeType> type; + private ResourceLocation id; + private Supplier> serializerSupplier; + private Supplier> typeSupplier; + private IRecipeSerializer serializer; + private IRecipeType type; - AllRecipeTypes(Supplier> supplier) { - this(supplier, null); + AllRecipeTypes(Supplier> serializerSupplier, Supplier> typeSupplier) { + this.id = Create.asResource(Lang.asId(name())); + this.serializerSupplier = serializerSupplier; + this.typeSupplier = typeSupplier; } - AllRecipeTypes(Supplier> supplier, - IRecipeType> existingType) { - this.supplier = supplier; - this.type = existingType; + AllRecipeTypes(Supplier> serializerSupplier, IRecipeType existingType) { + this(serializerSupplier, () -> existingType); } - public static void register(RegistryEvent.Register> event) { - ShapedRecipe.setCraftingSize(9, 9); - - for (AllRecipeTypes r : AllRecipeTypes.values()) { - if (r.type == null) - r.type = customType(Lang.asId(r.name())); - - r.serializer = r.supplier.get(); - ResourceLocation location = new ResourceLocation(Create.ID, Lang.asId(r.name())); - event.getRegistry() - .register(r.serializer.setRegistryName(location)); - } + AllRecipeTypes(Supplier> serializerSupplier) { + this.id = Create.asResource(Lang.asId(name())); + this.serializerSupplier = serializerSupplier; + this.typeSupplier = () -> simpleType(id); } - private static > IRecipeType customType(String id) { - return Registry.register(Registry.RECIPE_TYPE, new ResourceLocation(Create.ID, id), new IRecipeType() { - public String toString() { - return Create.ID + ":" + id; - } - }); + AllRecipeTypes(ProcessingRecipeFactory processingFactory) { + this(processingSerializer(processingFactory)); } - private static Supplier> processingSerializer( - ProcessingRecipeFactory> factory) { - return () -> new ProcessingRecipeSerializer<>(factory); + @Override + public ResourceLocation getId() { + return id; } @SuppressWarnings("unchecked") + @Override + public > T getSerializer() { + return (T) serializer; + } + + @SuppressWarnings("unchecked") + @Override public > T getType() { return (T) type; } public > Optional find(C inv, World world) { return world.getRecipeManager() - .getRecipe(getType(), inv, world); + .getRecipeFor(getType(), inv, world); } + + public static void register(RegistryEvent.Register> event) { + ShapedRecipe.setCraftingSize(9, 9); + + for (AllRecipeTypes r : AllRecipeTypes.values()) { + r.serializer = r.serializerSupplier.get(); + r.type = r.typeSupplier.get(); + r.serializer.setRegistryName(r.id); + event.getRegistry() + .register(r.serializer); + } + } + + private static Supplier> processingSerializer(ProcessingRecipeFactory factory) { + return () -> new ProcessingRecipeSerializer<>(factory); + } + + public static > IRecipeType simpleType(ResourceLocation id) { + String stringId = id.toString(); + return Registry.register(Registry.RECIPE_TYPE, id, new IRecipeType() { + public String toString() { + return stringId; + } + }); + } + } diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 6ffb1c167..9ba3acccd 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -108,16 +108,24 @@ public class AllShapes { PUMP = shape(2, 0, 2, 14, 5, 14).add(4, 0, 4, 12, 16, 12) .add(3, 12, 3, 13, 16, 13) .forDirectional(Direction.UP), - CRUSHING_WHEEL_CONTROLLER_COLLISION = shape(0, 0, 0, 16, 13, 16).forDirectional(Direction.DOWN) + CRUSHING_WHEEL_CONTROLLER_COLLISION = shape(0, 0, 0, 16, 13, 16).forDirectional(Direction.DOWN), + + BELL_FLOOR = shape(0, 0, 5, 16, 11, 11).add(3, 1, 3, 13, 13, 13).forHorizontal(SOUTH), + BELL_WALL = shape(5, 5, 8, 11, 11, 16).add(3, 1, 3, 13, 13, 13) + .forHorizontal(SOUTH), + BELL_DOUBLE_WALL = shape(5, 5, 0, 11, 11, 16).add(3, 1, 3, 13, 13, 13) + .forHorizontal(SOUTH), + BELL_CEILING = shape(0, 5, 5, 16, 16, 11).add(3, 1, 3, 13, 13, 13) + .forHorizontal(SOUTH) ; // Internally Shared Shapes private static final VoxelShape - PISTON_HEAD = Blocks.PISTON_HEAD.getDefaultState() - .with(DirectionalBlock.FACING, UP) - .with(PistonHeadBlock.SHORT, true) + PISTON_HEAD = Blocks.PISTON_HEAD.defaultBlockState() + .setValue(DirectionalBlock.FACING, UP) + .setValue(PistonHeadBlock.SHORT, true) .getShape(null, null), PISTON_EXTENDED = shape(CASING_12PX.get(UP)).add(FOUR_VOXEL_POLE.get(Axis.Y)) .build(), @@ -151,7 +159,7 @@ public class AllShapes { HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(), CRUSHING_WHEEL_COLLISION_SHAPE = cuboid(0, 0, 0, 16, 16, 16), SEAT = cuboid(0, 0, 0, 16, 8, 16), SEAT_COLLISION = cuboid(0, 0, 0, 16, 6, 16), - MECHANICAL_PROCESSOR_SHAPE = shape(VoxelShapes.fullCube()).erase(4, 0, 4, 12, 16, 12) + MECHANICAL_PROCESSOR_SHAPE = shape(VoxelShapes.block()).erase(4, 0, 4, 12, 16, 12) .build(), TURNTABLE_SHAPE = shape(1, 4, 1, 15, 8, 15).add(5, 0, 5, 11, 4, 11) .build(), @@ -229,60 +237,61 @@ public class AllShapes { } private static VoxelShape cuboid(double x1, double y1, double z1, double x2, double y2, double z2) { - return Block.makeCuboidShape(x1, y1, z1, x2, y2, z2); + return Block.box(x1, y1, z1, x2, y2, z2); } - private static class Builder { - VoxelShape shape; + public static class Builder { + + private VoxelShape shape; public Builder(VoxelShape shape) { this.shape = shape; } - Builder add(VoxelShape shape) { + public Builder add(VoxelShape shape) { this.shape = VoxelShapes.or(this.shape, shape); return this; } - Builder add(double x1, double y1, double z1, double x2, double y2, double z2) { + public Builder add(double x1, double y1, double z1, double x2, double y2, double z2) { return add(cuboid(x1, y1, z1, x2, y2, z2)); } - Builder erase(double x1, double y1, double z1, double x2, double y2, double z2) { + public Builder erase(double x1, double y1, double z1, double x2, double y2, double z2) { this.shape = - VoxelShapes.combineAndSimplify(shape, cuboid(x1, y1, z1, x2, y2, z2), IBooleanFunction.ONLY_FIRST); + VoxelShapes.join(shape, cuboid(x1, y1, z1, x2, y2, z2), IBooleanFunction.ONLY_FIRST); return this; } - VoxelShape build() { + public VoxelShape build() { return shape; } - VoxelShaper build(BiFunction factory, Direction direction) { + public VoxelShaper build(BiFunction factory, Direction direction) { return factory.apply(shape, direction); } - VoxelShaper build(BiFunction factory, Axis axis) { + public VoxelShaper build(BiFunction factory, Axis axis) { return factory.apply(shape, axis); } - VoxelShaper forDirectional(Direction direction) { + public VoxelShaper forDirectional(Direction direction) { return build(VoxelShaper::forDirectional, direction); } - VoxelShaper forAxis() { + public VoxelShaper forAxis() { return build(VoxelShaper::forAxis, Axis.Y); } - VoxelShaper forHorizontalAxis() { + public VoxelShaper forHorizontalAxis() { return build(VoxelShaper::forHorizontalAxis, Axis.Z); } - VoxelShaper forHorizontal(Direction direction) { + public VoxelShaper forHorizontal(Direction direction) { return build(VoxelShaper::forHorizontal, direction); } - VoxelShaper forDirectional() { + public VoxelShaper forDirectional() { return forDirectional(UP); } diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index d98fbe2d9..0dbe9ba98 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -10,7 +10,6 @@ import com.google.common.collect.Maps; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Pair; @@ -37,78 +36,78 @@ public class AllSoundEvents { public static final SoundEntry SCHEMATICANNON_LAUNCH_BLOCK = create("schematicannon_launch_block").subtitle("Schematicannon fires") - .playExisting(SoundEvents.ENTITY_GENERIC_EXPLODE, .1f, 1.1f) + .playExisting(SoundEvents.GENERIC_EXPLODE, .1f, 1.1f) .category(SoundCategory.BLOCKS) .build(), SCHEMATICANNON_FINISH = create("schematicannon_finish").subtitle("Schematicannon dings") - .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BELL, 1, .7f) + .playExisting(SoundEvents.NOTE_BLOCK_BELL, 1, .7f) .category(SoundCategory.BLOCKS) .build(), DEPOT_SLIDE = create("depot_slide").subtitle("Item slides") - .playExisting(SoundEvents.BLOCK_SAND_BREAK, .125f, 1.5f) + .playExisting(SoundEvents.SAND_BREAK, .125f, 1.5f) .category(SoundCategory.BLOCKS) .build(), DEPOT_PLOP = create("depot_plop").subtitle("Item lands") - .playExisting(SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, .25f, 1.25f) + .playExisting(SoundEvents.ITEM_FRAME_ADD_ITEM, .25f, 1.25f) .category(SoundCategory.BLOCKS) .build(), - FUNNEL_FLAP = create("funnel_flap").subtitle("Funnel Flaps") - .playExisting(SoundEvents.ENTITY_ITEM_FRAME_ROTATE_ITEM, .125f, 1.5f) - .playExisting(SoundEvents.BLOCK_WOOL_BREAK, .0425f, .75f) + FUNNEL_FLAP = create("funnel_flap").subtitle("Funnel flaps") + .playExisting(SoundEvents.ITEM_FRAME_ROTATE_ITEM, .125f, 1.5f) + .playExisting(SoundEvents.WOOL_BREAK, .0425f, .75f) .category(SoundCategory.BLOCKS) .build(), SLIME_ADDED = create("slime_added").subtitle("Slime squishes") - .playExisting(SoundEvents.BLOCK_SLIME_BLOCK_PLACE) + .playExisting(SoundEvents.SLIME_BLOCK_PLACE) .category(SoundCategory.BLOCKS) .build(), MECHANICAL_PRESS_ACTIVATION = create("mechanical_press_activation").subtitle("Mechanical Press clangs") - .playExisting(SoundEvents.BLOCK_ANVIL_LAND, .125f, 1f) - .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .5f, 1f) + .playExisting(SoundEvents.ANVIL_LAND, .125f, 1f) + .playExisting(SoundEvents.ITEM_BREAK, .5f, 1f) .category(SoundCategory.BLOCKS) .build(), MECHANICAL_PRESS_ACTIVATION_ON_BELT = create("mechanical_press_activation_belt").subtitle("Mechanical Press bonks") - .playExisting(SoundEvents.BLOCK_WOOL_HIT, .75f, 1f) - .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .15f, .75f) + .playExisting(SoundEvents.WOOL_HIT, .75f, 1f) + .playExisting(SoundEvents.ITEM_BREAK, .15f, .75f) .category(SoundCategory.BLOCKS) .build(), - MIXING = create("mixing").subtitle("Mixing Noises") - .playExisting(SoundEvents.BLOCK_GILDED_BLACKSTONE_BREAK, .125f, .5f) - .playExisting(SoundEvents.BLOCK_NETHERRACK_BREAK, .125f, .5f) + MIXING = create("mixing").subtitle("Mixing noises") + .playExisting(SoundEvents.GILDED_BLACKSTONE_BREAK, .125f, .5f) + .playExisting(SoundEvents.NETHERRACK_BREAK, .125f, .5f) .category(SoundCategory.BLOCKS) .build(), CRANKING = create("cranking").subtitle("Hand Crank turns") - .playExisting(SoundEvents.BLOCK_WOOD_PLACE, .075f, .5f) - .playExisting(SoundEvents.BLOCK_WOODEN_BUTTON_CLICK_OFF, .025f, .5f) + .playExisting(SoundEvents.WOOD_PLACE, .075f, .5f) + .playExisting(SoundEvents.WOODEN_BUTTON_CLICK_OFF, .025f, .5f) .category(SoundCategory.BLOCKS) .build(), WORLDSHAPER_PLACE = create("worldshaper_place").subtitle("Worldshaper zaps") - .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM) + .playExisting(SoundEvents.NOTE_BLOCK_BASEDRUM) .category(SoundCategory.PLAYERS) .build(), SCROLL_VALUE = create("scroll_value").subtitle("Scroll-input clicks") - .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_HAT, .124f, 1f) + .playExisting(SoundEvents.NOTE_BLOCK_HAT, .124f, 1f) .category(SoundCategory.PLAYERS) .build(), CONFIRM = create("confirm").subtitle("Affirmative ding") - .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BELL, 0.5f, 0.8f) + .playExisting(SoundEvents.NOTE_BLOCK_BELL, 0.5f, 0.8f) .category(SoundCategory.PLAYERS) .build(), DENY = create("deny").subtitle("Declining boop") - .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BASS, 1f, 0.5f) + .playExisting(SoundEvents.NOTE_BLOCK_BASS, 1f, 0.5f) .category(SoundCategory.PLAYERS) .build(), @@ -121,46 +120,46 @@ public class AllSoundEvents { .build(), POTATO_HIT = create("potato_hit").subtitle("Vegetable impacts") - .playExisting(SoundEvents.ENTITY_ITEM_FRAME_BREAK, .75f, .75f) - .playExisting(SoundEvents.BLOCK_WEEPING_VINES_BREAK, .75f, 1.25f) + .playExisting(SoundEvents.ITEM_FRAME_BREAK, .75f, .75f) + .playExisting(SoundEvents.WEEPING_VINES_BREAK, .75f, 1.25f) .category(SoundCategory.PLAYERS) .build(), CONTRAPTION_ASSEMBLE = create("contraption_assemble").subtitle("Contraption moves") - .playExisting(SoundEvents.BLOCK_WOODEN_TRAPDOOR_OPEN, .5f, .5f) - .playExisting(SoundEvents.BLOCK_CHEST_OPEN, .045f, .74f) + .playExisting(SoundEvents.WOODEN_TRAPDOOR_OPEN, .5f, .5f) + .playExisting(SoundEvents.CHEST_OPEN, .045f, .74f) .category(SoundCategory.BLOCKS) .build(), CONTRAPTION_DISASSEMBLE = create("contraption_disassemble").subtitle("Contraption stops") - .playExisting(SoundEvents.BLOCK_IRON_TRAPDOOR_CLOSE, .35f, .75f) + .playExisting(SoundEvents.IRON_TRAPDOOR_CLOSE, .35f, .75f) .category(SoundCategory.BLOCKS) .build(), WRENCH_ROTATE = create("wrench_rotate").subtitle("Wrench used") - .playExisting(SoundEvents.BLOCK_WOODEN_TRAPDOOR_CLOSE, .25f, 1.25f) + .playExisting(SoundEvents.WOODEN_TRAPDOOR_CLOSE, .25f, 1.25f) .category(SoundCategory.BLOCKS) .build(), WRENCH_REMOVE = create("wrench_remove").subtitle("Component breaks") - .playExisting(SoundEvents.ENTITY_ITEM_PICKUP, .25f, .75f) - .playExisting(SoundEvents.BLOCK_NETHERITE_BLOCK_HIT, .25f, .75f) + .playExisting(SoundEvents.ITEM_PICKUP, .25f, .75f) + .playExisting(SoundEvents.NETHERITE_BLOCK_HIT, .25f, .75f) .category(SoundCategory.BLOCKS) .build(), CRAFTER_CLICK = create("crafter_click").subtitle("Crafter clicks") - .playExisting(SoundEvents.BLOCK_NETHERITE_BLOCK_HIT, .25f, 1) - .playExisting(SoundEvents.BLOCK_WOODEN_TRAPDOOR_OPEN, .125f, 1) + .playExisting(SoundEvents.NETHERITE_BLOCK_HIT, .25f, 1) + .playExisting(SoundEvents.WOODEN_TRAPDOOR_OPEN, .125f, 1) .category(SoundCategory.BLOCKS) .build(), CRAFTER_CRAFT = create("crafter_craft").subtitle("Crafter crafts") - .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .125f, .75f) + .playExisting(SoundEvents.ITEM_BREAK, .125f, .75f) .category(SoundCategory.BLOCKS) .build(), COPPER_ARMOR_EQUIP = create("copper_armor_equip").subtitle("Diving equipment clinks") - .playExisting(SoundEvents.ITEM_ARMOR_EQUIP_GOLD, 1f, 1f) + .playExisting(SoundEvents.ARMOR_EQUIP_GOLD, 1f, 1f) .category(SoundCategory.PLAYERS) .build(), @@ -170,22 +169,22 @@ public class AllSoundEvents { .build(), CONTROLLER_CLICK = create("controller_click").subtitle("Controller clicks") - .playExisting(SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, .35f, 1f) + .playExisting(SoundEvents.ITEM_FRAME_ADD_ITEM, .35f, 1f) .category(SoundCategory.BLOCKS) .build(), CONTROLLER_PUT = create("controller_put").subtitle("Controller thumps") - .playExisting(SoundEvents.ITEM_BOOK_PUT, 1f, 1f) + .playExisting(SoundEvents.BOOK_PUT, 1f, 1f) .category(SoundCategory.BLOCKS) .build(), CONTROLLER_TAKE = create("controller_take").subtitle("Lectern empties") - .playExisting(SoundEvents.ENTITY_ITEM_FRAME_REMOVE_ITEM, 1f, 1f) + .playExisting(SoundEvents.ITEM_FRAME_REMOVE_ITEM, 1f, 1f) .category(SoundCategory.BLOCKS) .build(), SAW_ACTIVATE_WOOD = create("saw_activate_wood").subtitle("Mechanical Saw activates") - .playExisting(SoundEvents.ENTITY_BOAT_PADDLE_LAND, .75f, 1.5f) + .playExisting(SoundEvents.BOAT_PADDLE_LAND, .75f, 1.5f) .category(SoundCategory.BLOCKS) .build(), @@ -195,20 +194,35 @@ public class AllSoundEvents { .build(), BLAZE_MUNCH = create("blaze_munch").subtitle("Blaze Burner munches") - .playExisting(SoundEvents.ENTITY_GENERIC_EAT, .5f, 1f) + .playExisting(SoundEvents.GENERIC_EAT, .5f, 1f) .category(SoundCategory.BLOCKS) .build(), + CRUSHING_1 = create("crushing_1").subtitle("Crushing noises") + .playExisting(SoundEvents.NETHERRACK_HIT) + .category(SoundCategory.BLOCKS) + .build(), + + CRUSHING_2 = create("crushing_2").noSubtitle() + .playExisting(SoundEvents.GRAVEL_PLACE) + .category(SoundCategory.BLOCKS) + .build(), + + CRUSHING_3 = create("crushing_3").noSubtitle() + .playExisting(SoundEvents.NETHERITE_BLOCK_BREAK) + .category(SoundCategory.BLOCKS) + .build(), + PECULIAR_BELL_USE = create("peculiar_bell_use").subtitle("Peculiar Bell tolls") - .playExisting(SoundEvents.BLOCK_BELL_USE) + .playExisting(SoundEvents.BELL_BLOCK) .category(SoundCategory.BLOCKS) .build(), - CURSED_BELL_CONVERT = create("cursed_bell_convert").subtitle("Cursed Bell awakens") + HAUNTED_BELL_CONVERT = create("haunted_bell_convert").subtitle("Haunted Bell awakens") .category(SoundCategory.BLOCKS) .build(), - CURSED_BELL_USE = create("cursed_bell_use").subtitle("Cursed Bell tolls") + HAUNTED_BELL_USE = create("haunted_bell_use").subtitle("Haunted Bell tolls") .category(SoundCategory.BLOCKS) .build(); @@ -227,10 +241,11 @@ public class AllSoundEvents { entry.prepare(); } - public static JsonElement provideLangEntries() { + public static JsonObject provideLangEntries() { JsonObject object = new JsonObject(); for (SoundEntry entry : entries.values()) - object.addProperty(entry.getSubtitleKey(), entry.getSubtitle()); + if (entry.hasSubtitle()) + object.addProperty(entry.getSubtitleKey(), entry.getSubtitle()); return object; } @@ -257,7 +272,7 @@ public class AllSoundEvents { } @Override - public void act(DirectoryCache cache) throws IOException { + public void run(DirectoryCache cache) throws IOException { generate(generator.getOutputFolder(), cache); } @@ -306,6 +321,11 @@ public class AllSoundEvents { this.subtitle = subtitle; return this; } + + public SoundEntryBuilder noSubtitle() { + this.subtitle = null; + return this; + } public SoundEntryBuilder category(SoundCategory category) { this.category = category; @@ -361,6 +381,10 @@ public class AllSoundEvents { public ResourceLocation getLocation() { return Create.asResource(id); } + + public boolean hasSubtitle() { + return subtitle != null; + } public String getSubtitle() { return subtitle; @@ -384,7 +408,7 @@ public class AllSoundEvents { public void playFrom(Entity entity, float volume, float pitch) { if (!entity.isSilent()) - play(entity.world, null, entity.getBlockPos(), volume, pitch); + play(entity.level, null, entity.blockPosition(), volume, pitch); } public void play(World world, PlayerEntity entity, BlockPos pos, float volume, float pitch) { @@ -392,7 +416,7 @@ public class AllSoundEvents { } public void play(World world, PlayerEntity entity, Vector3d pos, float volume, float pitch) { - play(world, entity, pos.getX(), pos.getY(), pos.getZ(), volume, pitch); + play(world, entity, pos.x(), pos.y(), pos.z(), volume, pitch); } public abstract void play(World world, PlayerEntity entity, double x, double y, double z, float volume, float pitch); @@ -402,7 +426,7 @@ public class AllSoundEvents { } public void playAt(World world, Vector3d pos, float volume, float pitch, boolean fade) { - playAt(world, pos.getX(), pos.getY(), pos.getZ(), volume, pitch, fade); + playAt(world, pos.x(), pos.y(), pos.z(), volume, pitch, fade); } public abstract void playAt(World world, double x, double y, double z, float volume, float pitch, boolean fade); @@ -455,12 +479,12 @@ public class AllSoundEvents { JsonArray list = new JsonArray(); JsonObject s = new JsonObject(); s.addProperty("name", pair.getFirst() - .getName() + .getLocation() .toString()); s.addProperty("type", "event"); list.add(s); entry.add("sounds", list); - if (i == 0) + if (i == 0 && hasSubtitle()) entry.addProperty("subtitle", getSubtitleKey()); json.add(getIdOf(i), entry); } @@ -479,7 +503,7 @@ public class AllSoundEvents { public void playAt(World world, double x, double y, double z, float volume, float pitch, boolean fade) { for (Pair> pair : compiledEvents) { Couple volPitch = pair.getSecond(); - world.playSound(x, y, z, pair.getFirst(), category, volPitch.getFirst() * volume, + world.playLocalSound(x, y, z, pair.getFirst(), category, volPitch.getFirst() * volume, volPitch.getSecond() * pitch, fade); } } @@ -526,7 +550,7 @@ public class AllSoundEvents { @Override public void playAt(World world, double x, double y, double z, float volume, float pitch, boolean fade) { - world.playSound(x, y, z, event, category, volume, pitch, fade); + world.playLocalSound(x, y, z, event, category, volume, pitch, fade); } } diff --git a/src/main/java/com/simibubi/create/AllSpecialTextures.java b/src/main/java/com/simibubi/create/AllSpecialTextures.java index 786dde9be..3f0826421 100644 --- a/src/main/java/com/simibubi/create/AllSpecialTextures.java +++ b/src/main/java/com/simibubi/create/AllSpecialTextures.java @@ -24,7 +24,7 @@ public enum AllSpecialTextures { public void bind() { Minecraft.getInstance() .getTextureManager() - .bindTexture(location); + .bind(location); } public ResourceLocation getLocation() { diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index e2c943f9f..94ba43b41 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -83,7 +83,7 @@ public class AllSpriteShifts { WoodType.CRIMSON, WoodType.WARPED }; Arrays.stream(supportedWoodTypes) - .forEach(woodType -> WOODEN_WINDOWS.put(woodType, vertical("palettes/" + woodType.getName() + "_window"))); + .forEach(woodType -> WOODEN_WINDOWS.put(woodType, vertical("palettes/" + woodType.name() + "_window"))); for (PaletteStoneVariants paletteStoneVariants : PaletteStoneVariants.values()) { String variantName = Lang.asId(paletteStoneVariants.name()); @@ -98,7 +98,7 @@ public class AllSpriteShifts { } for (DyeColor color : DyeColor.values()) { - String id = color.getString(); + String id = color.getSerializedName(); DYED_BELTS.put(color, SpriteShifter.get("block/belt", "block/belt/" + id + "_scroll")); DYED_OFFSET_BELTS.put(color, SpriteShifter.get("block/belt_offset", "block/belt/" + id + "_scroll")); DYED_DIAGONAL_BELTS.put(color, diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index 2fa0b7294..a3542f906 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -41,15 +41,15 @@ public class AllTags { } public static ITag.INamedTag forgeBlockTag(String name) { - return forgeTag(BlockTags::makeWrapperTag, name); + return forgeTag(BlockTags::bind, name); } public static ITag.INamedTag forgeItemTag(String name) { - return forgeTag(ItemTags::makeWrapperTag, name); + return forgeTag(ItemTags::bind, name); } public static ITag.INamedTag forgeFluidTag(String name) { - return forgeTag(FluidTags::makeWrapperTag, name); + return forgeTag(FluidTags::bind, name); } public static ITag.INamedTag forgeTag(Function> wrapperFactory, String name) { @@ -95,9 +95,9 @@ public class AllTags { } private AllItemTags(NameSpace namespace, String path) { - tag = ItemTags.makeWrapperTag( + tag = ItemTags.bind( new ResourceLocation(namespace.id, (path.isEmpty() ? "" : path + "/") + Lang.asId(name())).toString()); - REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.getOrCreateTagBuilder(tag)); + REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(tag)); } public boolean matches(ItemStack stack) { @@ -105,12 +105,12 @@ public class AllTags { } public void add(Item... values) { - REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.getOrCreateTagBuilder(tag) + REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(tag) .add(values)); } public void includeIn(AllItemTags parent) { - REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.getOrCreateTagBuilder(parent.tag) + REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(parent.tag) .addTag(tag)); } } @@ -137,7 +137,7 @@ public class AllTags { } public boolean matches(Fluid fluid) { - return fluid != null && fluid.isIn(tag); + return fluid != null && fluid.is(tag); } static void loadClass() {} @@ -173,8 +173,8 @@ public class AllTags { new ResourceLocation(namespace.id, (path.isEmpty() ? "" : path + "/") + Lang.asId(name())); if (ModList.get() .isLoaded(namespace.id)) { - tag = BlockTags.makeWrapperTag(id.toString()); - REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.getOrCreateTagBuilder(tag)); + tag = BlockTags.bind(id.toString()); + REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag)); } else { tag = new EmptyNamedTag<>(id); } @@ -186,17 +186,17 @@ public class AllTags { } public void includeIn(AllBlockTags parent) { - REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.getOrCreateTagBuilder(parent.tag) + REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(parent.tag) .addTag(tag)); } public void includeAll(ITag.INamedTag child) { - REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.getOrCreateTagBuilder(tag) + REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag) .addTag(child)); } public void add(Block... values) { - REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.getOrCreateTagBuilder(tag) + REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag) .add(values)); } } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 7ec222efc..b426c3421 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -1,5 +1,6 @@ package com.simibubi.create; +import com.simibubi.create.content.contraptions.base.CutoutRotatingInstance; import com.simibubi.create.content.contraptions.base.HalfShaftInstance; import com.simibubi.create.content.contraptions.base.HorizontalHalfShaftInstance; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; @@ -120,7 +121,7 @@ import com.simibubi.create.content.curiosities.armor.CopperBacktankInstance; import com.simibubi.create.content.curiosities.armor.CopperBacktankRenderer; import com.simibubi.create.content.curiosities.armor.CopperBacktankTileEntity; import com.simibubi.create.content.curiosities.bell.BellRenderer; -import com.simibubi.create.content.curiosities.bell.CursedBellTileEntity; +import com.simibubi.create.content.curiosities.bell.HauntedBellTileEntity; import com.simibubi.create.content.curiosities.bell.PeculiarBellTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelInstance; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelRenderer; @@ -489,7 +490,7 @@ public class AllTileEntities { public static final TileEntityEntry CRUSHING_WHEEL = Create.registrate() .tileEntity("crushing_wheel", CrushingWheelTileEntity::new) - .instance(() -> SingleRotatingInstance::new) + .instance(() -> CutoutRotatingInstance::new) .validBlocks(AllBlocks.CRUSHING_WHEEL) .renderer(() -> KineticTileEntityRenderer::new) .register(); @@ -503,7 +504,7 @@ public class AllTileEntities { public static final TileEntityEntry WATER_WHEEL = Create.registrate() .tileEntity("water_wheel", WaterWheelTileEntity::new) - .instance(() -> SingleRotatingInstance::new) + .instance(() -> CutoutRotatingInstance::new) .validBlocks(AllBlocks.WATER_WHEEL) .renderer(() -> KineticTileEntityRenderer::new) .register(); @@ -598,7 +599,8 @@ public class AllTileEntities { public static final TileEntityEntry NIXIE_TUBE = Create.registrate() .tileEntity("nixie_tube", NixieTubeTileEntity::new) - .validBlocks(AllBlocks.NIXIE_TUBE) + .validBlocks(AllBlocks.ORANGE_NIXIE_TUBE) + .validBlocks(AllBlocks.NIXIE_TUBES.toArray()) .renderer(() -> NixieTubeRenderer::new) .register(); @@ -683,9 +685,9 @@ public class AllTileEntities { .renderer(() -> BellRenderer::new) .register(); - public static final TileEntityEntry CURSED_BELL = Create.registrate() - .tileEntity("cursed_bell", CursedBellTileEntity::new) - .validBlocks(AllBlocks.CURSED_BELL) + public static final TileEntityEntry HAUNTED_BELL = Create.registrate() + .tileEntity("cursed_bell", HauntedBellTileEntity::new) + .validBlocks(AllBlocks.HAUNTED_BELL) .renderer(() -> BellRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 8b81243de..272da5d28 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -57,7 +57,7 @@ public class Create { public static final String ID = "create"; public static final String NAME = "Create"; - public static final String VERSION = "0.3.2"; + public static final String VERSION = "0.3.2c"; public static final Logger LOGGER = LogManager.getLogger(); @@ -90,6 +90,7 @@ public class Create { AllMovementBehaviours.register(); AllWorldFeatures.register(); AllConfigs.register(); + AllEnchantments.register(); IEventBus modEventBus = FMLJavaModLoadingContext.get() .getModEventBus(); diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index fbdd15ce8..fecb6d893 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Map; import java.util.function.Function; -import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; @@ -110,7 +109,7 @@ public class CreateClient { IResourceManager resourceManager = Minecraft.getInstance() .getResourceManager(); if (resourceManager instanceof IReloadableResourceManager) - ((IReloadableResourceManager) resourceManager).addReloadListener(new ResourceReloadHandler()); + ((IReloadableResourceManager) resourceManager).registerReloadListener(new ResourceReloadHandler()); event.enqueueWork(() -> { CopperBacktankArmorLayer.register(); @@ -119,16 +118,14 @@ public class CreateClient { public static void onTextureStitch(TextureStitchEvent.Pre event) { if (!event.getMap() - .getId() - .equals(PlayerContainer.BLOCK_ATLAS_TEXTURE)) + .location() + .equals(PlayerContainer.BLOCK_ATLAS)) return; SpriteShifter.getAllTargetSprites() .forEach(event::addSprite); } public static void onModelRegistry(ModelRegistryEvent event) { - PartialModel.onModelRegistry(event); - getCustomRenderedItems().foreach((item, modelFunc) -> modelFunc.apply(null) .getModelLocations() .forEach(ModelLoader::addSpecialModel)); @@ -136,7 +133,6 @@ public class CreateClient { public static void onModelBake(ModelBakeEvent event) { Map modelRegistry = event.getModelRegistry(); - PartialModel.onModelBake(event); getCustomBlockModels() .foreach((block, modelFunc) -> swapModels(modelRegistry, getAllBlockStateModelLocations(block), modelFunc)); @@ -154,10 +150,10 @@ public class CreateClient { protected static List getAllBlockStateModelLocations(Block block) { List models = new ArrayList<>(); - block.getStateContainer() - .getValidStates() + block.getStateDefinition() + .getPossibleStates() .forEach(state -> { - models.add(getBlockModelLocation(block, BlockModelShapes.getPropertyMapString(state.getValues()))); + models.add(getBlockModelLocation(block, BlockModelShapes.statePropertiesToString(state.getValues()))); }); return models; } @@ -213,21 +209,21 @@ public class CreateClient { if (mc.player == null) return; - if (mc.gameSettings.graphicsMode != GraphicsFanciness.FABULOUS) + if (mc.options.graphicsMode != GraphicsFanciness.FABULOUS) return; if (AllConfigs.CLIENT.ignoreFabulousWarning.get()) return; - IFormattableTextComponent text = TextComponentUtils.bracketed(new StringTextComponent("WARN")) - .formatted(TextFormatting.GOLD) + IFormattableTextComponent text = TextComponentUtils.wrapInSquareBrackets(new StringTextComponent("WARN")) + .withStyle(TextFormatting.GOLD) .append(new StringTextComponent( " Some of Create's visual features will not be available while Fabulous graphics are enabled!")) - .styled(style -> style + .withStyle(style -> style .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/create dismissFabulousWarning")) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new StringTextComponent("Click here to disable this warning")))); - mc.ingameGUI.addChatMessage(ChatType.CHAT, text, mc.player.getUniqueID()); + mc.gui.handleChat(ChatType.CHAT, text, mc.player.getUUID()); } } diff --git a/src/main/java/com/simibubi/create/compat/Mods.java b/src/main/java/com/simibubi/create/compat/Mods.java new file mode 100644 index 000000000..85b23626a --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/Mods.java @@ -0,0 +1,38 @@ +package com.simibubi.create.compat; + +import java.util.Optional; +import java.util.function.Supplier; + +import net.minecraftforge.fml.ModList; + +/** + * For compatibility with and without another mod present, we have to define load conditions of the specific code + */ +public enum Mods { + DYNAMICTREES; + + /** + * @return a boolean of whether the mod is loaded or not based on mod id + */ + public boolean isLoaded() { + return ModList.get().isLoaded(asId()); + } + + /** + * @return the mod id + */ + public String asId() { + return name().toLowerCase(); + } + + /** + * Simple hook to run code if a mod is installed + * @param toRun will be run only if the mod is loaded + * @return Optional.empty() if the mod is not loaded, otherwise an Optional of the return value of the given supplier + */ + public Optional runIfInstalled(Supplier> toRun) { + if (isLoaded()) + return Optional.of(toRun.get().get()); + return Optional.empty(); + } +} diff --git a/src/main/java/com/simibubi/create/compat/dynamictrees/DynamicTree.java b/src/main/java/com/simibubi/create/compat/dynamictrees/DynamicTree.java new file mode 100644 index 000000000..2238c7d76 --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/dynamictrees/DynamicTree.java @@ -0,0 +1,63 @@ +package com.simibubi.create.compat.dynamictrees; + +import java.util.function.BiConsumer; + +import javax.annotation.Nullable; + +import com.ferreusveritas.dynamictrees.api.TreeHelper; +import com.ferreusveritas.dynamictrees.blocks.branches.BranchBlock; +import com.ferreusveritas.dynamictrees.blocks.branches.TrunkShellBlock; +import com.ferreusveritas.dynamictrees.util.BranchDestructionData; +import com.simibubi.create.foundation.utility.AbstractBlockBreakQueue; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class DynamicTree extends AbstractBlockBreakQueue { + private BlockPos startCutPos; + + public DynamicTree(BlockPos startCutPos) { + this.startCutPos = startCutPos; + } + + @Override + public void destroyBlocks(World world, ItemStack toDamage, @Nullable PlayerEntity playerEntity, BiConsumer drop) { + BranchBlock start = TreeHelper.getBranch(world.getBlockState(startCutPos)); + if (start == null) //if start is null, it was not a branch + start = setBranchToShellMuse(world, world.getBlockState(startCutPos)); //we check for a trunk shell instead + + if (start == null) //if it is null again, it was neither a branch nor a trunk shell and thus we return + return; + + // Play and render block break sound and particles + world.levelEvent(null, 2001, startCutPos, Block.getId(world.getBlockState(startCutPos))); + // Actually breaks the tree + + BranchDestructionData data = start.destroyBranchFromNode(world, startCutPos, Direction.DOWN, false, playerEntity); + + // Feed all the tree drops to drop bi-consumer + data.leavesDrops.forEach(stackPos -> drop.accept(stackPos.pos.offset(startCutPos), stackPos.stack)); + start.getLogDrops(world, startCutPos, data.species, data.woodVolume).forEach(stack -> drop.accept(startCutPos, stack)); + } + + private BranchBlock setBranchToShellMuse(World world, BlockState state){ + Block block = state.getBlock(); + if (block instanceof TrunkShellBlock){ + TrunkShellBlock.ShellMuse muse = ((TrunkShellBlock)block).getMuse(world, startCutPos); + if (muse != null){ + startCutPos = muse.pos; //the cut pos is moved to the center of the trunk + return TreeHelper.getBranch(muse.state); + } + } + return null; + } + + public static boolean isDynamicBranch(Block block) { + return TreeHelper.isBranch(block) || block instanceof TrunkShellBlock; + } +} diff --git a/src/main/java/com/simibubi/create/compat/jei/ConversionRecipe.java b/src/main/java/com/simibubi/create/compat/jei/ConversionRecipe.java index c6d46653b..a59c356e1 100644 --- a/src/main/java/com/simibubi/create/compat/jei/ConversionRecipe.java +++ b/src/main/java/com/simibubi/create/compat/jei/ConversionRecipe.java @@ -25,7 +25,7 @@ public class ConversionRecipe extends ProcessingRecipe { public static ConversionRecipe create(ItemStack from, ItemStack to) { ResourceLocation recipeId = Create.asResource("conversion_" + counter++); return new ProcessingRecipeBuilder<>(ConversionRecipe::new, recipeId) - .withItemIngredients(Ingredient.fromStacks(from)) + .withItemIngredients(Ingredient.of(from)) .withSingleItemOutput(to) .build(); } diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 498db0bc8..da8730eaa 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -51,6 +51,7 @@ import com.simibubi.create.content.schematics.block.SchematicannonScreen; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CRecipes; import com.simibubi.create.foundation.config.ConfigBase.ConfigBool; +import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; @@ -79,12 +80,6 @@ public class CreateJEI implements IModPlugin { private static final ResourceLocation ID = new ResourceLocation(Create.ID, "jei_plugin"); - @Override - @Nonnull - public ResourceLocation getPluginUid() { - return ID; - } - public IIngredientManager ingredientManager; private final List> allCategories = new ArrayList<>(); private final CreateRecipeCategory @@ -127,7 +122,7 @@ public class CreateJEI implements IModPlugin { .build(), autoShapeless = register("automatic_shapeless", MixingCategory::autoShapeless) - .recipes(r -> r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS && r.getIngredients() + .recipes(r -> r.getSerializer() == IRecipeSerializer.SHAPELESS_RECIPE && r.getIngredients() .size() > 1 && !MechanicalPressTileEntity.canCompress(r.getIngredients()), BasinRecipe::convertShapeless) .catalyst(AllBlocks.MECHANICAL_MIXER::get) @@ -153,7 +148,7 @@ public class CreateJEI implements IModPlugin { woodCutting = register("wood_cutting", () -> new BlockCuttingCategory(Items.OAK_STAIRS)) .recipeList(() -> CondensedBlockCuttingRecipe - .condenseRecipes(findRecipesByType(SawTileEntity.woodcuttingRecipeType.getValue()))) + .condenseRecipes(findRecipesByType(SawTileEntity.woodcuttingRecipeType.get()))) .catalyst(AllBlocks.MECHANICAL_SAW::get) .enableWhenBool(c -> c.allowWoodcuttingOnSaw.get() && ModList.get() .isLoaded("druidcraft")) @@ -179,7 +174,7 @@ public class CreateJEI implements IModPlugin { deploying = register("deploying", DeployingCategory::new) .recipeList( - () -> DeployerApplicationRecipe.convert(findRecipesByType(AllRecipeTypes.SANDPAPER_POLISHING.type))) + () -> DeployerApplicationRecipe.convert(findRecipesByType(AllRecipeTypes.SANDPAPER_POLISHING.getType()))) .recipes(AllRecipeTypes.DEPLOYING) .catalyst(AllBlocks.DEPLOYER::get) .catalyst(AllBlocks.DEPOT::get) @@ -202,10 +197,10 @@ public class CreateJEI implements IModPlugin { .build(), autoShaped = register("automatic_shaped", MechanicalCraftingCategory::new) - .recipes(r -> r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS && r.getIngredients() + .recipes(r -> r.getSerializer() == IRecipeSerializer.SHAPELESS_RECIPE && r.getIngredients() .size() == 1) .recipes( - r -> (r.getType() == IRecipeType.CRAFTING && r.getType() != AllRecipeTypes.MECHANICAL_CRAFTING.type) + r -> (r.getType() == IRecipeType.CRAFTING && r.getType() != AllRecipeTypes.MECHANICAL_CRAFTING.getType()) && (r instanceof ShapedRecipe)) .catalyst(AllBlocks.MECHANICAL_CRAFTER::get) .enableWhen(c -> c.allowRegularCraftingInCrafter) @@ -221,6 +216,12 @@ public class CreateJEI implements IModPlugin { return new CategoryBuilder(name, supplier); } + @Override + @Nonnull + public ResourceLocation getPluginUid() { + return ID; + } + @Override public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) { registration.addRecipeTransferHandler(new BlueprintTransferHandler(), VanillaRecipeCategoryUid.CRAFTING); @@ -269,7 +270,7 @@ public class CreateJEI implements IModPlugin { pred = Predicates.alwaysTrue(); } - public CategoryBuilder recipes(AllRecipeTypes recipeTypeEntry) { + public CategoryBuilder recipes(IRecipeTypeInfo recipeTypeEntry) { return recipes(recipeTypeEntry::getType); } @@ -359,7 +360,7 @@ public class CreateJEI implements IModPlugin { } public static List> findRecipes(Predicate> predicate) { - return Minecraft.getInstance().world.getRecipeManager() + return Minecraft.getInstance().level.getRecipeManager() .getRecipes() .stream() .filter(predicate) @@ -396,7 +397,7 @@ public class CreateJEI implements IModPlugin { public static boolean doInputsMatch(IRecipe recipe1, IRecipe recipe2) { ItemStack[] matchingStacks = recipe1.getIngredients() .get(0) - .getMatchingStacks(); + .getItems(); if (matchingStacks.length == 0) return true; if (recipe2.getIngredients() diff --git a/src/main/java/com/simibubi/create/compat/jei/DoubleItemIcon.java b/src/main/java/com/simibubi/create/compat/jei/DoubleItemIcon.java index 9abd1c945..84ae49721 100644 --- a/src/main/java/com/simibubi/create/compat/jei/DoubleItemIcon.java +++ b/src/main/java/com/simibubi/create/compat/jei/DoubleItemIcon.java @@ -39,26 +39,26 @@ public class DoubleItemIcon implements IDrawable { secondaryStack = secondarySupplier.get(); } - RenderHelper.enable(); + RenderHelper.turnBackOn(); RenderSystem.color4f(1, 1, 1, 1); RenderSystem.enableDepthTest(); - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(xOffset, yOffset, 0); - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(1, 1, 0); GuiGameElement.of(primaryStack) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(10, 10, 100); matrixStack.scale(.5f, .5f, .5f); GuiGameElement.of(secondaryStack) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); - matrixStack.pop(); + matrixStack.popPose(); RenderSystem.enableBlend(); } diff --git a/src/main/java/com/simibubi/create/compat/jei/GhostIngredientHandler.java b/src/main/java/com/simibubi/create/compat/jei/GhostIngredientHandler.java index 7a1644dda..5732d4bff 100644 --- a/src/main/java/com/simibubi/create/compat/jei/GhostIngredientHandler.java +++ b/src/main/java/com/simibubi/create/compat/jei/GhostIngredientHandler.java @@ -28,7 +28,7 @@ public class GhostIngredientHandler> boolean isAttributeFilter = gui instanceof AttributeFilterScreen; if (ingredient instanceof ItemStack) { - for (int i = 36; i < gui.getContainer().inventorySlots.size(); i++) { + for (int i = 36; i < gui.getMenu().slots.size(); i++) { targets.add(new GhostTarget<>(gui, i - 36, isAttributeFilter)); // Only accept items in 1st slot. 2nd is used for functionality, don't wanna override that one @@ -61,8 +61,8 @@ public class GhostIngredientHandler> this.gui = gui; this.slotIndex = slotIndex; this.isAttributeFilter = isAttributeFilter; - Slot slot = gui.getContainer().inventorySlots.get(slotIndex + 36); - this.area = new Rectangle2d(gui.getGuiLeft() + slot.xPos, gui.getGuiTop() + slot.yPos, 16, 16); + Slot slot = gui.getMenu().slots.get(slotIndex + 36); + this.area = new Rectangle2d(gui.getGuiLeft() + slot.x, gui.getGuiTop() + slot.y, 16, 16); } @Override @@ -74,7 +74,7 @@ public class GhostIngredientHandler> public void accept(I ingredient) { ItemStack stack = ((ItemStack) ingredient).copy(); stack.setCount(1); - gui.getContainer().ghostInventory.setStackInSlot(slotIndex, stack); + gui.getMenu().ghostInventory.setStackInSlot(slotIndex, stack); if (isAttributeFilter) return; diff --git a/src/main/java/com/simibubi/create/compat/jei/ScreenResourceWrapper.java b/src/main/java/com/simibubi/create/compat/jei/ScreenResourceWrapper.java index 67e7ce970..a4f2989c5 100644 --- a/src/main/java/com/simibubi/create/compat/jei/ScreenResourceWrapper.java +++ b/src/main/java/com/simibubi/create/compat/jei/ScreenResourceWrapper.java @@ -27,7 +27,7 @@ public class ScreenResourceWrapper implements IDrawable { @Override public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { resource.bind(); - AbstractGui.drawTexture(matrixStack, xOffset, yOffset, 0, resource.startX, resource.startY, resource.width, + AbstractGui.blit(matrixStack, xOffset, yOffset, 0, resource.startX, resource.startY, resource.width, resource.height, 256, 256); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java index 32526f37f..60bd73223 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java @@ -51,9 +51,9 @@ public class BasinCategory extends CreateRecipeCategory { HeatCondition requiredHeat = recipe.getRequiredHeat(); if (!requiredHeat.testBlazeBurner(HeatLevel.NONE)) - itemIngredients.add(Ingredient.fromItems(AllBlocks.BLAZE_BURNER.get())); + itemIngredients.add(Ingredient.of(AllBlocks.BLAZE_BURNER.get())); if (!requiredHeat.testBlazeBurner(HeatLevel.KINDLED)) - itemIngredients.add(Ingredient.fromItems(AllItems.BLAZE_CAKE.get())); + itemIngredients.add(Ingredient.of(AllItems.BLAZE_CAKE.get())); ingredients.setInputIngredients(itemIngredients); ingredients.setInputLists(VanillaTypes.FLUID, recipe.getFluidIngredients() @@ -62,7 +62,7 @@ public class BasinCategory extends CreateRecipeCategory { .collect(Collectors.toList())); if (!recipe.getRollableResults() .isEmpty()) - ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput()); + ingredients.setOutput(VanillaTypes.ITEM, recipe.getResultItem()); if (!recipe.getFluidResults() .isEmpty()) ingredients.setOutputs(VanillaTypes.FLUID, recipe.getFluidResults()); @@ -97,7 +97,7 @@ public class BasinCategory extends CreateRecipeCategory { Ingredient ingredient = pair.getFirst(); MutableInt amount = pair.getSecond(); - for (ItemStack itemStack : ingredient.getMatchingStacks()) { + for (ItemStack itemStack : ingredient.getItems()) { ItemStack stack = itemStack.copy(); stack.setCount(amount.getValue()); stacks.add(stack); @@ -117,7 +117,7 @@ public class BasinCategory extends CreateRecipeCategory { if (!itemOutput.isEmpty()) { itemStacks.init(i, false, 141, 50 + yOffset); - itemStacks.set(i, recipe.getRecipeOutput() + itemStacks.set(i, recipe.getResultItem() .getStack()); yOffset -= 19; } @@ -165,7 +165,7 @@ public class BasinCategory extends CreateRecipeCategory { AllGuiTextures heatBar = noHeat ? AllGuiTextures.JEI_NO_HEAT_BAR : AllGuiTextures.JEI_HEAT_BAR; heatBar.draw(matrixStack, 4, 80); - Minecraft.getInstance().fontRenderer.draw(matrixStack, Lang.translate(requiredHeat.getTranslationKey()), 9, + Minecraft.getInstance().font.draw(matrixStack, Lang.translate(requiredHeat.getTranslationKey()), 9, 86, requiredHeat.getColor()); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java index 2d1cfe9b7..95dd72956 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java @@ -45,7 +45,7 @@ public class BlockCuttingCategory extends CreateRecipeCategory> results = recipe.getCondensedOutputs(); for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { @@ -110,19 +110,19 @@ public class BlockCuttingCategory extends CreateRecipeCategory> implements IRec return icon; } - protected static AllGuiTextures getRenderedSlot(IRecipe recipe, int index) { + public static AllGuiTextures getRenderedSlot(IRecipe recipe, int index) { AllGuiTextures jeiSlot = AllGuiTextures.JEI_SLOT; if (!(recipe instanceof ProcessingRecipe)) return jeiSlot; @@ -85,27 +85,33 @@ public abstract class CreateRecipeCategory> implements IRec return AllGuiTextures.JEI_CHANCE_SLOT; } - protected static IDrawable emptyBackground(int width, int height) { + public static IDrawable emptyBackground(int width, int height) { return new EmptyBackground(width, height); } - protected static IDrawable doubleItemIcon(IItemProvider item1, IItemProvider item2) { + public static IDrawable doubleItemIcon(IItemProvider item1, IItemProvider item2) { return new DoubleItemIcon(() -> new ItemStack(item1), () -> new ItemStack(item2)); } - protected static IDrawable itemIcon(IItemProvider item) { + public static IDrawable itemIcon(IItemProvider item) { return new DoubleItemIcon(() -> new ItemStack(item), () -> ItemStack.EMPTY); } - protected static void addStochasticTooltip(IGuiItemStackGroup itemStacks, List results) { + public static void addStochasticTooltip(IGuiItemStackGroup itemStacks, List results) { + addStochasticTooltip(itemStacks, results, 1); + } + + public static void addStochasticTooltip(IGuiItemStackGroup itemStacks, List results, int startIndex) { itemStacks.addTooltipCallback((slotIndex, input, ingredient, tooltip) -> { if (input) return; - ProcessingOutput output = results.get(slotIndex - 1); + if (slotIndex < startIndex) + return; + ProcessingOutput output = results.get(slotIndex - startIndex); float chance = output.getChance(); if (chance != 1) tooltip.add(1, Lang.translate("recipe.processing.chance", chance < 0.01 ? "<1" : (int) (chance * 100)) - .formatted(TextFormatting.GOLD)); + .withStyle(TextFormatting.GOLD)); }); } @@ -138,7 +144,7 @@ public abstract class CreateRecipeCategory> implements IRec return; if (fluid.getFluid() - .isEquivalentTo(AllFluids.POTION.get())) { + .isSame(AllFluids.POTION.get())) { ITextComponent name = fluid.getDisplayName(); if (tooltip.isEmpty()) tooltip.add(0, name); @@ -152,7 +158,7 @@ public abstract class CreateRecipeCategory> implements IRec } int amount = amounts.get(index != -1 ? 0 : slotIndex); - ITextComponent text = (Lang.translate("generic.unit.millibuckets", amount)).formatted(TextFormatting.GOLD); + ITextComponent text = (Lang.translate("generic.unit.millibuckets", amount)).withStyle(TextFormatting.GOLD); if (tooltip.isEmpty()) tooltip.add(0, text); else { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java index 6d8fab965..794b43cfd 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java @@ -41,7 +41,7 @@ public class CrushingCategory extends CreateRecipeCategory results = recipe.getRollableResults(); int size = results.size(); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/DeployingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/DeployingCategory.java index d3d6c6d3e..f3fc6ee9e 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/DeployingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/DeployingCategory.java @@ -39,7 +39,7 @@ public class DeployingCategory extends CreateRecipeCategory @Override public void renderAttachedBlock(MatrixStack matrixStack) { - GuiGameElement.of(Blocks.FIRE.getDefaultState()) + GuiGameElement.of(Blocks.FIRE.defaultBlockState()) .scale(24) .atLocal(0, 0, 2) .render(matrixStack); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java index d6bb5a96d..939071a61 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java @@ -40,7 +40,7 @@ public class FanWashingCategory extends ProcessingViaFanCategory results = recipe.getRollableResults(); boolean single = results.size() == 1; @@ -86,14 +86,14 @@ public class FanWashingCategory extends ProcessingViaFanCategory { .forEach(stack -> { if (stack.getItem() instanceof PotionItem) { FluidStack fluidFromPotionItem = PotionFluidHandler.getFluidFromPotionItem(stack); - Ingredient potion = Ingredient.fromStacks(stack); + Ingredient potion = Ingredient.of(stack); recipes.add(new ProcessingRecipeBuilder<>(EmptyingRecipe::new, Create.asResource("potions")) .withItemIngredients(potion) .withFluidOutputs(fluidFromPotionItem) @@ -70,8 +70,10 @@ public class ItemDrainCategory extends CreateRecipeCategory { ItemStack result = handler.getContainer(); if (extracted.isEmpty()) return; + if (result.isEmpty()) + return; - Ingredient ingredient = Ingredient.fromStacks(stack); + Ingredient ingredient = Ingredient.of(stack); ResourceLocation itemName = stack.getItem() .getRegistryName(); ResourceLocation fluidName = extracted.getFluid() @@ -99,7 +101,7 @@ public class ItemDrainCategory extends CreateRecipeCategory { if (!recipe.getRollableResults() .isEmpty()) - ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput()); + ingredients.setOutput(VanillaTypes.ITEM, recipe.getResultItem()); if (!recipe.getFluidResults() .isEmpty()) ingredients.setOutputs(VanillaTypes.FLUID, recipe.getFluidResults()); @@ -112,14 +114,14 @@ public class ItemDrainCategory extends CreateRecipeCategory { FluidStack fluidOutput = recipe.getResultingFluid(); List matchingIngredients = Arrays.asList(recipe.getIngredients() .get(0) - .getMatchingStacks()); + .getItems()); fluidStacks.init(0, true, 132, 8); fluidStacks.set(0, withImprovedVisibility(fluidOutput)); itemStacks.init(0, true, 26, 7); itemStacks.set(0, matchingIngredients); itemStacks.init(1, false, 131, 26); - itemStacks.set(1, recipe.getRecipeOutput()); + itemStacks.set(1, recipe.getResultItem()); addFluidTooltip(fluidStacks, Collections.emptyList(), ImmutableList.of(fluidOutput)); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java index 86febc77d..545184839 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java @@ -41,7 +41,7 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory recipeIngredients = recipe.getIngredients(); itemStacks.init(0, false, 133, 80); - itemStacks.set(0, recipe.getRecipeOutput() + itemStacks.set(0, recipe.getResultItem() .getStack()); int x = getXPadding(recipe); @@ -66,7 +66,7 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory list = new ArrayList<>(); TranslationTextComponent crash = new TranslationTextComponent("jei.tooltip.error.crash"); - list.add(crash.formatted(TextFormatting.RED)); + list.add(crash.withStyle(TextFormatting.RED)); return list; } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java index ddd53ff55..fda2f0e9b 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java @@ -41,7 +41,7 @@ public class MillingCategory extends CreateRecipeCategory results = recipe.getRollableResults(); boolean single = results.size() == 1; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MysteriousItemConversionCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MysteriousItemConversionCategory.java index 16d2d67dd..86332537c 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MysteriousItemConversionCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MysteriousItemConversionCategory.java @@ -23,7 +23,7 @@ public class MysteriousItemConversionCategory extends CreateRecipeCategory results = recipe.getRollableResults(); itemStacks.init(0, true, 26, 16); - itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); + itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getItems())); itemStacks.init(1, false, 131, 16); itemStacks.set(1, results.get(0).getStack()); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/PackingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/PackingCategory.java index 2dcdce197..dac7c0e38 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/PackingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/PackingCategory.java @@ -4,8 +4,10 @@ import java.util.Arrays; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlocks; +import com.simibubi.create.compat.jei.category.animations.AnimatedBlazeBurner; import com.simibubi.create.compat.jei.category.animations.AnimatedPress; import com.simibubi.create.content.contraptions.processing.BasinRecipe; +import com.simibubi.create.content.contraptions.processing.HeatCondition; import com.simibubi.create.foundation.gui.AllGuiTextures; import mezz.jei.api.gui.IRecipeLayout; @@ -19,6 +21,7 @@ import net.minecraft.util.NonNullList; public class PackingCategory extends BasinCategory { private AnimatedPress press = new AnimatedPress(true); + private final AnimatedBlazeBurner heater = new AnimatedBlazeBurner(); private PackingType type; enum PackingType { @@ -55,12 +58,12 @@ public class PackingCategory extends BasinCategory { while (i < size) { Ingredient ingredient = ingredients2.get(i); itemStacks.init(i, true, (rows == 2 ? 26 : 17) + (i % rows) * 19, 50 - (i / rows) * 19); - itemStacks.set(i, Arrays.asList(ingredient.getMatchingStacks())); + itemStacks.set(i, Arrays.asList(ingredient.getItems())); i++; } itemStacks.init(i, false, 141, 50); - itemStacks.set(i, recipe.getRecipeOutput()); + itemStacks.set(i, recipe.getResultItem()); } @Override @@ -80,7 +83,11 @@ public class PackingCategory extends BasinCategory { AllGuiTextures.JEI_SHADOW.draw(matrixStack, 81, 68); } - press.draw(matrixStack, getBackground().getWidth() / 2 + 6, 40); + HeatCondition requiredHeat = recipe.getRequiredHeat(); + if (requiredHeat != HeatCondition.NONE) + heater.withHeat(requiredHeat.visualizeAsBlazeBurner()) + .draw(matrixStack, getBackground().getWidth() / 2 + 3, 55); + press.draw(matrixStack, getBackground().getWidth() / 2 + 3, 34); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java index 99a5cbaf0..e3e2a461d 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java @@ -47,7 +47,7 @@ public class PolishingCategory extends CreateRecipeCategory ingredients = recipe.getIngredients(); ItemStack[] matchingStacks = ingredients.get(0) - .getMatchingStacks(); + .getItems(); if (matchingStacks.length == 0) return; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/PressingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/PressingCategory.java index fbd9d0656..ac32b8c5c 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/PressingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/PressingCategory.java @@ -41,7 +41,7 @@ public class PressingCategory extends CreateRecipeCategory { itemStacks.init(0, true, 26, 50); itemStacks.set(0, Arrays.asList(recipe.getIngredients() .get(0) - .getMatchingStacks())); + .getItems())); List results = recipe.getRollableResults(); for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java index ace3e71e2..4d0467a57 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java @@ -10,7 +10,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.utility.Lang; import mezz.jei.api.constants.VanillaTypes; @@ -35,12 +34,12 @@ public abstract class ProcessingViaFanCategory> extends Cre @Override public void setIngredients(T recipe, IIngredients ingredients) { ingredients.setInputIngredients(recipe.getIngredients()); - ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput()); + ingredients.setOutput(VanillaTypes.ITEM, recipe.getResultItem()); } public static Supplier getFan(String name) { return () -> AllBlocks.ENCASED_FAN.asStack() - .setDisplayName(Lang.translate("recipe." + name + ".fan").styled(style -> style.withItalic(false))); + .setHoverName(Lang.translate("recipe." + name + ".fan").withStyle(style -> style.withItalic(false))); } @Override @@ -49,10 +48,10 @@ public abstract class ProcessingViaFanCategory> extends Cre itemStacks.init(0, true, 20, 47); itemStacks.set(0, Arrays.asList(recipe.getIngredients() .get(0) - .getMatchingStacks())); + .getItems())); itemStacks.init(1, false, 139, 47); - itemStacks.set(1, recipe.getRecipeOutput()); + itemStacks.set(1, recipe.getResultItem()); } protected void renderWidgets(MatrixStack matrixStack, T recipe, double mouseX, double mouseY) { @@ -69,27 +68,25 @@ public abstract class ProcessingViaFanCategory> extends Cre return; renderWidgets(matrixStack, recipe, mouseX, mouseY); - matrixStack.push(); + matrixStack.pushPose(); translateFan(matrixStack); - matrixStack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-12.5f)); - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(22.5f)); + matrixStack.mulPose(Vector3f.XP.rotationDegrees(-12.5f)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f)); int scale = 24; - GuiGameElement.of(AllBlockPartials.ENCASED_FAN_INNER) + AnimatedKinetics.defaultBlockElement(AllBlockPartials.ENCASED_FAN_INNER) .rotateBlock(180, 0, AnimatedKinetics.getCurrentAngle() * 16) .scale(scale) - .lighting(AnimatedKinetics.DEFAULT_LIGHTING) .render(matrixStack); - GuiGameElement.of(AllBlocks.ENCASED_FAN.getDefaultState()) + AnimatedKinetics.defaultBlockElement(AllBlocks.ENCASED_FAN.getDefaultState()) .rotateBlock(0, 180, 0) .atLocal(0, 0, 0) .scale(scale) - .lighting(AnimatedKinetics.DEFAULT_LIGHTING) .render(matrixStack); renderAttachedBlock(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); } protected void translateFan(MatrixStack matrixStack) { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java index 61f88da28..83a6275e4 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java @@ -41,7 +41,7 @@ public class SawingCategory extends CreateRecipeCategory { itemStacks.init(0, true, 43, 4); itemStacks.set(0, Arrays.asList(recipe.getIngredients() .get(0) - .getMatchingStacks())); + .getItems())); List results = recipe.getRollableResults(); for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java index 0e1b480c4..74a81570f 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java @@ -40,7 +40,7 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory subCategories = new HashMap<>(); public SequencedAssemblyCategory() { - super(itemIcon(AllItems.CLOCKWORK_COMPONENT.get()), new EmptyBackground(180, 115)); + super(itemIcon(AllItems.PRECISION_MECHANISM.get()), new EmptyBackground(180, 115)); } @Override @@ -58,7 +58,7 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory 1) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(15, 9, 0); RenderSystem.color4f(.65f, .65f, .65f, 1); AllIcons.I_REFRESH.draw(matrixStack, 50 + xOffset, 75); RenderSystem.color4f(1, 1, 1, 1); ITextComponent repeat = new StringTextComponent("x" + recipe.getLoops()); font.draw(matrixStack, repeat, 66 + xOffset, 80, 0x888888); - matrixStack.pop(); + matrixStack.popPose(); } - matrixStack.pop(); + matrixStack.popPose(); int width = 0; int margin = 3; @@ -162,18 +162,18 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory> sequence = recipe.getSequence(); for (int i = 0; i < sequence.size(); i++) { SequencedRecipe sequencedRecipe = sequence.get(i); SequencedAssemblySubCategory subCategory = getSubCategory(sequencedRecipe); int subWidth = subCategory.getWidth(); StringTextComponent component = new StringTextComponent("" + romans[Math.min(i, 6)]); - font.draw(matrixStack, component, font.getWidth(component) / -2 + subWidth / 2, 2, 0x888888); + font.draw(matrixStack, component, font.width(component) / -2 + subWidth / 2, 2, 0x888888); subCategory.draw(sequencedRecipe, matrixStack, mouseX, mouseY, i); matrixStack.translate(subWidth + margin, 0, 0); } - matrixStack.pop(); + matrixStack.popPose(); } @Override @@ -194,7 +194,7 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory getAllItemIngredients(SequencedAssemblyRecipe recipe) { List assemblyIngredients = new ArrayList<>(); assemblyIngredients.add(recipe.getIngredient()); - assemblyIngredients.add(Ingredient.fromStacks(recipe.getTransitionalItem())); + assemblyIngredients.add(Ingredient.of(recipe.getTransitionalItem())); recipe.addAdditionalIngredientsAndMachines(assemblyIngredients); return assemblyIngredients; } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SpoutCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/SpoutCategory.java index 0c965b5c6..dd9f16238 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SpoutCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/SpoutCategory.java @@ -52,7 +52,7 @@ public class SpoutCategory extends CreateRecipeCategory { .forEach(stack -> { if (stack.getItem() instanceof PotionItem) { FluidStack fluidFromPotionItem = PotionFluidHandler.getFluidFromPotionItem(stack); - Ingredient bottle = Ingredient.fromItems(Items.GLASS_BOTTLE); + Ingredient bottle = Ingredient.of(Items.GLASS_BOTTLE); recipes.add(new ProcessingRecipeBuilder<>(FillingRecipe::new, Create.asResource("potions")) .withItemIngredients(bottle) .withFluidIngredients(FluidIngredient.fromFluidStack(fluidFromPotionItem)) @@ -78,12 +78,12 @@ public class SpoutCategory extends CreateRecipeCategory { fluidCopy.setAmount(1000); fhi.fill(fluidCopy, FluidAction.EXECUTE); ItemStack container = fhi.getContainer(); - if (container.isItemEqual(copy)) + if (container.sameItem(copy)) return; if (container.isEmpty()) return; - Ingredient bucket = Ingredient.fromStacks(stack); + Ingredient bucket = Ingredient.of(stack); ResourceLocation itemName = stack.getItem() .getRegistryName(); ResourceLocation fluidName = fluidCopy.getFluid() @@ -117,7 +117,7 @@ public class SpoutCategory extends CreateRecipeCategory { if (!recipe.getRollableResults() .isEmpty()) - ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput()); + ingredients.setOutput(VanillaTypes.ITEM, recipe.getResultItem()); if (!recipe.getFluidResults() .isEmpty()) ingredients.setOutputs(VanillaTypes.FLUID, recipe.getFluidResults()); @@ -130,14 +130,14 @@ public class SpoutCategory extends CreateRecipeCategory { FluidIngredient fluidIngredient = recipe.getRequiredFluid(); List matchingIngredients = Arrays.asList(recipe.getIngredients() .get(0) - .getMatchingStacks()); + .getItems()); fluidStacks.init(0, true, 27, 32); fluidStacks.set(0, withImprovedVisibility(fluidIngredient.getMatchingFluidStacks())); itemStacks.init(0, true, 26, 50); itemStacks.set(0, matchingIngredients); itemStacks.init(1, false, 131, 50); - itemStacks.set(1, recipe.getRecipeOutput()); + itemStacks.set(1, recipe.getResultItem()); addFluidTooltip(fluidStacks, ImmutableList.of(fluidIngredient), Collections.emptyList()); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java index 6757ced6d..84302d924 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java @@ -20,26 +20,26 @@ public class AnimatedBlazeBurner extends AnimatedKinetics { } public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(xOffset, yOffset, 200); - matrixStack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-15.5f)); - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(22.5f)); + matrixStack.mulPose(Vector3f.XP.rotationDegrees(-15.5f)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f)); int scale = 23; - defaultBlockElement(AllBlocks.BLAZE_BURNER.getDefaultState()) + blockElement(AllBlocks.BLAZE_BURNER.getDefaultState()) .atLocal(0, 1.65, 0) .scale(scale) .render(matrixStack); float offset = (MathHelper.sin(AnimationTickHolder.getRenderTime() / 16f) + 0.5f) / 16f; PartialModel blaze = AllBlockPartials.BLAZES.get(heatLevel); - defaultBlockElement(blaze) + blockElement(blaze) .atLocal(1, 1.65 + offset, 1) .rotate(0, 180, 0) .scale(scale) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrafter.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrafter.java index 525558289..ecee0a86f 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrafter.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrafter.java @@ -1,35 +1,35 @@ package com.simibubi.create.compat.jei.category.animations; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.utility.MatrixStacker; public class AnimatedCrafter extends AnimatedKinetics { @Override public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(xOffset, yOffset, 0); AllGuiTextures.JEI_SHADOW.draw(matrixStack, -16, 13); matrixStack.translate(3, 16, 0); - MatrixStacker.of(matrixStack) + MatrixTransformStack.of(matrixStack) .rotateX(-12.5f) .rotateY(-22.5f); int scale = 22; - defaultBlockElement(cogwheel()) + blockElement(cogwheel()) .rotateBlock(90, 0, getCurrentAngle()) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlocks.MECHANICAL_CRAFTER.getDefaultState()) + blockElement(AllBlocks.MECHANICAL_CRAFTER.getDefaultState()) .rotateBlock(0, 180, 0) .scale(scale) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrushingWheels.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrushingWheels.java index eecc33882..29ef44198 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrushingWheels.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedCrushingWheels.java @@ -11,27 +11,27 @@ import net.minecraft.util.math.vector.Vector3f; public class AnimatedCrushingWheels extends AnimatedKinetics { private final BlockState wheel = AllBlocks.CRUSHING_WHEEL.getDefaultState() - .with(BlockStateProperties.AXIS, Axis.X); + .setValue(BlockStateProperties.AXIS, Axis.X); @Override public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(xOffset, yOffset, 100); - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-22.5f)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(-22.5f)); int scale = 22; - defaultBlockElement(wheel) + blockElement(wheel) .rotateBlock(0, 90, -getCurrentAngle()) .scale(scale) .render(matrixStack); - defaultBlockElement(wheel) + blockElement(wheel) .rotateBlock(0, 90, getCurrentAngle()) .atLocal(2, 0, 0) .scale(scale) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java index 8e5faedab..e5236ee95 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java @@ -14,46 +14,46 @@ public class AnimatedDeployer extends AnimatedKinetics { @Override public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(xOffset, yOffset, 100); - matrixStack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-15.5f)); - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(22.5f)); + matrixStack.mulPose(Vector3f.XP.rotationDegrees(-15.5f)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f)); int scale = 20; - defaultBlockElement(shaft(Axis.Z)) + blockElement(shaft(Axis.Z)) .rotateBlock(0, 0, getCurrentAngle()) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlocks.DEPLOYER.getDefaultState() - .with(DeployerBlock.FACING, Direction.DOWN) - .with(DeployerBlock.AXIS_ALONG_FIRST_COORDINATE, false)) + blockElement(AllBlocks.DEPLOYER.getDefaultState() + .setValue(DeployerBlock.FACING, Direction.DOWN) + .setValue(DeployerBlock.AXIS_ALONG_FIRST_COORDINATE, false)) .scale(scale) .render(matrixStack); float cycle = (AnimationTickHolder.getRenderTime() - offset * 8) % 30; float offset = cycle < 10 ? cycle / 10f : cycle < 20 ? (20 - cycle) / 10f : 0; - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(0, offset * 17, 0); - defaultBlockElement(AllBlockPartials.DEPLOYER_POLE) + blockElement(AllBlockPartials.DEPLOYER_POLE) .rotateBlock(90, 0, 0) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlockPartials.DEPLOYER_HAND_HOLDING) + blockElement(AllBlockPartials.DEPLOYER_HAND_HOLDING) .rotateBlock(90, 0, 0) .scale(scale) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); - defaultBlockElement(AllBlocks.DEPOT.getDefaultState()) + blockElement(AllBlocks.DEPOT.getDefaultState()) .atLocal(0, 2, 0) .scale(scale) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java index 7bb1e0126..3186ad0c7 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java @@ -21,25 +21,25 @@ public class AnimatedItemDrain extends AnimatedKinetics { @Override public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(xOffset, yOffset, 100); - matrixStack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-15.5f)); - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(22.5f)); + matrixStack.mulPose(Vector3f.XP.rotationDegrees(-15.5f)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f)); int scale = 20; - defaultBlockElement(AllBlocks.ITEM_DRAIN.getDefaultState()) + blockElement(AllBlocks.ITEM_DRAIN.getDefaultState()) .scale(scale) .render(matrixStack); Impl buffer = IRenderTypeBuffer.immediate(Tessellator.getInstance() - .getBuffer()); + .getBuilder()); MatrixStack ms = new MatrixStack(); ms.scale(scale, -scale, scale); float from = 2/16f; float to = 1f - from; FluidRenderer.renderTiledFluidBB(fluid, from, from, from, to, 3/4f, to, buffer, ms, 0xF000F0, false); - buffer.draw(); + buffer.endBatch(); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java index a07c37fd8..069a397e2 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java @@ -22,26 +22,42 @@ public abstract class AnimatedKinetics implements IDrawable { .secondLightRotation(-20.0f, 50.0f) .build(); + /** + * Only use this method outside of subclasses. + * Use {@link #blockElement(BlockState)} if calling from inside a subclass. + */ + public static GuiGameElement.GuiRenderBuilder defaultBlockElement(BlockState state) { + return GuiGameElement.of(state) + .lighting(DEFAULT_LIGHTING); + } + + /** + * Only use this method outside of subclasses. + * Use {@link #blockElement(PartialModel)} if calling from inside a subclass. + */ + public static GuiGameElement.GuiRenderBuilder defaultBlockElement(PartialModel partial) { + return GuiGameElement.of(partial) + .lighting(DEFAULT_LIGHTING); + } + public static float getCurrentAngle() { return (AnimationTickHolder.getRenderTime() * 4f) % 360; } protected BlockState shaft(Axis axis) { - return AllBlocks.SHAFT.getDefaultState().with(BlockStateProperties.AXIS, axis); + return AllBlocks.SHAFT.getDefaultState().setValue(BlockStateProperties.AXIS, axis); } protected PartialModel cogwheel() { return AllBlockPartials.SHAFTLESS_COGWHEEL; } - protected GuiGameElement.GuiRenderBuilder defaultBlockElement(BlockState state) { - return GuiGameElement.of(state) - .lighting(DEFAULT_LIGHTING); + protected GuiGameElement.GuiRenderBuilder blockElement(BlockState state) { + return defaultBlockElement(state); } - protected GuiGameElement.GuiRenderBuilder defaultBlockElement(PartialModel partial) { - return GuiGameElement.of(partial) - .lighting(DEFAULT_LIGHTING); + protected GuiGameElement.GuiRenderBuilder blockElement(PartialModel partial) { + return defaultBlockElement(partial); } @Override diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMillstone.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMillstone.java index 147d9b2c4..4c9b87063 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMillstone.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMillstone.java @@ -9,23 +9,23 @@ public class AnimatedMillstone extends AnimatedKinetics { @Override public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(xOffset, yOffset, 0); AllGuiTextures.JEI_SHADOW.draw(matrixStack, -16, 13); matrixStack.translate(-2, 18, 0); int scale = 22; - defaultBlockElement(AllBlockPartials.MILLSTONE_COG) + blockElement(AllBlockPartials.MILLSTONE_COG) .rotateBlock(22.5, getCurrentAngle() * 2, 0) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlocks.MILLSTONE.getDefaultState()) + blockElement(AllBlocks.MILLSTONE.getDefaultState()) .rotateBlock(22.5, 22.5, 0) .scale(scale) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java index 05f9b806e..1b95917a9 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java @@ -12,42 +12,42 @@ public class AnimatedMixer extends AnimatedKinetics { @Override public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(xOffset, yOffset, 200); - matrixStack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-15.5f)); - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(22.5f)); + matrixStack.mulPose(Vector3f.XP.rotationDegrees(-15.5f)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f)); int scale = 23; - defaultBlockElement(cogwheel()) + blockElement(cogwheel()) .rotateBlock(0, getCurrentAngle() * 2, 0) .atLocal(0, 0, 0) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlocks.MECHANICAL_MIXER.getDefaultState()) + blockElement(AllBlocks.MECHANICAL_MIXER.getDefaultState()) .atLocal(0, 0, 0) .scale(scale) .render(matrixStack); float animation = ((MathHelper.sin(AnimationTickHolder.getRenderTime() / 32f) + 1) / 5) + .5f; - defaultBlockElement(AllBlockPartials.MECHANICAL_MIXER_POLE) + blockElement(AllBlockPartials.MECHANICAL_MIXER_POLE) .atLocal(0, animation, 0) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlockPartials.MECHANICAL_MIXER_HEAD) + blockElement(AllBlockPartials.MECHANICAL_MIXER_HEAD) .rotateBlock(0, getCurrentAngle() * 4, 0) .atLocal(0, animation, 0) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlocks.BASIN.getDefaultState()) + blockElement(AllBlocks.BASIN.getDefaultState()) .atLocal(0, 1.65, 0) .scale(scale) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java index 7f1b7dca0..a812afaa8 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java @@ -18,33 +18,33 @@ public class AnimatedPress extends AnimatedKinetics { @Override public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { - matrixStack.push(); - matrixStack.translate(xOffset, yOffset, 100); - matrixStack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-15.5f)); - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(22.5f)); - int scale = basin ? 20 : 24; + matrixStack.pushPose(); + matrixStack.translate(xOffset, yOffset, 200); + matrixStack.mulPose(Vector3f.XP.rotationDegrees(-15.5f)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f)); + int scale = basin ? 23 : 24; - defaultBlockElement(shaft(Axis.Z)) + blockElement(shaft(Axis.Z)) .rotateBlock(0, 0, getCurrentAngle()) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlocks.MECHANICAL_PRESS.getDefaultState()) + blockElement(AllBlocks.MECHANICAL_PRESS.getDefaultState()) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlockPartials.MECHANICAL_PRESS_HEAD) + blockElement(AllBlockPartials.MECHANICAL_PRESS_HEAD) .atLocal(0, -getAnimatedHeadOffset(), 0) .scale(scale) .render(matrixStack); if (basin) - defaultBlockElement(AllBlocks.BASIN.getDefaultState()) + blockElement(AllBlocks.BASIN.getDefaultState()) .atLocal(0, 1.65, 0) .scale(scale) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); } private float getAnimatedHeadOffset() { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSaw.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSaw.java index 1b051efd3..de5e9dd97 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSaw.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSaw.java @@ -13,31 +13,31 @@ public class AnimatedSaw extends AnimatedKinetics { @Override public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(xOffset, yOffset, 0); matrixStack.translate(0, 0, 200); matrixStack.translate(2, 22, 0); - matrixStack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-15.5f)); - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(22.5f + 90)); + matrixStack.mulPose(Vector3f.XP.rotationDegrees(-15.5f)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f + 90)); int scale = 25; - defaultBlockElement(shaft(Axis.X)) + blockElement(shaft(Axis.X)) .rotateBlock(-getCurrentAngle(), 0, 0) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlocks.MECHANICAL_SAW.getDefaultState() - .with(SawBlock.FACING, Direction.UP)) + blockElement(AllBlocks.MECHANICAL_SAW.getDefaultState() + .setValue(SawBlock.FACING, Direction.UP)) .rotateBlock(0, 0, 0) .scale(scale) .render(matrixStack); - defaultBlockElement(AllBlockPartials.SAW_BLADE_VERTICAL_ACTIVE) + blockElement(AllBlockPartials.SAW_BLADE_VERTICAL_ACTIVE) .rotateBlock(0, -90, -90) .scale(scale) .render(matrixStack); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index 6d812aab3..0e09a4c51 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -26,13 +26,13 @@ public class AnimatedSpout extends AnimatedKinetics { @Override public void draw(MatrixStack matrixStack, int xOffset, int yOffset) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(xOffset, yOffset, 100); - matrixStack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-15.5f)); - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(22.5f)); + matrixStack.mulPose(Vector3f.XP.rotationDegrees(-15.5f)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f)); int scale = 20; - defaultBlockElement(AllBlocks.SPOUT.getDefaultState()) + blockElement(AllBlocks.SPOUT.getDefaultState()) .scale(scale) .render(matrixStack); @@ -40,36 +40,36 @@ public class AnimatedSpout extends AnimatedKinetics { float squeeze = cycle < 20 ? MathHelper.sin((float) (cycle / 20f * Math.PI)) : 0; squeeze *= 20; - matrixStack.push(); + matrixStack.pushPose(); - defaultBlockElement(AllBlockPartials.SPOUT_TOP) + blockElement(AllBlockPartials.SPOUT_TOP) .scale(scale) .render(matrixStack); matrixStack.translate(0, -3 * squeeze / 32f, 0); - defaultBlockElement(AllBlockPartials.SPOUT_MIDDLE) + blockElement(AllBlockPartials.SPOUT_MIDDLE) .scale(scale) .render(matrixStack); matrixStack.translate(0, -3 * squeeze / 32f, 0); - defaultBlockElement(AllBlockPartials.SPOUT_BOTTOM) + blockElement(AllBlockPartials.SPOUT_BOTTOM) .scale(scale) .render(matrixStack); matrixStack.translate(0, -3 * squeeze / 32f, 0); - matrixStack.pop(); + matrixStack.popPose(); - defaultBlockElement(AllBlocks.DEPOT.getDefaultState()) + blockElement(AllBlocks.DEPOT.getDefaultState()) .atLocal(0, 2, 0) .scale(scale) .render(matrixStack); Impl buffer = IRenderTypeBuffer.immediate(Tessellator.getInstance() - .getBuffer()); - matrixStack.push(); + .getBuilder()); + matrixStack.pushPose(); matrixStack.scale(16, -16, 16); float from = 2/16f; float to = 1f - from; FluidRenderer.renderTiledFluidBB(fluids.get(0), from, from, from, to, to, to, buffer, matrixStack, 0xF000F0, false); - matrixStack.pop(); + matrixStack.popPose(); float width = 1 / 128f * squeeze; matrixStack.translate(scale / 2f, scale * 1.5f, scale / 2f); @@ -77,9 +77,9 @@ public class AnimatedSpout extends AnimatedKinetics { matrixStack.translate(-width / 2, 0, -width / 2); FluidRenderer.renderTiledFluidBB(fluids.get(0), 0, -0.001f, 0, width, 2.001f, width, buffer, matrixStack, 0xF000F0, false); - buffer.draw(); + buffer.endBatch(); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java index 15a078376..99810a1e1 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java @@ -51,11 +51,11 @@ public abstract class SequencedAssemblySubCategory { @Override public void draw(SequencedRecipe recipe, MatrixStack ms, double mouseX, double mouseY, int index) { press.offset = index; - ms.push(); + ms.pushPose(); ms.translate(-5, 50, 0); ms.scale(.6f, .6f, .6f); press.draw(ms, getWidth() / 2, 0); - ms.pop(); + ms.popPose(); } } @@ -86,7 +86,7 @@ public abstract class SequencedAssemblySubCategory { public void draw(SequencedRecipe recipe, MatrixStack ms, double mouseX, double mouseY, int index) { spout.offset = index; AllGuiTextures.JEI_SLOT.draw(ms, 3, 14); - ms.push(); + ms.pushPose(); ms.translate(-7, 50, 0); ms.scale(.75f, .75f, .75f); spout.withFluids(recipe.getRecipe() @@ -94,7 +94,7 @@ public abstract class SequencedAssemblySubCategory { .get(0) .getMatchingFluidStacks()) .draw(ms, getWidth() / 2, 0); - ms.pop(); + ms.popPose(); } } @@ -114,19 +114,19 @@ public abstract class SequencedAssemblySubCategory { itemStacks.set(index, Arrays.asList(recipe.getRecipe() .getIngredients() .get(1) - .getMatchingStacks())); + .getItems())); return 1; } @Override public void draw(SequencedRecipe recipe, MatrixStack ms, double mouseX, double mouseY, int index) { deployer.offset = index; - AllGuiTextures.JEI_SLOT.draw(ms, 3, 14); - ms.push(); + ms.pushPose(); ms.translate(-7, 50, 0); ms.scale(.75f, .75f, .75f); deployer.draw(ms, getWidth() / 2, 0); - ms.pop(); + ms.popPose(); + AllGuiTextures.JEI_SLOT.draw(ms, 3, 14); } } @@ -142,11 +142,11 @@ public abstract class SequencedAssemblySubCategory { @Override public void draw(SequencedRecipe recipe, MatrixStack ms, double mouseX, double mouseY, int index) { - ms.push(); + ms.pushPose(); ms.translate(0, 51.5f, 0); ms.scale(.6f, .6f, .6f); saw.draw(ms, getWidth() / 2, 30); - ms.pop(); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/CreateItemGroup.java b/src/main/java/com/simibubi/create/content/CreateItemGroup.java index e773d83b5..b36ce6945 100644 --- a/src/main/java/com/simibubi/create/content/CreateItemGroup.java +++ b/src/main/java/com/simibubi/create/content/CreateItemGroup.java @@ -19,7 +19,7 @@ public class CreateItemGroup extends CreateItemGroupBase { } @Override - public ItemStack createIcon() { + public ItemStack makeIcon() { return AllBlocks.COGWHEEL.asStack(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java b/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java index 6876dd717..0a3fa7cbd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java +++ b/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java @@ -37,23 +37,23 @@ public class KineticDebugger { if (te == null) return; - World world = Minecraft.getInstance().world; - BlockPos toOutline = te.hasSource() ? te.source : te.getPos(); + World world = Minecraft.getInstance().level; + BlockPos toOutline = te.hasSource() ? te.source : te.getBlockPos(); BlockState state = te.getBlockState(); VoxelShape shape = world.getBlockState(toOutline) - .getRenderShape(world, toOutline); + .getBlockSupportShape(world, toOutline); if (te.getTheoreticalSpeed() != 0 && !shape.isEmpty()) - CreateClient.OUTLINER.chaseAABB("kineticSource", shape.getBoundingBox() - .offset(toOutline)) + CreateClient.OUTLINER.chaseAABB("kineticSource", shape.bounds() + .move(toOutline)) .lineWidth(1 / 16f) .colored(te.hasSource() ? ColorHelper.colorFromLong(te.network) : 0xffcc00); if (state.getBlock() instanceof IRotate) { Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state); - Vector3d vec = Vector3d.of(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis) - .getDirectionVec()); - Vector3d center = VecHelper.getCenterOf(te.getPos()); + Vector3d vec = Vector3d.atLowerCornerOf(Direction.get(AxisDirection.POSITIVE, axis) + .getNormal()); + Vector3d center = VecHelper.getCenterOf(te.getBlockPos()); CreateClient.OUTLINER.showLine("rotationAxis", center.add(vec), center.subtract(vec)) .lineWidth(1 / 16f); } @@ -61,12 +61,12 @@ public class KineticDebugger { } public static boolean isActive() { - return Minecraft.getInstance().gameSettings.showDebugInfo && AllConfigs.CLIENT.rainbowDebug.get(); + return Minecraft.getInstance().options.renderDebug && AllConfigs.CLIENT.rainbowDebug.get(); } public static KineticTileEntity getSelectedTE() { - RayTraceResult obj = Minecraft.getInstance().objectMouseOver; - ClientWorld world = Minecraft.getInstance().world; + RayTraceResult obj = Minecraft.getInstance().hitResult; + ClientWorld world = Minecraft.getInstance().level; if (obj == null) return null; if (world == null) @@ -75,7 +75,7 @@ public class KineticDebugger { return null; BlockRayTraceResult ray = (BlockRayTraceResult) obj; - TileEntity te = world.getTileEntity(ray.getPos()); + TileEntity te = world.getBlockEntity(ray.getBlockPos()); if (!(te instanceof KineticTileEntity)) return null; diff --git a/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java b/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java index bbbe8e585..af9076cb6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java +++ b/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java @@ -89,7 +89,7 @@ public class KineticNetwork { te.updateFromNetwork(0, 0, 0); if (members.isEmpty()) { - TorquePropagator.networks.get(te.getWorld()) + TorquePropagator.networks.get(te.getLevel()) .remove(this.id); return; } @@ -109,9 +109,9 @@ public class KineticNetwork { boolean wasOverStressed = te.isOverStressed(); te.updateFromNetwork(currentCapacity, currentStress, getSize()); if (!wasOverStressed && te.isOverStressed() && te.getTheoreticalSpeed() != 0) { - AllTriggers.triggerForNearbyPlayers(AllTriggers.OVERSTRESSED, te.getWorld(), te.getPos(), 4); + AllTriggers.triggerForNearbyPlayers(AllTriggers.OVERSTRESSED, te.getLevel(), te.getBlockPos(), 4); if (containsFlywheel) - AllTriggers.triggerForNearbyPlayers(AllTriggers.OVERSTRESS_FLYWHEEL, te.getWorld(), te.getPos(), 4); + AllTriggers.triggerForNearbyPlayers(AllTriggers.OVERSTRESS_FLYWHEEL, te.getLevel(), te.getBlockPos(), 4); } } @@ -147,8 +147,8 @@ public class KineticNetwork { for (Iterator iterator = sources.keySet() .iterator(); iterator.hasNext();) { KineticTileEntity te = iterator.next(); - if (te.getWorld() - .getTileEntity(te.getPos()) != te) { + if (te.getLevel() + .getBlockEntity(te.getBlockPos()) != te) { iterator.remove(); continue; } @@ -164,8 +164,8 @@ public class KineticNetwork { for (Iterator iterator = members.keySet() .iterator(); iterator.hasNext();) { KineticTileEntity te = iterator.next(); - if (te.getWorld() - .getTileEntity(te.getPos()) != te) { + if (te.getLevel() + .getBlockEntity(te.getBlockPos()) != te) { iterator.remove(); continue; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java b/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java index faa8c2046..c12e8a081 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java @@ -51,20 +51,20 @@ public class RotationPropagator { final IRotate definitionFrom = (IRotate) fromBlock; final IRotate definitionTo = (IRotate) toBlock; - final BlockPos diff = to.getPos() - .subtract(from.getPos()); - final Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ()); - final World world = from.getWorld(); + final BlockPos diff = to.getBlockPos() + .subtract(from.getBlockPos()); + final Direction direction = Direction.getNearest(diff.getX(), diff.getY(), diff.getZ()); + final World world = from.getLevel(); boolean alignedAxes = true; for (Axis axis : Axis.values()) if (axis != direction.getAxis()) - if (axis.getCoordinate(diff.getX(), diff.getY(), diff.getZ()) != 0) + if (axis.choose(diff.getX(), diff.getY(), diff.getZ()) != 0) alignedAxes = false; boolean connectedByAxis = - alignedAxes && definitionFrom.hasShaftTowards(world, from.getPos(), stateFrom, direction) - && definitionTo.hasShaftTowards(world, to.getPos(), stateTo, direction.getOpposite()); + alignedAxes && definitionFrom.hasShaftTowards(world, from.getBlockPos(), stateFrom, direction) + && definitionTo.hasShaftTowards(world, to.getBlockPos(), stateTo, direction.getOpposite()); boolean connectedByGears = ICogWheel.isSmallCog(stateFrom) && ICogWheel.isSmallCog(stateTo); @@ -89,10 +89,10 @@ public class RotationPropagator { // Large Gear <-> Large Gear if (isLargeToLargeGear(stateFrom, stateTo, diff)) { - Axis sourceAxis = stateFrom.get(AXIS); - Axis targetAxis = stateTo.get(AXIS); - int sourceAxisDiff = sourceAxis.getCoordinate(diff.getX(), diff.getY(), diff.getZ()); - int targetAxisDiff = targetAxis.getCoordinate(diff.getX(), diff.getY(), diff.getZ()); + Axis sourceAxis = stateFrom.getValue(AXIS); + Axis targetAxis = stateTo.getValue(AXIS); + int sourceAxisDiff = sourceAxis.choose(diff.getX(), diff.getY(), diff.getZ()); + int targetAxisDiff = targetAxis.choose(diff.getX(), diff.getY(), diff.getZ()); return sourceAxisDiff > 0 ^ targetAxisDiff > 0 ? -1 : 1; } @@ -107,7 +107,7 @@ public class RotationPropagator { // Gear <-> Gear if (connectedByGears) { - if (diff.manhattanDistance(BlockPos.ZERO) != 1) + if (diff.distManhattan(BlockPos.ZERO) != 1) return 0; if (ICogWheel.isLargeCog(stateTo)) return 0; @@ -125,11 +125,11 @@ public class RotationPropagator { final BlockState stateTo = to.getBlockState(); // Rotation Speed Controller <-> Large Gear - if (isLargeCogToSpeedController(stateFrom, stateTo, to.getPos() - .subtract(from.getPos()))) + if (isLargeCogToSpeedController(stateFrom, stateTo, to.getBlockPos() + .subtract(from.getBlockPos()))) return SpeedControllerTileEntity.getConveyedSpeed(from, to, true); - if (isLargeCogToSpeedController(stateTo, stateFrom, from.getPos() - .subtract(to.getPos()))) + if (isLargeCogToSpeedController(stateTo, stateFrom, from.getBlockPos() + .subtract(to.getBlockPos()))) return SpeedControllerTileEntity.getConveyedSpeed(to, from, false); float rotationSpeedModifier = getRotationSpeedModifier(from, to); @@ -139,12 +139,12 @@ public class RotationPropagator { private static boolean isLargeToLargeGear(BlockState from, BlockState to, BlockPos diff) { if (!ICogWheel.isLargeCog(from) || !ICogWheel.isLargeCog(to)) return false; - Axis fromAxis = from.get(AXIS); - Axis toAxis = to.get(AXIS); + Axis fromAxis = from.getValue(AXIS); + Axis toAxis = to.getValue(AXIS); if (fromAxis == toAxis) return false; for (Axis axis : Axis.values()) { - int axisDiff = axis.getCoordinate(diff.getX(), diff.getY(), diff.getZ()); + int axisDiff = axis.choose(diff.getX(), diff.getY(), diff.getZ()); if (axis == fromAxis || axis == toAxis) { if (axisDiff == 0) return false; @@ -171,15 +171,15 @@ public class RotationPropagator { } private static boolean isLargeToSmallCog(BlockState from, BlockState to, IRotate defTo, BlockPos diff) { - Axis axisFrom = from.get(AXIS); + Axis axisFrom = from.getValue(AXIS); if (axisFrom != defTo.getRotationAxis(to)) return false; - if (axisFrom.getCoordinate(diff.getX(), diff.getY(), diff.getZ()) != 0) + if (axisFrom.choose(diff.getX(), diff.getY(), diff.getZ()) != 0) return false; for (Axis axis : Axis.values()) { if (axis == axisFrom) continue; - if (Math.abs(axis.getCoordinate(diff.getX(), diff.getY(), diff.getZ())) != 1) + if (Math.abs(axis.choose(diff.getX(), diff.getY(), diff.getZ())) != 1) return false; } return true; @@ -188,12 +188,12 @@ public class RotationPropagator { private static boolean isLargeCogToSpeedController(BlockState from, BlockState to, BlockPos diff) { if (!ICogWheel.isLargeCog(from) || !AllBlocks.ROTATION_SPEED_CONTROLLER.has(to)) return false; - if (!diff.equals(BlockPos.ZERO.down())) + if (!diff.equals(BlockPos.ZERO.below())) return false; - Axis axis = from.get(CogWheelBlock.AXIS); + Axis axis = from.getValue(CogWheelBlock.AXIS); if (axis.isVertical()) return false; - if (to.get(SpeedControllerBlock.HORIZONTAL_AXIS) == axis) + if (to.getValue(SpeedControllerBlock.HORIZONTAL_AXIS) == axis) return false; return true; } @@ -205,9 +205,9 @@ public class RotationPropagator { * @param pos */ public static void handleAdded(World worldIn, BlockPos pos, KineticTileEntity addedTE) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; - if (!worldIn.isBlockPresent(pos)) + if (!worldIn.isLoaded(pos)) return; propagateNewSource(addedTE); } @@ -218,8 +218,8 @@ public class RotationPropagator { * @param currentTE */ private static void propagateNewSource(KineticTileEntity currentTE) { - BlockPos pos = currentTE.getPos(); - World world = currentTE.getWorld(); + BlockPos pos = currentTE.getBlockPos(); + World world = currentTE.getLevel(); for (KineticTileEntity neighbourTE : getConnectedNeighbours(currentTE)) { float speedOfCurrent = currentTE.getTheoreticalSpeed(); @@ -251,7 +251,7 @@ public class RotationPropagator { // Neighbour faster, overpower the incoming tree if (Math.abs(oppositeSpeed) > Math.abs(speedOfCurrent)) { float prevSpeed = currentTE.getSpeed(); - currentTE.setSource(neighbourTE.getPos()); + currentTE.setSource(neighbourTE.getBlockPos()); currentTE.setSpeed(getConveyedSpeed(neighbourTE, currentTE)); currentTE.onSpeedChanged(prevSpeed); currentTE.sendData(); @@ -271,11 +271,11 @@ public class RotationPropagator { continue; } - if (currentTE.hasSource() && currentTE.source.equals(neighbourTE.getPos())) + if (currentTE.hasSource() && currentTE.source.equals(neighbourTE.getBlockPos())) currentTE.removeSource(); float prevSpeed = neighbourTE.getSpeed(); - neighbourTE.setSource(currentTE.getPos()); + neighbourTE.setSource(currentTE.getBlockPos()); neighbourTE.setSpeed(getConveyedSpeed(currentTE, neighbourTE)); neighbourTE.onSpeedChanged(prevSpeed); neighbourTE.sendData(); @@ -289,7 +289,7 @@ public class RotationPropagator { float prevSpeed = neighbourTE.getSpeed(); neighbourTE.setSpeed(newSpeed); - neighbourTE.setSource(currentTE.getPos()); + neighbourTE.setSource(currentTE.getBlockPos()); neighbourTE.onSpeedChanged(prevSpeed); neighbourTE.sendData(); propagateNewSource(neighbourTE); @@ -305,7 +305,7 @@ public class RotationPropagator { * @param removedTE */ public static void handleRemoved(World worldIn, BlockPos pos, KineticTileEntity removedTE) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; if (removedTE == null) return; @@ -316,7 +316,7 @@ public class RotationPropagator { BlockState neighbourState = worldIn.getBlockState(neighbourPos); if (!(neighbourState.getBlock() instanceof IRotate)) continue; - TileEntity tileEntity = worldIn.getTileEntity(neighbourPos); + TileEntity tileEntity = worldIn.getBlockEntity(neighbourPos); if (!(tileEntity instanceof KineticTileEntity)) continue; @@ -336,16 +336,16 @@ public class RotationPropagator { * @param updateTE */ private static void propagateMissingSource(KineticTileEntity updateTE) { - final World world = updateTE.getWorld(); + final World world = updateTE.getLevel(); List potentialNewSources = new LinkedList<>(); List frontier = new LinkedList<>(); - frontier.add(updateTE.getPos()); + frontier.add(updateTE.getBlockPos()); BlockPos missingSource = updateTE.hasSource() ? updateTE.source : null; while (!frontier.isEmpty()) { final BlockPos pos = frontier.remove(0); - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); if (!(tileEntity instanceof KineticTileEntity)) continue; final KineticTileEntity currentTE = (KineticTileEntity) tileEntity; @@ -354,7 +354,7 @@ public class RotationPropagator { currentTE.sendData(); for (KineticTileEntity neighbourTE : getConnectedNeighbours(currentTE)) { - if (neighbourTE.getPos() + if (neighbourTE.getBlockPos() .equals(missingSource)) continue; if (!neighbourTE.hasSource()) @@ -368,7 +368,7 @@ public class RotationPropagator { if (neighbourTE.isSource()) potentialNewSources.add(neighbourTE); - frontier.add(neighbourTE.getPos()); + frontier.add(neighbourTE.getBlockPos()); } } @@ -381,14 +381,14 @@ public class RotationPropagator { } private static KineticTileEntity findConnectedNeighbour(KineticTileEntity currentTE, BlockPos neighbourPos) { - BlockState neighbourState = currentTE.getWorld() + BlockState neighbourState = currentTE.getLevel() .getBlockState(neighbourPos); if (!(neighbourState.getBlock() instanceof IRotate)) return null; if (!neighbourState.hasTileEntity()) return null; - TileEntity neighbourTE = currentTE.getWorld() - .getTileEntity(neighbourPos); + TileEntity neighbourTE = currentTE.getLevel() + .getBlockEntity(neighbourPos); if (!(neighbourTE instanceof KineticTileEntity)) return null; KineticTileEntity neighbourKTE = (KineticTileEntity) neighbourTE; @@ -403,8 +403,8 @@ public class RotationPropagator { public static boolean isConnected(KineticTileEntity from, KineticTileEntity to) { final BlockState stateFrom = from.getBlockState(); final BlockState stateTo = to.getBlockState(); - return isLargeCogToSpeedController(stateFrom, stateTo, to.getPos() - .subtract(from.getPos())) || getRotationSpeedModifier(from, to) != 0 + return isLargeCogToSpeedController(stateFrom, stateTo, to.getBlockPos() + .subtract(from.getBlockPos())) || getRotationSpeedModifier(from, to) != 0 || from.isCustomConnection(to, stateFrom, stateTo); } @@ -423,13 +423,13 @@ public class RotationPropagator { private static List getPotentialNeighbourLocations(KineticTileEntity te) { List neighbours = new LinkedList<>(); - if (!te.getWorld() - .isAreaLoaded(te.getPos(), 1)) + if (!te.getLevel() + .isAreaLoaded(te.getBlockPos(), 1)) return neighbours; for (Direction facing : Iterate.directions) - neighbours.add(te.getPos() - .offset(facing)); + neighbours.add(te.getBlockPos() + .relative(facing)); BlockState blockState = te.getBlockState(); if (!(blockState.getBlock() instanceof IRotate)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/TorquePropagator.java b/src/main/java/com/simibubi/create/content/contraptions/TorquePropagator.java index 3d169a6ef..72b8fd57c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/TorquePropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/TorquePropagator.java @@ -26,7 +26,7 @@ public class TorquePropagator { public KineticNetwork getOrCreateNetworkFor(KineticTileEntity te) { Long id = te.network; KineticNetwork network; - Map map = networks.get(te.getWorld()); + Map map = networks.get(te.getLevel()); if (id == null) return null; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java index 592db77bf..3133c09ab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.base; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; @@ -12,6 +12,6 @@ public class BackHalfShaftInstance extends HalfShaftInstance { @Override protected Direction getShaftDirection() { - return tile.getBlockState().get(BlockStateProperties.FACING).getOpposite(); + return tile.getBlockState().getValue(BlockStateProperties.FACING).getOpposite(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/CasingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/CasingBlock.java index 75fb9c3d3..e3e1e4a0a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/CasingBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/CasingBlock.java @@ -29,7 +29,7 @@ public class CasingBlock extends Block implements IWrenchable { @Override public boolean canHarvestBlock(BlockState state, IBlockReader world, BlockPos pos, PlayerEntity player) { - for (ToolType toolType : player.getHeldItemMainhand().getToolTypes()) { + for (ToolType toolType : player.getMainHandItem().getToolTypes()) { if (isToolEffective(state, toolType)) return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/CutoutRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/CutoutRotatingInstance.java new file mode 100644 index 000000000..c8f3d4335 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/base/CutoutRotatingInstance.java @@ -0,0 +1,17 @@ +package com.simibubi.create.content.contraptions.base; + +import com.jozufozu.flywheel.backend.instancing.Instancer; +import com.jozufozu.flywheel.backend.material.InstanceMaterial; +import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.simibubi.create.foundation.render.AllMaterialSpecs; + +public class CutoutRotatingInstance extends SingleRotatingInstance { + public CutoutRotatingInstance(MaterialManager modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + protected InstanceMaterial getRotatingMaterial() { + return materialManager.defaultCutout() + .material(AllMaterialSpecs.ROTATING); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java index e3e4bc013..b51c78b95 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java @@ -24,30 +24,30 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(AXIS_ALONG_FIRST_COORDINATE); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } protected Direction getFacingForPlacement(BlockItemUseContext context) { Direction facing = context.getNearestLookingDirection() .getOpposite(); if (context.getPlayer() != null && context.getPlayer() - .isSneaking()) + .isShiftKeyDown()) facing = facing.getOpposite(); return facing; } protected boolean getAxisAlignmentForPlacement(BlockItemUseContext context) { - return context.getPlacementHorizontalFacing() + return context.getHorizontalDirection() .getAxis() == Axis.X; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { Direction facing = getFacingForPlacement(context); - BlockPos pos = context.getPos(); - World world = context.getWorld(); + BlockPos pos = context.getClickedPos(); + World world = context.getLevel(); boolean alongFirst = false; Axis faceAxis = facing.getAxis(); @@ -70,7 +70,7 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc for (Direction side : Iterate.horizontalDirections) { if (!prefersConnectionTo(world, pos, side, true) - && !prefersConnectionTo(world, pos, side.rotateY(), false)) + && !prefersConnectionTo(world, pos, side.getClockWise(), false)) continue; if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) { prefferedSide = null; @@ -83,15 +83,15 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc alongFirst = prefferedSide.getAxis() == Axis.X; } - return this.getDefaultState() - .with(FACING, facing) - .with(AXIS_ALONG_FIRST_COORDINATE, alongFirst); + return this.defaultBlockState() + .setValue(FACING, facing) + .setValue(AXIS_ALONG_FIRST_COORDINATE, alongFirst); } protected boolean prefersConnectionTo(IWorldReader reader, BlockPos pos, Direction facing, boolean shaftAxis) { if (!shaftAxis) return false; - BlockPos neighbourPos = pos.offset(facing); + BlockPos neighbourPos = pos.relative(facing); BlockState blockState = reader.getBlockState(neighbourPos); Block block = blockState.getBlock(); return block instanceof IRotate @@ -100,9 +100,9 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc @Override public Axis getRotationAxis(BlockState state) { - Axis pistonAxis = state.get(FACING) + Axis pistonAxis = state.getValue(FACING) .getAxis(); - boolean alongFirst = state.get(AXIS_ALONG_FIRST_COORDINATE); + boolean alongFirst = state.getValue(AXIS_ALONG_FIRST_COORDINATE); if (pistonAxis == Axis.X) return alongFirst ? Axis.Y : Axis.Z; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java index d6b43ef65..a95b29bda 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java @@ -21,20 +21,20 @@ public abstract class DirectionalKineticBlock extends KineticBlock { } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(FACING); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } public Direction getPreferredFacing(BlockItemUseContext context) { Direction prefferedSide = null; for (Direction side : Iterate.directions) { - BlockState blockState = context.getWorld() - .getBlockState(context.getPos() - .offset(side)); + BlockState blockState = context.getLevel() + .getBlockState(context.getClickedPos() + .relative(side)); if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos() - .offset(side), blockState, side.getOpposite())) + if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getLevel(), context.getClickedPos() + .relative(side), blockState, side.getOpposite())) if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) { prefferedSide = null; break; @@ -50,22 +50,22 @@ public abstract class DirectionalKineticBlock extends KineticBlock { public BlockState getStateForPlacement(BlockItemUseContext context) { Direction preferred = getPreferredFacing(context); if (preferred == null || (context.getPlayer() != null && context.getPlayer() - .isSneaking())) { + .isShiftKeyDown())) { Direction nearestLookingDirection = context.getNearestLookingDirection(); - return getDefaultState().with(FACING, context.getPlayer() != null && context.getPlayer() - .isSneaking() ? nearestLookingDirection : nearestLookingDirection.getOpposite()); + return defaultBlockState().setValue(FACING, context.getPlayer() != null && context.getPlayer() + .isShiftKeyDown() ? nearestLookingDirection : nearestLookingDirection.getOpposite()); } - return getDefaultState().with(FACING, preferred.getOpposite()); + return defaultBlockState().setValue(FACING, preferred.getOpposite()); } @Override public BlockState rotate(BlockState state, Rotation rot) { - return state.with(FACING, rot.rotate(state.get(FACING))); + return state.setValue(FACING, rot.rotate(state.getValue(FACING))); } @Override public BlockState mirror(BlockState state, Mirror mirrorIn) { - return state.rotate(mirrorIn.toRotation(state.get(FACING))); + return state.rotate(mirrorIn.getRotation(state.getValue(FACING))); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java index 916b8fe27..b96f34fff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java @@ -36,7 +36,7 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { @Override public void setSource(BlockPos source) { super.setSource(source); - TileEntity tileEntity = world.getTileEntity(source); + TileEntity tileEntity = level.getBlockEntity(source); if (!(tileEntity instanceof KineticTileEntity)) return; KineticTileEntity sourceTe = (KineticTileEntity) tileEntity; @@ -59,8 +59,8 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { float stressBase = calculateAddedStressCapacity(); if (stressBase != 0 && IRotate.StressImpact.isEnabled()) { - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.goggles.generator_stats"))); - tooltip.add(componentSpacing.copy().append(Lang.translate("tooltip.capacityProvided").formatted(TextFormatting.GRAY))); + tooltip.add(componentSpacing.plainCopy().append(Lang.translate("gui.goggles.generator_stats"))); + tooltip.add(componentSpacing.plainCopy().append(Lang.translate("tooltip.capacityProvided").withStyle(TextFormatting.GRAY))); float speed = getTheoreticalSpeed(); if (speed != getGeneratedSpeed() && speed != 0) @@ -70,12 +70,12 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { float stressTotal = stressBase * speed; tooltip.add( - componentSpacing.copy() + componentSpacing.plainCopy() .append(new StringTextComponent(" " + IHaveGoggleInformation.format(stressTotal)) .append(Lang.translate("generic.unit.stress")) - .formatted(TextFormatting.AQUA)) + .withStyle(TextFormatting.AQUA)) .append(" ") - .append(Lang.translate("gui.goggles.at_current_speed").formatted(TextFormatting.DARK_GRAY))); + .append(Lang.translate("gui.goggles.at_current_speed").withStyle(TextFormatting.DARK_GRAY))); added = true; } @@ -87,7 +87,7 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { float speed = getGeneratedSpeed(); float prevSpeed = this.speed; - if (world.isRemote) + if (level.isClientSide) return; if (prevSpeed != speed) { @@ -141,7 +141,7 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { // Staying below Overpowered speed if (Math.abs(prevSpeed) >= Math.abs(speed)) { if (Math.signum(prevSpeed) != Math.signum(speed)) - world.destroyBlock(pos, true); + level.destroyBlock(worldPosition, true); return; } @@ -161,6 +161,6 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { } public Long createNetworkId() { - return pos.toLong(); + return worldPosition.asLong(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java index cd06bf1a4..c5fa91df2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.AllBlockPartials; import net.minecraft.state.properties.BlockStateProperties; @@ -19,6 +19,6 @@ public class HalfShaftInstance extends SingleRotatingInstance { } protected Direction getShaftDirection() { - return blockState.get(BlockStateProperties.FACING); + return blockState.getValue(BlockStateProperties.FACING); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalAxisKineticBlock.java index 659d87bc6..1aceb4799 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalAxisKineticBlock.java @@ -25,25 +25,25 @@ public abstract class HorizontalAxisKineticBlock extends KineticBlock { } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(HORIZONTAL_AXIS); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { Axis preferredAxis = getPreferredHorizontalAxis(context); if (preferredAxis != null) - return this.getDefaultState().with(HORIZONTAL_AXIS, preferredAxis); - return this.getDefaultState().with(HORIZONTAL_AXIS, context.getPlacementHorizontalFacing().rotateY().getAxis()); + return this.defaultBlockState().setValue(HORIZONTAL_AXIS, preferredAxis); + return this.defaultBlockState().setValue(HORIZONTAL_AXIS, context.getHorizontalDirection().getClockWise().getAxis()); } public static Axis getPreferredHorizontalAxis(BlockItemUseContext context) { Direction prefferedSide = null; for (Direction side : Iterate.horizontalDirections) { - BlockState blockState = context.getWorld().getBlockState(context.getPos().offset(side)); + BlockState blockState = context.getLevel().getBlockState(context.getClickedPos().relative(side)); if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos().offset(side), + if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getLevel(), context.getClickedPos().relative(side), blockState, side.getOpposite())) if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) { prefferedSide = null; @@ -58,19 +58,19 @@ public abstract class HorizontalAxisKineticBlock extends KineticBlock { @Override public Axis getRotationAxis(BlockState state) { - return state.get(HORIZONTAL_AXIS); + return state.getValue(HORIZONTAL_AXIS); } @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.get(HORIZONTAL_AXIS); + return face.getAxis() == state.getValue(HORIZONTAL_AXIS); } @Override public BlockState rotate(BlockState state, Rotation rot) { - Axis axis = state.get(HORIZONTAL_AXIS); - return state.with(HORIZONTAL_AXIS, - rot.rotate(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis)).getAxis()); + Axis axis = state.getValue(HORIZONTAL_AXIS); + return state.setValue(HORIZONTAL_AXIS, + rot.rotate(Direction.get(AxisDirection.POSITIVE, axis)).getAxis()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java index c7298995f..2ccdd215a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.base; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; @@ -13,6 +13,6 @@ public class HorizontalHalfShaftInstance extends HalfShaftInstance { @Override protected Direction getShaftDirection() { - return blockState.get(BlockStateProperties.HORIZONTAL_FACING).getOpposite(); + return blockState.getValue(BlockStateProperties.HORIZONTAL_FACING).getOpposite(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java index e763f9f03..fb844a7f9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java @@ -21,27 +21,27 @@ public abstract class HorizontalKineticBlock extends KineticBlock { } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(HORIZONTAL_FACING); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return this.getDefaultState() - .with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing() + return this.defaultBlockState() + .setValue(HORIZONTAL_FACING, context.getHorizontalDirection() .getOpposite()); } public Direction getPreferredHorizontalFacing(BlockItemUseContext context) { Direction prefferedSide = null; for (Direction side : Iterate.horizontalDirections) { - BlockState blockState = context.getWorld() - .getBlockState(context.getPos() - .offset(side)); + BlockState blockState = context.getLevel() + .getBlockState(context.getClickedPos() + .relative(side)); if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos() - .offset(side), blockState, side.getOpposite())) + if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getLevel(), context.getClickedPos() + .relative(side), blockState, side.getOpposite())) if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) { prefferedSide = null; break; @@ -55,12 +55,12 @@ public abstract class HorizontalKineticBlock extends KineticBlock { @Override public BlockState rotate(BlockState state, Rotation rot) { - return state.with(HORIZONTAL_FACING, rot.rotate(state.get(HORIZONTAL_FACING))); + return state.setValue(HORIZONTAL_FACING, rot.rotate(state.getValue(HORIZONTAL_FACING))); } @Override public BlockState mirror(BlockState state, Mirror mirrorIn) { - return state.rotate(mirrorIn.toRotation(state.get(HORIZONTAL_FACING))); + return state.rotate(mirrorIn.getRotation(state.getValue(HORIZONTAL_FACING))); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java b/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java index 958290270..2f2540eb7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java @@ -72,9 +72,9 @@ public interface IRotate extends IWrenchable { level.append(" (" + IHaveGoggleInformation.format(Math.abs(speed))).append(Lang.translate("generic.unit.rpm")).append(") "); if (overstressed) - level.formatted(TextFormatting.DARK_GRAY, TextFormatting.STRIKETHROUGH); + level.withStyle(TextFormatting.DARK_GRAY, TextFormatting.STRIKETHROUGH); else - level.formatted(speedLevel.getTextColor()); + level.withStyle(speedLevel.getTextColor()); return level; } @@ -115,7 +115,7 @@ public interface IRotate extends IWrenchable { level.append(String.format(" (%s%%) ", (int) (stressPercent * 100))); - return level.formatted(color); + return level.withStyle(color); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java index 864737fae..c2dc5f863 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java @@ -31,7 +31,7 @@ public abstract class KineticBlock extends Block implements IRotate { @Override public boolean canHarvestBlock(BlockState state, IBlockReader world, BlockPos pos, PlayerEntity player) { - for (ToolType toolType : player.getHeldItemMainhand() + for (ToolType toolType : player.getMainHandItem() .getToolTypes()) { if (isToolEffective(state, toolType)) return true; @@ -45,13 +45,13 @@ public abstract class KineticBlock extends Block implements IRotate { } @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { + public void onPlace(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { // onBlockAdded is useless for init, as sometimes the TE gets re-instantiated // however, if a block change occurs that does not change kinetic connections, // we can prevent a major re-propagation here - TileEntity tileEntity = worldIn.getTileEntity(pos); + TileEntity tileEntity = worldIn.getBlockEntity(pos); if (tileEntity instanceof KineticTileEntity) { KineticTileEntity kineticTileEntity = (KineticTileEntity) tileEntity; kineticTileEntity.preventSpeedUpdate = 0; @@ -78,6 +78,8 @@ public abstract class KineticBlock extends Block implements IRotate { } protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) { + if (oldState.getBlock() != newState.getBlock()) + return false; return getRotationAxis(newState) == getRotationAxis(oldState); } @@ -85,11 +87,11 @@ public abstract class KineticBlock extends Block implements IRotate { public abstract TileEntity createTileEntity(BlockState state, IBlockReader world); @Override - public void updateDiagonalNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags, int count) { - if (worldIn.isRemote()) + public void updateIndirectNeighbourShapes(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags, int count) { + if (worldIn.isClientSide()) return; - TileEntity tileEntity = worldIn.getTileEntity(pos); + TileEntity tileEntity = worldIn.getBlockEntity(pos); if (!(tileEntity instanceof KineticTileEntity)) return; KineticTileEntity kte = (KineticTileEntity) tileEntity; @@ -106,11 +108,11 @@ public abstract class KineticBlock extends Block implements IRotate { } @Override - public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { - if (worldIn.isRemote) + public void setPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { + if (worldIn.isClientSide) return; - TileEntity tileEntity = worldIn.getTileEntity(pos); + TileEntity tileEntity = worldIn.getBlockEntity(pos); if (!(tileEntity instanceof KineticTileEntity)) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java index 6eb292670..2976a4cfd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java @@ -24,7 +24,7 @@ public class KineticData extends BasicData { } public KineticData setPosition(Vector3f pos) { - return setPosition(pos.getX(), pos.getY(), pos.getZ()); + return setPosition(pos.x(), pos.y(), pos.z()); } public KineticData setPosition(float x, float y, float z) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticEffectHandler.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticEffectHandler.java index 9e9d70c0b..6709d540e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticEffectHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticEffectHandler.java @@ -29,9 +29,9 @@ public class KineticEffectHandler { } public void tick() { - World world = kte.getWorld(); + World world = kte.getLevel(); - if (world.isRemote) { + if (world.isClientSide) { if (overStressedTime > 0) if (--overStressedTime == 0) if (kte.isOverStressed()) { @@ -59,15 +59,15 @@ public class KineticEffectHandler { } public void spawnEffect(IParticleData particle, float maxMotion, int amount) { - World world = kte.getWorld(); + World world = kte.getLevel(); if (world == null) return; - if (!world.isRemote) + if (!world.isClientSide) return; - Random r = world.rand; + Random r = world.random; for (int i = 0; i < amount; i++) { Vector3d motion = VecHelper.offsetRandomly(Vector3d.ZERO, r, maxMotion); - Vector3d position = VecHelper.getCenterOf(kte.getPos()); + Vector3d position = VecHelper.getCenterOf(kte.getBlockPos()); world.addParticle(particle, position.x, position.y, position.z, motion.x, motion.y, motion.z); } } @@ -87,8 +87,8 @@ public class KineticEffectHandler { float radius2 = kb.getParticleTargetRadius(); Axis axis = kb.getRotationAxis(state); - BlockPos pos = kte.getPos(); - World world = kte.getWorld(); + BlockPos pos = kte.getBlockPos(); + World world = kte.getLevel(); if (axis == null) return; if (world == null) @@ -105,7 +105,7 @@ public class KineticEffectHandler { AllTriggers.triggerForNearbyPlayers(AllTriggers.ROTATION, world, pos, 5); RotationIndicatorParticleData particleData = new RotationIndicatorParticleData(color, particleSpeed, radius1, radius2, 10, axisChar); - ((ServerWorld) world).spawnParticle(particleData, vec.x, vec.y, vec.z, 20, 0, 0, 0, 1); + ((ServerWorld) world).sendParticles(particleData, vec.x, vec.y, vec.z, 20, 0, 0, 0, 1); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 6878a5167..ec172249f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -78,7 +78,7 @@ public abstract class KineticTileEntity extends SmartTileEntity @Override public void initialize() { - if (hasNetwork() && !world.isRemote) { + if (hasNetwork() && !level.isClientSide) { KineticNetwork network = getOrCreateNetwork(); if (!network.initialized) network.initFromTE(capacity, stress, networkSize); @@ -90,13 +90,13 @@ public abstract class KineticTileEntity extends SmartTileEntity @Override public void tick() { - if (!world.isRemote && needsSpeedUpdate()) + if (!level.isClientSide && needsSpeedUpdate()) attachKinetics(); super.tick(); effects.tick(); - if (world.isRemote) { + if (level.isClientSide) { cachedBoundingBox = null; // cache the bounding box for every frame between ticks DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.tickAudio()); return; @@ -124,10 +124,10 @@ public abstract class KineticTileEntity extends SmartTileEntity return; } - if (!world.isBlockPresent(source)) + if (!level.isLoaded(source)) return; - TileEntity tileEntity = world.getTileEntity(source); + TileEntity tileEntity = level.getBlockEntity(source); KineticTileEntity sourceTe = tileEntity instanceof KineticTileEntity ? (KineticTileEntity) tileEntity : null; if (sourceTe == null || sourceTe.speed == 0) { @@ -184,13 +184,13 @@ public abstract class KineticTileEntity extends SmartTileEntity } @Override - public void remove() { - if (!world.isRemote) { + public void setRemoved() { + if (!level.isClientSide) { if (hasNetwork()) getOrCreateNetwork().remove(this); detachKinetics(); } - super.remove(); + super.setRemoved(); } @Override @@ -289,10 +289,10 @@ public abstract class KineticTileEntity extends SmartTileEntity public void setSource(BlockPos source) { this.source = source; - if (world == null || world.isRemote) + if (level == null || level.isClientSide) return; - TileEntity tileEntity = world.getTileEntity(source); + TileEntity tileEntity = level.getBlockEntity(source); if (!(tileEntity instanceof KineticTileEntity)) { removeSource(); return; @@ -339,11 +339,11 @@ public abstract class KineticTileEntity extends SmartTileEntity public void attachKinetics() { updateSpeed = false; - RotationPropagator.handleAdded(world, pos, this); + RotationPropagator.handleAdded(level, worldPosition, this); } public void detachKinetics() { - RotationPropagator.handleRemoved(world, pos, this); + RotationPropagator.handleRemoved(level, worldPosition, this); } public boolean isSpeedRequirementFulfilled() { @@ -362,17 +362,17 @@ public abstract class KineticTileEntity extends SmartTileEntity } public static void switchToBlockState(World world, BlockPos pos, BlockState state) { - if (world.isRemote) + if (world.isClientSide) return; - TileEntity tileEntityIn = world.getTileEntity(pos); + TileEntity tileEntityIn = world.getBlockEntity(pos); BlockState currentState = world.getBlockState(pos); boolean isKinetic = tileEntityIn instanceof KineticTileEntity; if (currentState == state) return; if (tileEntityIn == null || !isKinetic) { - world.setBlockState(pos, state, 3); + world.setBlock(pos, state, 3); return; } @@ -386,7 +386,7 @@ public abstract class KineticTileEntity extends SmartTileEntity tileEntity.removeSource(); } - world.setBlockState(pos, state, 3); + world.setBlock(pos, state, 3); } @Override @@ -397,27 +397,27 @@ public abstract class KineticTileEntity extends SmartTileEntity boolean notFastEnough = !isSpeedRequirementFulfilled() && getSpeed() != 0; if (overStressed && AllConfigs.CLIENT.enableOverstressedTooltip.get()) { - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("gui.stressometer.overstressed") - .formatted(GOLD))); + .withStyle(GOLD))); ITextComponent hint = Lang.translate("gui.contraptions.network_overstressed"); List cutString = TooltipHelper.cutTextComponent(hint, GRAY, TextFormatting.WHITE); for (int i = 0; i < cutString.size(); i++) - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(cutString.get(i))); return true; } if (notFastEnough) { - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("tooltip.speedRequirement") - .formatted(GOLD))); + .withStyle(GOLD))); ITextComponent hint = - Lang.translate("gui.contraptions.not_fast_enough", I18n.format(getBlockState().getBlock() - .getTranslationKey())); + Lang.translate("gui.contraptions.not_fast_enough", I18n.get(getBlockState().getBlock() + .getDescriptionId())); List cutString = TooltipHelper.cutTextComponent(hint, GRAY, TextFormatting.WHITE); for (int i = 0; i < cutString.size(); i++) - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(cutString.get(i))); return true; } @@ -431,21 +431,21 @@ public abstract class KineticTileEntity extends SmartTileEntity float stressAtBase = calculateStressApplied(); if (calculateStressApplied() != 0 && StressImpact.isEnabled()) { - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("gui.goggles.kinetic_stats"))); - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("tooltip.stressImpact") - .formatted(TextFormatting.GRAY))); + .withStyle(TextFormatting.GRAY))); float stressTotal = stressAtBase * Math.abs(getTheoreticalSpeed()); - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(new StringTextComponent(" " + IHaveGoggleInformation.format(stressTotal)) .append(Lang.translate("generic.unit.stress")) .append(" ") - .formatted(TextFormatting.AQUA)) + .withStyle(TextFormatting.AQUA)) .append(Lang.translate("gui.goggles.at_current_speed") - .formatted(TextFormatting.DARK_GRAY))); + .withStyle(TextFormatting.DARK_GRAY))); added = true; } @@ -526,13 +526,13 @@ public abstract class KineticTileEntity extends SmartTileEntity return neighbours; Axis axis = block.getRotationAxis(state); - BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1)) + BlockPos.betweenClosedStream(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1)) .forEach(offset -> { - if (axis.getCoordinate(offset.getX(), offset.getY(), offset.getZ()) != 0) + if (axis.choose(offset.getX(), offset.getY(), offset.getZ()) != 0) return; - if (offset.distanceSq(0, 0, 0, false) != BlockPos.ZERO.distanceSq(1, 1, 0, false)) + if (offset.distSqr(0, 0, 0, false) != BlockPos.ZERO.distSqr(1, 1, 0, false)) return; - neighbours.add(pos.add(offset)); + neighbours.add(worldPosition.offset(offset)); }); return neighbours; } @@ -560,7 +560,7 @@ public abstract class KineticTileEntity extends SmartTileEntity @Override public void requestModelDataUpdate() { super.requestModelDataUpdate(); - if (!this.removed) + if (!this.remove) DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedRenderDispatcher.enqueueUpdate(this)); } @@ -586,15 +586,16 @@ public abstract class KineticTileEntity extends SmartTileEntity float pitch = MathHelper.clamp((componentSpeed / 256f) + .45f, .85f, 1f); if (isNoisy()) - SoundScapes.play(AmbienceGroup.KINETIC, pos, pitch); + SoundScapes.play(AmbienceGroup.KINETIC, worldPosition, pitch); Block block = getBlockState().getBlock(); if (ICogWheel.isSmallCog(block) || ICogWheel.isLargeCog(block) || block instanceof GearboxBlock) - SoundScapes.play(AmbienceGroup.COG, pos, pitch); + SoundScapes.play(AmbienceGroup.COG, worldPosition, pitch); } protected boolean isNoisy() { return true; } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 213c8f91d..91dc9f7ee 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -39,9 +39,9 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer extends T return shaft(getRotationAxis()); } - protected final InstanceMaterial getRotatingMaterial() { - return materialManager.getMaterial(AllMaterialSpecs.ROTATING); + protected InstanceMaterial getRotatingMaterial() { + return materialManager.defaultSolid() + .material(AllMaterialSpecs.ROTATING); } public static BlockState shaft(Direction.Axis axis) { return AllBlocks.SHAFT.getDefaultState() - .with(ShaftBlock.AXIS, axis); + .setValue(ShaftBlock.AXIS, axis); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java index 75c45893c..16dbd32a3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java @@ -18,8 +18,8 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock { public RotatedPillarKineticBlock(Properties properties) { super(properties); - this.setDefaultState(this.getDefaultState() - .with(AXIS, Direction.Axis.Y)); + this.registerDefaultState(this.defaultBlockState() + .setValue(AXIS, Direction.Axis.Y)); } @Override @@ -27,11 +27,11 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock { switch (rot) { case COUNTERCLOCKWISE_90: case CLOCKWISE_90: - switch (state.get(AXIS)) { + switch (state.getValue(AXIS)) { case X: - return state.with(AXIS, Direction.Axis.Z); + return state.setValue(AXIS, Direction.Axis.Z); case Z: - return state.with(AXIS, Direction.Axis.X); + return state.setValue(AXIS, Direction.Axis.X); default: return state; } @@ -43,12 +43,12 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock { public static Axis getPreferredAxis(BlockItemUseContext context) { Axis prefferedAxis = null; for (Direction side : Iterate.directions) { - BlockState blockState = context.getWorld() - .getBlockState(context.getPos() - .offset(side)); + BlockState blockState = context.getLevel() + .getBlockState(context.getClickedPos() + .relative(side)); if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos() - .offset(side), blockState, side.getOpposite())) + if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getLevel(), context.getClickedPos() + .relative(side), blockState, side.getOpposite())) if (prefferedAxis != null && prefferedAxis != side.getAxis()) { prefferedAxis = null; break; @@ -61,7 +61,7 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock { } @Override - protected void fillStateContainer(StateContainer.Builder builder) { + protected void createBlockStateDefinition(StateContainer.Builder builder) { builder.add(AXIS); } @@ -69,12 +69,12 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock { public BlockState getStateForPlacement(BlockItemUseContext context) { Axis preferredAxis = getPreferredAxis(context); if (preferredAxis != null && (context.getPlayer() == null || !context.getPlayer() - .isSneaking())) - return this.getDefaultState() - .with(AXIS, preferredAxis); - return this.getDefaultState() - .with(AXIS, preferredAxis != null && context.getPlayer() - .isSneaking() ? context.getFace() + .isShiftKeyDown())) + return this.defaultBlockState() + .setValue(AXIS, preferredAxis); + return this.defaultBlockState() + .setValue(AXIS, preferredAxis != null && context.getPlayer() + .isShiftKeyDown() ? context.getClickedFace() .getAxis() : context.getNearestLookingDirection() .getAxis()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java index 443168be0..b155b5fba 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java @@ -16,13 +16,13 @@ public class RotatingData extends KineticData { } public RotatingData setRotationAxis(Direction.Axis axis) { - Direction orientation = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis); - setRotationAxis(orientation.getUnitVector()); + Direction orientation = Direction.get(Direction.AxisDirection.POSITIVE, axis); + setRotationAxis(orientation.step()); return this; } public RotatingData setRotationAxis(Vector3f axis) { - setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); + setRotationAxis(axis.x(), axis.y(), axis.z()); return this; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java index 415882390..e7b747d02 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.AllMaterialSpecs; @@ -13,6 +13,8 @@ public class ShaftlessCogInstance extends SingleRotatingInstance { @Override protected Instancer getModel() { - return materialManager.getMaterial(AllMaterialSpecs.ROTATING).getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, tile.getBlockState()); + return materialManager.defaultSolid() + .material(AllMaterialSpecs.ROTATING) + .getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, tile.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index 17ba2884d..90a5efdb6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/AssemblyOperatorBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/AssemblyOperatorBlockItem.java new file mode 100644 index 000000000..1a4e5d1b8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/AssemblyOperatorBlockItem.java @@ -0,0 +1,50 @@ +package com.simibubi.create.content.contraptions.components; + +import com.simibubi.create.AllBlocks; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.BlockItem; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.vector.Vector3d; + +public class AssemblyOperatorBlockItem extends BlockItem { + + public AssemblyOperatorBlockItem(Block block, Properties builder) { + super(block, builder); + } + + @Override + public ActionResultType place(BlockItemUseContext context) { + BlockPos placedOnPos = context.getClickedPos() + .relative(context.getClickedFace() + .getOpposite()); + BlockState placedOnState = context.getLevel() + .getBlockState(placedOnPos); + if (operatesOn(placedOnState)) { + if (context.getLevel() + .getBlockState(placedOnPos.above(2)) + .getMaterial() + .isReplaceable()) + context = adjustContext(context, placedOnPos); + else + return ActionResultType.FAIL; + } + + return super.place(context); + } + + protected BlockItemUseContext adjustContext(BlockItemUseContext context, BlockPos placedOnPos) { + BlockPos up = placedOnPos.above(2); + return new AssemblyOperatorUseContext(context.getLevel(), context.getPlayer(), context.getHand(), context.getItemInHand(), new BlockRayTraceResult(new Vector3d((double)up.getX() + 0.5D + (double) Direction.UP.getStepX() * 0.5D, (double)up.getY() + 0.5D + (double) Direction.UP.getStepY() * 0.5D, (double)up.getZ() + 0.5D + (double) Direction.UP.getStepZ() * 0.5D), Direction.UP, up, false)); + } + + protected boolean operatesOn(BlockState placedOnState) { + return AllBlocks.BASIN.has(placedOnState) || AllBlocks.BELT.has(placedOnState) || AllBlocks.DEPOT.has(placedOnState) || AllBlocks.WEIGHTED_EJECTOR.has(placedOnState); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/AssemblyOperatorUseContext.java b/src/main/java/com/simibubi/create/content/contraptions/components/AssemblyOperatorUseContext.java new file mode 100644 index 000000000..80fde6127 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/AssemblyOperatorUseContext.java @@ -0,0 +1,16 @@ +package com.simibubi.create.content.contraptions.components; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.world.World; + +public class AssemblyOperatorUseContext extends BlockItemUseContext { + public AssemblyOperatorUseContext(World p_i50056_1_, @Nullable PlayerEntity p_i50056_2_, Hand p_i50056_3_, ItemStack p_i50056_4_, BlockRayTraceResult p_i50056_5_) { + super(p_i50056_1_, p_i50056_2_, p_i50056_3_, p_i50056_4_, p_i50056_5_); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorData.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorData.java index dd8c01e8e..cc3e6535c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorData.java @@ -66,7 +66,7 @@ public class ActorData extends InstanceData { } public ActorData setRotationAxis(Vector3f axis) { - setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); + setRotationAxis(axis.x(), axis.y(), axis.z()); return this; } @@ -79,7 +79,7 @@ public class ActorData extends InstanceData { } public ActorData setRotationCenter(Vector3f axis) { - setRotationCenter(axis.getX(), axis.getY(), axis.getZ()); + setRotationCenter(axis.x(), axis.y(), axis.z()); return this; } @@ -92,10 +92,10 @@ public class ActorData extends InstanceData { } public ActorData setLocalRotation(Quaternion q) { - this.qX = q.getX(); - this.qY = q.getY(); - this.qZ = q.getZ(); - this.qW = q.getW(); + this.qX = q.i(); + this.qY = q.j(); + this.qZ = q.k(); + this.qW = q.r(); markDirty(); return this; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java index c9ea4bac8..827540eac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java @@ -37,41 +37,41 @@ public abstract class AttachedActorBlock extends HorizontalBlock implements IWre @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - Direction direction = state.get(HORIZONTAL_FACING); + Direction direction = state.getValue(FACING); return AllShapes.HARVESTER_BASE.get(direction); } @Override - protected void fillStateContainer(Builder builder) { - builder.add(HORIZONTAL_FACING); - super.fillStateContainer(builder); + protected void createBlockStateDefinition(Builder builder) { + builder.add(FACING); + super.createBlockStateDefinition(builder); } @Override - public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { - Direction direction = state.get(HORIZONTAL_FACING); - BlockPos offset = pos.offset(direction.getOpposite()); + public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos) { + Direction direction = state.getValue(FACING); + BlockPos offset = pos.relative(direction.getOpposite()); return BlockHelper.hasBlockSolidSide(worldIn.getBlockState(offset), worldIn, offset, direction); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { Direction facing; - if (context.getFace().getAxis().isVertical()) - facing = context.getPlacementHorizontalFacing().getOpposite(); + if (context.getClickedFace().getAxis().isVertical()) + facing = context.getHorizontalDirection().getOpposite(); else { BlockState blockState = - context.getWorld().getBlockState(context.getPos().offset(context.getFace().getOpposite())); + context.getLevel().getBlockState(context.getClickedPos().relative(context.getClickedFace().getOpposite())); if (blockState.getBlock() instanceof AttachedActorBlock) - facing = blockState.get(HORIZONTAL_FACING); + facing = blockState.getValue(FACING); else - facing = context.getFace(); + facing = context.getClickedFace(); } - return getDefaultState().with(HORIZONTAL_FACING, facing); + return defaultBlockState().setValue(FACING, facing); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java index 10ab639cd..b635039d8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java @@ -20,7 +20,7 @@ public class BellMovementBehaviour extends MovementBehaviour { @Override public void onSpeedChanged(MovementContext context, Vector3d oldMotion, Vector3d motion) { - double dotProduct = oldMotion.dotProduct(motion); + double dotProduct = oldMotion.dot(motion); if (dotProduct <= 0 && (context.relativeMotion.length() != 0) || context.firstMovement) playSound(context); @@ -41,7 +41,7 @@ public class BellMovementBehaviour extends MovementBehaviour { ((AbstractBellBlock) block).playSound(world, pos); } else { // Vanilla bell sound - world.playSound(null, pos, SoundEvents.BLOCK_BELL_USE, + world.playSound(null, pos, SoundEvents.BELL_BLOCK, SoundCategory.BLOCKS, 2f, 1f); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java index a74d1a200..a9b11e083 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java @@ -77,17 +77,17 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity { } @Override - public void remove() { - if (!world.isRemote && destroyProgress != 0) - world.sendBlockBreakProgress(breakerId, breakingPos, -1); - super.remove(); + public void setRemoved() { + if (!level.isClientSide && destroyProgress != 0) + level.destroyBlockProgress(breakerId, breakingPos, -1); + super.setRemoved(); } @Override public void tick() { super.tick(); - if (world.isRemote) + if (level.isClientSide) return; if (!shouldRun()) return; @@ -101,31 +101,31 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity { if (ticksUntilNextProgress-- > 0) return; - BlockState stateToBreak = world.getBlockState(breakingPos); - float blockHardness = stateToBreak.getBlockHardness(world, breakingPos); + BlockState stateToBreak = level.getBlockState(breakingPos); + float blockHardness = stateToBreak.getDestroySpeed(level, breakingPos); if (!canBreak(stateToBreak, blockHardness)) { if (destroyProgress != 0) { destroyProgress = 0; - world.sendBlockBreakProgress(breakerId, breakingPos, -1); + level.destroyBlockProgress(breakerId, breakingPos, -1); } return; } float breakSpeed = getBreakSpeed(); destroyProgress += MathHelper.clamp((int) (breakSpeed / blockHardness), 1, 10 - destroyProgress); - world.playSound(null, pos, stateToBreak.getSoundType().getHitSound(), SoundCategory.NEUTRAL, .25f, 1); + level.playSound(null, worldPosition, stateToBreak.getSoundType().getHitSound(), SoundCategory.NEUTRAL, .25f, 1); if (destroyProgress >= 10) { onBlockBroken(stateToBreak); destroyProgress = 0; ticksUntilNextProgress = -1; - world.sendBlockBreakProgress(breakerId, breakingPos, -1); + level.destroyBlockProgress(breakerId, breakingPos, -1); return; } ticksUntilNextProgress = (int) (blockHardness / breakSpeed); - world.sendBlockBreakProgress(breakerId, breakingPos, (int) destroyProgress); + level.destroyBlockProgress(breakerId, breakingPos, (int) destroyProgress); } public boolean canBreak(BlockState stateToBreak, float blockHardness) { @@ -138,23 +138,23 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity { } public void onBlockBroken(BlockState stateToBreak) { - FluidState FluidState = world.getFluidState(breakingPos); - world.playEvent(2001, breakingPos, Block.getStateId(stateToBreak)); - TileEntity tileentity = stateToBreak.hasTileEntity() ? world.getTileEntity(breakingPos) : null; - Vector3d vec = VecHelper.offsetRandomly(VecHelper.getCenterOf(breakingPos), world.rand, .125f); + FluidState FluidState = level.getFluidState(breakingPos); + level.levelEvent(2001, breakingPos, Block.getId(stateToBreak)); + TileEntity tileentity = stateToBreak.hasTileEntity() ? level.getBlockEntity(breakingPos) : null; + Vector3d vec = VecHelper.offsetRandomly(VecHelper.getCenterOf(breakingPos), level.random, .125f); - Block.getDrops(stateToBreak, (ServerWorld) world, breakingPos, tileentity).forEach((stack) -> { - if (!stack.isEmpty() && world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS) - && !world.restoringBlockSnapshots) { - ItemEntity itementity = new ItemEntity(world, vec.x, vec.y, vec.z, stack); - itementity.setDefaultPickupDelay(); - itementity.setMotion(Vector3d.ZERO); - world.addEntity(itementity); + Block.getDrops(stateToBreak, (ServerWorld) level, breakingPos, tileentity).forEach((stack) -> { + if (!stack.isEmpty() && level.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS) + && !level.restoringBlockSnapshots) { + ItemEntity itementity = new ItemEntity(level, vec.x, vec.y, vec.z, stack); + itementity.setDefaultPickUpDelay(); + itementity.setDeltaMovement(Vector3d.ZERO); + level.addFreshEntity(itementity); } }); - if (world instanceof ServerWorld) - stateToBreak.spawnAdditionalDrops((ServerWorld) world, breakingPos, ItemStack.EMPTY); - world.setBlockState(breakingPos, FluidState.getBlockState(), 3); + if (level instanceof ServerWorld) + stateToBreak.spawnAfterBreak((ServerWorld) level, breakingPos, ItemStack.EMPTY); + level.setBlock(breakingPos, FluidState.createLegacyBlock(), 3); } protected float getBreakSpeed() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java index 14c090563..b23ce8153 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java @@ -25,7 +25,7 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { @Override public void startMoving(MovementContext context) { - if (context.world.isRemote) + if (context.world.isClientSide) return; context.data.putInt("BreakerId", -BlockBreakingKineticTileEntity.NEXT_BREAKER_ID.incrementAndGet()); } @@ -35,9 +35,9 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { World world = context.world; BlockState stateVisited = world.getBlockState(pos); - if (!stateVisited.isNormalCube(world, pos)) + if (!stateVisited.isRedstoneConductor(world, pos)) damageEntities(context, pos, world); - if (world.isRemote) + if (world.isClientSide) return; if (!canBreak(world, pos, stateVisited)) return; @@ -50,29 +50,29 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { DamageSource damageSource = getDamageSource(); if (damageSource == null && !throwsEntities()) return; - Entities: for (Entity entity : world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(pos))) { + Entities: for (Entity entity : world.getEntitiesOfClass(Entity.class, new AxisAlignedBB(pos))) { if (entity instanceof ItemEntity) continue; if (entity instanceof AbstractContraptionEntity) continue; if (entity instanceof AbstractMinecartEntity) - for (Entity passenger : entity.getRecursivePassengers()) + for (Entity passenger : entity.getIndirectPassengers()) if (passenger instanceof AbstractContraptionEntity && ((AbstractContraptionEntity) passenger).getContraption() == context.contraption) continue Entities; - if (damageSource != null && !world.isRemote) { + if (damageSource != null && !world.isClientSide) { float damage = (float) MathHelper.clamp(6 * Math.pow(context.relativeMotion.length(), 0.4) + 1, 2, 10); - entity.attackEntityFrom(damageSource, damage); + entity.hurt(damageSource, damage); } - if (throwsEntities() && (world.isRemote == (entity instanceof PlayerEntity))) { + if (throwsEntities() && (world.isClientSide == (entity instanceof PlayerEntity))) { Vector3d motionBoost = context.motion.add(0, context.motion.length() / 4f, 0); int maxBoost = 4; if (motionBoost.length() > maxBoost) { motionBoost = motionBoost.subtract(motionBoost.normalize().scale(motionBoost.length() - maxBoost)); } - entity.setMotion(entity.getMotion().add(motionBoost)); - entity.velocityChanged = true; + entity.setDeltaMovement(entity.getDeltaMovement().add(motionBoost)); + entity.hurtMarked = true; } } } @@ -88,7 +88,7 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { @Override public void stopMoving(MovementContext context) { CompoundNBT data = context.data; - if (context.world.isRemote) + if (context.world.isClientSide) return; if (!data.contains("BreakingPos")) return; @@ -102,7 +102,7 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { data.remove("BreakingPos"); context.stall = false; - world.sendBlockBreakProgress(id, breakingPos, -1); + world.destroyBlockProgress(id, breakingPos, -1); } @Override @@ -129,7 +129,7 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { public void tickBreaker(MovementContext context) { CompoundNBT data = context.data; - if (context.world.isRemote) + if (context.world.isClientSide) return; if (!data.contains("BreakingPos")) return; @@ -149,7 +149,7 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { int destroyProgress = data.getInt("Progress"); int id = data.getInt("BreakerId"); BlockState stateToBreak = world.getBlockState(breakingPos); - float blockHardness = stateToBreak.getBlockHardness(world, breakingPos); + float blockHardness = stateToBreak.getDestroySpeed(world, breakingPos); if (!canBreak(world, breakingPos, stateToBreak)) { if (destroyProgress != 0) { @@ -157,7 +157,7 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { data.remove("Progress"); data.remove("TicksUntilNextProgress"); data.remove("BreakingPos"); - world.sendBlockBreakProgress(id, breakingPos, -1); + world.destroyBlockProgress(id, breakingPos, -1); } context.stall = false; return; @@ -166,20 +166,21 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { float breakSpeed = MathHelper.clamp(Math.abs(context.getAnimationSpeed()) / 500f, 1 / 128f, 16f); destroyProgress += MathHelper.clamp((int) (breakSpeed / blockHardness), 1, 10 - destroyProgress); world.playSound(null, breakingPos, stateToBreak.getSoundType().getHitSound(), SoundCategory.NEUTRAL, .25f, 1); - + if (destroyProgress >= 10) { - world.sendBlockBreakProgress(id, breakingPos, -1); - + world.destroyBlockProgress(id, breakingPos, -1); + // break falling blocks from top to bottom BlockPos ogPos = breakingPos; - BlockState stateAbove = world.getBlockState(breakingPos.up()); + BlockState stateAbove = world.getBlockState(breakingPos.above()); while (stateAbove.getBlock() instanceof FallingBlock) { - breakingPos = breakingPos.up(); - stateAbove = world.getBlockState(breakingPos.up()); + breakingPos = breakingPos.above(); + stateAbove = world.getBlockState(breakingPos.above()); } stateToBreak = world.getBlockState(breakingPos); - + context.stall = false; + if (shouldDestroyStartBlock(stateToBreak)) BlockHelper.destroyBlock(context.world, breakingPos, 1f, stack -> this.dropItem(context, stack)); onBlockBroken(context, ogPos, stateToBreak); ticksUntilNextProgress = -1; @@ -190,13 +191,17 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { } ticksUntilNextProgress = (int) (blockHardness / breakSpeed); - world.sendBlockBreakProgress(id, breakingPos, (int) destroyProgress); + world.destroyBlockProgress(id, breakingPos, (int) destroyProgress); data.putInt("TicksUntilNextProgress", ticksUntilNextProgress); data.putInt("Progress", destroyProgress); } + protected boolean shouldDestroyStartBlock(BlockState stateToBreak) { + return true; + } + public boolean canBreak(World world, BlockPos breakingPos, BlockState state) { - float blockHardness = state.getBlockHardness(world, breakingPos); + float blockHardness = state.getDestroySpeed(world, breakingPos); return BlockBreakingKineticTileEntity.isBreakable(state, blockHardness); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java index e27cffee5..39ac14bce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java @@ -16,20 +16,20 @@ public class CampfireMovementBehaviour extends MovementBehaviour { @Override public void tick(MovementContext context) { - if (context.world == null || !context.world.isRemote || context.position == null - || !context.state.get(CampfireBlock.LIT)) + if (context.world == null || !context.world.isClientSide || context.position == null + || !context.state.getValue(CampfireBlock.LIT)) return; // Mostly copied from CampfireBlock and CampfireTileEntity - Random random = context.world.rand; + Random random = context.world.random; if (random.nextFloat() < 0.11F) { for (int i = 0; i < random.nextInt(2) + 2; ++i) { - context.world.addOptionalParticle( - context.state.get(CampfireBlock.SIGNAL_FIRE) ? ParticleTypes.CAMPFIRE_SIGNAL_SMOKE + context.world.addAlwaysVisibleParticle( + context.state.getValue(CampfireBlock.SIGNAL_FIRE) ? ParticleTypes.CAMPFIRE_SIGNAL_SMOKE : ParticleTypes.CAMPFIRE_COSY_SMOKE, - true, context.position.getX() + random.nextDouble() / (random.nextBoolean() ? 3D : -3D), - context.position.getY() + random.nextDouble() + random.nextDouble(), - context.position.getZ() + random.nextDouble() / (random.nextBoolean() ? 3D : -3D), 0.0D, 0.07D, + true, context.position.x() + random.nextDouble() / (random.nextBoolean() ? 3D : -3D), + context.position.y() + random.nextDouble() + random.nextDouble(), + context.position.z() + random.nextDouble() / (random.nextBoolean() ? 3D : -3D), 0.0D, 0.07D, 0.0D); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java index 316d7eed2..c142cd2cf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.components.actors; -import com.jozufozu.flywheel.backend.instancing.InstanceMaterial; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.InstanceMaterial; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; @@ -22,11 +22,12 @@ public class DrillActorInstance extends ActorInstance { public DrillActorInstance(MaterialManager materialManager, PlacementSimulationWorld contraption, MovementContext context) { super(materialManager, contraption, context); - InstanceMaterial instanceMaterial = materialManager.getMaterial(AllMaterialSpecs.ACTORS); + InstanceMaterial instanceMaterial = materialManager.defaultSolid() + .material(AllMaterialSpecs.ACTORS); BlockState state = context.state; - facing = state.get(DrillBlock.FACING); + facing = state.getValue(DrillBlock.FACING); Direction.Axis axis = facing.getAxis(); float eulerX = AngleHelper.verticalAngle(facing); @@ -35,7 +36,7 @@ public class DrillActorInstance extends ActorInstance { if (axis == Direction.Axis.Y) eulerY = 0; else - eulerY = facing.getHorizontalAngle() + ((axis == Direction.Axis.X) ? 180 : 0); + eulerY = facing.toYRot() + ((axis == Direction.Axis.X) ? 180 : 0); drillHead = instanceMaterial.getModel(AllBlockPartials.DRILL_HEAD, state).createInstance(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java index b7c9d029a..0e0a95fba 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java @@ -30,7 +30,7 @@ import net.minecraft.world.World; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class DrillBlock extends DirectionalKineticBlock implements ITE { - public static DamageSource damageSourceDrill = new DamageSource("create.mechanical_drill").setDamageBypassesArmor(); + public static DamageSource damageSourceDrill = new DamageSource("create.mechanical_drill").bypassArmor(); public DrillBlock(Properties properties) { super(properties); @@ -42,15 +42,15 @@ public class DrillBlock extends DirectionalKineticBlock implements ITE { if (te.getSpeed() == 0) return; - entityIn.attackEntityFrom(damageSourceDrill, (float) getDamage(te.getSpeed())); + entityIn.hurt(damageSourceDrill, (float) getDamage(te.getSpeed())); }); } @@ -61,7 +61,7 @@ public class DrillBlock extends DirectionalKineticBlock implements ITE getModel() { BlockState referenceState = tile.getBlockState(); - Direction facing = referenceState.get(FACING); + Direction facing = referenceState.getValue(FACING); return getRotatingMaterial().getModel(AllBlockPartials.DRILL_HEAD, referenceState, facing); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index cda9e9a75..8942b48c5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.actors; import javax.annotation.Nullable; import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; @@ -23,14 +23,14 @@ public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { @Override public boolean isActive(MovementContext context) { - return !VecHelper.isVecPointingTowards(context.relativeMotion, context.state.get(DrillBlock.FACING) + return !VecHelper.isVecPointingTowards(context.relativeMotion, context.state.getValue(DrillBlock.FACING) .getOpposite()); } @Override public Vector3d getActiveAreaOffset(MovementContext context) { - return Vector3d.of(context.state.get(DrillBlock.FACING) - .getDirectionVec()).scale(.65f); + return Vector3d.atLowerCornerOf(context.state.getValue(DrillBlock.FACING) + .getNormal()).scale(.65f); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index df1e668d9..3a81d4509 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.components.actors; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -11,7 +12,6 @@ import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; @@ -36,7 +36,7 @@ public class DrillRenderer extends KineticTileEntityRenderer { ContraptionMatrices matrices, IRenderTypeBuffer buffer) { BlockState state = context.state; SuperByteBuffer superBuffer = PartialBufferer.get(AllBlockPartials.DRILL_HEAD, state); - Direction facing = state.get(DrillBlock.FACING); + Direction facing = state.getValue(DrillBlock.FACING); float speed = (float) (context.contraption.stalled || !VecHelper.isVecPointingTowards(context.relativeMotion, facing @@ -45,8 +45,8 @@ public class DrillRenderer extends KineticTileEntityRenderer { float angle = (float) (((time * speed) % 360)); MatrixStack m = matrices.contraptionStack; - m.push(); - MatrixStacker.of(m) + m.pushPose(); + MatrixTransformStack.of(m) .centre() .rotateY(AngleHelper.horizontalAngle(facing)) .rotateX(AngleHelper.verticalAngle(facing)) @@ -57,9 +57,9 @@ public class DrillRenderer extends KineticTileEntityRenderer { .transform(m) .light(matrices.entityMatrix, ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld)) - .renderInto(matrices.entityStack, buffer.getBuffer(RenderType.getSolid())); + .renderInto(matrices.entityStack, buffer.getBuffer(RenderType.solid())); - m.pop(); + m.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillTileEntity.java index 065d18491..6c124890e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillTileEntity.java @@ -11,7 +11,7 @@ public class DrillTileEntity extends BlockBreakingKineticTileEntity { @Override protected BlockPos getBreakingPos() { - return getPos().offset(getBlockState().get(DrillBlock.FACING)); + return getBlockPos().relative(getBlockState().getValue(DrillBlock.FACING)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java index fafd7c7e2..936a88bb5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java @@ -2,16 +2,17 @@ package com.simibubi.create.content.contraptions.components.actors; import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; -import com.jozufozu.flywheel.backend.instancing.InstanceMaterial; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.InstanceMaterial; +import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.ModelData; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; @@ -36,15 +37,16 @@ public class HarvesterActorInstance extends ActorInstance { public HarvesterActorInstance(MaterialManager materialManager, PlacementSimulationWorld simulationWorld, MovementContext context) { super(materialManager, simulationWorld, context); - InstanceMaterial instanceMaterial = materialManager.getTransformMaterial(); + InstanceMaterial instanceMaterial = materialManager.defaultCutout() + .material(Materials.TRANSFORMED); BlockState state = context.state; - facing = state.get(HORIZONTAL_FACING); + facing = state.getValue(HORIZONTAL_FACING); harvester = instanceMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state).createInstance(); - horizontalAngle = facing.getHorizontalAngle() + ((facing.getAxis() == Direction.Axis.X) ? 180 : 0); + horizontalAngle = facing.toYRot() + ((facing.getAxis() == Direction.Axis.X) ? 180 : 0); harvester.setBlockLight(localBlockLight()); } @@ -74,7 +76,7 @@ public class HarvesterActorInstance extends ActorInstance { @Override public void beginFrame() { MatrixStack ms = new MatrixStack(); - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); msr.translate(context.localPos) .centre() diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index 0aed0b128..87eee9790 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -1,13 +1,13 @@ package com.simibubi.create.content.contraptions.components.actors; -import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING; +import static net.minecraft.block.HorizontalBlock.FACING; import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableBoolean; import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; @@ -38,7 +38,7 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { @Override public boolean isActive(MovementContext context) { - return !VecHelper.isVecPointingTowards(context.relativeMotion, context.state.get(HORIZONTAL_FACING) + return !VecHelper.isVecPointingTowards(context.relativeMotion, context.state.getValue(FACING) .getOpposite()); } @@ -62,8 +62,8 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { @Override public Vector3d getActiveAreaOffset(MovementContext context) { - return Vector3d.of(context.state.get(HORIZONTAL_FACING) - .getDirectionVec()) + return Vector3d.atLowerCornerOf(context.state.getValue(FACING) + .getNormal()) .scale(.45); } @@ -73,7 +73,7 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { BlockState stateVisited = world.getBlockState(pos); boolean notCropButCuttable = false; - if (world.isRemote) + if (world.isClientSide) return; if (!isValidCrop(world, pos, stateVisited)) { @@ -86,14 +86,14 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { MutableBoolean seedSubtracted = new MutableBoolean(notCropButCuttable); BlockState state = stateVisited; BlockHelper.destroyBlock(world, pos, 1, stack -> { - if (!seedSubtracted.getValue() && stack.isItemEqual(new ItemStack(state.getBlock()))) { + if (!seedSubtracted.getValue() && stack.sameItem(new ItemStack(state.getBlock()))) { stack.shrink(1); seedSubtracted.setTrue(); } dropItem(context, stack); }); - world.setBlockState(pos, cutCrop(world, pos, stateVisited)); + world.setBlockAndUpdate(pos, cutCrop(world, pos, stateVisited)); } private boolean isValidCrop(World world, BlockPos pos, BlockState state) { @@ -109,10 +109,10 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { if (!(property instanceof IntegerProperty)) continue; if (!property.getName() - .equals(BlockStateProperties.AGE_0_1.getName())) + .equals(BlockStateProperties.AGE_1.getName())) continue; - if (((IntegerProperty) property).getAllowedValues() - .size() - 1 != state.get((IntegerProperty) property) + if (((IntegerProperty) property).getPossibleValues() + .size() - 1 != state.getValue((IntegerProperty) property) .intValue()) continue; return true; @@ -139,7 +139,7 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { if (!(property instanceof IntegerProperty)) continue; if (!property.getName() - .equals(BlockStateProperties.AGE_0_1.getName())) + .equals(BlockStateProperties.AGE_1.getName())) continue; return false; } @@ -155,17 +155,17 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { Block block = state.getBlock(); if (block instanceof CropsBlock) { CropsBlock crop = (CropsBlock) block; - return crop.withAge(0); + return crop.getStateForAge(0); } if (block == Blocks.SWEET_BERRY_BUSH) { - return state.with(BlockStateProperties.AGE_0_3, Integer.valueOf(1)); + return state.setValue(BlockStateProperties.AGE_3, Integer.valueOf(1)); } if (block == Blocks.SUGAR_CANE || block == Blocks.KELP) { if (state.getFluidState() .isEmpty()) - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); return state.getFluidState() - .getBlockState(); + .createLegacyBlock(); } if (state.getCollisionShape(world, pos) .isEmpty() || block instanceof CocoaBlock) { @@ -173,17 +173,17 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { if (!(property instanceof IntegerProperty)) continue; if (!property.getName() - .equals(BlockStateProperties.AGE_0_1.getName())) + .equals(BlockStateProperties.AGE_1.getName())) continue; - return state.with((IntegerProperty) property, Integer.valueOf(0)); + return state.setValue((IntegerProperty) property, Integer.valueOf(0)); } } if (state.getFluidState() .isEmpty()) - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); return state.getFluidState() - .getBlockState(); + .createLegacyBlock(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 652e42e85..79eee6a0a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -35,16 +35,16 @@ public class HarvesterRenderer extends SafeTileEntityRenderer dropItem(context, s)); @@ -108,7 +108,7 @@ public class PloughMovementBehaviour extends BlockBreakingMovementBehaviour { private PloughFakePlayer getPlayer(MovementContext context) { if (!(context.temporaryData instanceof PloughFakePlayer) && context.world != null) { PloughFakePlayer player = new PloughFakePlayer((ServerWorld) context.world); - player.setHeldItem(Hand.MAIN_HAND, new ItemStack(Items.DIAMOND_HOE)); + player.setItemInHand(Hand.MAIN_HAND, new ItemStack(Items.DIAMOND_HOE)); context.temporaryData = player; } return (PloughFakePlayer) context.temporaryData; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java index 7afae49c4..6d93e5c95 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java @@ -57,22 +57,22 @@ public class PortableStorageInterfaceBlock extends ProperDirectionalBlock @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return getDefaultState().with(FACING, context.getNearestLookingDirection() + return defaultBlockState().setValue(FACING, context.getNearestLookingDirection() .getOpposite()); } @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.PORTABLE_STORAGE_INTERFACE.get(state.get(FACING)); + return AllShapes.PORTABLE_STORAGE_INTERFACE.get(state.getValue(FACING)); } @Override - public boolean hasComparatorInputOverride(BlockState state) { + public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override - public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { + public int getAnalogOutputSignal(BlockState blockState, World worldIn, BlockPos pos) { return getTileEntityOptional(worldIn, pos).map(te -> te.isConnected() ? 15 : 0) .orElse(0); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java index 6bd6b8f13..c0d2a2a19 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java @@ -26,8 +26,8 @@ public class PortableStorageInterfaceMovement extends MovementBehaviour { @Override public Vector3d getActiveAreaOffset(MovementContext context) { - return Vector3d.of(context.state.get(PortableStorageInterfaceBlock.FACING) - .getDirectionVec()).scale(1.85f); + return Vector3d.atLowerCornerOf(context.state.getValue(PortableStorageInterfaceBlock.FACING) + .getNormal()).scale(1.85f); } @Override @@ -55,13 +55,13 @@ public class PortableStorageInterfaceMovement extends MovementBehaviour { if (psi == null) return false; - if ((psi.isTransferring() || psi.isPowered()) && !context.world.isRemote) + if ((psi.isTransferring() || psi.isPowered()) && !context.world.isClientSide) return false; - context.data.put(_workingPos_, NBTUtil.writeBlockPos(psi.getPos())); - if (!context.world.isRemote) { - Vector3d diff = VecHelper.getCenterOf(psi.getPos()) + context.data.put(_workingPos_, NBTUtil.writeBlockPos(psi.getBlockPos())); + if (!context.world.isClientSide) { + Vector3d diff = VecHelper.getCenterOf(psi.getBlockPos()) .subtract(context.position); - diff = VecHelper.project(diff, Vector3d.of(currentFacing.getDirectionVec())); + diff = VecHelper.project(diff, Vector3d.atLowerCornerOf(currentFacing.getNormal())); float distance = (float) (diff.length() + 1.85f - 1); psi.startTransferringTo(context.contraption, distance); } else { @@ -72,7 +72,7 @@ public class PortableStorageInterfaceMovement extends MovementBehaviour { @Override public void tick(MovementContext context) { - if (context.world.isRemote) { + if (context.world.isClientSide) { boolean stalled = context.contraption.stalled; if (stalled && !context.data.contains(_workingPos_)) { BlockPos pos = new BlockPos(context.position); @@ -117,7 +117,7 @@ public class PortableStorageInterfaceMovement extends MovementBehaviour { Direction facing) { for (int i = 0; i < 2; i++) { PortableStorageInterfaceTileEntity interfaceAt = - getStationaryInterfaceAt(world, pos.offset(facing, i), state, facing); + getStationaryInterfaceAt(world, pos.relative(facing, i), state, facing); if (interfaceAt == null) continue; return interfaceAt; @@ -127,23 +127,23 @@ public class PortableStorageInterfaceMovement extends MovementBehaviour { private PortableStorageInterfaceTileEntity getStationaryInterfaceAt(World world, BlockPos pos, BlockState state, Direction facing) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (!(te instanceof PortableStorageInterfaceTileEntity)) return null; BlockState blockState = world.getBlockState(pos); if (blockState.getBlock() != state.getBlock()) return null; - if (blockState.get(PortableStorageInterfaceBlock.FACING) != facing.getOpposite()) + if (blockState.getValue(PortableStorageInterfaceBlock.FACING) != facing.getOpposite()) return null; return (PortableStorageInterfaceTileEntity) te; } private Optional getCurrentFacingIfValid(MovementContext context) { - Vector3d directionVec = Vector3d.of(context.state.get(PortableStorageInterfaceBlock.FACING) - .getDirectionVec()); + Vector3d directionVec = Vector3d.atLowerCornerOf(context.state.getValue(PortableStorageInterfaceBlock.FACING) + .getNormal()); directionVec = context.rotation.apply(directionVec); - Direction facingFromVector = Direction.getFacingFromVector(directionVec.x, directionVec.y, directionVec.z); - if (directionVec.distanceTo(Vector3d.of(facingFromVector.getDirectionVec())) > 1 / 2f) + Direction facingFromVector = Direction.getNearest(directionVec.x, directionVec.y, directionVec.z); + if (directionVec.distanceTo(Vector3d.atLowerCornerOf(facingFromVector.getNormal())) > 1 / 2f) return Optional.empty(); return Optional.of(facingFromVector); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java index 287b2314f..edf462cb4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java @@ -37,7 +37,7 @@ public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer sbb.light(light) .renderInto(ms, vb)); } @@ -46,7 +46,7 @@ public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer dynamicTree = TreeCutter.findDynamicTree(brokenState.getBlock(), pos); + if (dynamicTree.isPresent()) { + dynamicTree.get().destroyBlocks(context.world, null, (stack, dropPos) -> dropItemFromCutTree(context, stack, dropPos)); + return; + } + TreeCutter.findTree(context.world, pos).destroyBlocks(context.world, null, (stack, dropPos) -> dropItemFromCutTree(context, stack, dropPos)); } @@ -70,8 +80,8 @@ public class SawMovementBehaviour extends BlockBreakingMovementBehaviour { Vector3d dropPos = VecHelper.getCenterOf(pos); float distance = (float) dropPos.distanceTo(context.position); ItemEntity entity = new ItemEntity(world, dropPos.x, dropPos.y, dropPos.z, remainder); - entity.setMotion(context.relativeMotion.scale(distance / 20f)); - world.addEntity(entity); + entity.setDeltaMovement(context.relativeMotion.scale(distance / 20f)); + world.addFreshEntity(entity); } @Override @@ -81,6 +91,11 @@ public class SawMovementBehaviour extends BlockBreakingMovementBehaviour { SawRenderer.renderInContraption(context, renderWorld, matrices, buffer); } + @Override + protected boolean shouldDestroyStartBlock(BlockState stateToBreak) { + return !TreeCutter.canDynamicTreeCutFrom(stateToBreak.getBlock()); + } + @Override protected DamageSource getDamageSource() { return SawBlock.damageSourceSaw; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java index bd2f0001c..87ef62be5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java @@ -45,28 +45,28 @@ public class SeatBlock extends Block { } @Override - public void fillItemGroup(ItemGroup group, NonNullList p_149666_2_) { - if (group != ItemGroup.SEARCH && !inCreativeTab) + public void fillItemCategory(ItemGroup group, NonNullList p_149666_2_) { + if (group != ItemGroup.TAB_SEARCH && !inCreativeTab) return; - super.fillItemGroup(group, p_149666_2_); + super.fillItemCategory(group, p_149666_2_); } @Override - public void onFallenUpon(World p_180658_1_, BlockPos p_180658_2_, Entity p_180658_3_, float p_180658_4_) { - super.onFallenUpon(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_ * 0.5F); + public void fallOn(World p_180658_1_, BlockPos p_180658_2_, Entity p_180658_3_, float p_180658_4_) { + super.fallOn(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_ * 0.5F); } @Override - public void onLanded(IBlockReader reader, Entity entity) { - BlockPos pos = entity.getBlockPos(); - if (entity instanceof PlayerEntity || !(entity instanceof LivingEntity) || !canBePickedUp(entity) || isSeatOccupied(entity.world, pos)) { - Blocks.PINK_BED.onLanded(reader, entity); + public void updateEntityAfterFallOn(IBlockReader reader, Entity entity) { + BlockPos pos = entity.blockPosition(); + if (entity instanceof PlayerEntity || !(entity instanceof LivingEntity) || !canBePickedUp(entity) || isSeatOccupied(entity.level, pos)) { + Blocks.PINK_BED.updateEntityAfterFallOn(reader, entity); return; } if (reader.getBlockState(pos) .getBlock() != this) return; - sitDown(entity.world, pos, entity); + sitDown(entity.level, pos, entity); } @Override @@ -88,46 +88,46 @@ public class SeatBlock extends Block { } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult p_225533_6_) { - if (player.isSneaking()) + if (player.isShiftKeyDown()) return ActionResultType.PASS; - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); for (DyeColor color : DyeColor.values()) { if (!heldItem.getItem() - .isIn(DyeHelper.getTagOfDye(color))) + .is(DyeHelper.getTagOfDye(color))) continue; - if (world.isRemote) + if (world.isClientSide) return ActionResultType.SUCCESS; BlockState newState = AllBlocks.SEATS.get(color).getDefaultState(); if (newState != state) - world.setBlockState(pos, newState); + world.setBlockAndUpdate(pos, newState); return ActionResultType.SUCCESS; } - List seats = world.getEntitiesWithinAABB(SeatEntity.class, new AxisAlignedBB(pos)); + List seats = world.getEntitiesOfClass(SeatEntity.class, new AxisAlignedBB(pos)); if (!seats.isEmpty()) { SeatEntity seatEntity = seats.get(0); List passengers = seatEntity.getPassengers(); if (!passengers.isEmpty() && passengers.get(0) instanceof PlayerEntity) return ActionResultType.PASS; - if (!world.isRemote) { - seatEntity.removePassengers(); + if (!world.isClientSide) { + seatEntity.ejectPassengers(); player.startRiding(seatEntity); } return ActionResultType.SUCCESS; } - if (world.isRemote) + if (world.isClientSide) return ActionResultType.SUCCESS; sitDown(world, pos, player); return ActionResultType.SUCCESS; } public static boolean isSeatOccupied(World world, BlockPos pos) { - return !world.getEntitiesWithinAABB(SeatEntity.class, new AxisAlignedBB(pos)) + return !world.getEntitiesOfClass(SeatEntity.class, new AxisAlignedBB(pos)) .isEmpty(); } @@ -136,16 +136,16 @@ public class SeatBlock extends Block { } public static void sitDown(World world, BlockPos pos, Entity entity) { - if (world.isRemote) + if (world.isClientSide) return; SeatEntity seat = new SeatEntity(world, pos); - seat.setPos(pos.getX() + .5f, pos.getY(), pos.getZ() + .5f); - world.addEntity(seat); + seat.setPosRaw(pos.getX() + .5f, pos.getY(), pos.getZ() + .5f); + world.addFreshEntity(seat); entity.startRiding(seat, true); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java index b5dea8fcd..9777aedd8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java @@ -27,13 +27,13 @@ public class SeatEntity extends Entity implements IEntityAdditionalSpawnData { public SeatEntity(World world, BlockPos pos) { this(AllEntityTypes.SEAT.get(), world); - noClip = true; + noPhysics = true; } public static EntityType.Builder build(EntityType.Builder builder) { @SuppressWarnings("unchecked") EntityType.Builder entityBuilder = (EntityType.Builder) builder; - return entityBuilder.size(0.25f, 0.35f); + return entityBuilder.sized(0.25f, 0.35f); } @Override @@ -42,29 +42,29 @@ public class SeatEntity extends Entity implements IEntityAdditionalSpawnData { } @Override - public void setPos(double x, double y, double z) { - super.setPos(x, y, z); + public void setPosRaw(double x, double y, double z) { + super.setPosRaw(x, y, z); AxisAlignedBB bb = getBoundingBox(); Vector3d diff = new Vector3d(x, y, z).subtract(bb.getCenter()); - setBoundingBox(bb.offset(diff)); + setBoundingBox(bb.move(diff)); } @Override - public void setMotion(Vector3d p_213317_1_) {} + public void setDeltaMovement(Vector3d p_213317_1_) {} @Override public void tick() { - if (world.isRemote) + if (level.isClientSide) return; - boolean blockPresent = world.getBlockState(getBlockPos()) + boolean blockPresent = level.getBlockState(blockPosition()) .getBlock() instanceof SeatBlock; - if (isBeingRidden() && blockPresent) + if (isVehicle() && blockPresent) return; this.remove(); } @Override - protected boolean canBeRidden(Entity entity) { + protected boolean canRide(Entity entity) { // Fake Players (tested with deployers) have a BUNCH of weird issues, don't let them ride seats return !(entity instanceof FakePlayer); } @@ -72,21 +72,21 @@ public class SeatEntity extends Entity implements IEntityAdditionalSpawnData { @Override protected void removePassenger(Entity entity) { super.removePassenger(entity); - Vector3d pos = entity.getPositionVec(); - entity.setPosition(pos.x, pos.y + 0.85f, pos.z); + Vector3d pos = entity.position(); + entity.setPos(pos.x, pos.y + 0.85f, pos.z); } @Override - protected void registerData() {} + protected void defineSynchedData() {} @Override - protected void readAdditional(CompoundNBT p_70037_1_) {} + protected void readAdditionalSaveData(CompoundNBT p_70037_1_) {} @Override - protected void writeAdditional(CompoundNBT p_213281_1_) {} + protected void addAdditionalSaveData(CompoundNBT p_213281_1_) {} @Override - public IPacket createSpawnPacket() { + public IPacket getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } @@ -102,7 +102,7 @@ public class SeatEntity extends Entity implements IEntityAdditionalSpawnData { } @Override - public ResourceLocation getEntityTexture(SeatEntity p_110775_1_) { + public ResourceLocation getTextureLocation(SeatEntity p_110775_1_) { return null; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java index e2143baf2..84776eb68 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java @@ -40,8 +40,8 @@ public class SeatMovementBehaviour extends MovementBehaviour { Map seatMapping = context.contraption.getSeatMapping(); BlockState blockState = context.world.getBlockState(pos); - boolean slab = blockState.getBlock() instanceof SlabBlock && blockState.get(SlabBlock.TYPE) == SlabType.BOTTOM; - boolean solid = blockState.isSolid() || slab; + boolean slab = blockState.getBlock() instanceof SlabBlock && blockState.getValue(SlabBlock.TYPE) == SlabType.BOTTOM; + boolean solid = blockState.canOcclude() || slab; // Occupied if (seatMapping.containsValue(index)) { @@ -53,7 +53,7 @@ public class SeatMovementBehaviour extends MovementBehaviour { continue; for (Entity entity : contraptionEntity.getPassengers()) { if (!entry.getKey() - .equals(entity.getUniqueID())) + .equals(entity.getUUID())) continue; toDismount = entity; } @@ -62,7 +62,7 @@ public class SeatMovementBehaviour extends MovementBehaviour { toDismount.stopRiding(); Vector3d position = VecHelper.getCenterOf(pos) .add(0, slab ? .5f : 1f, 0); - toDismount.setPositionAndUpdate(position.x, position.y, position.z); + toDismount.teleportTo(position.x, position.y, position.z); toDismount.getPersistentData() .remove("ContraptionDismountLocation"); } @@ -72,8 +72,8 @@ public class SeatMovementBehaviour extends MovementBehaviour { if (solid) return; - List nearbyEntities = context.world.getEntitiesWithinAABB(Entity.class, - new AxisAlignedBB(pos).shrink(1 / 16f), SeatBlock::canBePickedUp); + List nearbyEntities = context.world.getEntitiesOfClass(Entity.class, + new AxisAlignedBB(pos).deflate(1 / 16f), SeatBlock::canBePickedUp); if (!nearbyEntities.isEmpty()) contraptionEntity.addSittingPassenger(nearbyEntities.get(0), index); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/ContraptionBlockSource.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/ContraptionBlockSource.java index 57bfc9449..d7660c434 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/ContraptionBlockSource.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/ContraptionBlockSource.java @@ -31,42 +31,42 @@ public class ContraptionBlockSource implements IBlockSource { } @Override - public double getX() { + public double x() { return (double)this.pos.getX() + 0.5D; } @Override - public double getY() { + public double y() { return (double)this.pos.getY() + 0.5D; } @Override - public double getZ() { + public double z() { return (double)this.pos.getZ() + 0.5D; } @Override - public BlockPos getBlockPos() { + public BlockPos getPos() { return pos; } @Override public BlockState getBlockState() { - if(context.state.contains(BlockStateProperties.FACING) && overrideFacing != null) - return context.state.with(BlockStateProperties.FACING, overrideFacing); + if(context.state.hasProperty(BlockStateProperties.FACING) && overrideFacing != null) + return context.state.setValue(BlockStateProperties.FACING, overrideFacing); return context.state; } @Override @Nullable - public T getBlockTileEntity() { + public T getEntity() { return null; } @Override @Nullable - public ServerWorld getWorld() { + public ServerWorld getLevel() { MinecraftServer server = context.world.getServer(); - return server != null ? server.getWorld(context.world.getRegistryKey()) : null; + return server != null ? server.getLevel(context.world.dimension()) : null; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DispenserMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DispenserMovementBehaviour.java index 39837a67f..a423fb7e7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DispenserMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DispenserMovementBehaviour.java @@ -7,7 +7,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import mcp.MethodsReturnNonnullByDefault; -import net.minecraft.block.Block; +import net.minecraft.block.AbstractBlock; import net.minecraft.block.Blocks; import net.minecraft.block.DispenserBlock; import net.minecraft.dispenser.DefaultDispenseItemBehavior; @@ -42,7 +42,7 @@ public class DispenserMovementBehaviour extends DropperMovementBehaviour { DispenseItemLocation location = getDispenseLocation(context); if (location.isEmpty()) { - context.world.playEvent(1001, pos, 0); + context.world.levelEvent(1001, pos, 0); } else { ItemStack itemstack = getItemStackAt(location, context); // Special dispense item behaviour for moving contraptions @@ -59,7 +59,7 @@ public class DispenserMovementBehaviour extends DropperMovementBehaviour { return; } - IDispenseItemBehavior idispenseitembehavior = BEHAVIOUR_LOOKUP.getBehavior(itemstack); + IDispenseItemBehavior idispenseitembehavior = BEHAVIOUR_LOOKUP.getDispenseMethod(itemstack); if (idispenseitembehavior instanceof ProjectileDispenseBehavior) { // Projectile behaviours can be converted most of the time IMovedDispenseItemBehaviour iMovedDispenseItemBehaviour = MovedProjectileDispenserBehaviour.of((ProjectileDispenseBehavior) idispenseitembehavior); setItemStackAt(location, iMovedDispenseItemBehaviour.dispense(itemstack, context, pos), context); @@ -67,10 +67,10 @@ public class DispenserMovementBehaviour extends DropperMovementBehaviour { return; } - Vector3d facingVec = Vector3d.of(context.state.get(DispenserBlock.FACING).getDirectionVec()); + Vector3d facingVec = Vector3d.atLowerCornerOf(context.state.getValue(DispenserBlock.FACING).getNormal()); facingVec = context.rotation.apply(facingVec); facingVec.normalize(); - Direction clostestFacing = Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z); + Direction clostestFacing = Direction.getNearest(facingVec.x, facingVec.y, facingVec.z); ContraptionBlockSource blockSource = new ContraptionBlockSource(context, pos, clostestFacing); if (idispenseitembehavior.getClass() != DefaultDispenseItemBehavior.class) { // There is a dispense item behaviour registered for the vanilla dispenser @@ -89,11 +89,11 @@ public class DispenserMovementBehaviour extends DropperMovementBehaviour { @MethodsReturnNonnullByDefault private static class DispenserLookup extends DispenserBlock { protected DispenserLookup() { - super(Block.Properties.from(Blocks.DISPENSER)); + super(AbstractBlock.Properties.copy(Blocks.DISPENSER)); } - public IDispenseItemBehavior getBehavior(ItemStack itemStack) { - return super.getBehavior(itemStack); + public IDispenseItemBehavior getDispenseMethod(ItemStack itemStack) { + return super.getDispenseMethod(itemStack); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DropperMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DropperMovementBehaviour.java index 27aa13c60..e9771be43 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DropperMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/DropperMovementBehaviour.java @@ -21,7 +21,7 @@ public class DropperMovementBehaviour extends MovementBehaviour { protected void activate(MovementContext context, BlockPos pos) { DispenseItemLocation location = getDispenseLocation(context); if (location.isEmpty()) { - context.world.playEvent(1001, pos, 0); + context.world.levelEvent(1001, pos, 0); } else { setItemStackAt(location, defaultBehaviour.dispense(getItemStackAt(location, context), context, pos), context); } @@ -29,7 +29,7 @@ public class DropperMovementBehaviour extends MovementBehaviour { @Override public void visitNewPosition(MovementContext context, BlockPos pos) { - if (context.world.isRemote) + if (context.world.isClientSide) return; collectItems(context); activate(context, pos); @@ -37,7 +37,7 @@ public class DropperMovementBehaviour extends MovementBehaviour { private void collectItems(MovementContext context) { getStacks(context).stream().filter(itemStack -> !itemStack.isEmpty() && itemStack.getItem() != Items.AIR && itemStack.getMaxStackSize() > itemStack.getCount()).forEach(itemStack -> itemStack.grow( - ItemHelper.extract(context.contraption.inventory, itemStack::isItemEqual, ItemHelper.ExtractionCountMode.UPTO, itemStack.getMaxStackSize() - itemStack.getCount(), false).getCount())); + ItemHelper.extract(context.contraption.inventory, itemStack::sameItem, ItemHelper.ExtractionCountMode.UPTO, itemStack.getMaxStackSize() - itemStack.getCount(), false).getCount())); } private void updateTemporaryData(MovementContext context) { @@ -62,7 +62,7 @@ public class DropperMovementBehaviour extends MovementBehaviour { if (testStack == null || testStack.isEmpty()) continue; if (testStack.getMaxStackSize() == 1) { - location = new DispenseItemLocation(false, ItemHelper.findFirstMatchingSlotIndex(context.contraption.inventory, testStack::isItemEqual)); + location = new DispenseItemLocation(false, ItemHelper.findFirstMatchingSlotIndex(context.contraption.inventory, testStack::sameItem)); if (!getItemStackAt(location, context).isEmpty()) useable.add(location); } else if (testStack.getCount() >= 2) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/IMovedDispenseItemBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/IMovedDispenseItemBehaviour.java index c70c6b899..bfb7e7e9f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/IMovedDispenseItemBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/IMovedDispenseItemBehaviour.java @@ -47,17 +47,17 @@ public interface IMovedDispenseItemBehaviour { if (context.world instanceof ServerWorld) { EntityType entityType = ((SpawnEggItem) itemStack.getItem()).getType(itemStack.getTag()); Entity spawnedEntity = entityType.spawn((ServerWorld) context.world, itemStack, null, - pos.add(facing.x + .7, facing.y + .7, facing.z + .7), SpawnReason.DISPENSER, facing.y < .5, + pos.offset(facing.x + .7, facing.y + .7, facing.z + .7), SpawnReason.DISPENSER, facing.y < .5, false); if (spawnedEntity != null) - spawnedEntity.setMotion(context.motion.scale(2)); + spawnedEntity.setDeltaMovement(context.motion.scale(2)); } itemStack.shrink(1); return itemStack; } }; - for (SpawnEggItem spawneggitem : SpawnEggItem.getEggs()) + for (SpawnEggItem spawneggitem : SpawnEggItem.eggs()) DispenserMovementBehaviour.registerMovedDispenseItemBehaviour(spawneggitem, spawnEggDispenseBehaviour); } @@ -92,10 +92,10 @@ public interface IMovedDispenseItemBehaviour { double y = pos.getY() + facing.y * .7 + .5; double z = pos.getZ() + facing.z * .7 + .5; TNTEntity tntentity = new TNTEntity(context.world, x, y, z, null); - tntentity.addVelocity(context.motion.x, context.motion.y, context.motion.z); - context.world.addEntity(tntentity); + tntentity.push(context.motion.x, context.motion.y, context.motion.z); + context.world.addFreshEntity(tntentity); context.world.playSound(null, tntentity.getX(), tntentity.getY(), tntentity.getZ(), - SoundEvents.ENTITY_TNT_PRIMED, SoundCategory.BLOCKS, 1.0F, 1.0F); + SoundEvents.TNT_PRIMED, SoundCategory.BLOCKS, 1.0F, 1.0F); itemStack.shrink(1); return itemStack; } @@ -112,14 +112,14 @@ public interface IMovedDispenseItemBehaviour { FireworkRocketEntity fireworkrocketentity = new FireworkRocketEntity(context.world, itemStack, x, y, z, true); fireworkrocketentity.shoot(facing.x, facing.y, facing.z, 0.5F, 1.0F); - context.world.addEntity(fireworkrocketentity); + context.world.addFreshEntity(fireworkrocketentity); itemStack.shrink(1); return itemStack; } @Override protected void playDispenseSound(IWorld world, BlockPos pos) { - world.playEvent(1004, pos, 0); + world.levelEvent(1004, pos, 0); } }); @@ -127,22 +127,22 @@ public interface IMovedDispenseItemBehaviour { new MovedDefaultDispenseItemBehaviour() { @Override protected void playDispenseSound(IWorld world, BlockPos pos) { - world.playEvent(1018, pos, 0); + world.levelEvent(1018, pos, 0); } @Override protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vector3d facing) { - Random random = context.world.rand; + Random random = context.world.random; double x = pos.getX() + facing.x * .7 + .5; double y = pos.getY() + facing.y * .7 + .5; double z = pos.getZ() + facing.z * .7 + .5; - context.world.addEntity(Util.make( + context.world.addFreshEntity(Util.make( new SmallFireballEntity(context.world, x, y, z, random.nextGaussian() * 0.05D + facing.x + context.motion.x, random.nextGaussian() * 0.05D + facing.y + context.motion.y, random.nextGaussian() * 0.05D + facing.z + context.motion.z), - (p_229425_1_) -> p_229425_1_.setStack(itemStack))); + (p_229425_1_) -> p_229425_1_.setItem(itemStack))); itemStack.shrink(1); return itemStack; } @@ -154,21 +154,21 @@ public interface IMovedDispenseItemBehaviour { protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vector3d facing) { this.successful = false; - BlockPos interactAt = pos.offset(getClosestFacingDirection(facing)); + BlockPos interactAt = pos.relative(getClosestFacingDirection(facing)); BlockState state = context.world.getBlockState(interactAt); Block block = state.getBlock(); - if (block.isIn(BlockTags.BEEHIVES) && state.get(BeehiveBlock.HONEY_LEVEL) >= 5) { - ((BeehiveBlock) block).takeHoney(context.world, state, interactAt, null, + if (block.is(BlockTags.BEEHIVES) && state.getValue(BeehiveBlock.HONEY_LEVEL) >= 5) { + ((BeehiveBlock) block).releaseBeesAndResetHoneyLevel(context.world, state, interactAt, null, BeehiveTileEntity.State.BEE_RELEASED); this.successful = true; return placeItemInInventory(itemStack, new ItemStack(Items.HONEY_BOTTLE), context, pos, facing); } else if (context.world.getFluidState(interactAt) - .isTagged(FluidTags.WATER)) { + .is(FluidTags.WATER)) { this.successful = true; return placeItemInInventory(itemStack, - PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.WATER), context, pos, + PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER), context, pos, facing); } else { return super.dispenseStack(itemStack, context, pos, facing); @@ -181,13 +181,13 @@ public interface IMovedDispenseItemBehaviour { @Override protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vector3d facing) { - BlockPos interactAt = pos.offset(getClosestFacingDirection(facing)); + BlockPos interactAt = pos.relative(getClosestFacingDirection(facing)); BlockState state = context.world.getBlockState(interactAt); Block block = state.getBlock(); if (block instanceof IBucketPickupHandler) { - Fluid fluid = ((IBucketPickupHandler) block).pickupFluid(context.world, interactAt, state); + Fluid fluid = ((IBucketPickupHandler) block).takeLiquid(context.world, interactAt, state); if (fluid instanceof FlowingFluid) - return placeItemInInventory(itemStack, new ItemStack(fluid.getFilledBucket()), context, pos, + return placeItemInInventory(itemStack, new ItemStack(fluid.getBucket()), context, pos, facing); } return super.dispenseStack(itemStack, context, pos, facing); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedDefaultDispenseItemBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedDefaultDispenseItemBehaviour.java index 88aea0fed..d12d2d31a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedDefaultDispenseItemBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedDefaultDispenseItemBehaviour.java @@ -21,32 +21,32 @@ public class MovedDefaultDispenseItemBehaviour implements IMovedDispenseItemBeha double d0 = p_82486_4_.getX() + facing.x + .5; double d1 = p_82486_4_.getY() + facing.y + .5; double d2 = p_82486_4_.getZ() + facing.z + .5; - if (Direction.getFacingFromVector(facing.x, facing.y, facing.z).getAxis() == Direction.Axis.Y) { + if (Direction.getNearest(facing.x, facing.y, facing.z).getAxis() == Direction.Axis.Y) { d1 = d1 - 0.125D; } else { d1 = d1 - 0.15625D; } ItemEntity itementity = new ItemEntity(p_82486_0_, d0, d1, d2, p_82486_1_); - double d3 = p_82486_0_.rand.nextDouble() * 0.1D + 0.2D; - itementity.setMotion(p_82486_0_.rand.nextGaussian() * (double) 0.0075F * (double) p_82486_2_ + facing.getX() * d3 + context.motion.x, p_82486_0_.rand.nextGaussian() * (double) 0.0075F * (double) p_82486_2_ + facing.getY() * d3 + context.motion.y, p_82486_0_.rand.nextGaussian() * (double) 0.0075F * (double) p_82486_2_ + facing.getZ() * d3 + context.motion.z); - p_82486_0_.addEntity(itementity); + double d3 = p_82486_0_.random.nextDouble() * 0.1D + 0.2D; + itementity.setDeltaMovement(p_82486_0_.random.nextGaussian() * (double) 0.0075F * (double) p_82486_2_ + facing.x() * d3 + context.motion.x, p_82486_0_.random.nextGaussian() * (double) 0.0075F * (double) p_82486_2_ + facing.y() * d3 + context.motion.y, p_82486_0_.random.nextGaussian() * (double) 0.0075F * (double) p_82486_2_ + facing.z() * d3 + context.motion.z); + p_82486_0_.addFreshEntity(itementity); } @Override public ItemStack dispense(ItemStack itemStack, MovementContext context, BlockPos pos) { - Vector3d facingVec = Vector3d.of(context.state.get(DispenserBlock.FACING).getDirectionVec()); + Vector3d facingVec = Vector3d.atLowerCornerOf(context.state.getValue(DispenserBlock.FACING).getNormal()); facingVec = context.rotation.apply(facingVec); facingVec.normalize(); Direction closestToFacing = getClosestFacingDirection(facingVec); - IInventory iinventory = HopperTileEntity.getInventoryAtPosition(context.world, pos.offset(closestToFacing)); + IInventory iinventory = HopperTileEntity.getContainerAt(context.world, pos.relative(closestToFacing)); if (iinventory == null) { this.playDispenseSound(context.world, pos); this.spawnDispenseParticles(context.world, pos, closestToFacing); return this.dispenseStack(itemStack, context, pos, facingVec); } else { - if (HopperTileEntity.putStackInInventoryAllSlots(null, iinventory, itemStack.copy().split(1), closestToFacing.getOpposite()).isEmpty()) + if (HopperTileEntity.addItem(null, iinventory, itemStack.copy().split(1), closestToFacing.getOpposite()).isEmpty()) itemStack.shrink(1); return itemStack; } @@ -65,7 +65,7 @@ public class MovedDefaultDispenseItemBehaviour implements IMovedDispenseItemBeha * Play the dispense sound from the specified block. */ protected void playDispenseSound(IWorld world, BlockPos pos) { - world.playEvent(1000, pos, 0); + world.levelEvent(1000, pos, 0); } /** @@ -76,11 +76,11 @@ public class MovedDefaultDispenseItemBehaviour implements IMovedDispenseItemBeha } protected void spawnDispenseParticles(IWorld world, BlockPos pos, Direction direction) { - world.playEvent(2000, pos, direction.getIndex()); + world.levelEvent(2000, pos, direction.get3DDataValue()); } protected Direction getClosestFacingDirection(Vector3d exactFacing) { - return Direction.getFacingFromVector(exactFacing.x, exactFacing.y, exactFacing.z); + return Direction.getNearest(exactFacing.x, exactFacing.y, exactFacing.z); } protected ItemStack placeItemInInventory(ItemStack consumedFrom, ItemStack output, MovementContext context, BlockPos pos, Vector3d facing) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedOptionalDispenseBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedOptionalDispenseBehaviour.java index d3eb7e88e..9b8ecef5e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedOptionalDispenseBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedOptionalDispenseBehaviour.java @@ -8,6 +8,6 @@ public class MovedOptionalDispenseBehaviour extends MovedDefaultDispenseItemBeha @Override protected void playDispenseSound(IWorld world, BlockPos pos) { - world.playEvent(this.successful ? 1000 : 1001, pos, 0); + world.levelEvent(this.successful ? 1000 : 1001, pos, 0); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedProjectileDispenserBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedProjectileDispenserBehaviour.java index bd39d404f..313253630 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedProjectileDispenserBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/MovedProjectileDispenserBehaviour.java @@ -28,14 +28,14 @@ public abstract class MovedProjectileDispenserBehaviour extends MovedDefaultDisp return itemStack; Vector3d effectiveMovementVec = facing.scale(getProjectileVelocity()).add(context.motion); ProjectileEntity.shoot(effectiveMovementVec.x, effectiveMovementVec.y, effectiveMovementVec.z, (float) effectiveMovementVec.length(), this.getProjectileInaccuracy()); - context.world.addEntity(ProjectileEntity); + context.world.addFreshEntity(ProjectileEntity); itemStack.shrink(1); return itemStack; } @Override protected void playDispenseSound(IWorld world, BlockPos pos) { - world.playEvent(1002, pos, 0); + world.levelEvent(1002, pos, 0); } @Nullable @@ -81,19 +81,19 @@ public abstract class MovedProjectileDispenserBehaviour extends MovedDefaultDisp } private static Method getProjectileEntityLookup() { - Method getProjectileEntity = ObfuscationReflectionHelper.findMethod(ProjectileDispenseBehavior.class, "func_82499_a", World.class, IPosition.class, ItemStack.class); + Method getProjectileEntity = ObfuscationReflectionHelper.findMethod(ProjectileDispenseBehavior.class, "func_82499_a", World.class, IPosition.class, ItemStack.class); // getProjectile getProjectileEntity.setAccessible(true); return getProjectileEntity; } private static Method getProjectileInaccuracyLookup() { - Method getProjectileInaccuracy = ObfuscationReflectionHelper.findMethod(ProjectileDispenseBehavior.class, "func_82498_a"); + Method getProjectileInaccuracy = ObfuscationReflectionHelper.findMethod(ProjectileDispenseBehavior.class, "func_82498_a"); // getUncertainty getProjectileInaccuracy.setAccessible(true); return getProjectileInaccuracy; } private static Method getProjectileVelocityLookup() { - Method getProjectileVelocity = ObfuscationReflectionHelper.findMethod(ProjectileDispenseBehavior.class, "func_82500_b"); + Method getProjectileVelocity = ObfuscationReflectionHelper.findMethod(ProjectileDispenseBehavior.class, "func_82500_b"); // getPower getProjectileVelocity.setAccessible(true); return getProjectileVelocity; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/SimplePos.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/SimplePos.java index 5da3e0b13..a751cc024 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/SimplePos.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/dispenser/SimplePos.java @@ -14,17 +14,17 @@ public class SimplePos implements IPosition { } @Override - public double getX() { + public double x() { return x; } @Override - public double getY() { + public double y() { return y; } @Override - public double getZ() { + public double z() { return z; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockBlock.java index 3b179fc49..9782accaf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockBlock.java @@ -49,22 +49,22 @@ public class CuckooClockBlock extends HorizontalKineticBlock { } @Override - public void fillItemGroup(ItemGroup group, NonNullList items) { + public void fillItemCategory(ItemGroup group, NonNullList items) { if (!mysterious) - super.fillItemGroup(group, items); + super.fillItemCategory(group, items); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { Direction preferred = getPreferredHorizontalFacing(context); if (preferred != null) - return getDefaultState().with(HORIZONTAL_FACING, preferred.getOpposite()); - return this.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite()); + return defaultBlockState().setValue(HORIZONTAL_FACING, preferred.getOpposite()); + return this.defaultBlockState().setValue(HORIZONTAL_FACING, context.getHorizontalDirection().getOpposite()); } @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face == state.get(HORIZONTAL_FACING).getOpposite(); + return face == state.getValue(HORIZONTAL_FACING).getOpposite(); } public static boolean containsSurprise(BlockState state) { @@ -74,11 +74,11 @@ public class CuckooClockBlock extends HorizontalKineticBlock { @Override public Axis getRotationAxis(BlockState state) { - return state.get(HORIZONTAL_FACING).getAxis(); + return state.getValue(HORIZONTAL_FACING).getAxis(); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index 03f8fa982..443c00b11 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -34,10 +34,10 @@ public class CuckooClockRenderer extends KineticTileEntityRenderer { CuckooClockTileEntity clock = (CuckooClockTileEntity) te; BlockState blockState = te.getBlockState(); - int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, te.getPos()); - Direction direction = blockState.get(CuckooClockBlock.HORIZONTAL_FACING); + int packedLightmapCoords = WorldRenderer.getLightColor(te.getLevel(), blockState, te.getBlockPos()); + Direction direction = blockState.getValue(CuckooClockBlock.HORIZONTAL_FACING); - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + IVertexBuilder vb = buffer.getBuffer(RenderType.solid()); // Render Hands SuperByteBuffer hourHand = PartialBufferer.get(AllBlockPartials.CUCKOO_HOUR_HAND, blockState); @@ -83,7 +83,7 @@ public class CuckooClockRenderer extends KineticTileEntityRenderer { PartialModel partialModel = (clock.animationType == Animation.PIG ? AllBlockPartials.CUCKOO_PIG : AllBlockPartials.CUCKOO_CREEPER); SuperByteBuffer figure = PartialBufferer.get(partialModel, blockState); - figure.rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(direction.rotateYCCW()))); + figure.rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(direction.getCounterClockWise()))); figure.translate(offset, 0, 0); figure.light(packedLightmapCoords) .renderInto(ms, vb); @@ -98,7 +98,7 @@ public class CuckooClockRenderer extends KineticTileEntityRenderer { private SuperByteBuffer transform(PartialModel partial, KineticTileEntity te) { return PartialBufferer.getFacing(partial, te.getBlockState(), te.getBlockState() - .get(CuckooClockBlock.HORIZONTAL_FACING) + .getValue(CuckooClockBlock.HORIZONTAL_FACING) .getOpposite()); } @@ -106,7 +106,7 @@ public class CuckooClockRenderer extends KineticTileEntityRenderer { float pivotX = 2 / 16f; float pivotY = 6 / 16f; float pivotZ = 8 / 16f; - buffer.rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing.rotateYCCW()))); + buffer.rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing.getCounterClockWise()))); buffer.translate(pivotX, pivotY, pivotZ); buffer.rotate(Direction.EAST, angle); buffer.translate(-pivotX, -pivotY, -pivotZ); @@ -117,7 +117,7 @@ public class CuckooClockRenderer extends KineticTileEntityRenderer { float pivotX = 2 / 16f; float pivotY = 0; float pivotZ = (left ? 6 : 10) / 16f; - buffer.rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing.rotateYCCW()))); + buffer.rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing.getCounterClockWise()))); buffer.translate(pivotX, pivotY, pivotZ); buffer.rotate(Direction.UP, AngleHelper.rad(angle) * (left ? -1 : 1)); buffer.translate(-pivotX, -pivotY, -pivotZ); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java index 9b3aefbd8..a38d44ee1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java @@ -67,24 +67,24 @@ public class CuckooClockTileEntity extends KineticTileEntity { return; - boolean isNatural = world.getDimension().isNatural(); - int dayTime = (int) ((world.getDayTime() * (isNatural ? 1 : 24)) % 24000); + boolean isNatural = level.dimensionType().natural(); + int dayTime = (int) ((level.getDayTime() * (isNatural ? 1 : 24)) % 24000); int hours = (dayTime / 1000 + 6) % 24; int minutes = (dayTime % 1000) * 60 / 1000; if (!isNatural) { - if (world.isRemote) { + if (level.isClientSide) { moveHands(hours, minutes); if (AnimationTickHolder.getTicks() % 6 == 0) - playSound(SoundEvents.BLOCK_NOTE_BLOCK_HAT, 1 / 16f, 2f); + playSound(SoundEvents.NOTE_BLOCK_HAT, 1 / 16f, 2f); else if (AnimationTickHolder.getTicks() % 3 == 0) - playSound(SoundEvents.BLOCK_NOTE_BLOCK_HAT, 1 / 16f, 1.5f); + playSound(SoundEvents.NOTE_BLOCK_HAT, 1 / 16f, 1.5f); } return; } - if (!world.isRemote) { + if (!level.isClientSide) { if (animationType == Animation.NONE) { if (hours == 12 && minutes < 5) startAnimation(Animation.PIG); @@ -97,23 +97,23 @@ public class CuckooClockTileEntity extends KineticTileEntity { animationType = Animation.NONE; if (animationType == Animation.SURPRISE && animationProgress.value == 50) { - Vector3d center = VecHelper.getCenterOf(pos); - world.destroyBlock(pos, false); - world.createExplosion(null, CUCKOO_SURPRISE, null, center.x, center.y, center.z, 3, false, + Vector3d center = VecHelper.getCenterOf(worldPosition); + level.destroyBlock(worldPosition, false); + level.explode(null, CUCKOO_SURPRISE, null, center.x, center.y, center.z, 3, false, Explosion.Mode.BREAK); } } } - if (world.isRemote) { + if (level.isClientSide) { moveHands(hours, minutes); if (animationType == Animation.NONE) { if (AnimationTickHolder.getTicks() % 32 == 0) - playSound(SoundEvents.BLOCK_NOTE_BLOCK_HAT, 1 / 16f, 2f); + playSound(SoundEvents.NOTE_BLOCK_HAT, 1 / 16f, 2f); else if (AnimationTickHolder.getTicks() % 16 == 0) - playSound(SoundEvents.BLOCK_NOTE_BLOCK_HAT, 1 / 16f, 1.5f); + playSound(SoundEvents.NOTE_BLOCK_HAT, 1 / 16f, 1.5f); } else { boolean isSurprise = animationType == Animation.SURPRISE; @@ -125,29 +125,29 @@ public class CuckooClockTileEntity extends KineticTileEntity { // sounds if (value == 1) - playSound(SoundEvents.BLOCK_NOTE_BLOCK_CHIME, 2, .5f); + playSound(SoundEvents.NOTE_BLOCK_CHIME, 2, .5f); if (value == 21) - playSound(SoundEvents.BLOCK_NOTE_BLOCK_CHIME, 2, 0.793701f); + playSound(SoundEvents.NOTE_BLOCK_CHIME, 2, 0.793701f); if (value > 30 && isSurprise) { - Vector3d pos = VecHelper.offsetRandomly(VecHelper.getCenterOf(this.pos), world.rand, .5f); - world.addParticle(ParticleTypes.LARGE_SMOKE, pos.x, pos.y, pos.z, 0, 0, 0); + Vector3d pos = VecHelper.offsetRandomly(VecHelper.getCenterOf(this.worldPosition), level.random, .5f); + level.addParticle(ParticleTypes.LARGE_SMOKE, pos.x, pos.y, pos.z, 0, 0, 0); } if (value == 40 && isSurprise) - playSound(SoundEvents.ENTITY_TNT_PRIMED, 1f, 1f); + playSound(SoundEvents.TNT_PRIMED, 1f, 1f); int step = isSurprise ? 3 : 15; for (int phase = 30; phase <= 60; phase += step) { if (value == phase - step / 3) - playSound(SoundEvents.BLOCK_CHEST_OPEN, 1 / 16f, 2f); + playSound(SoundEvents.CHEST_OPEN, 1 / 16f, 2f); if (value == phase) { if (animationType == Animation.PIG) - playSound(SoundEvents.ENTITY_PIG_AMBIENT, 1 / 4f, 1f); + playSound(SoundEvents.PIG_AMBIENT, 1 / 4f, 1f); else - playSound(SoundEvents.ENTITY_CREEPER_HURT, 1 / 4f, 3f); + playSound(SoundEvents.CREEPER_HURT, 1 / 4f, 3f); } if (value == phase + step / 3) - playSound(SoundEvents.BLOCK_CHEST_CLOSE, 1 / 16f, 2f); + playSound(SoundEvents.CHEST_CLOSE, 1 / 16f, 2f); } @@ -166,7 +166,7 @@ public class CuckooClockTileEntity extends KineticTileEntity { sendAnimationUpdate = true; if (animation == Animation.CREEPER) - AllTriggers.triggerForNearbyPlayers(AllTriggers.CUCKOO, world, pos, 10); + AllTriggers.triggerForNearbyPlayers(AllTriggers.CUCKOO, level, worldPosition, 10); sendData(); } @@ -183,8 +183,8 @@ public class CuckooClockTileEntity extends KineticTileEntity { } private void playSound(SoundEvent sound, float volume, float pitch) { - Vector3d vec = VecHelper.getCenterOf(pos); - world.playSound(vec.x, vec.y, vec.z, sound, SoundCategory.BLOCKS, volume, pitch, false); + Vector3d vec = VecHelper.getCenterOf(worldPosition); + level.playLocalSound(vec.x, vec.y, vec.z, sound, SoundCategory.BLOCKS, volume, pitch, false); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/ConnectedInputHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/ConnectedInputHandler.java index db6b86bfd..39e725e9b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/ConnectedInputHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/ConnectedInputHandler.java @@ -34,17 +34,17 @@ public class ConnectedInputHandler { public static boolean shouldConnect(World world, BlockPos pos, Direction face, Direction direction) { BlockState refState = world.getBlockState(pos); - if (!refState.contains(HORIZONTAL_FACING)) + if (!refState.hasProperty(HORIZONTAL_FACING)) return false; - Direction refDirection = refState.get(HORIZONTAL_FACING); + Direction refDirection = refState.getValue(HORIZONTAL_FACING); if (direction.getAxis() == refDirection.getAxis()) return false; if (face == refDirection) return false; - BlockState neighbour = world.getBlockState(pos.offset(direction)); + BlockState neighbour = world.getBlockState(pos.relative(direction)); if (!AllBlocks.MECHANICAL_CRAFTER.has(neighbour)) return false; - if (refDirection != neighbour.get(HORIZONTAL_FACING)) + if (refDirection != neighbour.getValue(HORIZONTAL_FACING)) return false; return true; } @@ -56,16 +56,16 @@ public class ConnectedInputHandler { if (crafter1 == null || crafter2 == null) return; - BlockPos controllerPos1 = crafter1.getPos() - .add(crafter1.input.data.get(0)); - BlockPos controllerPos2 = crafter2.getPos() - .add(crafter2.input.data.get(0)); + BlockPos controllerPos1 = crafter1.getBlockPos() + .offset(crafter1.input.data.get(0)); + BlockPos controllerPos2 = crafter2.getBlockPos() + .offset(crafter2.input.data.get(0)); if (controllerPos1.equals(controllerPos2)) { MechanicalCrafterTileEntity controller = CrafterHelper.getCrafter(world, controllerPos1); Set positions = controller.input.data.stream() - .map(controllerPos1::add) + .map(controllerPos1::offset) .collect(Collectors.toSet()); List frontier = new LinkedList<>(); List splitGroup = new ArrayList<>(); @@ -76,7 +76,7 @@ public class ConnectedInputHandler { while (!frontier.isEmpty()) { BlockPos current = frontier.remove(0); for (Direction direction : Iterate.directions) { - BlockPos next = current.offset(direction); + BlockPos next = current.relative(direction); if (!positions.remove(next)) continue; splitGroup.add(next); @@ -87,9 +87,9 @@ public class ConnectedInputHandler { initAndAddAll(world, crafter1, positions); initAndAddAll(world, crafter2, splitGroup); - crafter1.markDirty(); + crafter1.setChanged(); crafter1.connectivityChanged(); - crafter2.markDirty(); + crafter2.setChanged(); crafter2.connectivityChanged(); return; } @@ -103,11 +103,11 @@ public class ConnectedInputHandler { connectControllers(world, crafter1, crafter2); - world.setBlockState(crafter1.getPos(), crafter1.getBlockState(), 3); + world.setBlock(crafter1.getBlockPos(), crafter1.getBlockState(), 3); - crafter1.markDirty(); + crafter1.setChanged(); crafter1.connectivityChanged(); - crafter2.markDirty(); + crafter2.setChanged(); crafter2.connectivityChanged(); } @@ -115,8 +115,8 @@ public class ConnectedInputHandler { crafter.input = new ConnectedInput(); positions.forEach(splitPos -> { modifyAndUpdate(world, splitPos, input -> { - input.attachTo(crafter.getPos(), splitPos); - crafter.input.data.add(splitPos.subtract(crafter.getPos())); + input.attachTo(crafter.getBlockPos(), splitPos); + crafter.input.data.add(splitPos.subtract(crafter.getBlockPos())); }); }); } @@ -125,8 +125,8 @@ public class ConnectedInputHandler { MechanicalCrafterTileEntity crafter2) { crafter1.input.data.forEach(offset -> { - BlockPos connectedPos = crafter1.getPos() - .add(offset); + BlockPos connectedPos = crafter1.getBlockPos() + .offset(offset); modifyAndUpdate(world, connectedPos, input -> { }); }); @@ -134,26 +134,26 @@ public class ConnectedInputHandler { crafter2.input.data.forEach(offset -> { if (offset.equals(BlockPos.ZERO)) return; - BlockPos connectedPos = crafter2.getPos() - .add(offset); + BlockPos connectedPos = crafter2.getBlockPos() + .offset(offset); modifyAndUpdate(world, connectedPos, input -> { - input.attachTo(crafter1.getPos(), connectedPos); + input.attachTo(crafter1.getBlockPos(), connectedPos); crafter1.input.data.add(BlockPos.ZERO.subtract(input.data.get(0))); }); }); - crafter2.input.attachTo(crafter1.getPos(), crafter2.getPos()); + crafter2.input.attachTo(crafter1.getBlockPos(), crafter2.getBlockPos()); crafter1.input.data.add(BlockPos.ZERO.subtract(crafter2.input.data.get(0))); } private static void modifyAndUpdate(World world, BlockPos pos, Consumer callback) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (!(te instanceof MechanicalCrafterTileEntity)) return; MechanicalCrafterTileEntity crafter = (MechanicalCrafterTileEntity) te; callback.accept(crafter.input); - crafter.markDirty(); + crafter.setChanged(); crafter.connectivityChanged(); } @@ -174,7 +174,7 @@ public class ConnectedInputHandler { public IItemHandler getItemHandler(World world, BlockPos pos) { if (!isController) { - BlockPos controllerPos = pos.add(data.get(0)); + BlockPos controllerPos = pos.offset(data.get(0)); ConnectedInput input = CrafterHelper.getInput(world, controllerPos); if (input == this || input == null || !input.isController) return new ItemStackHandler(); @@ -182,7 +182,7 @@ public class ConnectedInputHandler { } List list = data.stream() - .map(l -> CrafterHelper.getCrafter(world, pos.add(l))) + .map(l -> CrafterHelper.getCrafter(world, pos.offset(l))) .filter(Objects::nonNull) .map(crafter -> crafter.getInventory()) .collect(Collectors.toList()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/CrafterCTBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/CrafterCTBehaviour.java index f4cf702e7..3649a3ab4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/CrafterCTBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/CrafterCTBehaviour.java @@ -21,7 +21,7 @@ public class CrafterCTBehaviour extends ConnectedTextureBehaviour { Direction face) { if (state.getBlock() != other.getBlock()) return false; - if (state.get(HORIZONTAL_FACING) != other.get(HORIZONTAL_FACING)) + if (state.getValue(HORIZONTAL_FACING) != other.getValue(HORIZONTAL_FACING)) return false; ConnectedInput input1 = CrafterHelper.getInput(reader, pos); @@ -32,8 +32,8 @@ public class CrafterCTBehaviour extends ConnectedTextureBehaviour { if (input1.data.isEmpty() || input2.data.isEmpty()) return false; try { - if (pos.add(input1.data.get(0)) - .equals(otherPos.add(input2.data.get(0)))) + if (pos.offset(input1.data.get(0)) + .equals(otherPos.offset(input2.data.get(0)))) return true; } catch (IndexOutOfBoundsException e) { // race condition. data somehow becomes empty between the last 2 if statements @@ -47,7 +47,7 @@ public class CrafterCTBehaviour extends ConnectedTextureBehaviour { if (!direction.getAxis() .isVertical()) return false; - Direction facing = state.get(HORIZONTAL_FACING); + Direction facing = state.getValue(HORIZONTAL_FACING); if (facing.getAxis() == direction.getAxis()) return false; @@ -59,7 +59,7 @@ public class CrafterCTBehaviour extends ConnectedTextureBehaviour { @Override public CTSpriteShiftEntry get(BlockState state, Direction direction) { - Direction facing = state.get(HORIZONTAL_FACING); + Direction facing = state.getValue(HORIZONTAL_FACING); boolean isFront = facing.getAxis() == direction.getAxis(); boolean isVertical = direction.getAxis() .isVertical(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/CrafterHelper.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/CrafterHelper.java index ed41f7c3a..b954fe412 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/CrafterHelper.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/CrafterHelper.java @@ -7,7 +7,7 @@ import net.minecraft.world.IBlockDisplayReader; public class CrafterHelper { public static MechanicalCrafterTileEntity getCrafter(IBlockDisplayReader reader, BlockPos pos) { - TileEntity te = reader.getTileEntity(pos); + TileEntity te = reader.getBlockEntity(pos); if (!(te instanceof MechanicalCrafterTileEntity)) return null; return (MechanicalCrafterTileEntity) te; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java index 05c41789d..d732ea2e2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java @@ -47,12 +47,12 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT public MechanicalCrafterBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(POINTING, Pointing.UP)); + registerDefaultState(defaultBlockState().setValue(POINTING, Pointing.UP)); } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(POINTING)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(POINTING)); } @Override @@ -62,35 +62,35 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT @Override public Axis getRotationAxis(BlockState state) { - return state.get(HORIZONTAL_FACING) + return state.getValue(HORIZONTAL_FACING) .getAxis(); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - Direction face = context.getFace(); - BlockPos placedOnPos = context.getPos() - .offset(face.getOpposite()); - BlockState blockState = context.getWorld() + Direction face = context.getClickedFace(); + BlockPos placedOnPos = context.getClickedPos() + .relative(face.getOpposite()); + BlockState blockState = context.getLevel() .getBlockState(placedOnPos); if ((blockState.getBlock() != this) || (context.getPlayer() != null && context.getPlayer() - .isSneaking())) { + .isShiftKeyDown())) { BlockState stateForPlacement = super.getStateForPlacement(context); - Direction direction = stateForPlacement.get(HORIZONTAL_FACING); + Direction direction = stateForPlacement.getValue(HORIZONTAL_FACING); if (direction != face) - stateForPlacement = stateForPlacement.with(POINTING, pointingFromFacing(face, direction)); + stateForPlacement = stateForPlacement.setValue(POINTING, pointingFromFacing(face, direction)); return stateForPlacement; } - Direction otherFacing = blockState.get(HORIZONTAL_FACING); + Direction otherFacing = blockState.getValue(HORIZONTAL_FACING); Pointing pointing = pointingFromFacing(face, otherFacing); - return getDefaultState().with(HORIZONTAL_FACING, otherFacing) - .with(POINTING, pointing); + return defaultBlockState().setValue(HORIZONTAL_FACING, otherFacing) + .setValue(POINTING, pointing); } @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { if (state.getBlock() == newState.getBlock()) { if (getTargetDirection(state) != getTargetDirection(newState)) { MechanicalCrafterTileEntity crafter = CrafterHelper.getCrafter(worldIn, pos); @@ -103,29 +103,29 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT MechanicalCrafterTileEntity crafter = CrafterHelper.getCrafter(worldIn, pos); if (crafter != null) { if (crafter.covered) - Block.spawnAsEntity(worldIn, pos, AllItems.CRAFTER_SLOT_COVER.asStack()); + Block.popResource(worldIn, pos, AllItems.CRAFTER_SLOT_COVER.asStack()); crafter.ejectWholeGrid(); } for (Direction direction : Iterate.directions) { - if (direction.getAxis() == state.get(HORIZONTAL_FACING) + if (direction.getAxis() == state.getValue(HORIZONTAL_FACING) .getAxis()) continue; - BlockPos otherPos = pos.offset(direction); + BlockPos otherPos = pos.relative(direction); ConnectedInput thisInput = CrafterHelper.getInput(worldIn, pos); ConnectedInput otherInput = CrafterHelper.getInput(worldIn, otherPos); if (thisInput == null || otherInput == null) continue; - if (!pos.add(thisInput.data.get(0)) - .equals(otherPos.add(otherInput.data.get(0)))) + if (!pos.offset(thisInput.data.get(0)) + .equals(otherPos.offset(otherInput.data.get(0)))) continue; ConnectedInputHandler.toggleConnection(worldIn, pos, otherPos); } - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } } @@ -146,9 +146,9 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - if (context.getFace() == state.get(HORIZONTAL_FACING)) { - if (!context.getWorld().isRemote) - KineticTileEntity.switchToBlockState(context.getWorld(), context.getPos(), state.cycle(POINTING)); + if (context.getClickedFace() == state.getValue(HORIZONTAL_FACING)) { + if (!context.getLevel().isClientSide) + KineticTileEntity.switchToBlockState(context.getLevel(), context.getClickedPos(), state.cycle(POINTING)); return ActionResultType.SUCCESS; } @@ -156,12 +156,12 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - ItemStack heldItem = player.getHeldItem(handIn); + ItemStack heldItem = player.getItemInHand(handIn); boolean isHand = heldItem.isEmpty() && handIn == Hand.MAIN_HAND; - TileEntity te = worldIn.getTileEntity(pos); + TileEntity te = worldIn.getBlockEntity(pos); if (!(te instanceof MechanicalCrafterTileEntity)) return ActionResultType.PASS; MechanicalCrafterTileEntity crafter = (MechanicalCrafterTileEntity) te; @@ -170,7 +170,7 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT if (AllBlocks.MECHANICAL_ARM.isIn(heldItem)) return ActionResultType.PASS; - if (hit.getFace() == state.get(HORIZONTAL_FACING)) { + if (hit.getDirection() == state.getValue(HORIZONTAL_FACING)) { if (crafter.phase != Phase.IDLE && !wrenched) { crafter.ejectWholeGrid(); @@ -178,7 +178,7 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT } if (crafter.phase == Phase.IDLE && !isHand && !wrenched) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return ActionResultType.SUCCESS; if (AllItems.CRAFTER_SLOT_COVER.isIn(heldItem)) { @@ -187,7 +187,7 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT if (!crafter.inventory.isEmpty()) return ActionResultType.PASS; crafter.covered = true; - crafter.markDirty(); + crafter.setChanged(); crafter.sendData(); if (!player.isCreative()) heldItem.shrink(1); @@ -201,17 +201,17 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT ItemStack remainder = ItemHandlerHelper.insertItem(capability.orElse(new ItemStackHandler()), heldItem.copy(), false); if (remainder.getCount() != heldItem.getCount()) - player.setHeldItem(handIn, remainder); + player.setItemInHand(handIn, remainder); return ActionResultType.SUCCESS; } - ItemStack inSlot = crafter.getInventory().getStackInSlot(0); + ItemStack inSlot = crafter.getInventory().getItem(0); if (inSlot.isEmpty()) { if (crafter.covered && !wrenched) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return ActionResultType.SUCCESS; crafter.covered = false; - crafter.markDirty(); + crafter.setChanged(); crafter.sendData(); if (!player.isCreative()) player.inventory.placeItemBackInInventory(worldIn, AllItems.CRAFTER_SLOT_COVER.asStack()); @@ -221,7 +221,7 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT } if (!isHand && !ItemHandlerHelper.canItemStacksStack(heldItem, inSlot)) return ActionResultType.PASS; - if (worldIn.isRemote) + if (worldIn.isClientSide) return ActionResultType.SUCCESS; player.inventory.placeItemBackInInventory(worldIn, inSlot); crafter.getInventory().setStackInSlot(0, ItemStack.EMPTY); @@ -252,25 +252,25 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT public static Direction getTargetDirection(BlockState state) { if (!AllBlocks.MECHANICAL_CRAFTER.has(state)) return Direction.UP; - Direction facing = state.get(HORIZONTAL_FACING); - Pointing point = state.get(POINTING); + Direction facing = state.getValue(HORIZONTAL_FACING); + Pointing point = state.getValue(POINTING); Vector3d targetVec = new Vector3d(0, 1, 0); targetVec = VecHelper.rotate(targetVec, -point.getXRotation(), Axis.Z); targetVec = VecHelper.rotate(targetVec, AngleHelper.horizontalAngle(facing), Axis.Y); - return Direction.getFacingFromVector(targetVec.x, targetVec.y, targetVec.z); + return Direction.getNearest(targetVec.x, targetVec.y, targetVec.z); } public static boolean isValidTarget(World world, BlockPos targetPos, BlockState crafterState) { BlockState targetState = world.getBlockState(targetPos); - if (!world.isBlockPresent(targetPos)) + if (!world.isLoaded(targetPos)) return false; if (!AllBlocks.MECHANICAL_CRAFTER.has(targetState)) return false; - if (crafterState.get(HORIZONTAL_FACING) != targetState.get(HORIZONTAL_FACING)) + if (crafterState.getValue(HORIZONTAL_FACING) != targetState.getValue(HORIZONTAL_FACING)) return false; - if (Math.abs(crafterState.get(POINTING) + if (Math.abs(crafterState.getValue(POINTING) .getXRotation() - - targetState.get(POINTING) + - targetState.getValue(POINTING) .getXRotation()) == 180) return false; return true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java index 4ca256adf..cfacf3990 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java @@ -3,13 +3,14 @@ package com.simibubi.create.content.contraptions.components.crafter; import java.util.function.Supplier; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; +import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.util.Direction; @@ -21,20 +22,22 @@ public class MechanicalCrafterInstance extends SingleRotatingInstance { @Override protected Instancer getModel() { - Direction facing = blockState.get(MechanicalCrafterBlock.HORIZONTAL_FACING); + Direction facing = blockState.getValue(MechanicalCrafterBlock.HORIZONTAL_FACING); - Supplier ms = () -> { - MatrixStack stack = new MatrixStack(); - MatrixStacker stacker = MatrixStacker.of(stack).centre(); - - if (facing.getAxis() == Direction.Axis.X) - stacker.rotateZ(90); - else if (facing.getAxis() == Direction.Axis.Z) - stacker.rotateX(90); - - stacker.unCentre(); - return stack; - }; - return getRotatingMaterial().getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState, facing, ms); + return getRotatingMaterial().getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState, facing, rotateToFace(facing)); } + + private Supplier rotateToFace(Direction facing) { + return () -> { + MatrixStack stack = new MatrixStack(); + TransformStack stacker = MatrixTransformStack.of(stack) + .centre(); + + if (facing.getAxis() == Direction.Axis.X) stacker.rotateZ(90); + else if (facing.getAxis() == Direction.Axis.Z) stacker.rotateX(90); + + stacker.unCentre(); + return stack; + }; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java index a4575de82..82858218e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java @@ -5,6 +5,7 @@ import static com.simibubi.create.content.contraptions.base.KineticTileEntityRen import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.core.PartialModel; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; @@ -16,7 +17,6 @@ import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -41,25 +41,25 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer { - if (getStackInSlot(slot).isEmpty()) + if (getItem(slot).isEmpty()) return; if (te.phase == Phase.IDLE) te.checkCompletedRecipe(false); @@ -72,8 +72,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { return stack; ItemStack insertItem = super.insertItem(slot, stack, simulate); if (insertItem.getCount() != stack.getCount() && !simulate) - te.getWorld() - .playSound(null, te.getPos(), SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, + te.getLevel() + .playSound(null, te.getBlockPos(), SoundEvents.ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, .5f); return insertItem; } @@ -83,7 +83,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { protected Inventory inventory; protected GroupedItems groupedItems = new GroupedItems(); protected ConnectedInput input = new ConnectedInput(); - protected LazyOptional invSupplier = LazyOptional.of(() -> input.getItemHandler(world, pos)); + protected LazyOptional invSupplier = LazyOptional.of(() -> input.getItemHandler(level, worldPosition)); protected boolean reRender; protected Phase phase; protected int countDown; @@ -176,25 +176,25 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { if (!clientPacket) return; if (compound.contains("Redraw")) - world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16); + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 16); if (phaseBefore != phase && phase == Phase.CRAFTING) groupedItemsBeforeCraft = before; if (phaseBefore == Phase.EXPORTING && phase == Phase.WAITING) { - Direction facing = getBlockState().get(MechanicalCrafterBlock.HORIZONTAL_FACING); - Vector3d vec = Vector3d.of(facing.getDirectionVec()) + Direction facing = getBlockState().getValue(MechanicalCrafterBlock.HORIZONTAL_FACING); + Vector3d vec = Vector3d.atLowerCornerOf(facing.getNormal()) .scale(.75) - .add(VecHelper.getCenterOf(pos)); + .add(VecHelper.getCenterOf(worldPosition)); Direction targetDirection = MechanicalCrafterBlock.getTargetDirection(getBlockState()); - vec = vec.add(Vector3d.of(targetDirection.getDirectionVec()) + vec = vec.add(Vector3d.atLowerCornerOf(targetDirection.getNormal()) .scale(1)); - world.addParticle(ParticleTypes.CRIT, vec.x, vec.y, vec.z, 0, 0, 0); + level.addParticle(ParticleTypes.CRIT, vec.x, vec.y, vec.z, 0, 0, 0); } } @Override - public void remove() { + public void setRemoved() { invSupplier.invalidate(); - super.remove(); + super.setRemoved(); } public int getCountDownSpeed() { @@ -210,11 +210,11 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { if (phase == Phase.ACCEPTING) return; - boolean onClient = world.isRemote; + boolean onClient = level.isClientSide; boolean runLogic = !onClient || isVirtual(); - if (wasPoweredBefore != world.isBlockPowered(pos)) { - wasPoweredBefore = world.isBlockPowered(pos); + if (wasPoweredBefore != level.hasNeighborSignal(worldPosition)) { + wasPoweredBefore = level.hasNeighborSignal(worldPosition); if (wasPoweredBefore) { if (!runLogic) return; @@ -236,7 +236,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { } ItemStack result = - isVirtual() ? scriptedResult : RecipeGridHandler.tryToApplyRecipe(world, groupedItems); + isVirtual() ? scriptedResult : RecipeGridHandler.tryToApplyRecipe(level, groupedItems); if (result != null) { List containers = new ArrayList<>(); @@ -282,12 +282,12 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { return; } - Pointing pointing = getBlockState().get(MechanicalCrafterBlock.POINTING); + Pointing pointing = getBlockState().getValue(MechanicalCrafterBlock.POINTING); groupedItems.mergeOnto(targetingCrafter.groupedItems, pointing); groupedItems = new GroupedItems(); float pitch = targetingCrafter.groupedItems.grid.size() * 1/16f + .5f; - AllSoundEvents.CRAFTER_CLICK.playOnServer(world, pos, 1, pitch); + AllSoundEvents.CRAFTER_CLICK.playOnServer(level, worldPosition, 1, pitch); phase = Phase.WAITING; countDown = 0; @@ -301,18 +301,18 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { if (phase == Phase.CRAFTING) { if (onClient) { - Direction facing = getBlockState().get(MechanicalCrafterBlock.HORIZONTAL_FACING); + Direction facing = getBlockState().getValue(MechanicalCrafterBlock.HORIZONTAL_FACING); float progress = countDown / 2000f; - Vector3d facingVec = Vector3d.of(facing.getDirectionVec()); + Vector3d facingVec = Vector3d.atLowerCornerOf(facing.getNormal()); Vector3d vec = facingVec.scale(.65) - .add(VecHelper.getCenterOf(pos)); - Vector3d offset = VecHelper.offsetRandomly(Vector3d.ZERO, world.rand, .125f) - .mul(VecHelper.axisAlingedPlaneOf(facingVec)) + .add(VecHelper.getCenterOf(worldPosition)); + Vector3d offset = VecHelper.offsetRandomly(Vector3d.ZERO, level.random, .125f) + .multiply(VecHelper.axisAlingedPlaneOf(facingVec)) .normalize() .scale(progress * .5f) .add(vec); if (progress > .5f) - world.addParticle(ParticleTypes.CRIT, offset.x, offset.y, offset.z, 0, 0, 0); + level.addParticle(ParticleTypes.CRIT, offset.x, offset.y, offset.z, 0, 0, 0); if (!groupedItemsBeforeCraft.grid.isEmpty() && progress < .5f) { if (groupedItems.grid.containsKey(Pair.of(0, 0))) { @@ -320,13 +320,13 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { groupedItemsBeforeCraft = new GroupedItems(); for (int i = 0; i < 10; i++) { - Vector3d randVec = VecHelper.offsetRandomly(Vector3d.ZERO, world.rand, .125f) - .mul(VecHelper.axisAlingedPlaneOf(facingVec)) + Vector3d randVec = VecHelper.offsetRandomly(Vector3d.ZERO, level.random, .125f) + .multiply(VecHelper.axisAlingedPlaneOf(facingVec)) .normalize() .scale(.25f); Vector3d offset2 = randVec.add(vec); randVec = randVec.scale(.35f); - world.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), offset2.x, offset2.y, + level.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), offset2.x, offset2.y, offset2.z, randVec.x, randVec.y, randVec.z); } } @@ -337,8 +337,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { countDown -= getCountDownSpeed(); if (countDown < 1000 && prev >= 1000) { - AllSoundEvents.CRAFTER_CLICK.playOnServer(world, pos, 1, 2); - AllSoundEvents.CRAFTER_CRAFT.playOnServer(world, pos); + AllSoundEvents.CRAFTER_CLICK.playOnServer(level, worldPosition, 1, 2); + AllSoundEvents.CRAFTER_CRAFT.playOnServer(level, worldPosition); } if (countDown < 0) { @@ -363,8 +363,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { } protected DirectBeltInputBehaviour getTargetingBelt() { - BlockPos targetPos = pos.offset(getTargetDirection()); - return TileEntityBehaviour.get(world, targetPos, DirectBeltInputBehaviour.TYPE); + BlockPos targetPos = worldPosition.relative(getTargetDirection()); + return TileEntityBehaviour.get(level, targetPos, DirectBeltInputBehaviour.TYPE); } public void tryInsert() { @@ -380,7 +380,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { for (Entry, ItemStack> entry : groupedItems.grid.entrySet()) { Pair pair = entry.getKey(); ItemStack stack = entry.getValue(); - BlockFace face = getTargetFace(world, pos, getBlockState()); + BlockFace face = getTargetFace(level, worldPosition, getBlockState()); ItemStack remainder = behaviour == null ? inserting.insert(stack.copy()) : behaviour.handleInsertion(stack, face.getFace(), false); @@ -411,15 +411,15 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { public void eject() { BlockState blockState = getBlockState(); boolean present = AllBlocks.MECHANICAL_CRAFTER.has(blockState); - Vector3d vec = present ? Vector3d.of(blockState.get(HORIZONTAL_FACING) - .getDirectionVec()) + Vector3d vec = present ? Vector3d.atLowerCornerOf(blockState.getValue(HORIZONTAL_FACING) + .getNormal()) .scale(.75f) : Vector3d.ZERO; - Vector3d ejectPos = VecHelper.getCenterOf(pos) + Vector3d ejectPos = VecHelper.getCenterOf(worldPosition) .add(vec); groupedItems.grid.forEach((pair, stack) -> dropItem(ejectPos, stack)); - if (!inventory.getStackInSlot(0) + if (!inventory.getItem(0) .isEmpty()) - dropItem(ejectPos, inventory.getStackInSlot(0)); + dropItem(ejectPos, inventory.getItem(0)); phase = Phase.IDLE; groupedItems = new GroupedItems(); inventory.setStackInSlot(0, ItemStack.EMPTY); @@ -427,15 +427,15 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { } public void dropItem(Vector3d ejectPos, ItemStack stack) { - ItemEntity itemEntity = new ItemEntity(world, ejectPos.x, ejectPos.y, ejectPos.z, stack); - itemEntity.setDefaultPickupDelay(); - world.addEntity(itemEntity); + ItemEntity itemEntity = new ItemEntity(level, ejectPos.x, ejectPos.y, ejectPos.z, stack); + itemEntity.setDefaultPickUpDelay(); + level.addFreshEntity(itemEntity); } @Override public void lazyTick() { super.lazyTick(); - if (world.isRemote && !isVirtual()) + if (level.isClientSide && !isVirtual()) return; if (phase == Phase.IDLE && craftingItemPresent()) checkCompletedRecipe(false); @@ -444,19 +444,19 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { } public boolean craftingItemPresent() { - return !inventory.getStackInSlot(0) + return !inventory.getItem(0) .isEmpty(); } public boolean craftingItemOrCoverPresent() { - return !inventory.getStackInSlot(0) + return !inventory.getItem(0) .isEmpty() || covered; } protected void checkCompletedRecipe(boolean poweredStart) { if (getSpeed() == 0) return; - if (world.isRemote && !isVirtual()) + if (level.isClientSide && !isVirtual()) return; List chain = RecipeGridHandler.getAllCraftersOfChainIf(this, poweredStart ? MechanicalCrafterTileEntity::craftingItemPresent @@ -469,7 +469,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { protected void begin() { phase = Phase.ACCEPTING; - groupedItems = new GroupedItems(inventory.getStackInSlot(0)); + groupedItems = new GroupedItems(inventory.getItem(0)); inventory.setStackInSlot(0, ItemStack.EMPTY); if (RecipeGridHandler.getPrecedingCrafters(this) .isEmpty()) { @@ -505,7 +505,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { reRender = true; sendData(); invSupplier.invalidate(); - invSupplier = LazyOptional.of(() -> input.getItemHandler(world, pos)); + invSupplier = LazyOptional.of(() -> input.getItemHandler(level, worldPosition)); } public Inventory getInventory() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCraftingInventory.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCraftingInventory.java index 600cb4996..21cf5d725 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCraftingInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCraftingInventory.java @@ -12,7 +12,7 @@ import net.minecraft.item.ItemStack; public class MechanicalCraftingInventory extends CraftingInventory { private static Container dummyContainer = new Container(null, -1) { - public boolean canInteractWith(PlayerEntity playerIn) { + public boolean stillValid(PlayerEntity playerIn) { return false; } }; @@ -22,7 +22,7 @@ public class MechanicalCraftingInventory extends CraftingInventory { for (int y = 0; y < items.height; y++) { for (int x = 0; x < items.width; x++) { ItemStack stack = items.grid.get(Pair.of(x + items.minX, y + items.minY)); - setInventorySlotContents(x + (items.height - y - 1) * items.width, + setItem(x + (items.height - y - 1) * items.width, stack == null ? ItemStack.EMPTY : stack.copy()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCraftingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCraftingRecipe.java index a44acfa42..2022cccf2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCraftingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCraftingRecipe.java @@ -23,7 +23,7 @@ public class MechanicalCraftingRecipe extends ShapedRecipe { private static MechanicalCraftingRecipe fromShaped(ShapedRecipe recipe) { return new MechanicalCraftingRecipe(recipe.getId(), recipe.getGroup(), recipe.getWidth(), recipe.getHeight(), - recipe.getIngredients(), recipe.getRecipeOutput()); + recipe.getIngredients(), recipe.getResultItem()); } @Override @@ -33,29 +33,29 @@ public class MechanicalCraftingRecipe extends ShapedRecipe { @Override public IRecipeType getType() { - return AllRecipeTypes.MECHANICAL_CRAFTING.type; + return AllRecipeTypes.MECHANICAL_CRAFTING.getType(); } - + @Override - public boolean isDynamic() { + public boolean isSpecial() { return true; } - + @Override public IRecipeSerializer getSerializer() { - return AllRecipeTypes.MECHANICAL_CRAFTING.serializer; + return AllRecipeTypes.MECHANICAL_CRAFTING.getSerializer(); } public static class Serializer extends ShapedRecipe.Serializer { @Override - public ShapedRecipe read(ResourceLocation recipeId, JsonObject json) { - return fromShaped(super.read(recipeId, json)); + public ShapedRecipe fromJson(ResourceLocation recipeId, JsonObject json) { + return fromShaped(super.fromJson(recipeId, json)); } - + @Override - public ShapedRecipe read(ResourceLocation recipeId, PacketBuffer buffer) { - return fromShaped(super.read(recipeId, buffer)); + public ShapedRecipe fromNetwork(ResourceLocation recipeId, PacketBuffer buffer) { + return fromShaped(super.fromNetwork(recipeId, buffer)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/RecipeGridHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/RecipeGridHandler.java index 0650e9107..12a0ee73a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/RecipeGridHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/RecipeGridHandler.java @@ -66,8 +66,8 @@ public class RecipeGridHandler { empty = true; else allEmpty = false; - if (poweredStart && current.getWorld() - .isBlockPowered(current.getPos())) + if (poweredStart && current.getLevel() + .hasNeighborSignal(current.getBlockPos())) powered = true; crafters.add(current); @@ -89,29 +89,29 @@ public class RecipeGridHandler { if (!isCrafter(state)) return null; - BlockPos targetPos = crafter.getPos() - .offset(MechanicalCrafterBlock.getTargetDirection(state)); - MechanicalCrafterTileEntity targetTE = CrafterHelper.getCrafter(crafter.getWorld(), targetPos); + BlockPos targetPos = crafter.getBlockPos() + .relative(MechanicalCrafterBlock.getTargetDirection(state)); + MechanicalCrafterTileEntity targetTE = CrafterHelper.getCrafter(crafter.getLevel(), targetPos); if (targetTE == null) return null; BlockState targetState = targetTE.getBlockState(); if (!isCrafter(targetState)) return null; - if (state.get(HORIZONTAL_FACING) != targetState.get(HORIZONTAL_FACING)) + if (state.getValue(HORIZONTAL_FACING) != targetState.getValue(HORIZONTAL_FACING)) return null; return targetTE; } public static List getPrecedingCrafters(MechanicalCrafterTileEntity crafter) { - BlockPos pos = crafter.getPos(); - World world = crafter.getWorld(); + BlockPos pos = crafter.getBlockPos(); + World world = crafter.getLevel(); List crafters = new ArrayList<>(); BlockState blockState = crafter.getBlockState(); if (!isCrafter(blockState)) return crafters; - Direction blockFacing = blockState.get(HORIZONTAL_FACING); + Direction blockFacing = blockState.getValue(HORIZONTAL_FACING); Direction blockPointing = MechanicalCrafterBlock.getTargetDirection(blockState); for (Direction facing : Iterate.directions) { if (blockFacing.getAxis() == facing.getAxis()) @@ -119,13 +119,13 @@ public class RecipeGridHandler { if (blockPointing == facing) continue; - BlockPos neighbourPos = pos.offset(facing); + BlockPos neighbourPos = pos.relative(facing); BlockState neighbourState = world.getBlockState(neighbourPos); if (!isCrafter(neighbourState)) continue; if (MechanicalCrafterBlock.getTargetDirection(neighbourState) != facing.getOpposite()) continue; - if (blockFacing != neighbourState.get(HORIZONTAL_FACING)) + if (blockFacing != neighbourState.getValue(HORIZONTAL_FACING)) continue; MechanicalCrafterTileEntity te = CrafterHelper.getCrafter(world, neighbourPos); if (te == null) @@ -147,21 +147,21 @@ public class RecipeGridHandler { ItemStack result = null; if (AllConfigs.SERVER.recipes.allowRegularCraftingInCrafter.get()) result = world.getRecipeManager() - .getRecipe(IRecipeType.CRAFTING, craftinginventory, world) + .getRecipeFor(IRecipeType.CRAFTING, craftinginventory, world) .filter(r -> isRecipeAllowed(r, craftinginventory)) - .map(r -> r.getCraftingResult(craftinginventory)) + .map(r -> r.assemble(craftinginventory)) .orElse(null); if (result == null) result = AllRecipeTypes.MECHANICAL_CRAFTING.find(craftinginventory, world) - .map(r -> r.getCraftingResult(craftinginventory)) + .map(r -> r.assemble(craftinginventory)) .orElse(null); return result; } public static boolean isRecipeAllowed(ICraftingRecipe recipe, CraftingInventory inventory) { if (!AllConfigs.SERVER.recipes.allowBiggerFireworksInCrafter.get() && recipe instanceof FireworkRocketRecipe) { - int numItems = IntStream.range(0, inventory.getSizeInventory()) - .map(i -> inventory.getStackInSlot(i).isEmpty() ? 0 : 1) + int numItems = IntStream.range(0, inventory.getContainerSize()) + .map(i -> inventory.getItem(i).isEmpty() ? 0 : 1) .sum(); if (numItems > 9) return false; @@ -207,7 +207,7 @@ public class RecipeGridHandler { CompoundNBT entry = (CompoundNBT) inbt; int x = entry.getInt("x"); int y = entry.getInt("y"); - ItemStack stack = ItemStack.read(entry.getCompound("item")); + ItemStack stack = ItemStack.of(entry.getCompound("item")); items.grid.put(Pair.of(x, y), stack); }); return items; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java index bef299a96..916e384b0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java @@ -37,7 +37,7 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE te.turn(player.isSneaking())); - player.addExhaustion(getRotationSpeed() * AllConfigs.SERVER.kinetics.crankHungerMultiplier.getF()); + withTileEntityDo(worldIn, pos, te -> te.turn(player.isShiftKeyDown())); + player.causeFoodExhaustion(getRotationSpeed() * AllConfigs.SERVER.kinetics.crankHungerMultiplier.getF()); return ActionResultType.SUCCESS; } @@ -67,16 +67,16 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE model = getTransformMaterial().getModel(renderedHandle, blockState, opposite); crank = model.createInstance(); @@ -51,10 +51,10 @@ public class HandCrankInstance extends SingleRotatingInstance implements IDynami float angle = (tile.independentAngle + AnimationTickHolder.getPartialTicks() * tile.chasingVelocity) / 360; MatrixStack ms = new MatrixStack(); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .translate(getInstancePosition()) .centre() - .rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis), angle) + .rotate(Direction.get(Direction.AxisDirection.POSITIVE, axis), angle) .unCentre(); crank.setTransform(ms); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java index 586f0ea90..f4a6c7871 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java @@ -28,7 +28,7 @@ public class HandCrankRenderer extends KineticTileEntityRenderer { int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; BlockState state = te.getBlockState(); Block block = state.getBlock(); @@ -38,12 +38,12 @@ public class HandCrankRenderer extends KineticTileEntityRenderer { if (renderedHandle == null) return; - Direction facing = state.get(FACING); + Direction facing = state.getValue(FACING); SuperByteBuffer handle = PartialBufferer.getFacing(renderedHandle, state, facing.getOpposite()); HandCrankTileEntity crank = (HandCrankTileEntity) te; kineticRotationTransform(handle, te, facing.getAxis(), (crank.independentAngle + partialTicks * crank.chasingVelocity) / 360, light); - handle.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + handle.renderInto(ms, buffer.getBuffer(RenderType.solid())); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java index 259a89b10..c7ad300fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java @@ -9,6 +9,8 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class HandCrankTileEntity extends GeneratingKineticTileEntity { @@ -29,7 +31,7 @@ public class HandCrankTileEntity extends GeneratingKineticTileEntity { inUse = 10; this.backwards = back; - if (update && !world.isRemote) + if (update && !level.isClientSide) updateGeneratedRotation(); } @@ -40,7 +42,7 @@ public class HandCrankTileEntity extends GeneratingKineticTileEntity { return 0; HandCrankBlock crank = (HandCrankBlock) block; int speed = (inUse == 0 ? 0 : backwards ? -1 : 1) * crank.getRotationSpeed(); - return convertToDirection(speed, getBlockState().get(HandCrankBlock.FACING)); + return convertToDirection(speed, getBlockState().getValue(HandCrankBlock.FACING)); } @Override @@ -66,7 +68,7 @@ public class HandCrankTileEntity extends GeneratingKineticTileEntity { if (inUse > 0) { inUse--; - if (inUse == 0 && !world.isRemote) + if (inUse == 0 && !level.isClientSide) updateGeneratedRotation(); } } @@ -82,12 +84,13 @@ public class HandCrankTileEntity extends GeneratingKineticTileEntity { } @Override + @OnlyIn(Dist.CLIENT) public void tickAudio() { super.tickAudio(); if (inUse > 0 && AnimationTickHolder.getTicks() % 10 == 0) { if (!AllBlocks.HAND_CRANK.has(getBlockState())) return; - AllSoundEvents.CRANKING.playAt(world, pos, (inUse) / 2.5f, .65f + (10 - inUse) / 10f, true); + AllSoundEvents.CRANKING.playAt(level, worldPosition, (inUse) / 2.5f, .65f + (10 - inUse) / 10f, true); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java index 8b0b71e91..7d0b97fe8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java @@ -38,32 +38,32 @@ public class ValveHandleBlock extends HandCrankBlock { } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - ItemStack heldItem = player.getHeldItem(handIn); + ItemStack heldItem = player.getItemInHand(handIn); for (DyeColor color : DyeColor.values()) { if (!heldItem.getItem() - .isIn(DyeHelper.getTagOfDye(color))) + .is(DyeHelper.getTagOfDye(color))) continue; - if (worldIn.isRemote) + if (worldIn.isClientSide) return ActionResultType.SUCCESS; BlockState newState = AllBlocks.DYED_VALVE_HANDLES.get(color) .getDefaultState() - .with(FACING, state.get(FACING)); + .setValue(FACING, state.getValue(FACING)); if (newState != state) - worldIn.setBlockState(pos, newState); + worldIn.setBlockAndUpdate(pos, newState); return ActionResultType.SUCCESS; } - return super.onUse(state, worldIn, pos, player, handIn, hit); + return super.use(state, worldIn, pos, player, handIn, hit); } @Override - public void fillItemGroup(ItemGroup group, NonNullList p_149666_2_) { - if (group != ItemGroup.SEARCH && !inCreativeTab) + public void fillItemCategory(ItemGroup group, NonNullList p_149666_2_) { + if (group != ItemGroup.TAB_SEARCH && !inCreativeTab) return; - super.fillItemGroup(group, p_149666_2_); + super.fillItemCategory(group, p_149666_2_); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/AbstractCrushingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/AbstractCrushingRecipe.java index 350a5269a..ec8c290d4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/AbstractCrushingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/AbstractCrushingRecipe.java @@ -1,14 +1,14 @@ package com.simibubi.create.content.contraptions.components.crusher; -import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; +import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; import net.minecraftforge.items.wrapper.RecipeWrapper; public abstract class AbstractCrushingRecipe extends ProcessingRecipe { - public AbstractCrushingRecipe(AllRecipeTypes recipeType, ProcessingRecipeParams params) { + public AbstractCrushingRecipe(IRecipeTypeInfo recipeType, ProcessingRecipeParams params) { super(recipeType, params); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingRecipe.java index d03b8e07e..e4bfa6be3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingRecipe.java @@ -20,9 +20,9 @@ public class CrushingRecipe extends AbstractCrushingRecipe { if (inv.isEmpty()) return false; return ingredients.get(0) - .test(inv.getStackInSlot(0)); + .test(inv.getItem(0)); } - + @Override protected int getMaxOutputCount() { return 7; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java index 34e587985..c0afc346b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java @@ -38,11 +38,11 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE @Override public Axis getRotationAxis(BlockState state) { - return state.get(AXIS); + return state.getValue(AXIS); } @Override - public BlockRenderType getRenderType(BlockState state) { + public BlockRenderType getRenderShape(BlockState state) { return BlockRenderType.ENTITYBLOCK_ANIMATED; } @@ -53,35 +53,35 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE } @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { for (Direction d : Iterate.directions) { - if (d.getAxis() == state.get(AXIS)) + if (d.getAxis() == state.getValue(AXIS)) continue; - if (AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(worldIn.getBlockState(pos.offset(d)))) - worldIn.setBlockState(pos.offset(d), Blocks.AIR.getDefaultState()); + if (AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(worldIn.getBlockState(pos.relative(d)))) + worldIn.setBlockAndUpdate(pos.relative(d), Blocks.AIR.defaultBlockState()); } if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } } public void updateControllers(BlockState state, World world, BlockPos pos, Direction side) { - if (side.getAxis() == state.get(AXIS)) + if (side.getAxis() == state.getValue(AXIS)) return; if (world == null) return; - BlockPos controllerPos = pos.offset(side); - BlockPos otherWheelPos = pos.offset(side, 2); + BlockPos controllerPos = pos.relative(side); + BlockPos otherWheelPos = pos.relative(side, 2); boolean controllerExists = AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(world.getBlockState(controllerPos)); boolean controllerIsValid = controllerExists && world.getBlockState(controllerPos) - .get(VALID); + .getValue(VALID); Direction controllerOldDirection = controllerExists ? world.getBlockState(controllerPos) - .get(FACING) + .getValue(FACING) : null; boolean controllerShouldExist = false; @@ -97,29 +97,29 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE if (te != null && otherTe != null && (te.getSpeed() > 0) != (otherTe.getSpeed() > 0) && te.getSpeed() != 0) { - Axis wheelAxis = state.get(AXIS); + Axis wheelAxis = state.getValue(AXIS); Axis sideAxis = side.getAxis(); - int controllerADO = Math.round(Math.signum(te.getSpeed())) * side.getAxisDirection().getOffset(); + int controllerADO = Math.round(Math.signum(te.getSpeed())) * side.getAxisDirection().getStep(); Vector3d controllerDirVec = new Vector3d(wheelAxis == Axis.X ? 1 : 0 , wheelAxis == Axis.Y ? 1 : 0 , wheelAxis == Axis.Z ? 1 : 0) - .crossProduct(new Vector3d(sideAxis == Axis.X ? 1 : 0 + .cross(new Vector3d(sideAxis == Axis.X ? 1 : 0 , sideAxis == Axis.Y ? 1 : 0 , sideAxis == Axis.Z ? 1 : 0)); - controllerNewDirection = Direction.getFacingFromVector(controllerDirVec.x * controllerADO + controllerNewDirection = Direction.getNearest(controllerDirVec.x * controllerADO , controllerDirVec.y * controllerADO , controllerDirVec.z * controllerADO); controllerShouldBeValid = true; } - if (otherState.get(AXIS) != state.get(AXIS)) + if (otherState.getValue(AXIS) != state.getValue(AXIS)) controllerShouldExist = false; } if (!controllerShouldExist) { if (controllerExists) - world.setBlockState(controllerPos, Blocks.AIR.getDefaultState()); + world.setBlockAndUpdate(controllerPos, Blocks.AIR.defaultBlockState()); return; } @@ -128,13 +128,13 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE .getMaterial() .isReplaceable()) return; - world.setBlockState(controllerPos, AllBlocks.CRUSHING_WHEEL_CONTROLLER.getDefaultState() - .with(VALID, controllerShouldBeValid) - .with(FACING, controllerNewDirection)); + world.setBlockAndUpdate(controllerPos, AllBlocks.CRUSHING_WHEEL_CONTROLLER.getDefaultState() + .setValue(VALID, controllerShouldBeValid) + .setValue(FACING, controllerNewDirection)); } else if (controllerIsValid != controllerShouldBeValid || controllerOldDirection != controllerNewDirection) { - world.setBlockState(controllerPos, world.getBlockState(controllerPos) - .with(VALID, controllerShouldBeValid) - .with(FACING, controllerNewDirection)); + world.setBlockAndUpdate(controllerPos, world.getBlockState(controllerPos) + .setValue(VALID, controllerShouldBeValid) + .setValue(FACING, controllerNewDirection)); } ((CrushingWheelControllerBlock) AllBlocks.CRUSHING_WHEEL_CONTROLLER.get()) @@ -143,7 +143,7 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE } @Override - public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { + public void entityInside(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { if (entityIn.getY() < pos.getY() + 1.25f || !entityIn.isOnGround()) return; @@ -153,29 +153,29 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE double x = 0; double z = 0; - if (state.get(AXIS) == Axis.X) { + if (state.getValue(AXIS) == Axis.X) { z = speed / 20f; x += (pos.getX() + .5f - entityIn.getX()) * .1f; } - if (state.get(AXIS) == Axis.Z) { + if (state.getValue(AXIS) == Axis.Z) { x = speed / -20f; z += (pos.getZ() + .5f - entityIn.getZ()) * .1f; } - entityIn.setMotion(entityIn.getMotion() + entityIn.setDeltaMovement(entityIn.getDeltaMovement() .add(x, 0, z)); } @Override - public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { + public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos) { for (Direction direction : Iterate.directions) { - BlockPos neighbourPos = pos.offset(direction); + BlockPos neighbourPos = pos.relative(direction); BlockState neighbourState = worldIn.getBlockState(neighbourPos); - Axis stateAxis = state.get(AXIS); + Axis stateAxis = state.getValue(AXIS); if (AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(neighbourState) && direction.getAxis() != stateAxis) return false; if (!AllBlocks.CRUSHING_WHEEL.has(neighbourState)) continue; - if (neighbourState.get(AXIS) != stateAxis || stateAxis != direction.getAxis()) + if (neighbourState.getValue(AXIS) != stateAxis || stateAxis != direction.getAxis()) return false; } @@ -184,7 +184,7 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.get(AXIS); + return face.getAxis() == state.getValue(AXIS); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java index 944b8e073..3184f7f3b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java @@ -52,7 +52,7 @@ public class CrushingWheelControllerBlock extends DirectionalBlock } @Override - public boolean isReplaceable(BlockState state, BlockItemUseContext useContext) { + public boolean canBeReplaced(BlockState state, BlockItemUseContext useContext) { return false; } @@ -67,17 +67,17 @@ public class CrushingWheelControllerBlock extends DirectionalBlock } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(VALID); builder.add(FACING); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } - public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { - if (!state.get(VALID)) + public void entityInside(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { + if (!state.getValue(VALID)) return; - Direction facing = state.get(FACING); + Direction facing = state.getValue(FACING); Axis axis = facing.getAxis(); checkEntityForProcessing(worldIn, pos, entityIn); @@ -85,7 +85,7 @@ public class CrushingWheelControllerBlock extends DirectionalBlock withTileEntityDo(worldIn, pos, te -> { if (te.processingEntity == entityIn) - entityIn.setMotionMultiplier(state, new Vector3d(axis == Axis.X ? (double) 0.05F : 0.25D + entityIn.makeStuckInBlock(state, new Vector3d(axis == Axis.X ? (double) 0.05F : 0.25D , axis == Axis.Y ? (double) 0.05F : 0.25D , axis == Axis.Z ? (double) 0.05F : 0.25D)); }); @@ -98,7 +98,7 @@ public class CrushingWheelControllerBlock extends DirectionalBlock if (te.crushingspeed == 0) return; if (entityIn instanceof ItemEntity) - ((ItemEntity) entityIn).setPickupDelay(10); + ((ItemEntity) entityIn).setPickUpDelay(10); CompoundNBT data = entityIn.getPersistentData(); if (data.contains("BypassCrushingWheel")) { if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel")))) @@ -109,21 +109,21 @@ public class CrushingWheelControllerBlock extends DirectionalBlock boolean isPlayer = entityIn instanceof PlayerEntity; if (isPlayer && ((PlayerEntity) entityIn).isCreative()) return; - if (isPlayer && entityIn.world.getDifficulty() == Difficulty.PEACEFUL) + if (isPlayer && entityIn.level.getDifficulty() == Difficulty.PEACEFUL) return; te.startCrushing(entityIn); } @Override - public void onLanded(IBlockReader worldIn, Entity entityIn) { - super.onLanded(worldIn, entityIn); + public void updateEntityAfterFallOn(IBlockReader worldIn, Entity entityIn) { + super.updateEntityAfterFallOn(worldIn, entityIn); //Moved to onEntityCollision to allow for omnidirectional input } @Override public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) { - if (!stateIn.get(VALID)) + if (!stateIn.getValue(VALID)) return; if (rand.nextInt(1) != 0) return; @@ -134,7 +134,7 @@ public class CrushingWheelControllerBlock extends DirectionalBlock } @Override - public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, + public BlockState updateShape(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) { updateSpeed(stateIn, worldIn, currentPos); return stateIn; @@ -142,7 +142,7 @@ public class CrushingWheelControllerBlock extends DirectionalBlock public void updateSpeed(BlockState state, IWorld world, BlockPos pos) { withTileEntityDo(world, pos, te -> { - if (!state.get(VALID)) { + if (!state.getValue(VALID)) { if (te.crushingspeed != 0) { te.crushingspeed = 0; te.sendData(); @@ -151,12 +151,12 @@ public class CrushingWheelControllerBlock extends DirectionalBlock } for (Direction d : Iterate.directions) { - BlockState neighbour = world.getBlockState(pos.offset(d)); + BlockState neighbour = world.getBlockState(pos.relative(d)); if (!AllBlocks.CRUSHING_WHEEL.has(neighbour)) continue; - if (neighbour.get(BlockStateProperties.AXIS) == d.getAxis()) + if (neighbour.getValue(BlockStateProperties.AXIS) == d.getAxis()) continue; - KineticTileEntity wheelTe = (KineticTileEntity) world.getTileEntity(pos.offset(d)); + KineticTileEntity wheelTe = (KineticTileEntity) world.getBlockEntity(pos.relative(d)); te.crushingspeed = Math.abs(wheelTe.getSpeed() / 50f); te.sendData(); break; @@ -167,9 +167,9 @@ public class CrushingWheelControllerBlock extends DirectionalBlock @Override public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - VoxelShape standardShape = AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING)); + VoxelShape standardShape = AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.getValue(FACING)); - if (!state.get(VALID)) + if (!state.getValue(VALID)) return standardShape; Entity entity = context.getEntity(); @@ -179,7 +179,7 @@ public class CrushingWheelControllerBlock extends DirectionalBlock CompoundNBT data = entity.getPersistentData(); if (data.contains("BypassCrushingWheel")) if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel")))) - if (state.get(FACING) != Direction.UP) // Allow output items to land on top of the block rather than falling back through. + if (state.getValue(FACING) != Direction.UP) // Allow output items to land on top of the block rather than falling back through. return VoxelShapes.empty(); CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos); @@ -190,12 +190,12 @@ public class CrushingWheelControllerBlock extends DirectionalBlock } @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) return; withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory)); - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } @Override @@ -204,7 +204,7 @@ public class CrushingWheelControllerBlock extends DirectionalBlock } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java index e8562843c..5928a5838 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java @@ -13,6 +13,8 @@ import com.simibubi.create.content.contraptions.processing.ProcessingInventory; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.sound.SoundScapes; +import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; @@ -38,8 +40,11 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.RecipeWrapper; @@ -77,7 +82,7 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { BlockState blockState = getBlockState(); if (blockState == null) return false; - Direction direction = blockState.get(CrushingWheelControllerBlock.FACING); + Direction direction = blockState.getValue(CrushingWheelControllerBlock.FACING); return direction == Direction.DOWN || direction == side; } @@ -86,48 +91,52 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { super.tick(); if (searchForEntity) { searchForEntity = false; - List search = world.getEntitiesInAABBexcluding(null, new AxisAlignedBB(getPos()), - e -> entityUUID.equals(e.getUniqueID())); + List search = level.getEntities((Entity) null, new AxisAlignedBB(getBlockPos()), + e -> entityUUID.equals(e.getUUID())); if (search.isEmpty()) clear(); else processingEntity = search.get(0); } - - if (!isOccupied()) return; if (crushingspeed == 0) return; + if (level.isClientSide) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.tickAudio()); + float speed = crushingspeed * 4; - Vector3d centerPos = VecHelper.getCenterOf(pos); - Direction facing = getBlockState().get(FACING); - int offset = facing.getAxisDirection().getOffset(); - Vector3d outSpeed = new Vector3d((facing.getAxis() == Axis.X ? 0.25D : 0.0D) * offset - , offset == 1 ? (facing.getAxis() == Axis.Y ? 0.5D : 0.0D) : 0.0D //Increased upwards speed so upwards crushing wheels shoot out the item properly. - , (facing.getAxis() == Axis.Z ? 0.25D : 0.0D) * offset); //No downwards speed, so downwards crushing wheels drop the items as before. - Vector3d outPos = centerPos.add((facing.getAxis() == Axis.X ? .55f * offset : 0f) - , (facing.getAxis() == Axis.Y ? .55f * offset : 0f) - , (facing.getAxis() == Axis.Z ? .55f * offset : 0f)); + Vector3d centerPos = VecHelper.getCenterOf(worldPosition); + Direction facing = getBlockState().getValue(FACING); + int offset = facing.getAxisDirection() + .getStep(); + Vector3d outSpeed = new Vector3d((facing.getAxis() == Axis.X ? 0.25D : 0.0D) * offset, + offset == 1 ? (facing.getAxis() == Axis.Y ? 0.5D : 0.0D) : 0.0D // Increased upwards speed so upwards + // crushing wheels shoot out the item + // properly. + , (facing.getAxis() == Axis.Z ? 0.25D : 0.0D) * offset); // No downwards speed, so downwards crushing wheels + // drop the items as before. + Vector3d outPos = centerPos.add((facing.getAxis() == Axis.X ? .55f * offset : 0f), + (facing.getAxis() == Axis.Y ? .55f * offset : 0f), (facing.getAxis() == Axis.Z ? .55f * offset : 0f)); if (!hasEntity()) { float processingSpeed = - MathHelper.clamp((speed) / (!inventory.appliedRecipe ? MathHelper.log2(inventory.getStackInSlot(0) - .getCount()) : 1), .25f, 20); + MathHelper.clamp((speed) / (!inventory.appliedRecipe ? MathHelper.log2(inventory.getStackInSlot(0) + .getCount()) : 1), .25f, 20); inventory.remainingTime -= processingSpeed; spawnParticles(inventory.getStackInSlot(0)); - if (world.isRemote) + if (level.isClientSide) return; if (inventory.remainingTime < 20 && !inventory.appliedRecipe) { applyRecipe(); inventory.appliedRecipe = true; - world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16); + level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 2 | 16); return; } @@ -136,12 +145,13 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { } inventory.remainingTime = 0; - //Output Items - if (facing.getAxis().isHorizontal() || facing == Direction.DOWN) { - BlockPos nextPos = pos.add(facing.getAxis() == Axis.X ? 1f * offset : 0f - , (-1f) - , facing.getAxis() == Axis.Z ? 1f * offset : 0f); - DirectBeltInputBehaviour behaviour = TileEntityBehaviour.get(world, nextPos, DirectBeltInputBehaviour.TYPE); + // Output Items + if (facing.getAxis() + .isHorizontal() || facing == Direction.DOWN) { + BlockPos nextPos = worldPosition.offset(facing.getAxis() == Axis.X ? 1f * offset : 0f, (-1f), + facing.getAxis() == Axis.Z ? 1f * offset : 0f); + DirectBeltInputBehaviour behaviour = + TileEntityBehaviour.get(level, nextPos, DirectBeltInputBehaviour.TYPE); if (behaviour != null) { boolean changed = false; if (!behaviour.canInsertFromSide(facing)) @@ -157,97 +167,112 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { changed = true; } if (changed) { - markDirty(); + setChanged(); sendData(); } return; } } - //Eject Items + // Eject Items for (int slot = 0; slot < inventory.getSlots(); slot++) { ItemStack stack = inventory.getStackInSlot(slot); if (stack.isEmpty()) continue; - ItemEntity entityIn = new ItemEntity(world, outPos.x, outPos.y, outPos.z, stack); - entityIn.setMotion(outSpeed); + ItemEntity entityIn = new ItemEntity(level, outPos.x, outPos.y, outPos.z, stack); + entityIn.setDeltaMovement(outSpeed); entityIn.getPersistentData() - .put("BypassCrushingWheel", NBTUtil.writeBlockPos(pos)); - world.addEntity(entityIn); + .put("BypassCrushingWheel", NBTUtil.writeBlockPos(worldPosition)); + level.addFreshEntity(entityIn); } inventory.clear(); - world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16); - + level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 2 | 16); return; } if (!processingEntity.isAlive() || !processingEntity.getBoundingBox() - .intersects(new AxisAlignedBB(pos).grow(.5f))) { + .intersects(new AxisAlignedBB(worldPosition).inflate(.5f))) { clear(); return; } - double xMotion = ((pos.getX() + .5f) - processingEntity.getX()) / 2f; - double zMotion = ((pos.getZ() + .5f) - processingEntity.getZ()) / 2f; - if (processingEntity.isSneaking()) + double xMotion = ((worldPosition.getX() + .5f) - processingEntity.getX()) / 2f; + double zMotion = ((worldPosition.getZ() + .5f) - processingEntity.getZ()) / 2f; + if (processingEntity.isShiftKeyDown()) xMotion = zMotion = 0; double movement = Math.max(-speed / 4f, -.5f) * -offset; - processingEntity.setMotion(new Vector3d(facing.getAxis() == Axis.X ? movement : xMotion - , facing.getAxis() == Axis.Y ? movement : 0f //Do not move entities upwards or downwards for horizontal crushers, - , facing.getAxis() == Axis.Z ? movement : zMotion)); //Or they'll only get their feet crushed. + processingEntity.setDeltaMovement( + new Vector3d(facing.getAxis() == Axis.X ? movement : xMotion, facing.getAxis() == Axis.Y ? movement : 0f // Do + // not + // move + // entities + // upwards + // or + // downwards + // for + // horizontal + // crushers, + , facing.getAxis() == Axis.Z ? movement : zMotion)); // Or they'll only get their feet crushed. - if (world.isRemote) + if (level.isClientSide) return; if (!(processingEntity instanceof ItemEntity)) { - Vector3d entityOutPos = outPos.add(facing.getAxis() == Axis.X ? .5f * offset : 0f - , facing.getAxis() == Axis.Y ? .5f * offset : 0f - , facing.getAxis() == Axis.Z ? .5f * offset : 0f); + Vector3d entityOutPos = outPos.add(facing.getAxis() == Axis.X ? .5f * offset : 0f, + facing.getAxis() == Axis.Y ? .5f * offset : 0f, facing.getAxis() == Axis.Z ? .5f * offset : 0f); int crusherDamage = AllConfigs.SERVER.kinetics.crushingDamage.get(); if (processingEntity instanceof LivingEntity) { - if ((((LivingEntity) processingEntity).getHealth() - crusherDamage <= 0) //Takes LivingEntity instances as exception, so it can move them before it would kill them. - && (((LivingEntity) processingEntity).hurtTime <= 0)) { //This way it can actually output the items to the right spot. - processingEntity.setPosition(entityOutPos.x - , entityOutPos.y - , entityOutPos.z); + if ((((LivingEntity) processingEntity).getHealth() - crusherDamage <= 0) // Takes LivingEntity instances + // as exception, so it can + // move them before it would + // kill them. + && (((LivingEntity) processingEntity).hurtTime <= 0)) { // This way it can actually output the items + // to the right spot. + processingEntity.setPos(entityOutPos.x, entityOutPos.y, entityOutPos.z); } } - processingEntity.attackEntityFrom(CrushingWheelTileEntity.damageSource, - crusherDamage); + processingEntity.hurt(CrushingWheelTileEntity.damageSource, crusherDamage); if (!processingEntity.isAlive()) { - processingEntity.setPosition(entityOutPos.x - , entityOutPos.y - , entityOutPos.z); + processingEntity.setPos(entityOutPos.x, entityOutPos.y, entityOutPos.z); } return; } ItemEntity itemEntity = (ItemEntity) processingEntity; - itemEntity.setPickupDelay(20); + itemEntity.setPickUpDelay(20); if (facing.getAxis() == Axis.Y) { - if (processingEntity.getY() * -offset < (centerPos.y - .25f) * -offset) { + if (processingEntity.getY() * -offset < (centerPos.y - .25f) * -offset) { intakeItem(itemEntity); } } else if (facing.getAxis() == Axis.Z) { - if (processingEntity.getZ() * -offset < (centerPos.z - .25f) * -offset) { + if (processingEntity.getZ() * -offset < (centerPos.z - .25f) * -offset) { intakeItem(itemEntity); } } else { - if (processingEntity.getX() * -offset < (centerPos.x - .25f) * -offset) { + if (processingEntity.getX() * -offset < (centerPos.x - .25f) * -offset) { intakeItem(itemEntity); } } } + @OnlyIn(Dist.CLIENT) + public void tickAudio() { + float pitch = MathHelper.clamp((crushingspeed / 256f) + .45f, .85f, 1f); + if (entityUUID == null && inventory.getStackInSlot(0) + .isEmpty()) + return; + SoundScapes.play(AmbienceGroup.CRUSHING, worldPosition, pitch); + } + private void intakeItem(ItemEntity itemEntity) { inventory.clear(); inventory.setStackInSlot(0, itemEntity.getItem() - .copy()); + .copy()); itemInserted(inventory.getStackInSlot(0)); itemEntity.remove(); - world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16); + level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 2 | 16); } protected void spawnParticles(ItemStack stack) { @@ -257,14 +282,14 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { IParticleData particleData = null; if (stack.getItem() instanceof BlockItem) particleData = new BlockParticleData(ParticleTypes.BLOCK, ((BlockItem) stack.getItem()).getBlock() - .getDefaultState()); + .defaultBlockState()); else particleData = new ItemParticleData(ParticleTypes.ITEM, stack); - Random r = world.rand; + Random r = level.random; for (int i = 0; i < 4; i++) - world.addParticle(particleData, pos.getX() + r.nextFloat(), pos.getY() + r.nextFloat(), - pos.getZ() + r.nextFloat(), 0, 0, 0); + level.addParticle(particleData, worldPosition.getX() + r.nextFloat(), worldPosition.getY() + r.nextFloat(), + worldPosition.getZ() + r.nextFloat(), 0, 0, 0); } private void applyRecipe() { @@ -273,11 +298,11 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { List list = new ArrayList<>(); if (recipe.isPresent()) { int rolls = inventory.getStackInSlot(0) - .getCount(); + .getCount(); inventory.clear(); for (int roll = 0; roll < rolls; roll++) { List rolledResults = recipe.get() - .rollResults(); + .rollResults(); for (int i = 0; i < rolledResults.size(); i++) { ItemStack stack = rolledResults.get(i); ItemHelper.addToList(stack, list); @@ -292,16 +317,16 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { } public Optional> findRecipe() { - Optional> crushingRecipe = AllRecipeTypes.CRUSHING.find(wrapper, world); + Optional> crushingRecipe = AllRecipeTypes.CRUSHING.find(wrapper, level); if (!crushingRecipe.isPresent()) - crushingRecipe = AllRecipeTypes.MILLING.find(wrapper, world); + crushingRecipe = AllRecipeTypes.MILLING.find(wrapper, level); return crushingRecipe; } @Override public void write(CompoundNBT compound, boolean clientPacket) { if (hasEntity()) - compound.put("Entity", NBTUtil.fromUuid(entityUUID)); + compound.put("Entity", NBTUtil.createUUID(entityUUID)); compound.put("Inventory", inventory.serializeNBT()); compound.putFloat("Speed", crushingspeed); super.write(compound, clientPacket); @@ -311,7 +336,7 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { super.fromTag(state, compound, clientPacket); if (compound.contains("Entity") && !isOccupied()) { - entityUUID = NBTUtil.readUniqueId(NBTHelper.getINBT(compound, "Entity")); + entityUUID = NBTUtil.loadUUID(NBTHelper.getINBT(compound, "Entity")); this.searchForEntity = true; } crushingspeed = compound.getFloat("Speed"); @@ -320,13 +345,13 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { public void startCrushing(Entity entity) { processingEntity = entity; - entityUUID = entity.getUniqueID(); + entityUUID = entity.getUUID(); } private void itemInserted(ItemStack stack) { Optional> recipe = findRecipe(); inventory.remainingTime = recipe.isPresent() ? recipe.get() - .getProcessingDuration() : 100; + .getProcessingDuration() : 100; inventory.appliedRecipe = false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java index ea210238d..fa0fa32af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java @@ -17,8 +17,8 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber public class CrushingWheelTileEntity extends KineticTileEntity { - public static DamageSource damageSource = new DamageSource("create.crush").setDamageBypassesArmor() - .setDifficultyScaled(); + public static DamageSource damageSource = new DamageSource("create.crush").bypassArmor() + .setScalesWithDifficulty(); public CrushingWheelTileEntity(TileEntityType type) { super(type); @@ -33,13 +33,13 @@ public class CrushingWheelTileEntity extends KineticTileEntity { public void fixControllers() { for (Direction d : Iterate.directions) - ((CrushingWheelBlock) getBlockState().getBlock()).updateControllers(getBlockState(), getWorld(), getPos(), + ((CrushingWheelBlock) getBlockState().getBlock()).updateControllers(getBlockState(), getLevel(), getBlockPos(), d); } @Override public AxisAlignedBB makeRenderBoundingBox() { - return new AxisAlignedBB(pos).grow(1); + return new AxisAlignedBB(worldPosition).inflate(1); } @Override @@ -61,7 +61,7 @@ public class CrushingWheelTileEntity extends KineticTileEntity { return; Vector3d outSpeed = Vector3d.ZERO; for (ItemEntity outputItem : event.getDrops()) { - outputItem.setMotion(outSpeed); + outputItem.setDeltaMovement(outSpeed); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/BeltDeployerCallbacks.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/BeltDeployerCallbacks.java index 7d007d11e..b0900e2be 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/BeltDeployerCallbacks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/BeltDeployerCallbacks.java @@ -38,7 +38,7 @@ public class BeltDeployerCallbacks { if (deployerTileEntity.mode == Mode.PUNCH) return ProcessingResult.PASS; BlockState blockState = deployerTileEntity.getBlockState(); - if (!blockState.contains(FACING) || blockState.get(FACING) != Direction.DOWN) + if (!blockState.hasProperty(FACING) || blockState.getValue(FACING) != Direction.DOWN) return ProcessingResult.PASS; if (deployerTileEntity.state != State.WAITING) return ProcessingResult.HOLD; @@ -58,7 +58,7 @@ public class BeltDeployerCallbacks { if (deployerTileEntity.getSpeed() == 0) return ProcessingResult.PASS; BlockState blockState = deployerTileEntity.getBlockState(); - if (!blockState.contains(FACING) || blockState.get(FACING) != Direction.DOWN) + if (!blockState.hasProperty(FACING) || blockState.getValue(FACING) != Direction.DOWN) return ProcessingResult.PASS; IRecipe recipe = deployerTileEntity.getRecipe(s.stack); if (recipe == null) @@ -103,17 +103,17 @@ public class BeltDeployerCallbacks { else handler.handleProcessingOnItem(transported, TransportedResult.convertToAndLeaveHeld(collect, left)); - ItemStack heldItem = deployerTileEntity.player.getHeldItemMainhand(); - if (heldItem.isDamageable()) - heldItem.damageItem(1, deployerTileEntity.player, s -> s.sendBreakAnimation(Hand.MAIN_HAND)); + ItemStack heldItem = deployerTileEntity.player.getMainHandItem(); + if (heldItem.isDamageableItem()) + heldItem.hurtAndBreak(1, deployerTileEntity.player, s -> s.broadcastBreakEvent(Hand.MAIN_HAND)); else heldItem.shrink(1); - BlockPos pos = deployerTileEntity.getPos(); - World world = deployerTileEntity.getWorld(); + BlockPos pos = deployerTileEntity.getBlockPos(); + World world = deployerTileEntity.getLevel(); if (heldItem.isEmpty()) - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_BREAK, SoundCategory.BLOCKS, .25f, 1); - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, .25f, .75f); + world.playSound(null, pos, SoundEvents.ITEM_BREAK, SoundCategory.BLOCKS, .25f, 1); + world.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundCategory.BLOCKS, .25f, .75f); if (recipe instanceof SandPaperPolishingRecipe) AllSoundEvents.AUTO_POLISH.playOnServer(world, pos, .25f, 1f); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java index 437ac1686..21768e690 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java @@ -3,10 +3,12 @@ package com.simibubi.create.content.contraptions.components.deployer; import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; -import com.jozufozu.flywheel.backend.instancing.InstanceMaterial; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.InstanceMaterial; +import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.materials.ModelData; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; @@ -17,7 +19,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.foundation.render.AllMaterialSpecs; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; @@ -44,16 +45,17 @@ public class DeployerActorInstance extends ActorInstance { public DeployerActorInstance(MaterialManager materialManager, PlacementSimulationWorld simulationWorld, MovementContext context) { super(materialManager, simulationWorld, context); - InstanceMaterial mat = materialManager.getTransformMaterial(); + InstanceMaterial mat = materialManager.defaultSolid() + .material(Materials.TRANSFORMED); BlockState state = context.state; DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class); PartialModel handPose = DeployerRenderer.getHandPose(mode); stationaryTimer = context.data.contains("StationaryTimer"); - facing = state.get(FACING); + facing = state.getValue(FACING); - boolean rotatePole = state.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; + boolean rotatePole = state.getValue(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; yRot = AngleHelper.horizontalAngle(facing); zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; zRotPole = rotatePole ? 90 : 0; @@ -62,7 +64,8 @@ public class DeployerActorInstance extends ActorInstance { hand = mat.getModel(handPose, state).createInstance(); Direction.Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state); - shaft = materialManager.getMaterial(AllMaterialSpecs.ROTATING) + shaft = materialManager.defaultSolid() + .material(AllMaterialSpecs.ROTATING) .getModel(KineticTileInstance.shaft(axis)) .createInstance(); @@ -89,10 +92,10 @@ public class DeployerActorInstance extends ActorInstance { factor = .5f - MathHelper.clamp(MathHelper.lerp(AnimationTickHolder.getPartialTicks(), distance, nextDistance), 0, 1); } - Vector3d offset = Vector3d.of(facing.getDirectionVec()).scale(factor); + Vector3d offset = Vector3d.atLowerCornerOf(facing.getNormal()).scale(factor); MatrixStack ms = new MatrixStack(); - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); msr.translate(context.localPos) .translate(offset); @@ -100,7 +103,7 @@ public class DeployerActorInstance extends ActorInstance { transformModel(msr, pole, hand, yRot, zRot, zRotPole); } - static void transformModel(MatrixStacker msr, ModelData pole, ModelData hand, float yRot, float zRot, float zRotPole) { + static void transformModel(MatrixTransformStack msr, ModelData pole, ModelData hand, float yRot, float zRot, float zRotPole) { msr.centre(); msr.rotate(Direction.SOUTH, (float) ((zRot) / 180 * Math.PI)); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerApplicationRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerApplicationRecipe.java index d3c6f0ed8..c315bea50 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerApplicationRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerApplicationRecipe.java @@ -37,9 +37,9 @@ public class DeployerApplicationRecipe extends ProcessingRecipe i @Override public boolean matches(RecipeWrapper inv, World p_77569_2_) { return ingredients.get(0) - .test(inv.getStackInSlot(0)) + .test(inv.getItem(0)) && ingredients.get(1) - .test(inv.getStackInSlot(1)); + .test(inv.getItem(1)); } @Override @@ -69,8 +69,8 @@ public class DeployerApplicationRecipe extends ProcessingRecipe i .map(r -> new ProcessingRecipeBuilder<>(DeployerApplicationRecipe::new, Create.asResource(r.getId() .getPath() + "_using_deployer")).require(r.getIngredients() .get(0)) - .require(Ingredient.fromItems(AllItems.SAND_PAPER.get(), AllItems.RED_SAND_PAPER.get())) - .output(r.getRecipeOutput()) + .require(Ingredient.of(AllItems.SAND_PAPER.get(), AllItems.RED_SAND_PAPER.get())) + .output(r.getResultItem()) .build()) .collect(Collectors.toList()); } @@ -84,11 +84,11 @@ public class DeployerApplicationRecipe extends ProcessingRecipe i @OnlyIn(Dist.CLIENT) public ITextComponent getDescriptionForAssembly() { ItemStack[] matchingStacks = ingredients.get(1) - .getMatchingStacks(); + .getItems(); if (matchingStacks.length == 0) return new StringTextComponent("Invalid"); return Lang.translate("recipe.assembly.deploying_item", - new TranslationTextComponent(matchingStacks[0].getTranslationKey()).getString()); + new TranslationTextComponent(matchingStacks[0].getDescriptionId()).getString()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java index 43d4d656b..d6bc343a6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java @@ -6,6 +6,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; +import com.simibubi.create.content.contraptions.components.AssemblyOperatorUseContext; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; @@ -15,11 +16,13 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; @@ -42,63 +45,63 @@ public class DeployerBlock extends DirectionalAxisKineticBlock implements ITE { if (te.player != null && !isMoving) { - te.player.inventory.dropAllItems(); - te.overflowItems.forEach(itemstack -> te.player.dropItem(itemstack, true, false)); + te.player.inventory.dropAll(); + te.overflowItems.forEach(itemstack -> te.player.drop(itemstack, true, false)); te.player.remove(); te.player = null; } }); TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - ItemStack heldByPlayer = player.getHeldItem(handIn) + ItemStack heldByPlayer = player.getItemInHand(handIn) .copy(); if (AllItems.WRENCH.isIn(heldByPlayer)) return ActionResultType.PASS; - if (hit.getFace() != state.get(FACING)) + if (hit.getDirection() != state.getValue(FACING)) return ActionResultType.PASS; - if (worldIn.isRemote) + if (worldIn.isClientSide) return ActionResultType.SUCCESS; withTileEntityDo(worldIn, pos, te -> { - ItemStack heldByDeployer = te.player.getHeldItemMainhand() + ItemStack heldByDeployer = te.player.getMainHandItem() .copy(); if (heldByDeployer.isEmpty() && heldByPlayer.isEmpty()) return; - player.setHeldItem(handIn, heldByDeployer); - te.player.setHeldItem(Hand.MAIN_HAND, heldByPlayer); + player.setItemInHand(handIn, heldByDeployer); + te.player.setItemInHand(Hand.MAIN_HAND, heldByPlayer); te.sendData(); }); @@ -109,22 +112,27 @@ public class DeployerBlock extends DirectionalAxisKineticBlock implements ITE getTileEntityClass() { return DeployerTileEntity.class; } - + @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { - super.onBlockAdded(state, world, pos, oldState, isMoving); + public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + super.onPlace(state, world, pos, oldState, isMoving); withTileEntityDo(world, pos, DeployerTileEntity::redstoneUpdate); } - + @Override public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_, boolean p_220069_6_) { withTileEntityDo(world, pos, DeployerTileEntity::redstoneUpdate); } - + @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } + @Override + protected Direction getFacingForPlacement(BlockItemUseContext context) { + if (context instanceof AssemblyOperatorUseContext) return Direction.DOWN; + else return super.getFacingForPlacement(context); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFakePlayer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFakePlayer.java index 76163d2ee..a2bc9d666 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFakePlayer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFakePlayer.java @@ -57,7 +57,7 @@ public class DeployerFakePlayer extends FakePlayer { } @Override - public OptionalInt openContainer(INamedContainerProvider container) { + public OptionalInt openMenu(INamedContainerProvider container) { return OptionalInt.empty(); } @@ -73,12 +73,12 @@ public class DeployerFakePlayer extends FakePlayer { } @Override - public Vector3d getPositionVec() { + public Vector3d position() { return new Vector3d(getX(), getY(), getZ()); } @Override - public float getCooldownPeriod() { + public float getCurrentItemAttackStrengthDelay() { return 1 / 64f; } @@ -88,7 +88,7 @@ public class DeployerFakePlayer extends FakePlayer { } @Override - public ItemStack onFoodEaten(World world, ItemStack stack) { + public ItemStack eat(World world, ItemStack stack) { stack.shrink(1); return stack; } @@ -104,11 +104,11 @@ public class DeployerFakePlayer extends FakePlayer { if (!(event.getSource() instanceof EntityDamageSource)) return; EntityDamageSource source = (EntityDamageSource) event.getSource(); - Entity trueSource = source.getTrueSource(); + Entity trueSource = source.getEntity(); if (trueSource != null && trueSource instanceof DeployerFakePlayer) { DeployerFakePlayer fakePlayer = (DeployerFakePlayer) trueSource; event.getDrops() - .forEach(stack -> fakePlayer.inventory.placeItemBackInInventory(trueSource.world, stack.getItem())); + .forEach(stack -> fakePlayer.inventory.placeItemBackInInventory(trueSource.level, stack.getItem())); event.setCanceled(true); } } @@ -118,8 +118,8 @@ public class DeployerFakePlayer extends FakePlayer { @Override public void remove(boolean keepData) { - if (blockBreakingProgress != null && !world.isRemote) - world.sendBlockBreakProgress(getEntityId(), blockBreakingProgress.getKey(), -1); + if (blockBreakingProgress != null && !level.isClientSide) + level.destroyBlockProgress(getId(), blockBreakingProgress.getKey(), -1); super.remove(keepData); } @@ -142,11 +142,11 @@ public class DeployerFakePlayer extends FakePlayer { switch (setting) { case ALL: - mob.setAttackTarget(null); + mob.setTarget(null); break; case CREEPERS: if (mob instanceof CreeperEntity) - mob.setAttackTarget(null); + mob.setTarget(null); break; case NONE: default: @@ -159,10 +159,10 @@ public class DeployerFakePlayer extends FakePlayer { } @Override - public void sendPacket(IPacket packetIn) {} + public void send(IPacket packetIn) {} @Override - public void sendPacket(IPacket packetIn, + public void send(IPacket packetIn, GenericFutureListener> futureListeners) {} } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java index b5c071b12..b65aaff17 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.contraptions.components.deployer; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -15,7 +15,7 @@ public class DeployerFilterSlot extends ValueBoxTransform { @Override protected Vector3d getLocalOffset(BlockState state) { - Direction facing = state.get(DeployerBlock.FACING); + Direction facing = state.getValue(DeployerBlock.FACING); Vector3d vec = VecHelper.voxelSpace(8f, 13.5f, 11.5f); float yRot = AngleHelper.horizontalAngle(facing); @@ -28,10 +28,10 @@ public class DeployerFilterSlot extends ValueBoxTransform { @Override protected void rotate(BlockState state, MatrixStack ms) { - Direction facing = state.get(DeployerBlock.FACING); + Direction facing = state.getValue(DeployerBlock.FACING); float xRot = facing == Direction.UP ? 90 : facing == Direction.DOWN ? 270 : 0; float yRot = AngleHelper.horizontalAngle(facing) + 180; - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(yRot) .rotateX(xRot); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java index 696332e89..60809d55c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java @@ -80,26 +80,26 @@ public class DeployerHandler { boolean rayMode = false; private ItemUseWorld(World world, Direction face, BlockPos pos) { - super(world, world.getChunkProvider()); + super(world, world.getChunkSource()); this.face = face; this.pos = pos; } @Override - public BlockRayTraceResult rayTraceBlocks(RayTraceContext context) { + public BlockRayTraceResult clip(RayTraceContext context) { rayMode = true; - BlockRayTraceResult rayTraceBlocks = super.rayTraceBlocks(context); + BlockRayTraceResult rayTraceBlocks = super.clip(context); rayMode = false; return rayTraceBlocks; } @Override public BlockState getBlockState(BlockPos position) { - if (rayMode && (pos.offset(face.getOpposite(), 3) + if (rayMode && (pos.relative(face.getOpposite(), 3) .equals(position) - || pos.offset(face.getOpposite(), 1) + || pos.relative(face.getOpposite(), 1) .equals(position))) - return Blocks.BEDROCK.getDefaultState(); + return Blocks.BEDROCK.defaultBlockState(); return world.getBlockState(position); } } @@ -114,7 +114,7 @@ public class DeployerHandler { BucketItem bucketItem = (BucketItem) held.getItem(); Fluid fluid = bucketItem.getFluid(); if (fluid != Fluids.EMPTY && world.getFluidState(targetPos) - .getFluid() == fluid) + .getType() == fluid) return false; } @@ -127,13 +127,13 @@ public class DeployerHandler { static void activate(DeployerFakePlayer player, Vector3d vec, BlockPos clickedPos, Vector3d extensionVector, Mode mode) { - Multimap attributeModifiers = player.getHeldItemMainhand() + Multimap attributeModifiers = player.getMainHandItem() .getAttributeModifiers(EquipmentSlotType.MAINHAND); player.getAttributes() - .addTemporaryModifiers(attributeModifiers); + .addTransientAttributeModifiers(attributeModifiers); activateInner(player, vec, clickedPos, extensionVector, mode); player.getAttributes() - .addTemporaryModifiers(attributeModifiers); + .addTransientAttributeModifiers(attributeModifiers); } private static void activateInner(DeployerFakePlayer player, Vector3d vec, BlockPos clickedPos, @@ -141,19 +141,19 @@ public class DeployerHandler { Vector3d rayOrigin = vec.add(extensionVector.scale(3 / 2f + 1 / 64f)); Vector3d rayTarget = vec.add(extensionVector.scale(5 / 2f - 1 / 64f)); - player.setPosition(rayOrigin.x, rayOrigin.y, rayOrigin.z); + player.setPos(rayOrigin.x, rayOrigin.y, rayOrigin.z); BlockPos pos = new BlockPos(vec); - ItemStack stack = player.getHeldItemMainhand(); + ItemStack stack = player.getMainHandItem(); Item item = stack.getItem(); // Check for entities - final ServerWorld world = player.getServerWorld(); - List entities = world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(clickedPos)).stream() + final ServerWorld world = player.getLevel(); + List entities = world.getEntitiesOfClass(Entity.class, new AxisAlignedBB(clickedPos)).stream() .filter(e -> !(e instanceof AbstractContraptionEntity)) .collect(Collectors.toList()); Hand hand = Hand.MAIN_HAND; if (!entities.isEmpty()) { - Entity entity = entities.get(world.rand.nextInt(entities.size())); + Entity entity = entities.get(world.random.nextInt(entities.size())); List capturedDrops = new ArrayList<>(); boolean success = false; entity.captureDrops(capturedDrops); @@ -166,24 +166,24 @@ public class DeployerHandler { return; } if (cancelResult == null) { - if (entity.processInitialInteract(player, hand) - .isAccepted()){ + if (entity.interact(player, hand) + .consumesAction()){ if (entity instanceof AbstractVillagerEntity) { AbstractVillagerEntity villager = ((AbstractVillagerEntity) entity); - if (villager.getCustomer() instanceof DeployerFakePlayer) - villager.setCustomer(null); + if (villager.getTradingPlayer() instanceof DeployerFakePlayer) + villager.setTradingPlayer(null); } success = true; } - else if (entity instanceof LivingEntity && stack.useOnEntity(player, (LivingEntity) entity, hand) - .isAccepted()) + else if (entity instanceof LivingEntity && stack.interactLivingEntity(player, (LivingEntity) entity, hand) + .consumesAction()) success = true; } - if (!success && stack.isFood() && entity instanceof PlayerEntity) { + if (!success && stack.isEdible() && entity instanceof PlayerEntity) { PlayerEntity playerEntity = (PlayerEntity) entity; - if (playerEntity.canEat(item.getFood() - .canEatWhenFull())) { - playerEntity.onFoodEaten(world, stack); + if (playerEntity.canEat(item.getFoodProperties() + .canAlwaysEat())) { + playerEntity.eat(world, stack); player.spawnedItemEffects = stack.copy(); success = true; } @@ -192,8 +192,8 @@ public class DeployerHandler { // Punch entity if (mode == Mode.PUNCH) { - player.resetCooldown(); - player.attackTargetEntityWithCurrentItem(entity); + player.resetAttackStrengthTicker(); + player.attack(entity); success = true; } @@ -206,18 +206,18 @@ public class DeployerHandler { // Shoot ray RayTraceContext rayTraceContext = new RayTraceContext(rayOrigin, rayTarget, BlockMode.OUTLINE, FluidMode.NONE, player); - BlockRayTraceResult result = world.rayTraceBlocks(rayTraceContext); - if (result.getPos() != clickedPos) - result = new BlockRayTraceResult(result.getHitVec(), result.getFace(), clickedPos, result.isInside()); + BlockRayTraceResult result = world.clip(rayTraceContext); + if (result.getBlockPos() != clickedPos) + result = new BlockRayTraceResult(result.getLocation(), result.getDirection(), clickedPos, result.isInside()); BlockState clickedState = world.getBlockState(clickedPos); - Direction face = result.getFace(); + Direction face = result.getDirection(); if (face == null) - face = Direction.getFacingFromVector(extensionVector.x, extensionVector.y, extensionVector.z) + face = Direction.getNearest(extensionVector.x, extensionVector.y, extensionVector.z) .getOpposite(); // Left click if (mode == Mode.PUNCH) { - if (!world.isBlockModifiable(player, clickedPos)) + if (!world.mayInteract(player, clickedPos)) return; if (clickedState.getShape(world, clickedPos) .isEmpty()) { @@ -230,11 +230,11 @@ public class DeployerHandler { if (BlockHelper.extinguishFire(world, player, clickedPos, face)) // FIXME: is there an equivalent in world, as there was in 1.15? return; if (event.getUseBlock() != DENY) - clickedState.onBlockClicked(world, clickedPos, player); + clickedState.attack(world, clickedPos, player); if (stack.isEmpty()) return; - float progress = clickedState.getPlayerRelativeBlockHardness(player, world, clickedPos) * 16; + float progress = clickedState.getDestroyProgress(player, world, clickedPos) * 16; float before = 0; Pair blockBreakingProgress = player.blockBreakingProgress; if (blockBreakingProgress != null) @@ -244,8 +244,8 @@ public class DeployerHandler { .getHitSound(), SoundCategory.NEUTRAL, .25f, 1); if (progress >= 1) { - tryHarvestBlock(player.interactionManager, clickedPos); - world.sendBlockBreakProgress(player.getEntityId(), clickedPos, -1); + tryHarvestBlock(player.gameMode, clickedPos); + world.destroyBlockProgress(player.getId(), clickedPos, -1); player.blockBreakingProgress = null; return; } @@ -255,7 +255,7 @@ public class DeployerHandler { } if ((int) (before * 10) != (int) (progress * 10)) - world.sendBlockBreakProgress(player.getEntityId(), clickedPos, (int) (progress * 10)); + world.destroyBlockProgress(player.getId(), clickedPos, (int) (progress * 10)); player.blockBreakingProgress = Pair.of(clickedPos, progress); return; } @@ -278,14 +278,14 @@ public class DeployerHandler { return; } - boolean holdingSomething = !player.getHeldItemMainhand() + boolean holdingSomething = !player.getMainHandItem() .isEmpty(); boolean flag1 = - !(player.isSneaking() && holdingSomething) || (stack.doesSneakBypassUse(world, clickedPos, player)); + !(player.isShiftKeyDown() && holdingSomething) || (stack.doesSneakBypassUse(world, clickedPos, player)); // Use on block if (useBlock != DENY && flag1 - && safeOnUse(clickedState, world, clickedPos, player, hand, result).isAccepted()) + && safeOnUse(clickedState, world, clickedPos, player, hand, result).consumesAction()) return; if (stack.isEmpty()) return; @@ -293,24 +293,24 @@ public class DeployerHandler { return; if (item instanceof BlockItem && !(item instanceof CartAssemblerBlockItem) - && !clickedState.isReplaceable(new BlockItemUseContext(itemusecontext))) + && !clickedState.canBeReplaced(new BlockItemUseContext(itemusecontext))) return; // Reposition fire placement for convenience if (item == Items.FLINT_AND_STEEL) { - Direction newFace = result.getFace(); - BlockPos newPos = result.getPos(); - if (!AbstractFireBlock.method_30032(world, clickedPos, newFace)) + Direction newFace = result.getDirection(); + BlockPos newPos = result.getBlockPos(); + if (!AbstractFireBlock.canBePlacedAt(world, clickedPos, newFace)) newFace = Direction.UP; if (clickedState.getMaterial() == Material.AIR) - newPos = newPos.offset(face.getOpposite()); - result = new BlockRayTraceResult(result.getHitVec(), newFace, newPos, result.isInside()); + newPos = newPos.relative(face.getOpposite()); + result = new BlockRayTraceResult(result.getLocation(), newFace, newPos, result.isInside()); itemusecontext = new ItemUseContext(player, hand, result); } // 'Inert' item use behaviour & block placement - ActionResultType onItemUse = stack.onItemUse(itemusecontext); - if (onItemUse.isAccepted()) + ActionResultType onItemUse = stack.useOn(itemusecontext); + if (onItemUse.consumesAction()) return; if (item == Items.ENDER_PEARL) return; @@ -320,76 +320,76 @@ public class DeployerHandler { if (item instanceof BucketItem || item instanceof SandPaperItem) itemUseWorld = new ItemUseWorld(world, face, pos); - ActionResult onItemRightClick = item.onItemRightClick(itemUseWorld, player, hand); - ItemStack resultStack = onItemRightClick.getResult(); + ActionResult onItemRightClick = item.use(itemUseWorld, player, hand); + ItemStack resultStack = onItemRightClick.getObject(); if (resultStack != stack || resultStack.getCount() != stack.getCount() || resultStack.getUseDuration() > 0 - || resultStack.getDamage() != stack.getDamage()) { - player.setHeldItem(hand, onItemRightClick.getResult()); + || resultStack.getDamageValue() != stack.getDamageValue()) { + player.setItemInHand(hand, onItemRightClick.getObject()); } CompoundNBT tag = stack.getTag(); if (tag != null && stack.getItem() instanceof SandPaperItem && tag.contains("Polishing")) { - player.spawnedItemEffects = ItemStack.read(tag.getCompound("Polishing")); + player.spawnedItemEffects = ItemStack.of(tag.getCompound("Polishing")); AllSoundEvents.AUTO_POLISH.playOnServer(world, pos, .25f, 1f); } - if (!player.getActiveItemStack() + if (!player.getUseItem() .isEmpty()) - player.setHeldItem(hand, stack.onItemUseFinish(world, player)); + player.setItemInHand(hand, stack.finishUsingItem(world, player)); - player.resetActiveHand(); + player.stopUsingItem(); } public static boolean tryHarvestBlock(PlayerInteractionManager interactionManager, BlockPos pos) { // <> PlayerInteractionManager#tryHarvestBlock - ServerWorld world = interactionManager.world; + ServerWorld world = interactionManager.level; ServerPlayerEntity player = interactionManager.player; BlockState blockstate = world.getBlockState(pos); - GameType gameType = interactionManager.getGameType(); + GameType gameType = interactionManager.getGameModeForPlayer(); if (net.minecraftforge.common.ForgeHooks.onBlockBreakEvent(world, gameType, player, pos) == -1) return false; - TileEntity tileentity = world.getTileEntity(pos); - if (player.getHeldItemMainhand() + TileEntity tileentity = world.getBlockEntity(pos); + if (player.getMainHandItem() .onBlockStartBreak(pos, player)) return false; - if (player.isBlockBreakingRestricted(world, pos, gameType)) + if (player.blockActionRestricted(world, pos, gameType)) return false; - ItemStack prevHeldItem = player.getHeldItemMainhand(); + ItemStack prevHeldItem = player.getMainHandItem(); ItemStack heldItem = prevHeldItem.copy(); boolean canHarvest = blockstate.canHarvestBlock(world, pos, player); - prevHeldItem.onBlockDestroyed(world, blockstate, pos, player); + prevHeldItem.mineBlock(world, blockstate, pos, player); if (prevHeldItem.isEmpty() && !heldItem.isEmpty()) net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem(player, heldItem, Hand.MAIN_HAND); - BlockPos posUp = pos.up(); + BlockPos posUp = pos.above(); BlockState stateUp = world.getBlockState(posUp); if (blockstate.getBlock() instanceof DoublePlantBlock - && blockstate.get(DoublePlantBlock.HALF) == DoubleBlockHalf.LOWER + && blockstate.getValue(DoublePlantBlock.HALF) == DoubleBlockHalf.LOWER && stateUp.getBlock() == blockstate.getBlock() - && stateUp.get(DoublePlantBlock.HALF) == DoubleBlockHalf.UPPER + && stateUp.getValue(DoublePlantBlock.HALF) == DoubleBlockHalf.UPPER ) { // hack to prevent DoublePlantBlock from dropping a duplicate item - world.setBlockState(pos, Blocks.AIR.getDefaultState(), 35); - world.setBlockState(posUp, Blocks.AIR.getDefaultState(), 35); + world.setBlock(pos, Blocks.AIR.defaultBlockState(), 35); + world.setBlock(posUp, Blocks.AIR.defaultBlockState(), 35); } else { if (!blockstate.removedByPlayer(world, pos, player, canHarvest, world.getFluidState(pos))) return true; } blockstate.getBlock() - .onPlayerDestroy(world, pos, blockstate); + .destroy(world, pos, blockstate); if (!canHarvest) return true; Block.getDrops(blockstate, world, pos, tileentity, player, prevHeldItem) .forEach(item -> player.inventory.placeItemBackInInventory(world, item)); - blockstate.spawnAdditionalDrops(world, pos, prevHeldItem); + blockstate.spawnAfterBreak(world, pos, prevHeldItem); return true; } @@ -397,7 +397,7 @@ public class DeployerHandler { Hand hand, BlockRayTraceResult ray) { if (state.getBlock() instanceof BeehiveBlock) return safeOnBeehiveUse(state, world, pos, player, hand); - return state.onUse(world, player, hand, ray); + return state.use(world, player, hand, ray); } protected static ActionResultType safeOnBeehiveUse(BlockState state, World world, BlockPos pos, PlayerEntity player, @@ -405,28 +405,28 @@ public class DeployerHandler { // <> BeehiveBlock#onUse BeehiveBlock block = (BeehiveBlock) state.getBlock(); - ItemStack prevHeldItem = player.getHeldItem(hand); - int honeyLevel = state.get(BeehiveBlock.HONEY_LEVEL); + ItemStack prevHeldItem = player.getItemInHand(hand); + int honeyLevel = state.getValue(BeehiveBlock.HONEY_LEVEL); boolean success = false; if (honeyLevel < 5) return ActionResultType.PASS; if (prevHeldItem.getItem() == Items.SHEARS) { - world.playSound(player, player.getX(), player.getY(), player.getZ(), SoundEvents.BLOCK_BEEHIVE_SHEAR, + world.playSound(player, player.getX(), player.getY(), player.getZ(), SoundEvents.BEEHIVE_SHEAR, SoundCategory.NEUTRAL, 1.0F, 1.0F); // <> BeehiveBlock#dropHoneycomb player.inventory.placeItemBackInInventory(world, new ItemStack(Items.HONEYCOMB, 3)); - prevHeldItem.damageItem(1, player, s -> s.sendBreakAnimation(hand)); + prevHeldItem.hurtAndBreak(1, player, s -> s.broadcastBreakEvent(hand)); success = true; } if (prevHeldItem.getItem() == Items.GLASS_BOTTLE) { prevHeldItem.shrink(1); - world.playSound(player, player.getX(), player.getY(), player.getZ(), SoundEvents.ITEM_BOTTLE_FILL, + world.playSound(player, player.getX(), player.getY(), player.getZ(), SoundEvents.BOTTLE_FILL, SoundCategory.NEUTRAL, 1.0F, 1.0F); ItemStack honeyBottle = new ItemStack(Items.HONEY_BOTTLE); if (prevHeldItem.isEmpty()) - player.setHeldItem(hand, honeyBottle); + player.setItemInHand(hand, honeyBottle); else player.inventory.placeItemBackInInventory(world, honeyBottle); success = true; @@ -435,7 +435,7 @@ public class DeployerHandler { if (!success) return ActionResultType.PASS; - block.takeHoney(world, state, pos); + block.resetHoneyLevel(world, state, pos); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java index 5981b32d8..d2c7b1c2d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java @@ -5,7 +5,7 @@ import static com.simibubi.create.content.contraptions.base.DirectionalKineticBl import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.ITickableInstance; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.materials.OrientedData; import com.simibubi.create.AllBlockPartials; @@ -40,9 +40,9 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance, super(dispatcher, tile); this.tile = (DeployerTileEntity) super.tile; - facing = blockState.get(FACING); + facing = blockState.getValue(FACING); - boolean rotatePole = blockState.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; + boolean rotatePole = blockState.getValue(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; yRot = AngleHelper.horizontalAngle(facing); zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; @@ -68,7 +68,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance, float newProgress = getProgress(AnimationTickHolder.getPartialTicks()); - if (!newHand && MathHelper.epsilonEquals(newProgress, progress)) return; + if (!newHand && MathHelper.equal(newProgress, progress)) return; progress = newProgress; newHand = false; @@ -118,7 +118,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance, float handLength = currentHand == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 : currentHand == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f); - Vector3i facingVec = facing.getDirectionVec(); + Vector3i facingVec = facing.getNormal(); BlockPos blockPos = getInstancePosition(); float x = blockPos.getX() + ((float) facingVec.getX()) * distance; @@ -131,12 +131,12 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance, static void updateRotation(OrientedData pole, OrientedData hand, float yRot, float zRot, float zRotPole) { - Quaternion q = Direction.SOUTH.getUnitVector().getDegreesQuaternion(zRot); - q.multiply(Direction.UP.getUnitVector().getDegreesQuaternion(yRot)); + Quaternion q = Direction.SOUTH.step().rotationDegrees(zRot); + q.mul(Direction.UP.step().rotationDegrees(yRot)); hand.setRotation(q); - q.multiply(Direction.SOUTH.getUnitVector().getDegreesQuaternion(zRotPole)); + q.mul(Direction.SOUTH.step().rotationDegrees(zRotPole)); pole.setRotation(q); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerItemHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerItemHandler.java index 0e7ba0183..55dfa8d48 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerItemHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerItemHandler.java @@ -32,16 +32,16 @@ public class DeployerItemHandler implements IItemHandlerModifiable { public ItemStack getHeld() { if (player == null) return ItemStack.EMPTY; - return player.getHeldItemMainhand(); + return player.getMainHandItem(); } public void set(ItemStack stack) { if (player == null) return; - if (te.getWorld().isRemote) + if (te.getLevel().isClientSide) return; - player.setHeldItem(Hand.MAIN_HAND, stack); - te.markDirty(); + player.setItemInHand(Hand.MAIN_HAND, stack); + te.setChanged(); te.sendData(); } @@ -119,7 +119,7 @@ public class DeployerItemHandler implements IItemHandlerModifiable { .split(amount); ItemStack toReturn = held.split(amount); - te.markDirty(); + te.setChanged(); te.sendData(); return toReturn; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java index 4243f024a..8db2c3089 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java @@ -8,7 +8,7 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.tuple.Pair; import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllTags.AllBlockTags; @@ -51,20 +51,20 @@ public class DeployerMovementBehaviour extends MovementBehaviour { @Override public Vector3d getActiveAreaOffset(MovementContext context) { - return Vector3d.of(context.state.get(DeployerBlock.FACING) - .getDirectionVec()) + return Vector3d.atLowerCornerOf(context.state.getValue(DeployerBlock.FACING) + .getNormal()) .scale(2); } @Override public void visitNewPosition(MovementContext context, BlockPos pos) { - if (context.world.isRemote) + if (context.world.isClientSide) return; tryGrabbingItem(context); DeployerFakePlayer player = getPlayer(context); Mode mode = getMode(context); - if (mode == Mode.USE && !DeployerHandler.shouldActivate(player.getHeldItemMainhand(), context.world, pos, null)) + if (mode == Mode.USE && !DeployerHandler.shouldActivate(player.getMainHandItem(), context.world, pos, null)) return; activate(context, pos, player, mode); @@ -79,12 +79,12 @@ public class DeployerMovementBehaviour extends MovementBehaviour { if (AllItems.SCHEMATIC.isIn(filter)) activateAsSchematicPrinter(context, pos, player, world, filter); - Vector3d facingVec = Vector3d.of(context.state.get(DeployerBlock.FACING) - .getDirectionVec()); + Vector3d facingVec = Vector3d.atLowerCornerOf(context.state.getValue(DeployerBlock.FACING) + .getNormal()); facingVec = context.rotation.apply(facingVec); Vector3d vec = context.position.subtract(facingVec.scale(2)); - player.rotationYaw = AbstractContraptionEntity.yawFromVector(facingVec); - player.rotationPitch = AbstractContraptionEntity.pitchFromVector(facingVec) - 90; + player.yRot = AbstractContraptionEntity.yawFromVector(facingVec); + player.xRot = AbstractContraptionEntity.pitchFromVector(facingVec) - 90; DeployerHandler.activate(player, vec, pos, facingVec, mode); } @@ -105,10 +105,10 @@ public class DeployerMovementBehaviour extends MovementBehaviour { if (schematicWorld == null) return; if (!schematicWorld.getBounds() - .isVecInside(pos.subtract(schematicWorld.anchor))) + .isInside(pos.subtract(schematicWorld.anchor))) return; BlockState blockState = schematicWorld.getBlockState(pos); - ItemRequirement requirement = ItemRequirement.of(blockState, schematicWorld.getTileEntity(pos)); + ItemRequirement requirement = ItemRequirement.of(blockState, schematicWorld.getBlockEntity(pos)); if (requirement.isInvalid() || requirement.isEmpty()) return; if (AllBlocks.BELT.has(blockState)) @@ -134,14 +134,14 @@ public class DeployerMovementBehaviour extends MovementBehaviour { CompoundNBT data = null; if (AllBlockTags.SAFE_NBT.matches(blockState)) { - TileEntity tile = schematicWorld.getTileEntity(pos); + TileEntity tile = schematicWorld.getBlockEntity(pos); if (tile != null) { - data = tile.write(new CompoundNBT()); + data = tile.save(new CompoundNBT()); data = NBTProcessors.process(tile, data, true); } } - BlockSnapshot blocksnapshot = BlockSnapshot.create(world.getRegistryKey(), world, pos); + BlockSnapshot blocksnapshot = BlockSnapshot.create(world.dimension(), world, pos); BlockHelper.placeSchematicBlock(world, blockState, pos, firstRequired, data); if (ForgeEventFactory.onBlockPlace(player, blocksnapshot, Direction.UP)) blocksnapshot.restore(true, false); @@ -149,7 +149,7 @@ public class DeployerMovementBehaviour extends MovementBehaviour { @Override public void tick(MovementContext context) { - if (context.world.isRemote) + if (context.world.isClientSide) return; if (!context.stall) return; @@ -176,14 +176,14 @@ public class DeployerMovementBehaviour extends MovementBehaviour { @Override public void stopMoving(MovementContext context) { - if (context.world.isRemote) + if (context.world.isClientSide) return; DeployerFakePlayer player = getPlayer(context); if (player == null) return; - context.tileData.put("Inventory", player.inventory.write(new ListNBT())); + context.tileData.put("Inventory", player.inventory.save(new ListNBT())); player.remove(); } @@ -191,14 +191,14 @@ public class DeployerMovementBehaviour extends MovementBehaviour { DeployerFakePlayer player = getPlayer(context); if (player == null) return; - if (player.getHeldItemMainhand() + if (player.getMainHandItem() .isEmpty()) { ItemStack filter = getFilter(context); if (AllItems.SCHEMATIC.isIn(filter)) return; ItemStack held = ItemHelper.extract(context.contraption.inventory, stack -> FilterItem.test(context.world, stack, filter), 1, false); - player.setHeldItem(Hand.MAIN_HAND, held); + player.setItemInHand(Hand.MAIN_HAND, held); } } @@ -209,13 +209,13 @@ public class DeployerMovementBehaviour extends MovementBehaviour { PlayerInventory inv = player.inventory; ItemStack filter = getFilter(context); - for (List list : Arrays.asList(inv.armorInventory, inv.offHandInventory, inv.mainInventory)) { + for (List list : Arrays.asList(inv.armor, inv.offhand, inv.items)) { for (int i = 0; i < list.size(); ++i) { ItemStack itemstack = list.get(i); if (itemstack.isEmpty()) continue; - if (list == inv.mainInventory && i == inv.currentItem + if (list == inv.items && i == inv.selected && FilterItem.test(context.world, itemstack, filter)) continue; @@ -230,16 +230,16 @@ public class DeployerMovementBehaviour extends MovementBehaviour { DeployerFakePlayer player = getPlayer(context); if (player == null) return; - context.data.put("HeldItem", player.getHeldItemMainhand() + context.data.put("HeldItem", player.getMainHandItem() .serializeNBT()); } private DeployerFakePlayer getPlayer(MovementContext context) { if (!(context.temporaryData instanceof DeployerFakePlayer) && context.world instanceof ServerWorld) { DeployerFakePlayer deployerFakePlayer = new DeployerFakePlayer((ServerWorld) context.world); - deployerFakePlayer.inventory.read(context.tileData.getList("Inventory", NBT.TAG_COMPOUND)); + deployerFakePlayer.inventory.load(context.tileData.getList("Inventory", NBT.TAG_COMPOUND)); if (context.data.contains("HeldItem")) - deployerFakePlayer.setHeldItem(Hand.MAIN_HAND, ItemStack.read(context.data.getCompound("HeldItem"))); + deployerFakePlayer.setItemInHand(Hand.MAIN_HAND, ItemStack.of(context.data.getCompound("HeldItem"))); context.tileData.remove("Inventory"); context.temporaryData = deployerFakePlayer; } @@ -247,7 +247,7 @@ public class DeployerMovementBehaviour extends MovementBehaviour { } private ItemStack getFilter(MovementContext context) { - return ItemStack.read(context.tileData.getCompound("Filter")); + return ItemStack.of(context.tileData.getCompound("Filter")); } private Mode getMode(MovementContext context) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 9eee73565..72b799cb3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -53,7 +53,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer renderItem(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; renderComponents(te, partialTicks, ms, buffer, light, overlay); } @@ -65,19 +65,19 @@ public class DeployerRenderer extends SafeTileEntityRenderer BlockState deployerState = te.getBlockState(); Vector3d offset = getHandOffset(te, partialTicks, deployerState).add(VecHelper.getCenterOf(BlockPos.ZERO)); - ms.push(); + ms.pushPose(); ms.translate(offset.x, offset.y, offset.z); - Direction facing = deployerState.get(FACING); + Direction facing = deployerState.getValue(FACING); boolean punching = te.mode == Mode.PUNCH; float yRot = AngleHelper.horizontalAngle(facing) + 180; float zRot = facing == Direction.UP ? 90 : facing == Direction.DOWN ? 270 : 0; boolean displayMode = facing == Direction.UP && te.getSpeed() == 0 && !punching; - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(yRot)); + ms.mulPose(Vector3f.YP.rotationDegrees(yRot)); if (!displayMode) { - ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(zRot)); + ms.mulPose(Vector3f.XP.rotationDegrees(zRot)); ms.translate(0, 0, -11 / 16f); } @@ -89,7 +89,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer TransformType transform = TransformType.NONE; boolean isBlockItem = (te.heldItem.getItem() instanceof BlockItem) - && itemRenderer.getItemModelWithOverrides(te.heldItem, Minecraft.getInstance().world, null) + && itemRenderer.getModel(te.heldItem, Minecraft.getInstance().level, null) .isGui3d(); if (displayMode) { @@ -97,7 +97,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer ms.translate(0, isBlockItem ? 9 / 16f : 11 / 16f, 0); ms.scale(scale, scale, scale); transform = TransformType.GROUND; - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AnimationTickHolder.getRenderTime(te.getWorld()))); + ms.mulPose(Vector3f.YP.rotationDegrees(AnimationTickHolder.getRenderTime(te.getLevel()))); } else { float scale = punching ? .75f : isBlockItem ? .75f - 1 / 64f : .5f; @@ -105,33 +105,33 @@ public class DeployerRenderer extends SafeTileEntityRenderer transform = punching ? TransformType.THIRD_PERSON_RIGHT_HAND : TransformType.FIXED; } - itemRenderer.renderItem(te.heldItem, transform, light, overlay, ms, buffer); - ms.pop(); + itemRenderer.renderStatic(te.heldItem, transform, light, overlay, ms, buffer); + ms.popPose(); } protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - if (!Backend.getInstance().canUseInstancing(te.getWorld())) { + IVertexBuilder vb = buffer.getBuffer(RenderType.solid()); + if (!Backend.getInstance().canUseInstancing(te.getLevel())) { KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), ms, vb, light); } BlockState blockState = te.getBlockState(); - BlockPos pos = te.getPos(); + BlockPos pos = te.getBlockPos(); Vector3d offset = getHandOffset(te, partialTicks, blockState); SuperByteBuffer pole = PartialBufferer.get(AllBlockPartials.DEPLOYER_POLE, blockState); SuperByteBuffer hand = PartialBufferer.get(te.getHandPose(), blockState); - transform(te.getWorld(), pole.translate(offset.x, offset.y, offset.z), blockState, pos, true).renderInto(ms, + transform(te.getLevel(), pole.translate(offset.x, offset.y, offset.z), blockState, pos, true).renderInto(ms, vb); - transform(te.getWorld(), hand.translate(offset.x, offset.y, offset.z), blockState, pos, false).renderInto(ms, + transform(te.getLevel(), hand.translate(offset.x, offset.y, offset.z), blockState, pos, false).renderInto(ms, vb); } protected Vector3d getHandOffset(DeployerTileEntity te, float partialTicks, BlockState blockState) { float distance = te.getHandOffset(partialTicks); - return Vector3d.of(blockState.get(FACING).getDirectionVec()).scale(distance); + return Vector3d.atLowerCornerOf(blockState.getValue(FACING).getNormal()).scale(distance); } protected BlockState getRenderedBlockState(KineticTileEntity te) { @@ -140,10 +140,10 @@ public class DeployerRenderer extends SafeTileEntityRenderer private static SuperByteBuffer transform(World world, SuperByteBuffer buffer, BlockState deployerState, BlockPos pos, boolean axisDirectionMatters) { - Direction facing = deployerState.get(FACING); + Direction facing = deployerState.getValue(FACING); float zRotLast = - axisDirectionMatters && (deployerState.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Axis.Z) ? 90 + axisDirectionMatters && (deployerState.getValue(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Axis.Z) ? 90 : 0; float yRot = AngleHelper.horizontalAngle(facing); float zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; @@ -151,13 +151,13 @@ public class DeployerRenderer extends SafeTileEntityRenderer buffer.rotateCentered(Direction.SOUTH, (float) ((zRot) / 180 * Math.PI)); buffer.rotateCentered(Direction.UP, (float) ((yRot) / 180 * Math.PI)); buffer.rotateCentered(Direction.SOUTH, (float) ((zRotLast) / 180 * Math.PI)); - buffer.light(WorldRenderer.getLightmapCoordinates(world, deployerState, pos)); + buffer.light(WorldRenderer.getLightColor(world, deployerState, pos)); return buffer; } public static void renderInContraption(MovementContext context, PlacementSimulationWorld renderWorld, ContraptionMatrices matrices, IRenderTypeBuffer buffer) { - IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); + IVertexBuilder builder = buffer.getBuffer(RenderType.solid()); BlockState blockState = context.state; BlockPos pos = BlockPos.ZERO; Mode mode = NBTHelper.readEnum(context.tileData, "Mode", Mode.class); @@ -178,11 +178,11 @@ public class DeployerRenderer extends SafeTileEntityRenderer factor = .5f - MathHelper.clamp(MathHelper.lerp(AnimationTickHolder.getPartialTicks(), distance, nextDistance), 0, 1); } - Vector3d offset = Vector3d.of(blockState.get(FACING) - .getDirectionVec()).scale(factor); + Vector3d offset = Vector3d.atLowerCornerOf(blockState.getValue(FACING) + .getNormal()).scale(factor); MatrixStack m = matrices.contraptionStack; - m.push(); + m.pushPose(); m.translate(offset.x, offset.y, offset.z); pole.transform(m); @@ -195,7 +195,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer hand.light(matrices.entityMatrix, ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld)) .renderInto(matrices.entityStack, builder); - m.pop(); + m.popPose(); } static PartialModel getHandPose(DeployerTileEntity.Mode mode) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 8c69d61d9..b8af6dae6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -104,24 +104,24 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public void initialize() { super.initialize(); - if (!world.isRemote) { - player = new DeployerFakePlayer((ServerWorld) world); + if (!level.isClientSide) { + player = new DeployerFakePlayer((ServerWorld) level); if (deferredInventoryList != null) { - player.inventory.read(deferredInventoryList); + player.inventory.load(deferredInventoryList); deferredInventoryList = null; - heldItem = player.getHeldItemMainhand(); + heldItem = player.getMainHandItem(); sendData(); } - Vector3d initialPos = VecHelper.getCenterOf(pos.offset(getBlockState().get(FACING))); - player.setPosition(initialPos.x, initialPos.y, initialPos.z); + Vector3d initialPos = VecHelper.getCenterOf(worldPosition.relative(getBlockState().getValue(FACING))); + player.setPos(initialPos.x, initialPos.y, initialPos.z); } invHandler = LazyOptional.of(this::createHandler); } protected void onExtract(ItemStack stack) { - player.setHeldItem(Hand.MAIN_HAND, stack.copy()); + player.setItemInHand(Hand.MAIN_HAND, stack.copy()); sendData(); - markDirty(); + setChanged(); } protected int getTimerSpeed() { @@ -134,9 +134,9 @@ public class DeployerTileEntity extends KineticTileEntity { if (getSpeed() == 0) return; - if (!world.isRemote && player != null && player.blockBreakingProgress != null) { - if (world.isAirBlock(player.blockBreakingProgress.getKey())) { - world.sendBlockBreakProgress(player.getEntityId(), player.blockBreakingProgress.getKey(), -1); + if (!level.isClientSide && player != null && player.blockBreakingProgress != null) { + if (level.isEmptyBlock(player.blockBreakingProgress.getKey())) { + level.destroyBlockProgress(player.getId(), player.blockBreakingProgress.getKey(), -1); player.blockBreakingProgress = null; } } @@ -144,10 +144,10 @@ public class DeployerTileEntity extends KineticTileEntity { timer -= getTimerSpeed(); return; } - if (world.isRemote) + if (level.isClientSide) return; - ItemStack stack = player.getHeldItemMainhand(); + ItemStack stack = player.getMainHandItem(); if (state == State.WAITING) { if (!overflowItems.isEmpty()) { timer = getTimerSpeed() * 10; @@ -155,15 +155,15 @@ public class DeployerTileEntity extends KineticTileEntity { } boolean changed = false; - for (int i = 0; i < player.inventory.getSizeInventory(); i++) { + for (int i = 0; i < player.inventory.getContainerSize(); i++) { if (overflowItems.size() > 10) break; - ItemStack item = player.inventory.getStackInSlot(i); + ItemStack item = player.inventory.getItem(i); if (item.isEmpty()) continue; if (item != stack || !filtering.test(item)) { overflowItems.add(item); - player.inventory.setInventorySlotContents(i, ItemStack.EMPTY); + player.inventory.setItem(i, ItemStack.EMPTY); changed = true; } } @@ -174,8 +174,8 @@ public class DeployerTileEntity extends KineticTileEntity { return; } - Direction facing = getBlockState().get(FACING); - if (mode == Mode.USE && !DeployerHandler.shouldActivate(stack, world, pos.offset(facing, 2), facing)) { + Direction facing = getBlockState().getValue(FACING); + if (mode == Mode.USE && !DeployerHandler.shouldActivate(stack, level, worldPosition.relative(facing, 2), facing)) { timer = getTimerSpeed() * 10; return; } @@ -213,14 +213,14 @@ public class DeployerTileEntity extends KineticTileEntity { protected void start() { state = State.EXPANDING; Vector3d movementVector = getMovementVector(); - Vector3d rayOrigin = VecHelper.getCenterOf(pos) + Vector3d rayOrigin = VecHelper.getCenterOf(worldPosition) .add(movementVector.scale(3 / 2f)); - Vector3d rayTarget = VecHelper.getCenterOf(pos) + Vector3d rayTarget = VecHelper.getCenterOf(worldPosition) .add(movementVector.scale(5 / 2f)); RayTraceContext rayTraceContext = new RayTraceContext(rayOrigin, rayTarget, BlockMode.OUTLINE, FluidMode.NONE, player); - BlockRayTraceResult result = world.rayTraceBlocks(rayTraceContext); - reach = (float) (.5f + Math.min(result.getHitVec() + BlockRayTraceResult result = level.clip(rayTraceContext); + reach = (float) (.5f + Math.min(result.getLocation() .subtract(rayOrigin) .length(), .75f)); timer = 1000; @@ -228,17 +228,17 @@ public class DeployerTileEntity extends KineticTileEntity { } public boolean startBoop(Direction facing) { - if (!world.isAirBlock(pos.offset(facing, 1)) || !world.isAirBlock(pos.offset(facing, 2))) + if (!level.isEmptyBlock(worldPosition.relative(facing, 1)) || !level.isEmptyBlock(worldPosition.relative(facing, 2))) return false; - BlockPos otherDeployer = pos.offset(facing, 4); - if (!world.isBlockPresent(otherDeployer)) + BlockPos otherDeployer = worldPosition.relative(facing, 4); + if (!level.isLoaded(otherDeployer)) return false; - TileEntity otherTile = world.getTileEntity(otherDeployer); + TileEntity otherTile = level.getBlockEntity(otherDeployer); if (!(otherTile instanceof DeployerTileEntity)) return false; DeployerTileEntity deployerTile = (DeployerTileEntity) otherTile; - if (world.getBlockState(otherDeployer) - .get(FACING) + if (level.getBlockState(otherDeployer) + .getValue(FACING) .getOpposite() != facing || deployerTile.mode != Mode.PUNCH) return false; @@ -251,7 +251,7 @@ public class DeployerTileEntity extends KineticTileEntity { } public void triggerBoop() { - TileEntity otherTile = world.getTileEntity(pos.offset(getBlockState().get(FACING), 4)); + TileEntity otherTile = level.getBlockEntity(worldPosition.relative(getBlockState().getValue(FACING), 4)); if (!(otherTile instanceof DeployerTileEntity)) return; @@ -270,32 +270,32 @@ public class DeployerTileEntity extends KineticTileEntity { // award nearby players List players = - world.getEntitiesWithinAABB(ServerPlayerEntity.class, new AxisAlignedBB(pos).grow(9)); + level.getEntitiesOfClass(ServerPlayerEntity.class, new AxisAlignedBB(worldPosition).inflate(9)); players.forEach(AllTriggers.DEPLOYER_BOOP::trigger); } protected void activate() { Vector3d movementVector = getMovementVector(); - Direction direction = getBlockState().get(FACING); - Vector3d center = VecHelper.getCenterOf(pos); - BlockPos clickedPos = pos.offset(direction, 2); - player.rotationYaw = direction.getHorizontalAngle(); - player.rotationPitch = direction == Direction.UP ? -90 : direction == Direction.DOWN ? 90 : 0; + Direction direction = getBlockState().getValue(FACING); + Vector3d center = VecHelper.getCenterOf(worldPosition); + BlockPos clickedPos = worldPosition.relative(direction, 2); + player.yRot = direction.toYRot(); + player.xRot = direction == Direction.UP ? -90 : direction == Direction.DOWN ? 90 : 0; if (direction == Direction.DOWN - && TileEntityBehaviour.get(world, clickedPos, TransportedItemStackHandlerBehaviour.TYPE) != null) + && TileEntityBehaviour.get(level, clickedPos, TransportedItemStackHandlerBehaviour.TYPE) != null) return; // Belt processing handled in BeltDeployerCallbacks DeployerHandler.activate(player, center, clickedPos, movementVector, mode); if (player != null) - heldItem = player.getHeldItemMainhand(); + heldItem = player.getMainHandItem(); } protected Vector3d getMovementVector() { if (!AllBlocks.DEPLOYER.has(getBlockState())) return Vector3d.ZERO; - return Vector3d.of(getBlockState().get(FACING) - .getDirectionVec()); + return Vector3d.atLowerCornerOf(getBlockState().getValue(FACING) + .getNormal()); } @Override @@ -308,16 +308,16 @@ public class DeployerTileEntity extends KineticTileEntity { deferredInventoryList = compound.getList("Inventory", NBT.TAG_COMPOUND); overflowItems = NBTHelper.readItemList(compound.getList("Overflow", NBT.TAG_COMPOUND)); if (compound.contains("HeldItem")) - heldItem = ItemStack.read(compound.getCompound("HeldItem")); + heldItem = ItemStack.of(compound.getCompound("HeldItem")); super.fromTag(blockState, compound, clientPacket); if (!clientPacket) return; reach = compound.getFloat("Reach"); if (compound.contains("Particle")) { - ItemStack particleStack = ItemStack.read(compound.getCompound("Particle")); - SandPaperItem.spawnParticles(VecHelper.getCenterOf(pos) - .add(getMovementVector().scale(reach + 1)), particleStack, this.world); + ItemStack particleStack = ItemStack.of(compound.getCompound("Particle")); + SandPaperItem.spawnParticles(VecHelper.getCenterOf(worldPosition) + .add(getMovementVector().scale(reach + 1)), particleStack, this.level); } } @@ -330,9 +330,9 @@ public class DeployerTileEntity extends KineticTileEntity { if (player != null) { ListNBT invNBT = new ListNBT(); - player.inventory.write(invNBT); + player.inventory.save(invNBT); compound.put("Inventory", invNBT); - compound.put("HeldItem", player.getHeldItemMainhand().serializeNBT()); + compound.put("HeldItem", player.getMainHandItem().serializeNBT()); compound.put("Overflow", NBTHelper.writeItemList(overflowItems)); } else if (deferredInventoryList != null) { compound.put("Inventory", deferredInventoryList); @@ -345,7 +345,7 @@ public class DeployerTileEntity extends KineticTileEntity { compound.putFloat("Reach", reach); if (player == null) return; - compound.put("HeldItem", player.getHeldItemMainhand() + compound.put("HeldItem", player.getMainHandItem() .serializeNBT()); if (player.spawnedItemEffects != null) { compound.put("Particle", player.spawnedItemEffects.serializeNBT()); @@ -358,9 +358,9 @@ public class DeployerTileEntity extends KineticTileEntity { } public void redstoneUpdate() { - if (world.isRemote) + if (level.isClientSide) return; - boolean blockPowered = world.isBlockPowered(pos); + boolean blockPowered = level.hasNeighborSignal(worldPosition); if (blockPowered == redstoneLocked) return; redstoneLocked = blockPowered; @@ -374,19 +374,19 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public AxisAlignedBB makeRenderBoundingBox() { - return super.makeRenderBoundingBox().grow(3); + return super.makeRenderBoundingBox().inflate(3); } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); if (invHandler != null) invHandler.invalidate(); } public void changeMode() { mode = mode == Mode.PUNCH ? Mode.USE : Mode.PUNCH; - markDirty(); + setChanged(); sendData(); } @@ -444,21 +444,21 @@ public class DeployerTileEntity extends KineticTileEntity { public IRecipe getRecipe(ItemStack stack) { if (player == null) return null; - ItemStack heldItemMainhand = player.getHeldItemMainhand(); + ItemStack heldItemMainhand = player.getMainHandItem(); if (heldItemMainhand.getItem() instanceof SandPaperItem) { - sandpaperInv.setInventorySlotContents(0, stack); - return AllRecipeTypes.SANDPAPER_POLISHING.find(sandpaperInv, world) + sandpaperInv.setItem(0, stack); + return AllRecipeTypes.SANDPAPER_POLISHING.find(sandpaperInv, level) .orElse(null); } - recipeInv.setInventorySlotContents(0, stack); - recipeInv.setInventorySlotContents(1, heldItemMainhand); + recipeInv.setItem(0, stack); + recipeInv.setItem(1, heldItemMainhand); - Optional assemblyRecipe = SequencedAssemblyRecipe.getRecipe(world, recipeInv, + Optional assemblyRecipe = SequencedAssemblyRecipe.getRecipe(level, recipeInv, AllRecipeTypes.DEPLOYING.getType(), DeployerApplicationRecipe.class); if (assemblyRecipe.isPresent()) return assemblyRecipe.get(); - return AllRecipeTypes.DEPLOYING.find(recipeInv, world) + return AllRecipeTypes.DEPLOYING.find(recipeInv, level) .orElse(null); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java index 72001c7ee..97f522e18 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java @@ -46,10 +46,10 @@ import net.minecraftforge.fml.DistExecutor; public class AirCurrent { - private static final DamageSource damageSourceFire = new DamageSource("create.fan_fire").setDifficultyScaled() - .setFireDamage(); - private static final DamageSource damageSourceLava = new DamageSource("create.fan_lava").setDifficultyScaled() - .setFireDamage(); + private static final DamageSource damageSourceFire = new DamageSource("create.fan_fire").setScalesWithDifficulty() + .setIsFire(); + private static final DamageSource damageSourceLava = new DamageSource("create.fan_lava").setScalesWithDifficulty() + .setIsFire(); public final IAirCurrentSource source; public AxisAlignedBB bounds = new AxisAlignedBB(0, 0, 0, 0, 0, 0); @@ -73,12 +73,12 @@ public class AirCurrent { rebuild(); World world = source.getAirCurrentWorld(); Direction facing = direction; - if (world != null && world.isRemote) { + if (world != null && world.isClientSide) { float offset = pushing ? 0.5f : maxDistance + .5f; Vector3d pos = VecHelper.getCenterOf(source.getAirCurrentPos()) - .add(Vector3d.of(facing.getDirectionVec()) + .add(Vector3d.atLowerCornerOf(facing.getNormal()) .scale(offset)); - if (world.rand.nextFloat() < AllConfigs.CLIENT.fanParticleDensity.get()) + if (world.random.nextFloat() < AllConfigs.CLIENT.fanParticleDensity.get()) world.addParticle(new AirFlowParticleData(source.getAirCurrentPos()), pos.x, pos.y, pos.z, 0, 0, 0); } @@ -95,14 +95,14 @@ public class AirCurrent { } Vector3d center = VecHelper.getCenterOf(source.getAirCurrentPos()); - Vector3i flow = (pushing ? facing : facing.getOpposite()).getDirectionVec(); + Vector3i flow = (pushing ? facing : facing.getOpposite()).getNormal(); - float sneakModifier = entity.isSneaking() ? 4096f : 512f; + float sneakModifier = entity.isShiftKeyDown() ? 4096f : 512f; float speed = Math.abs(source.getSpeed()); - double entityDistance = entity.getPositionVec() + double entityDistance = entity.position() .distanceTo(center); float acceleration = (float) (speed / sneakModifier / (entityDistance / maxDistance)); - Vector3d previousMotion = entity.getMotion(); + Vector3d previousMotion = entity.getDeltaMovement(); float maxAcceleration = 5; double xIn = @@ -112,13 +112,13 @@ public class AirCurrent { double zIn = MathHelper.clamp(flow.getZ() * acceleration - previousMotion.z, -maxAcceleration, maxAcceleration); - entity.setMotion(previousMotion.add(new Vector3d(xIn, yIn, zIn).scale(1 / 8f))); + entity.setDeltaMovement(previousMotion.add(new Vector3d(xIn, yIn, zIn).scale(1 / 8f))); entity.fallDistance = 0; DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> enableClientPlayerSound(entity, MathHelper.clamp(speed / 128f * .4f, 0.01f, .4f))); if (entity instanceof ServerPlayerEntity) - ((ServerPlayerEntity) entity).connection.floatingTickCount = 0; + ((ServerPlayerEntity) entity).connection.aboveGroundTickCount = 0; entityDistance -= .5f; InWorldProcessing.Type processingType = getSegmentAt((float) entityDistance); @@ -131,41 +131,41 @@ public class AirCurrent { } if (entity instanceof ItemEntity) { - InWorldProcessing.spawnParticlesForProcessing(world, entity.getPositionVec(), processingType); + InWorldProcessing.spawnParticlesForProcessing(world, entity.position(), processingType); ItemEntity itemEntity = (ItemEntity) entity; - if (world.isRemote) + if (world.isClientSide) continue; if (InWorldProcessing.canProcess(itemEntity, processingType)) InWorldProcessing.applyProcessing(itemEntity, processingType); continue; } - if (world.isRemote) + if (world.isClientSide) continue; switch (processingType) { case BLASTING: - if (!entity.isFireImmune()) { - entity.setFire(10); - entity.attackEntityFrom(damageSourceLava, 4); + if (!entity.fireImmune()) { + entity.setSecondsOnFire(10); + entity.hurt(damageSourceLava, 4); } break; case SMOKING: - if (!entity.isFireImmune()) { - entity.setFire(2); - entity.attackEntityFrom(damageSourceFire, 2); + if (!entity.fireImmune()) { + entity.setSecondsOnFire(2); + entity.hurt(damageSourceFire, 2); } break; case SPLASHING: if (entity instanceof EndermanEntity || entity.getType() == EntityType.SNOW_GOLEM || entity.getType() == EntityType.BLAZE) { - entity.attackEntityFrom(DamageSource.DROWN, 2); + entity.hurt(DamageSource.DROWN, 2); } - if (!entity.isBurning()) + if (!entity.isOnFire()) break; - entity.extinguish(); - world.playSound(null, entity.getBlockPos(), SoundEvents.ENTITY_GENERIC_EXTINGUISH_FIRE, - SoundCategory.NEUTRAL, 0.7F, 1.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.4F); + entity.clearFire(); + world.playSound(null, entity.blockPosition(), SoundEvents.GENERIC_EXTINGUISH_FIRE, + SoundCategory.NEUTRAL, 0.7F, 1.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.4F); break; default: break; @@ -190,7 +190,7 @@ public class AirCurrent { BlockPos start = source.getAirCurrentPos(); float max = this.maxDistance; Direction facing = direction; - Vector3d directionVec = Vector3d.of(facing.getDirectionVec()); + Vector3d directionVec = Vector3d.atLowerCornerOf(facing.getNormal()); maxDistance = getFlowLimit(world, start, max, facing); // Determine segments with transported fluids/gases @@ -205,7 +205,7 @@ public class AirCurrent { int searchStep = pushing ? 1 : -1; for (int i = searchStart; i * searchStep <= searchEnd * searchStep; i += searchStep) { - BlockPos currentPos = start.offset(direction, i); + BlockPos currentPos = start.relative(direction, i); InWorldProcessing.Type newType = InWorldProcessing.Type.byBlock(world, currentPos); if (newType != Type.NONE) type = newType; @@ -228,40 +228,40 @@ public class AirCurrent { float factor = maxDistance - 1; Vector3d scale = directionVec.scale(factor); if (factor > 0) - bounds = new AxisAlignedBB(start.offset(direction)).expand(scale); + bounds = new AxisAlignedBB(start.relative(direction)).expandTowards(scale); else { - bounds = new AxisAlignedBB(start.offset(direction)).contract(scale.x, scale.y, scale.z) - .offset(scale); + bounds = new AxisAlignedBB(start.relative(direction)).contract(scale.x, scale.y, scale.z) + .move(scale); } } findAffectedHandlers(); } public static float getFlowLimit(World world, BlockPos start, float max, Direction facing) { - Vector3d directionVec = Vector3d.of(facing.getDirectionVec()); + Vector3d directionVec = Vector3d.atLowerCornerOf(facing.getNormal()); Vector3d planeVec = VecHelper.axisAlingedPlaneOf(directionVec); // 4 Rays test for holes in the shapes blocking the flow float offsetDistance = .25f; - Vector3d[] offsets = new Vector3d[] { planeVec.mul(offsetDistance, offsetDistance, offsetDistance), - planeVec.mul(-offsetDistance, -offsetDistance, offsetDistance), - planeVec.mul(offsetDistance, -offsetDistance, -offsetDistance), - planeVec.mul(-offsetDistance, offsetDistance, -offsetDistance), }; + Vector3d[] offsets = new Vector3d[] { planeVec.multiply(offsetDistance, offsetDistance, offsetDistance), + planeVec.multiply(-offsetDistance, -offsetDistance, offsetDistance), + planeVec.multiply(offsetDistance, -offsetDistance, -offsetDistance), + planeVec.multiply(-offsetDistance, offsetDistance, -offsetDistance), }; float limitedDistance = 0; // Determine the distance of the air flow Outer: for (int i = 1; i <= max; i++) { - BlockPos currentPos = start.offset(facing, i); - if (!world.isBlockPresent(currentPos)) + BlockPos currentPos = start.relative(facing, i); + if (!world.isLoaded(currentPos)) break; BlockState state = world.getBlockState(currentPos); if (shouldAlwaysPass(state)) continue; - VoxelShape voxelshape = state.getCollisionShape(world, currentPos, ISelectionContext.dummy()); + VoxelShape voxelshape = state.getCollisionShape(world, currentPos, ISelectionContext.empty()); if (voxelshape.isEmpty()) continue; - if (voxelshape == VoxelShapes.fullCube()) { + if (voxelshape == VoxelShapes.block()) { max = i - 1; break; } @@ -272,11 +272,11 @@ public class AirCurrent { .add(offset); Vector3d rayEnd = rayStart.add(directionVec.scale(1 + 1 / 32f)); BlockRayTraceResult blockraytraceresult = - world.rayTraceBlocks(rayStart, rayEnd, currentPos, voxelshape, state); + world.clipWithInteractionOverride(rayStart, rayEnd, currentPos, voxelshape, state); if (blockraytraceresult == null) continue Outer; - double distance = i - 1 + blockraytraceresult.getHitVec() + double distance = i - 1 + blockraytraceresult.getLocation() .distanceTo(rayStart); if (limitedDistance < distance) limitedDistance = (float) distance; @@ -291,7 +291,7 @@ public class AirCurrent { public void findEntities() { caughtEntities.clear(); caughtEntities = source.getAirCurrentWorld() - .getEntitiesWithinAABBExcludingEntity(null, bounds); + .getEntities(null, bounds); } public void findAffectedHandlers() { @@ -304,8 +304,8 @@ public class AirCurrent { continue; for (int offset : Iterate.zeroAndOne) { - BlockPos pos = start.offset(direction, i) - .down(offset); + BlockPos pos = start.relative(direction, i) + .below(offset); TransportedItemStackHandlerBehaviour behaviour = TileEntityBehaviour.get(world, pos, TransportedItemStackHandlerBehaviour.TYPE); if (behaviour != null) @@ -326,7 +326,7 @@ public class AirCurrent { handler.handleProcessingOnAllItems((transported) -> { InWorldProcessing.spawnParticlesForProcessing(world, handler.getWorldPositionOf(transported), processingType); - if (world.isRemote) + if (world.isClientSide) return TransportedResult.doNothing(); return InWorldProcessing.applyProcessing(transported, world, processingType); }); @@ -360,18 +360,18 @@ public class AirCurrent { @OnlyIn(Dist.CLIENT) private static void enableClientPlayerSound(Entity e, float maxVolume) { if (e != Minecraft.getInstance() - .getRenderViewEntity()) + .getCameraEntity()) return; isClientPlayerInAirCurrent = true; - float pitch = (float) MathHelper.clamp(e.getMotion() + float pitch = (float) MathHelper.clamp(e.getDeltaMovement() .length() * .5f, .5f, 2f); - if (flyingSound == null || flyingSound.isDonePlaying()) { - flyingSound = new AirCurrentSound(SoundEvents.ITEM_ELYTRA_FLYING, pitch); + if (flyingSound == null || flyingSound.isStopped()) { + flyingSound = new AirCurrentSound(SoundEvents.ELYTRA_FLYING, pitch); Minecraft.getInstance() - .getSoundHandler() + .getSoundManager() .play(flyingSound); } flyingSound.setPitch(pitch); @@ -382,7 +382,7 @@ public class AirCurrent { public static void tickClientPlayerSounds() { if (!AirCurrent.isClientPlayerInAirCurrent && flyingSound != null) if (flyingSound.isFaded()) - flyingSound.stop(); + flyingSound.stopSound(); else flyingSound.fadeOut(); isClientPlayerInAirCurrent = false; @@ -391,7 +391,7 @@ public class AirCurrent { public static boolean isPlayerCreativeFlying(Entity entity) { if (entity instanceof PlayerEntity) { PlayerEntity player = (PlayerEntity) entity; - return player.isCreative() && player.abilities.isFlying; + return player.isCreative() && player.abilities.flying; } return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java index 7a9c4a7db..72a39910b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java @@ -12,9 +12,9 @@ public class AirCurrentSound extends TickableSound { super(p_i46532_1_, SoundCategory.BLOCKS); this.pitch = pitch; volume = 0.01f; - repeat = true; - repeatDelay = 0; - global = true; + looping = true; + delay = 0; + relative = true; } @Override @@ -23,26 +23,26 @@ public class AirCurrentSound extends TickableSound { public void setPitch(float pitch) { this.pitch = pitch; } - + public void fadeIn(float maxVolume) { volume = Math.min(maxVolume, volume + .05f); } - + public void fadeOut() { volume = Math.max(0, volume - .05f); } - + public boolean isFaded() { return volume == 0; } - + @Override public float getPitch() { return pitch; } - - public void stop() { - setDone(); + + public void stopSound() { + stop(); } - + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java index 8cb03c361..6cd3cc491 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java @@ -31,22 +31,22 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE te.queueGeneratorUpdate()); } @@ -91,19 +91,19 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE 0) speed = MathHelper.clamp(speed, 80, 64 * 20); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java index 16da67993..fc1730c97 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java @@ -78,11 +78,11 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements if (!AllBlocks.ENCASED_FAN.has(blockState)) shouldGenerate = false; - if (shouldGenerate && blockState.get(EncasedFanBlock.FACING) != Direction.DOWN) + if (shouldGenerate && blockState.getValue(EncasedFanBlock.FACING) != Direction.DOWN) shouldGenerate = false; if (shouldGenerate) - shouldGenerate = world != null && world.isBlockPowered(pos) && world.isBlockPresent(pos.down()) && blockBelowIsHot(); + shouldGenerate = level != null && level.hasNeighborSignal(worldPosition) && level.isLoaded(worldPosition.below()) && blockBelowIsHot(); if (shouldGenerate == isGenerator) return; @@ -91,19 +91,19 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements } public boolean blockBelowIsHot() { - if (world == null) + if (level == null) return false; - BlockState checkState = world.getBlockState(pos.down()); + BlockState checkState = level.getBlockState(worldPosition.below()); if (!checkState.getBlock() - .isIn(AllBlockTags.FAN_HEATERS.tag)) + .is(AllBlockTags.FAN_HEATERS.tag)) return false; - if (checkState.contains(BlazeBurnerBlock.HEAT_LEVEL) && !checkState.get(BlazeBurnerBlock.HEAT_LEVEL) + if (checkState.hasProperty(BlazeBurnerBlock.HEAT_LEVEL) && !checkState.getValue(BlazeBurnerBlock.HEAT_LEVEL) .isAtLeast(BlazeBurnerBlock.HeatLevel.FADING)) return false; - if (checkState.contains(BlockStateProperties.LIT) && !checkState.get(BlockStateProperties.LIT)) + if (checkState.hasProperty(BlockStateProperties.LIT) && !checkState.getValue(BlockStateProperties.LIT)) return false; return true; @@ -117,18 +117,18 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements @Nullable @Override public World getAirCurrentWorld() { - return world; + return level; } @Override public BlockPos getAirCurrentPos() { - return pos; + return worldPosition; } @Override public Direction getAirflowOriginSide() { return this.getBlockState() - .get(EncasedFanBlock.FACING); + .getValue(EncasedFanBlock.FACING); } @Override @@ -136,14 +136,14 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements float speed = getSpeed(); if (speed == 0) return null; - Direction facing = getBlockState().get(BlockStateProperties.FACING); + Direction facing = getBlockState().getValue(BlockStateProperties.FACING); speed = convertToDirection(speed, facing); return speed > 0 ? facing : facing.getOpposite(); } @Override public boolean isSourceRemoved() { - return removed; + return remove; } @Override @@ -154,11 +154,11 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements } public void updateChute() { - Direction direction = getBlockState().get(EncasedFanBlock.FACING); + Direction direction = getBlockState().getValue(EncasedFanBlock.FACING); if (!direction.getAxis() .isVertical()) return; - TileEntity poweredChute = world.getTileEntity(pos.offset(direction)); + TileEntity poweredChute = level.getBlockEntity(worldPosition.relative(direction)); if (!(poweredChute instanceof ChuteTileEntity)) return; ChuteTileEntity chuteTE = (ChuteTileEntity) poweredChute; @@ -176,7 +176,7 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements public void tick() { super.tick(); - boolean server = !world.isRemote || isVirtual(); + boolean server = !level.isClientSide || isVirtual(); if (server && airCurrentUpdateCooldown-- <= 0) { airCurrentUpdateCooldown = AllConfigs.SERVER.kinetics.fanBlockCheckRate.get(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java index 5bae092ce..9b6956c4d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java @@ -2,10 +2,11 @@ package com.simibubi.create.content.contraptions.components.fan; import static net.minecraft.state.properties.BlockStateProperties.FACING; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.foundation.render.AllMaterialSpecs; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -21,11 +22,14 @@ public class FanInstance extends KineticTileInstance { public FanInstance(MaterialManager modelManager, EncasedFanTileEntity tile) { super(modelManager, tile); - direction = blockState.get(FACING); + direction = blockState.getValue(FACING); opposite = direction.getOpposite(); shaft = getRotatingMaterial().getModel(AllBlockPartials.SHAFT_HALF, blockState, opposite).createInstance(); - fan = getRotatingMaterial().getModel(AllBlockPartials.ENCASED_FAN_INNER, blockState, opposite).createInstance(); + fan = modelManager.defaultCutout() + .material(AllMaterialSpecs.ROTATING) + .getModel(AllBlockPartials.ENCASED_FAN_INNER, blockState, opposite) + .createInstance(); setup(shaft); setup(fan, getFanSpeed()); @@ -48,10 +52,10 @@ public class FanInstance extends KineticTileInstance { @Override public void updateLight() { - BlockPos behind = pos.offset(opposite); + BlockPos behind = pos.relative(opposite); relight(behind, shaft); - BlockPos inFront = pos.offset(direction); + BlockPos inFront = pos.relative(direction); relight(inFront, fan); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleBlock.java index b25a7d0d5..dc943711a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleBlock.java @@ -47,37 +47,37 @@ public class NozzleBlock extends ProperDirectionalBlock { @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return getDefaultState().with(FACING, context.getFace()); + return defaultBlockState().setValue(FACING, context.getClickedFace()); } @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.NOZZLE.get(state.get(FACING)); + return AllShapes.NOZZLE.get(state.getValue(FACING)); } @Override public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; - if (fromPos.equals(pos.offset(state.get(FACING).getOpposite()))) - if (!isValidPosition(state, worldIn, pos)) { + if (fromPos.equals(pos.relative(state.getValue(FACING).getOpposite()))) + if (!canSurvive(state, worldIn, pos)) { worldIn.destroyBlock(pos, true); return; } } @Override - public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { - Direction towardsFan = state.get(FACING).getOpposite(); - TileEntity te = worldIn.getTileEntity(pos.offset(towardsFan)); + public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos) { + Direction towardsFan = state.getValue(FACING).getOpposite(); + TileEntity te = worldIn.getBlockEntity(pos.relative(towardsFan)); return te instanceof IAirCurrentSource && ((IAirCurrentSource) te).getAirflowOriginSide() == towardsFan.getOpposite(); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java index 73066ab14..1ca0d1ee5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java @@ -61,7 +61,7 @@ public class NozzleTileEntity extends SmartTileEntity { @Override public void initialize() { - fanPos = pos.offset(getBlockState().get(NozzleBlock.FACING) + fanPos = worldPosition.relative(getBlockState().getValue(NozzleBlock.FACING) .getOpposite()); super.initialize(); } @@ -74,28 +74,28 @@ public class NozzleTileEntity extends SmartTileEntity { if (this.range != range) setRange(range); - Vector3d center = VecHelper.getCenterOf(pos); - if (world.isRemote && range != 0) { - if (world.rand.nextInt( + Vector3d center = VecHelper.getCenterOf(worldPosition); + if (level.isClientSide && range != 0) { + if (level.random.nextInt( MathHelper.clamp((AllConfigs.SERVER.kinetics.fanPushDistance.get() - (int) range), 1, 10)) == 0) { - Vector3d start = VecHelper.offsetRandomly(center, world.rand, pushing ? 1 : range / 2); + Vector3d start = VecHelper.offsetRandomly(center, level.random, pushing ? 1 : range / 2); Vector3d motion = center.subtract(start) .normalize() .scale(MathHelper.clamp(range * (pushing ? .025f : 1f), 0, .5f) * (pushing ? -1 : 1)); - world.addParticle(ParticleTypes.POOF, start.x, start.y, start.z, motion.x, motion.y, motion.z); + level.addParticle(ParticleTypes.POOF, start.x, start.y, start.z, motion.x, motion.y, motion.z); } } for (Iterator iterator = pushingEntities.iterator(); iterator.hasNext();) { Entity entity = iterator.next(); - Vector3d diff = entity.getPositionVec() + Vector3d diff = entity.position() .subtract(center); - if (!(entity instanceof PlayerEntity) && world.isRemote) + if (!(entity instanceof PlayerEntity) && level.isClientSide) continue; double distance = diff.length(); - if (distance > range || entity.isSneaking() || AirCurrent.isPlayerCreativeFlying(entity)) { + if (distance > range || entity.isShiftKeyDown() || AirCurrent.isPlayerCreativeFlying(entity)) { iterator.remove(); continue; } @@ -106,10 +106,10 @@ public class NozzleTileEntity extends SmartTileEntity { float factor = (entity instanceof ItemEntity) ? 1 / 128f : 1 / 32f; Vector3d pushVec = diff.normalize() .scale((range - distance) * (pushing ? 1 : -1)); - entity.setMotion(entity.getMotion() + entity.setDeltaMovement(entity.getDeltaMovement() .add(pushVec.scale(factor))); entity.fallDistance = 0; - entity.velocityChanged = true; + entity.hurtMarked = true; } } @@ -122,7 +122,7 @@ public class NozzleTileEntity extends SmartTileEntity { } private float calcRange() { - TileEntity te = world.getTileEntity(fanPos); + TileEntity te = level.getBlockEntity(fanPos); if (!(te instanceof IAirCurrentSource)) return 0; @@ -144,15 +144,15 @@ public class NozzleTileEntity extends SmartTileEntity { if (range == 0) return; - Vector3d center = VecHelper.getCenterOf(pos); - AxisAlignedBB bb = new AxisAlignedBB(center, center).grow(range / 2f); + Vector3d center = VecHelper.getCenterOf(worldPosition); + AxisAlignedBB bb = new AxisAlignedBB(center, center).inflate(range / 2f); - for (Entity entity : world.getEntitiesWithinAABB(Entity.class, bb)) { - Vector3d diff = entity.getPositionVec() + for (Entity entity : level.getEntitiesOfClass(Entity.class, bb)) { + Vector3d diff = entity.position() .subtract(center); double distance = diff.length(); - if (distance > range || entity.isSneaking() || AirCurrent.isPlayerCreativeFlying(entity)) + if (distance > range || entity.isShiftKeyDown() || AirCurrent.isPlayerCreativeFlying(entity)) continue; boolean canSee = canSee(entity); @@ -172,8 +172,8 @@ public class NozzleTileEntity extends SmartTileEntity { iterator.remove(); } - if (!pushing && pushingEntities.size() > 256 && !world.isRemote) { - world.createExplosion(null, center.x, center.y, center.z, 2, Mode.NONE); + if (!pushing && pushingEntities.size() > 256 && !level.isClientSide) { + level.explode(null, center.x, center.y, center.z, 2, Mode.NONE); for (Iterator iterator = pushingEntities.iterator(); iterator.hasNext();) { Entity entity = iterator.next(); entity.remove(); @@ -184,10 +184,10 @@ public class NozzleTileEntity extends SmartTileEntity { } private boolean canSee(Entity entity) { - RayTraceContext context = new RayTraceContext(entity.getPositionVec(), VecHelper.getCenterOf(pos), + RayTraceContext context = new RayTraceContext(entity.position(), VecHelper.getCenterOf(worldPosition), BlockMode.COLLIDER, FluidMode.NONE, entity); - return pos.equals(world.rayTraceBlocks(context) - .getPos()); + return worldPosition.equals(level.clip(context) + .getBlockPos()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java index 9a9801cc3..499f6c8ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java @@ -22,7 +22,7 @@ public class SplashingRecipe extends ProcessingRecipe im public FlyWheelInstance(MaterialManager modelManager, FlywheelTileEntity tile) { super(modelManager, tile); - facing = blockState.get(HORIZONTAL_FACING); + facing = blockState.getValue(HORIZONTAL_FACING); shaft = setup(shaftModel().createInstance()); BlockState referenceState = blockState.rotate(Rotation.CLOCKWISE_90); - wheel = getTransformMaterial().getModel(AllBlockPartials.FLYWHEEL, referenceState, referenceState.get(HORIZONTAL_FACING)).createInstance(); + wheel = getTransformMaterial().getModel(AllBlockPartials.FLYWHEEL, referenceState, referenceState.getValue(HORIZONTAL_FACING)).createInstance(); connection = FlywheelBlock.getConnection(blockState); if (connection != null) { - connectedLeft = blockState.get(FlywheelBlock.CONNECTION) == FlywheelBlock.ConnectionState.LEFT; + connectedLeft = blockState.getValue(FlywheelBlock.CONNECTION) == FlywheelBlock.ConnectionState.LEFT; boolean flipAngle = connection.getAxis() == Direction.Axis.X ^ connection.getAxisDirection() == Direction.AxisDirection.NEGATIVE; @@ -95,41 +95,41 @@ public class FlyWheelInstance extends KineticTileInstance im private void animate(float angle) { MatrixStack ms = new MatrixStack(); - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); msr.translate(getInstancePosition()); if (connection != null) { float rotation = angle * connectorAngleMult; - ms.push(); + ms.pushPose(); rotateToFacing(msr, connection); - ms.push(); + ms.pushPose(); transformConnector(msr, true, true, rotation, connectedLeft); upperRotating.setTransform(ms); - ms.pop(); + ms.popPose(); - ms.push(); + ms.pushPose(); transformConnector(msr, false, true, rotation, connectedLeft); lowerRotating.setTransform(ms); - ms.pop(); + ms.popPose(); - ms.push(); + ms.pushPose(); transformConnector(msr, true, false, rotation, connectedLeft); upperSliding.setTransform(ms); - ms.pop(); + ms.popPose(); - ms.push(); + ms.pushPose(); transformConnector(msr, false, false, rotation, connectedLeft); lowerSliding.setTransform(ms); - ms.pop(); + ms.popPose(); - ms.pop(); + ms.popPose(); } msr.centre() - .rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, facing.getAxis()), AngleHelper.rad(angle)) + .rotate(Direction.get(Direction.AxisDirection.POSITIVE, facing.getAxis()), AngleHelper.rad(angle)) .unCentre(); wheel.setTransform(ms); @@ -145,7 +145,7 @@ public class FlyWheelInstance extends KineticTileInstance im relight(pos, shaft, wheel); if (connection != null) { - relight(this.pos.offset(connection), connectors.stream()); + relight(this.pos.relative(connection), connectors.stream()); } } @@ -163,7 +163,7 @@ public class FlyWheelInstance extends KineticTileInstance im return getRotatingMaterial().getModel(AllBlockPartials.SHAFT_HALF, blockState, opposite); } - protected void transformConnector(MatrixStacker ms, boolean upper, boolean rotating, float angle, boolean flip) { + protected void transformConnector(MatrixTransformStack ms, boolean upper, boolean rotating, float angle, boolean flip) { float shift = upper ? 1 / 4f : -1 / 8f; float offset = upper ? 1 / 4f : 1 / 4f; float radians = (float) (angle / 180 * Math.PI); @@ -189,7 +189,7 @@ public class FlyWheelInstance extends KineticTileInstance im ms.translate(9 / 16f, 0, 0); } - protected void rotateToFacing(MatrixStacker buffer, Direction facing) { + protected void rotateToFacing(MatrixTransformStack buffer, Direction facing) { buffer.centre() .rotate(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing))) .unCentre(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelBlock.java index 607dcdd19..71762f6fa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelBlock.java @@ -29,12 +29,12 @@ public class FlywheelBlock extends HorizontalKineticBlock { public FlywheelBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(CONNECTION, ConnectionState.NONE)); + registerDefaultState(defaultBlockState().setValue(CONNECTION, ConnectionState.NONE)); } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(CONNECTION)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(CONNECTION)); } @Override @@ -46,8 +46,8 @@ public class FlywheelBlock extends HorizontalKineticBlock { public BlockState getStateForPlacement(BlockItemUseContext context) { Direction preferred = getPreferredHorizontalFacing(context); if (preferred != null) - return getDefaultState().with(HORIZONTAL_FACING, preferred.getOpposite()); - return this.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing()); + return defaultBlockState().setValue(HORIZONTAL_FACING, preferred.getOpposite()); + return this.defaultBlockState().setValue(HORIZONTAL_FACING, context.getHorizontalDirection()); } public static boolean isConnected(BlockState state) { @@ -55,37 +55,37 @@ public class FlywheelBlock extends HorizontalKineticBlock { } public static Direction getConnection(BlockState state) { - Direction facing = state.get(HORIZONTAL_FACING); - ConnectionState connection = state.get(CONNECTION); + Direction facing = state.getValue(HORIZONTAL_FACING); + ConnectionState connection = state.getValue(CONNECTION); if (connection == ConnectionState.LEFT) - return facing.rotateYCCW(); + return facing.getCounterClockWise(); if (connection == ConnectionState.RIGHT) - return facing.rotateY(); + return facing.getClockWise(); return null; } public static void setConnection(World world, BlockPos pos, BlockState state, Direction direction) { - Direction facing = state.get(HORIZONTAL_FACING); + Direction facing = state.getValue(HORIZONTAL_FACING); ConnectionState connection = ConnectionState.NONE; - if (direction == facing.rotateY()) + if (direction == facing.getClockWise()) connection = ConnectionState.RIGHT; - if (direction == facing.rotateYCCW()) + if (direction == facing.getCounterClockWise()) connection = ConnectionState.LEFT; - world.setBlockState(pos, state.with(CONNECTION, connection), 18); + world.setBlock(pos, state.setValue(CONNECTION, connection), 18); AllTriggers.triggerForNearbyPlayers(AllTriggers.FLYWHEEL, world, pos, 4); } @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face == state.get(HORIZONTAL_FACING).getOpposite(); + return face == state.getValue(HORIZONTAL_FACING).getOpposite(); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(HORIZONTAL_FACING).getAxis(); + return state.getValue(HORIZONTAL_FACING).getAxis(); } @Override @@ -94,23 +94,23 @@ public class FlywheelBlock extends HorizontalKineticBlock { if (connection == null) return super.onWrenched(state ,context); - if (context.getFace().getAxis() == state.get(HORIZONTAL_FACING).getAxis()) + if (context.getClickedFace().getAxis() == state.getValue(HORIZONTAL_FACING).getAxis()) return ActionResultType.PASS; - World world = context.getWorld(); - BlockPos enginePos = context.getPos().offset(connection, 2); + World world = context.getLevel(); + BlockPos enginePos = context.getClickedPos().relative(connection, 2); BlockState engine = world.getBlockState(enginePos); if (engine.getBlock() instanceof FurnaceEngineBlock) ((FurnaceEngineBlock) engine.getBlock()).withTileEntityDo(world, enginePos, EngineTileEntity::detachWheel); - return super.onWrenched(state.with(CONNECTION, ConnectionState.NONE), context); + return super.onWrenched(state.setValue(CONNECTION, ConnectionState.NONE), context); } public enum ConnectionState implements IStringSerializable { NONE, LEFT, RIGHT; @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelGenerator.java index 13dc7759d..9244651ad 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelGenerator.java @@ -17,14 +17,14 @@ public class FlywheelGenerator extends SpecialBlockStateGen { @Override protected int getYRotation(BlockState state) { - return horizontalAngle(state.get(FlywheelBlock.HORIZONTAL_FACING)) + 90; + return horizontalAngle(state.getValue(FlywheelBlock.HORIZONTAL_FACING)) + 90; } @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { return prov.models() - .getExistingFile(prov.modLoc("block/" + ctx.getName() + "/casing_" + state.get(FlywheelBlock.CONNECTION) - .getString())); + .getExistingFile(prov.modLoc("block/" + ctx.getName() + "/casing_" + state.getValue(FlywheelBlock.CONNECTION) + .getSerializedName())); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index fc67fbd98..6eac080f0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -36,7 +36,7 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; BlockState blockState = te.getBlockState(); FlywheelTileEntity wte = (FlywheelTileEntity) te; @@ -44,16 +44,16 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { float speed = wte.visualSpeed.get(partialTicks) * 3 / 10f; float angle = wte.angle + speed * partialTicks; - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + IVertexBuilder vb = buffer.getBuffer(RenderType.solid()); if (FlywheelBlock.isConnected(blockState)) { Direction connection = FlywheelBlock.getConnection(blockState); - light = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, te.getPos() - .offset(connection)); + light = WorldRenderer.getLightColor(te.getLevel(), blockState, te.getBlockPos() + .relative(connection)); float rotation = connection.getAxis() == Axis.X ^ connection.getAxisDirection() == AxisDirection.NEGATIVE ? -angle : angle; - boolean flip = blockState.get(FlywheelBlock.CONNECTION) == ConnectionState.LEFT; + boolean flip = blockState.getValue(FlywheelBlock.CONNECTION) == ConnectionState.LEFT; transformConnector( rotateToFacing(PartialBufferer.get(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, blockState), connection), true, true, @@ -77,9 +77,9 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { private void renderFlywheel(KineticTileEntity te, MatrixStack ms, int light, BlockState blockState, float angle, IVertexBuilder vb) { BlockState referenceState = blockState.rotate(Rotation.CLOCKWISE_90); - Direction facing = referenceState.get(BlockStateProperties.HORIZONTAL_FACING); + Direction facing = referenceState.getValue(BlockStateProperties.HORIZONTAL_FACING); SuperByteBuffer wheel = PartialBufferer.getFacing(AllBlockPartials.FLYWHEEL, referenceState, facing); - kineticRotationTransform(wheel, te, blockState.get(HORIZONTAL_FACING) + kineticRotationTransform(wheel, te, blockState.getValue(HORIZONTAL_FACING) .getAxis(), AngleHelper.rad(angle), light); wheel.renderInto(ms, vb); } @@ -87,7 +87,7 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { return PartialBufferer.getFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), te.getBlockState() - .get(BlockStateProperties.HORIZONTAL_FACING) + .getValue(BlockStateProperties.HORIZONTAL_FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java index b27ccb01c..ece43296c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java @@ -40,7 +40,7 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { @Override public float getGeneratedSpeed() { - return convertToDirection(generatedSpeed, getBlockState().get(FlywheelBlock.HORIZONTAL_FACING)); + return convertToDirection(generatedSpeed, getBlockState().getValue(FlywheelBlock.HORIZONTAL_FACING)); } @Override @@ -50,7 +50,7 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { @Override public AxisAlignedBB makeRenderBoundingBox() { - return super.makeRenderBoundingBox().grow(2); + return super.makeRenderBoundingBox().inflate(2); } @Override @@ -76,7 +76,7 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { public void tick() { super.tick(); - if (world.isRemote) { + if (level.isClientSide) { float targetSpeed = isVirtual() ? speed : getGeneratedSpeed(); visualSpeed.target(targetSpeed); visualSpeed.tick(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineBlock.java index a32696209..483c3f0da 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineBlock.java @@ -29,8 +29,8 @@ public abstract class EngineBlock extends HorizontalBlock implements IWrenchable } @Override - public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { - return isValidPosition(state, worldIn, pos, state.get(HORIZONTAL_FACING)); + public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos) { + return isValidPosition(state, worldIn, pos, state.getValue(FACING)); } @Override @@ -48,24 +48,24 @@ public abstract class EngineBlock extends HorizontalBlock implements IWrenchable @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - Direction facing = context.getFace(); - return getDefaultState().with(HORIZONTAL_FACING, - facing.getAxis().isVertical() ? context.getPlacementHorizontalFacing().getOpposite() : facing); + Direction facing = context.getClickedFace(); + return defaultBlockState().setValue(FACING, + facing.getAxis().isVertical() ? context.getHorizontalDirection().getOpposite() : facing); } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(HORIZONTAL_FACING)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(FACING)); } @Override public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; if (fromPos.equals(getBaseBlockPos(state, pos))) { - if (!isValidPosition(state, worldIn, pos)) { + if (!canSurvive(state, worldIn, pos)) { worldIn.destroyBlock(pos, true); return; } @@ -79,7 +79,7 @@ public abstract class EngineBlock extends HorizontalBlock implements IWrenchable for (Direction otherFacing : Iterate.horizontalDirections) { if (otherFacing == facing) continue; - BlockPos otherPos = baseBlockPos.offset(otherFacing); + BlockPos otherPos = baseBlockPos.relative(otherFacing); BlockState otherState = world.getBlockState(otherPos); if (otherState.getBlock() instanceof EngineBlock && getBaseBlockPos(otherState, otherPos).equals(baseBlockPos)) @@ -90,7 +90,7 @@ public abstract class EngineBlock extends HorizontalBlock implements IWrenchable } public static BlockPos getBaseBlockPos(BlockState state, BlockPos pos) { - return pos.offset(state.get(HORIZONTAL_FACING).getOpposite()); + return pos.relative(state.getValue(FACING).getOpposite()); } @Nullable diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java index 4ce123e96..230960d90 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java @@ -1,12 +1,12 @@ package com.simibubi.create.content.contraptions.components.flywheel.engine; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.materials.ModelData; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.Block; import net.minecraft.state.properties.BlockStateProperties; @@ -27,14 +27,14 @@ public class EngineInstance extends TileEntityInstance { EngineBlock engineBlock = (EngineBlock) block; PartialModel frame = engineBlock.getFrameModel(); - Direction facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING); + Direction facing = blockState.getValue(BlockStateProperties.HORIZONTAL_FACING); this.frame = getTransformMaterial().getModel(frame, blockState).createInstance(); float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing)); MatrixStack ms = new MatrixStack(); - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); msr.translate(getInstancePosition()) .nudge(tile.hashCode()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java index ce77b42ef..0d09715ae 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java @@ -24,7 +24,7 @@ public class EngineRenderer extends SafeTileEntityRe protected void renderSafe(T te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; Block block = te.getBlockState() .getBlock(); @@ -33,13 +33,13 @@ public class EngineRenderer extends SafeTileEntityRe PartialModel frame = engineBlock.getFrameModel(); if (frame != null) { Direction facing = te.getBlockState() - .get(EngineBlock.HORIZONTAL_FACING); + .getValue(EngineBlock.FACING); float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing)); PartialBufferer.get(frame, te.getBlockState()) .rotateCentered(Direction.UP, angle) .translate(0, 0, -1) - .light(WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getBlockState(), te.getPos())) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + .light(WorldRenderer.getLightColor(te.getLevel(), te.getBlockState(), te.getBlockPos())) + .renderInto(ms, buffer.getBuffer(RenderType.solid())); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java index 719a735ca..43eb4ee7c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java @@ -37,7 +37,7 @@ public class EngineTileEntity extends SmartTileEntity implements IInstanceRender @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { if (cachedBoundingBox == null) { - cachedBoundingBox = super.getRenderBoundingBox().grow(1.5f); + cachedBoundingBox = super.getRenderBoundingBox().inflate(1.5f); } return cachedBoundingBox; } @@ -45,7 +45,7 @@ public class EngineTileEntity extends SmartTileEntity implements IInstanceRender @Override public void lazyTick() { super.lazyTick(); - if (world.isRemote) + if (level.isClientSide) return; if (poweredWheel != null && poweredWheel.isRemoved()) poweredWheel = null; @@ -54,23 +54,23 @@ public class EngineTileEntity extends SmartTileEntity implements IInstanceRender } public void attachWheel() { - Direction engineFacing = getBlockState().get(EngineBlock.HORIZONTAL_FACING); - BlockPos wheelPos = pos.offset(engineFacing, 2); - BlockState wheelState = world.getBlockState(wheelPos); + Direction engineFacing = getBlockState().getValue(EngineBlock.FACING); + BlockPos wheelPos = worldPosition.relative(engineFacing, 2); + BlockState wheelState = level.getBlockState(wheelPos); if (!AllBlocks.FLYWHEEL.has(wheelState)) return; - Direction wheelFacing = wheelState.get(FlywheelBlock.HORIZONTAL_FACING); - if (wheelFacing.getAxis() != engineFacing.rotateY().getAxis()) + Direction wheelFacing = wheelState.getValue(FlywheelBlock.HORIZONTAL_FACING); + if (wheelFacing.getAxis() != engineFacing.getClockWise().getAxis()) return; if (FlywheelBlock.isConnected(wheelState) && FlywheelBlock.getConnection(wheelState) != engineFacing.getOpposite()) return; - TileEntity te = world.getTileEntity(wheelPos); + TileEntity te = level.getBlockEntity(wheelPos); if (te.isRemoved()) return; if (te instanceof FlywheelTileEntity) { if (!FlywheelBlock.isConnected(wheelState)) - FlywheelBlock.setConnection(world, te.getPos(), te.getBlockState(), engineFacing.getOpposite()); + FlywheelBlock.setConnection(level, te.getBlockPos(), te.getBlockState(), engineFacing.getOpposite()); poweredWheel = (FlywheelTileEntity) te; refreshWheelSpeed(); } @@ -80,14 +80,14 @@ public class EngineTileEntity extends SmartTileEntity implements IInstanceRender if (poweredWheel == null || poweredWheel.isRemoved()) return; poweredWheel.setRotation(0, 0); - FlywheelBlock.setConnection(world, poweredWheel.getPos(), poweredWheel.getBlockState(), null); + FlywheelBlock.setConnection(level, poweredWheel.getBlockPos(), poweredWheel.getBlockState(), null); poweredWheel = null; } @Override - public void remove() { + public void setRemoved() { detachWheel(); - super.remove(); + super.setRemoved(); } protected void refreshWheelSpeed() { @@ -96,4 +96,5 @@ public class EngineTileEntity extends SmartTileEntity implements IInstanceRender poweredWheel.setRotation(appliedSpeed, appliedCapacity); } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineBlock.java index e3083ac1a..6c034f883 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineBlock.java @@ -38,7 +38,7 @@ public class FurnaceEngineBlock extends EngineBlock implements ITE { @@ -80,7 +80,7 @@ public class MillstoneBlock extends KineticBlock implements ITE { ItemHelper.dropContents(worldIn, pos, te.inputInv); ItemHelper.dropContents(worldIn, pos, te.outputInv); }); - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } } @@ -141,7 +141,7 @@ public class MillstoneBlock extends KineticBlock implements ITE behaviours) { behaviours.add(new DirectBeltInputBehaviour(this)); super.addBehaviours(behaviours); } + @Override + @OnlyIn(Dist.CLIENT) + public void tickAudio() { + super.tickAudio(); + + if (getSpeed() == 0) + return; + if (inputInv.getStackInSlot(0) + .isEmpty()) + return; + + float pitch = MathHelper.clamp((Math.abs(getSpeed()) / 256f) + .45f, .85f, 1f); + SoundScapes.play(AmbienceGroup.MILLING, worldPosition, pitch); + } + @Override public void tick() { super.tick(); @@ -62,7 +81,7 @@ public class MillstoneTileEntity extends KineticTileEntity { if (timer > 0) { timer -= getProcessingSpeed(); - if (world.isRemote) { + if (level.isClientSide) { spawnParticles(); return; } @@ -76,8 +95,8 @@ public class MillstoneTileEntity extends KineticTileEntity { return; RecipeWrapper inventoryIn = new RecipeWrapper(inputInv); - if (lastRecipe == null || !lastRecipe.matches(inventoryIn, world)) { - Optional recipe = AllRecipeTypes.MILLING.find(inventoryIn, world); + if (lastRecipe == null || !lastRecipe.matches(inventoryIn, level)) { + Optional recipe = AllRecipeTypes.MILLING.find(inventoryIn, level); if (!recipe.isPresent()) { timer = 100; sendData(); @@ -94,16 +113,16 @@ public class MillstoneTileEntity extends KineticTileEntity { } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); capability.invalidate(); } - + private void process() { RecipeWrapper inventoryIn = new RecipeWrapper(inputInv); - if (lastRecipe == null || !lastRecipe.matches(inventoryIn, world)) { - Optional recipe = AllRecipeTypes.MILLING.find(inventoryIn, world); + if (lastRecipe == null || !lastRecipe.matches(inventoryIn, level)) { + Optional recipe = AllRecipeTypes.MILLING.find(inventoryIn, level); if (!recipe.isPresent()) return; lastRecipe = recipe.get(); @@ -115,7 +134,7 @@ public class MillstoneTileEntity extends KineticTileEntity { lastRecipe.rollResults() .forEach(stack -> ItemHandlerHelper.insertItemStacked(outputInv, stack, false)); sendData(); - markDirty(); + setChanged(); } public void spawnParticles() { @@ -124,14 +143,14 @@ public class MillstoneTileEntity extends KineticTileEntity { return; ItemParticleData data = new ItemParticleData(ParticleTypes.ITEM, stackInSlot); - float angle = world.rand.nextFloat() * 360; + float angle = level.random.nextFloat() * 360; Vector3d offset = new Vector3d(0, 0, 0.5f); offset = VecHelper.rotate(offset, angle, Axis.Y); Vector3d target = VecHelper.rotate(offset, getSpeed() > 0 ? 25 : -25, Axis.Y); - Vector3d center = offset.add(VecHelper.getCenterOf(pos)); - target = VecHelper.offsetRandomly(target.subtract(offset), world.rand, 1 / 128f); - world.addParticle(data, center.x, center.y, center.z, target.x, target.y, target.z); + Vector3d center = offset.add(VecHelper.getCenterOf(worldPosition)); + target = VecHelper.offsetRandomly(target.subtract(offset), level.random, 1 / 128f); + level.addParticle(data, center.x, center.y, center.z, target.x, target.y, target.z); } @Override @@ -166,9 +185,9 @@ public class MillstoneTileEntity extends KineticTileEntity { tester.setStackInSlot(0, stack); RecipeWrapper inventoryIn = new RecipeWrapper(tester); - if (lastRecipe != null && lastRecipe.matches(inventoryIn, world)) + if (lastRecipe != null && lastRecipe.matches(inventoryIn, level)) return true; - return AllRecipeTypes.MILLING.find(inventoryIn, world) + return AllRecipeTypes.MILLING.find(inventoryIn, level) .isPresent(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/BasinOperatorBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/BasinOperatorBlockItem.java deleted file mode 100644 index e6831212e..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/BasinOperatorBlockItem.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.simibubi.create.content.contraptions.components.mixer; - -import com.simibubi.create.AllBlocks; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.BlockItem; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; - -public class BasinOperatorBlockItem extends BlockItem { - - public BasinOperatorBlockItem(Block block, Properties builder) { - super(block, builder); - } - - @Override - public ActionResultType tryPlace(BlockItemUseContext context) { - BlockPos placedOnPos = context.getPos() - .offset(context.getFace() - .getOpposite()); - BlockState placedOnState = context.getWorld() - .getBlockState(placedOnPos); - if (AllBlocks.BASIN.has(placedOnState) || AllBlocks.BELT.has(placedOnState) - || AllBlocks.DEPOT.has(placedOnState) || AllBlocks.WEIGHTED_EJECTOR.has(placedOnState)) { - if (context.getWorld() - .getBlockState(placedOnPos.up(2)) - .getMaterial() - .isReplaceable()) - context = BlockItemUseContext.func_221536_a(context, placedOnPos.up(2), Direction.UP); - else - return ActionResultType.FAIL; - } - - return super.tryPlace(context); - } - -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerBlock.java index 1d20436b9..5e618fef9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerBlock.java @@ -31,8 +31,8 @@ public class MechanicalMixerBlock extends KineticBlock implements ITE bte.setAreFluidsMoving(running && runningTicks <= 20)); } @@ -116,15 +116,16 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { if (runningTicks >= 40) { running = false; runningTicks = 0; + basinChecker.scheduleUpdate(); return; } float speed = Math.abs(getSpeed()); - if (running && world != null) { - if (world.isRemote && runningTicks == 20) + if (running && level != null) { + if (level.isClientSide && runningTicks == 20) renderParticles(); - if ((!world.isRemote || isVirtual()) && runningTicks == 20) { + if ((!level.isClientSide || isVirtual()) && runningTicks == 20) { if (processingTicks < 0) { processingTicks = MathHelper.clamp((MathHelper.log2((int) (512 / speed))) * 15 + 1, 1, 512); @@ -136,7 +137,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { .isEmpty() || !tanks.getSecond() .isEmpty()) - world.playSound(null, pos, SoundEvents.BLOCK_BUBBLE_COLUMN_WHIRLPOOL_AMBIENT, + level.playSound(null, worldPosition, SoundEvents.BUBBLE_COLUMN_WHIRLPOOL_AMBIENT, SoundCategory.BLOCKS, .75f, speed < 65 ? .75f : 1.5f); } @@ -158,13 +159,13 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { public void renderParticles() { Optional basin = getBasin(); - if (!basin.isPresent() || world == null) + if (!basin.isPresent() || level == null) return; for (SmartInventory inv : basin.get() .getInvs()) { for (int slot = 0; slot < inv.getSlots(); slot++) { - ItemStack stackInSlot = inv.getStackInSlot(slot); + ItemStack stackInSlot = inv.getItem(slot); if (stackInSlot.isEmpty()) continue; ItemParticleData data = new ItemParticleData(ParticleTypes.ITEM, stackInSlot); @@ -185,14 +186,14 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { } protected void spillParticle(IParticleData data) { - float angle = world.rand.nextFloat() * 360; + float angle = level.random.nextFloat() * 360; Vector3d offset = new Vector3d(0, 0, 0.25f); offset = VecHelper.rotate(offset, angle, Axis.Y); Vector3d target = VecHelper.rotate(offset, getSpeed() > 0 ? 25 : -25, Axis.Y) .add(0, .25f, 0); - Vector3d center = offset.add(VecHelper.getCenterOf(pos)); - target = VecHelper.offsetRandomly(target.subtract(offset), world.rand, 1 / 128f); - world.addParticle(data, center.x, center.y - 1.75f, center.z, target.x, target.y, target.z); + Vector3d center = offset.add(VecHelper.getCenterOf(worldPosition)); + target = VecHelper.offsetRandomly(target.subtract(offset), level.random, 1 / 128f); + level.addParticle(data, center.x, center.y - 1.75f, center.z, target.x, target.y, target.z); } @Override @@ -226,10 +227,10 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { @Override protected boolean matchStaticFilters(IRecipe r) { - return ((r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS + return ((r.getSerializer() == IRecipeSerializer.SHAPELESS_RECIPE && AllConfigs.SERVER.recipes.allowShapelessInMixer.get() && r.getIngredients() .size() > 1) - || r.getType() == AllRecipeTypes.MIXING.type); + || r.getType() == AllRecipeTypes.MIXING.getType()); } @Override @@ -280,7 +281,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { if (slow && AnimationTickHolder.getTicks() % 2 == 0) return; if (runningTicks == 20) - AllSoundEvents.MIXING.playAt(world, pos, .75f, 1, true); + AllSoundEvents.MIXING.playAt(level, worldPosition, .75f, 1, true); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java index 7aac448c8..b2fe1b653 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.components.mixer; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.core.materials.OrientedData; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.RotatingData; @@ -66,7 +66,7 @@ public class MixerInstance extends ShaftlessCogInstance implements IDynamicInsta public void updateLight() { super.updateLight(); - relight(pos.down(), mixerHead); + relight(pos.below(), mixerHead); relight(pos, mixerPole); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java index 7239a505e..0d137fe2e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java @@ -24,7 +24,7 @@ public class CreativeMotorBlock extends DirectionalKineticBlock { @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.MOTOR_BLOCK.get(state.get(FACING)); + return AllShapes.MOTOR_BLOCK.get(state.getValue(FACING)); } @Override @@ -36,21 +36,21 @@ public class CreativeMotorBlock extends DirectionalKineticBlock { public BlockState getStateForPlacement(BlockItemUseContext context) { Direction preferred = getPreferredFacing(context); if ((context.getPlayer() != null && context.getPlayer() - .isSneaking()) || preferred == null) + .isShiftKeyDown()) || preferred == null) return super.getStateForPlacement(context); - return getDefaultState().with(FACING, preferred); + return defaultBlockState().setValue(FACING, preferred); } // IRotate: @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face == state.get(FACING); + return face == state.getValue(FACING); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(FACING) + return state.getValue(FACING) .getAxis(); } @@ -60,7 +60,7 @@ public class CreativeMotorBlock extends DirectionalKineticBlock { } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorGenerator.java index a26c54d41..032783bb6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorGenerator.java @@ -14,20 +14,20 @@ public class CreativeMotorGenerator extends SpecialBlockStateGen { @Override protected int getXRotation(BlockState state) { - return state.get(CreativeMotorBlock.FACING) == Direction.DOWN ? 180 : 0; + return state.getValue(CreativeMotorBlock.FACING) == Direction.DOWN ? 180 : 0; } @Override protected int getYRotation(BlockState state) { - return state.get(CreativeMotorBlock.FACING) + return state.getValue(CreativeMotorBlock.FACING) .getAxis() - .isVertical() ? 0 : horizontalAngle(state.get(CreativeMotorBlock.FACING)); + .isVertical() ? 0 : horizontalAngle(state.getValue(CreativeMotorBlock.FACING)); } @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - return state.get(CreativeMotorBlock.FACING) + return state.getValue(CreativeMotorBlock.FACING) .getAxis() .isVertical() ? AssetLookup.partialBaseModel(ctx, prov, "vertical") : AssetLookup.partialBaseModel(ctx, prov); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java index 1f0168b87..4509f6ff8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java @@ -28,7 +28,7 @@ public class CreativeMotorTileEntity extends GeneratingKineticTileEntity { Integer max = AllConfigs.SERVER.kinetics.maxMotorSpeed.get(); CenteredSideValueBoxTransform slot = new CenteredSideValueBoxTransform( - (motor, side) -> motor.get(CreativeMotorBlock.FACING) == side.getOpposite()); + (motor, side) -> motor.getValue(CreativeMotorBlock.FACING) == side.getOpposite()); generatedSpeed = new ScrollValueBehaviour(Lang.translate("generic.speed"), this, slot); generatedSpeed.between(-max, max); @@ -51,7 +51,7 @@ public class CreativeMotorTileEntity extends GeneratingKineticTileEntity { public float getGeneratedSpeed() { if (!AllBlocks.CREATIVE_MOTOR.has(getBlockState())) return 0; - return convertToDirection(generatedSpeed.getValue(), getBlockState().get(CreativeMotorBlock.FACING)); + return convertToDirection(generatedSpeed.getValue(), getBlockState().getValue(CreativeMotorBlock.FACING)); } public static int step(StepContext context) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java index 3c4c63ef4..1af77a41f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java @@ -84,7 +84,7 @@ public class BeltPressingCallbacks { handler.handleProcessingOnItem(transported, TransportedResult.convertToAndLeaveHeld(collect, left)); } - AllTriggers.triggerForNearbyPlayers(AllTriggers.BONK, pressTe.getWorld(), pressTe.getPos(), 4); + AllTriggers.triggerForNearbyPlayers(AllTriggers.BONK, pressTe.getLevel(), pressTe.getBlockPos(), 4); pressTe.sendData(); return HOLD; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java index 8de328a78..e05d44501 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java @@ -33,8 +33,8 @@ public class MechanicalPressBlock extends HorizontalKineticBlock implements ITE< } @Override - public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { - return !AllBlocks.BASIN.has(worldIn.getBlockState(pos.down())); + public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos) { + return !AllBlocks.BASIN.has(worldIn.getBlockState(pos.below())); } @Override @@ -46,19 +46,19 @@ public class MechanicalPressBlock extends HorizontalKineticBlock implements ITE< public BlockState getStateForPlacement(BlockItemUseContext context) { Direction prefferedSide = getPreferredHorizontalFacing(context); if (prefferedSide != null) - return getDefaultState().with(HORIZONTAL_FACING, prefferedSide); + return defaultBlockState().setValue(HORIZONTAL_FACING, prefferedSide); return super.getStateForPlacement(context); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(HORIZONTAL_FACING) + return state.getValue(HORIZONTAL_FACING) .getAxis(); } @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.get(HORIZONTAL_FACING) + return face.getAxis() == state.getValue(HORIZONTAL_FACING) .getAxis(); } @@ -68,7 +68,7 @@ public class MechanicalPressBlock extends HorizontalKineticBlock implements ITE< } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java index 2b31d4afc..731294f2c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java @@ -24,7 +24,7 @@ public class MechanicalPressRenderer extends KineticTileEntityRenderer { } @Override - public boolean isGlobalRenderer(KineticTileEntity te) { + public boolean shouldRenderOffScreen(KineticTileEntity te) { return true; } @@ -33,17 +33,17 @@ public class MechanicalPressRenderer extends KineticTileEntityRenderer { int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; - BlockPos pos = te.getPos(); + BlockPos pos = te.getBlockPos(); BlockState blockState = te.getBlockState(); - int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); + int packedLightmapCoords = WorldRenderer.getLightColor(te.getLevel(), blockState, pos); float renderedHeadOffset = ((MechanicalPressTileEntity) te).getRenderedHeadOffset(partialTicks); - SuperByteBuffer headRender = PartialBufferer.getFacing(AllBlockPartials.MECHANICAL_PRESS_HEAD, blockState, blockState.get(HORIZONTAL_FACING)); + SuperByteBuffer headRender = PartialBufferer.getFacing(AllBlockPartials.MECHANICAL_PRESS_HEAD, blockState, blockState.getValue(HORIZONTAL_FACING)); headRender.translate(0, -renderedHeadOffset, 0) .light(packedLightmapCoords) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + .renderInto(ms, buffer.getBuffer(RenderType.solid())); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java index d6bbb96c3..27ac4f416 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java @@ -86,7 +86,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { if (clientPacket) { NBTHelper.iterateCompoundList(compound.getList("ParticleItems", NBT.TAG_COMPOUND), - c -> pressedItems.add(ItemStack.read(c))); + c -> pressedItems.add(ItemStack.of(c))); spawnParticles(); } } @@ -107,8 +107,8 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { @Override public AxisAlignedBB makeRenderBoundingBox() { - return new AxisAlignedBB(pos).expand(0, -1.5, 0) - .expand(0, 1, 0); + return new AxisAlignedBB(worldPosition).expandTowards(0, -1.5, 0) + .expandTowards(0, 1, 0); } public float getRenderedHeadOffset(float partialTicks) { @@ -142,8 +142,8 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { public void tick() { super.tick(); - if (!running || world == null) { - if (hasWorld() && !world.isRemote) { + if (!running || level == null) { + if (hasLevel() && !level.isClientSide) { if (getSpeed() == 0) return; @@ -151,13 +151,13 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { entityScanCooldown--; if (entityScanCooldown <= 0) { entityScanCooldown = ENTITY_SCAN; - if (TileEntityBehaviour.get(world, pos.down(2), TransportedItemStackHandlerBehaviour.TYPE) != null) + if (TileEntityBehaviour.get(level, worldPosition.below(2), TransportedItemStackHandlerBehaviour.TYPE) != null) return; - if (AllBlocks.BASIN.has(world.getBlockState(pos.down(2)))) + if (AllBlocks.BASIN.has(level.getBlockState(worldPosition.below(2)))) return; - for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class, - new AxisAlignedBB(pos.down()).shrink(.125f))) { + for (ItemEntity itemEntity : level.getEntitiesOfClass(ItemEntity.class, + new AxisAlignedBB(worldPosition.below()).deflate(.125f))) { if (!itemEntity.isAlive() || !itemEntity.isOnGround()) continue; ItemStack stack = itemEntity.getItem(); @@ -173,7 +173,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { return; } - if (world.isRemote && runningTicks == -CYCLE / 2) { + if (level.isClientSide && runningTicks == -CYCLE / 2) { prevRunningTicks = CYCLE / 2; return; } @@ -184,21 +184,25 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { if (onBasin()) applyCompactingOnBasin(); - if (world.getBlockState(pos.down(2)).getSoundType() == SoundType.CLOTH) - AllSoundEvents.MECHANICAL_PRESS_ACTIVATION_ON_BELT.playOnServer(world, pos); + if (level.getBlockState(worldPosition.below(2)).getSoundType() == SoundType.WOOL) + AllSoundEvents.MECHANICAL_PRESS_ACTIVATION_ON_BELT.playOnServer(level, worldPosition); else - AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.playOnServer(world, pos, .5f, .75f + (Math.abs(getSpeed()) / 1024f)); + AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.playOnServer(level, worldPosition, .5f, .75f + (Math.abs(getSpeed()) / 1024f)); - if (!world.isRemote) + if (!level.isClientSide) sendData(); } - if (!world.isRemote && runningTicks > CYCLE) { + if (!level.isClientSide && runningTicks > CYCLE) { finished = true; running = false; - if (onBasin() && matchBasinRecipe(currentRecipe)) + if (onBasin() && matchBasinRecipe(currentRecipe) + && getBasin().filter(BasinTileEntity::canContinueProcessing) + .isPresent()) startProcessingBasin(); + else + basinChecker.scheduleUpdate(); pressedItems.clear(); sendData(); @@ -210,13 +214,13 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { if (prevRunningTicks < CYCLE / 2 && runningTicks >= CYCLE / 2) { runningTicks = CYCLE / 2; // Pause the ticks until a packet is received - if (world.isRemote && !isVirtual()) + if (level.isClientSide && !isVirtual()) runningTicks = -(CYCLE / 2); } } protected void applyCompactingOnBasin() { - if (world.isRemote) + if (level.isClientSide) return; pressedItems.clear(); applyBasinRecipe(); @@ -225,7 +229,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { .getInputInventory(); if (basin.isPresent()) { for (int slot = 0; slot < inputs.getSlots(); slot++) { - ItemStack stackInSlot = inputs.getStackInSlot(slot); + ItemStack stackInSlot = inputs.getItem(slot); if (stackInSlot.isEmpty()) continue; pressedItems.add(stackInSlot); @@ -235,12 +239,12 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { } protected void applyPressingInWorld() { - AxisAlignedBB bb = new AxisAlignedBB(pos.down(1)); + AxisAlignedBB bb = new AxisAlignedBB(worldPosition.below(1)); boolean bulk = canProcessInBulk(); pressedItems.clear(); - if (world.isRemote) + if (level.isClientSide) return; - for (Entity entity : world.getEntitiesWithinAABBExcludingEntity(null, bb)) { + for (Entity entity : level.getEntities(null, bb)) { if (!(entity instanceof ItemEntity)) continue; if (!entity.isAlive() || !entity.isOnGround()) @@ -259,15 +263,15 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { for (ItemStack result : InWorldProcessing.applyRecipeOn(ItemHandlerHelper.copyStackWithSize(item, 1), recipe.get())) { ItemEntity created = - new ItemEntity(world, itemEntity.getX(), itemEntity.getY(), itemEntity.getZ(), result); - created.setDefaultPickupDelay(); - created.setMotion(VecHelper.offsetRandomly(Vector3d.ZERO, Create.RANDOM, .05f)); - world.addEntity(created); + new ItemEntity(level, itemEntity.getX(), itemEntity.getY(), itemEntity.getZ(), result); + created.setDefaultPickUpDelay(); + created.setDeltaMovement(VecHelper.offsetRandomly(Vector3d.ZERO, Create.RANDOM, .05f)); + level.addFreshEntity(created); } item.shrink(1); } - AllTriggers.triggerForNearbyPlayers(AllTriggers.BONK, world, pos, 4); + AllTriggers.triggerForNearbyPlayers(AllTriggers.BONK, level, worldPosition, 4); entityScanCooldown = 0; if (!bulk) @@ -290,35 +294,35 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { return; if (mode == Mode.BASIN) - pressedItems.forEach(stack -> makeCompactingParticleEffect(VecHelper.getCenterOf(pos.down(2)), stack)); + pressedItems.forEach(stack -> makeCompactingParticleEffect(VecHelper.getCenterOf(worldPosition.below(2)), stack)); if (mode == Mode.BELT) - pressedItems.forEach(stack -> makePressingParticleEffect(VecHelper.getCenterOf(pos.down(2)) + pressedItems.forEach(stack -> makePressingParticleEffect(VecHelper.getCenterOf(worldPosition.below(2)) .add(0, 8 / 16f, 0), stack)); if (mode == Mode.WORLD) - pressedItems.forEach(stack -> makePressingParticleEffect(VecHelper.getCenterOf(pos.down(1)) + pressedItems.forEach(stack -> makePressingParticleEffect(VecHelper.getCenterOf(worldPosition.below(1)) .add(0, -1 / 4f, 0), stack)); pressedItems.clear(); } public void makePressingParticleEffect(Vector3d pos, ItemStack stack) { - if (world == null || !world.isRemote) + if (level == null || !level.isClientSide) return; for (int i = 0; i < 20; i++) { - Vector3d motion = VecHelper.offsetRandomly(Vector3d.ZERO, world.rand, .125f) - .mul(1, 0, 1); - world.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), pos.x, pos.y - .25f, pos.z, motion.x, + Vector3d motion = VecHelper.offsetRandomly(Vector3d.ZERO, level.random, .125f) + .multiply(1, 0, 1); + level.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), pos.x, pos.y - .25f, pos.z, motion.x, motion.y + .125f, motion.z); } } public void makeCompactingParticleEffect(Vector3d pos, ItemStack stack) { - if (world == null || !world.isRemote) + if (level == null || !level.isClientSide) return; for (int i = 0; i < 20; i++) { - Vector3d motion = VecHelper.offsetRandomly(Vector3d.ZERO, world.rand, .175f) - .mul(1, 0, 1); - world.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), pos.x, pos.y, pos.z, motion.x, + Vector3d motion = VecHelper.offsetRandomly(Vector3d.ZERO, level.random, .175f) + .multiply(1, 0, 1); + level.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), pos.x, pos.y, pos.z, motion.x, motion.y + .25f, motion.z); } } @@ -327,12 +331,12 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { public Optional getRecipe(ItemStack item) { Optional assemblyRecipe = - SequencedAssemblyRecipe.getRecipe(world, item, AllRecipeTypes.PRESSING.getType(), PressingRecipe.class); + SequencedAssemblyRecipe.getRecipe(level, item, AllRecipeTypes.PRESSING.getType(), PressingRecipe.class); if (assemblyRecipe.isPresent()) return assemblyRecipe; - pressingInv.setInventorySlotContents(0, item); - return AllRecipeTypes.PRESSING.find(pressingInv, world); + pressingInv.setItem(0, item); + return AllRecipeTypes.PRESSING.find(pressingInv, level); } public static boolean canCompress(NonNullList ingredients) { @@ -344,7 +348,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { @Override protected boolean matchStaticFilters(IRecipe recipe) { return (recipe instanceof ICraftingRecipe && canCompress(recipe.getIngredients())) - || recipe.getType() == AllRecipeTypes.COMPACTING.type; + || recipe.getType() == AllRecipeTypes.COMPACTING.getType(); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java index 866fd4fa3..500295183 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java @@ -1,7 +1,8 @@ package com.simibubi.create.content.contraptions.components.press; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.OrientedData; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; @@ -20,11 +21,12 @@ public class PressInstance extends ShaftInstance implements IDynamicInstance { super(dispatcher, tile); press = tile; - pressHead = dispatcher.getOrientedMaterial() + pressHead = dispatcher.defaultSolid() + .material(Materials.ORIENTED) .getModel(AllBlockPartials.MECHANICAL_PRESS_HEAD, blockState) .createInstance(); - Quaternion q = Vector3f.POSITIVE_Y.getDegreesQuaternion(AngleHelper.horizontalAngle(blockState.get(MechanicalPressBlock.HORIZONTAL_FACING))); + Quaternion q = Vector3f.YP.rotationDegrees(AngleHelper.horizontalAngle(blockState.getValue(MechanicalPressBlock.HORIZONTAL_FACING))); pressHead.setRotation(q); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java index 4f9374ec1..f68c4abeb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java @@ -34,7 +34,7 @@ public class PressingRecipe extends ProcessingRecipe implements I if (inv.isEmpty()) return false; return ingredients.get(0) - .test(inv.getStackInSlot(0)); + .test(inv.getItem(0)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/CuttingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/CuttingRecipe.java index eddb48062..0933bec29 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/CuttingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/CuttingRecipe.java @@ -34,7 +34,7 @@ public class CuttingRecipe extends ProcessingRecipe implements IA if (inv.isEmpty()) return false; return ingredients.get(0) - .test(inv.getStackInSlot(0)); + .test(inv.getItem(0)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java index a4458acd7..cebba49a6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java @@ -33,7 +33,7 @@ import net.minecraft.world.World; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class SawBlock extends DirectionalAxisKineticBlock implements ITE { - public static DamageSource damageSourceSaw = new DamageSource("create.mechanical_saw").setDamageBypassesArmor(); + public static DamageSource damageSourceSaw = new DamageSource("create.mechanical_saw").bypassArmor(); public SawBlock(Properties properties) { super(properties); @@ -42,10 +42,10 @@ public class SawBlock extends DirectionalAxisKineticBlock implements ITE { if (te.getSpeed() == 0) return; - entityIn.attackEntityFrom(damageSourceSaw, (float) DrillBlock.getDamage(te.getSpeed())); + entityIn.hurt(damageSourceSaw, (float) DrillBlock.getDamage(te.getSpeed())); }); } @Override - public void onLanded(IBlockReader worldIn, Entity entityIn) { - super.onLanded(worldIn, entityIn); + public void updateEntityAfterFallOn(IBlockReader worldIn, Entity entityIn) { + super.updateEntityAfterFallOn(worldIn, entityIn); if (!(entityIn instanceof ItemEntity)) return; - if (entityIn.world.isRemote) + if (entityIn.level.isClientSide) return; - BlockPos pos = entityIn.getBlockPos(); - withTileEntityDo(entityIn.world, pos, te -> { + BlockPos pos = entityIn.blockPosition(); + withTileEntityDo(entityIn.level, pos, te -> { if (te.getSpeed() == 0) return; te.insertItem((ItemEntity) entityIn); @@ -88,33 +88,33 @@ public class SawBlock extends DirectionalAxisKineticBlock implements ITE ItemHelper.dropContents(worldIn, pos, te.inventory)); TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } @Override @@ -123,7 +123,7 @@ public class SawBlock extends DirectionalAxisKineticBlock implements ITE ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { String path = "block/" + ctx.getName() + "/"; - String orientation = state.get(SawBlock.FACING) + String orientation = state.getValue(SawBlock.FACING) .getAxis() .isVertical() ? "vertical" : "horizontal"; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java index 287e1b80f..59fcc7589 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.saw; import static net.minecraft.state.properties.BlockStateProperties.FACING; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatingData; @@ -21,9 +21,9 @@ public class SawInstance extends SingleRotatingInstance { @Override protected Instancer getModel() { - if (blockState.get(FACING).getAxis().isHorizontal()) { - BlockState referenceState = blockState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180); - Direction facing = referenceState.get(FACING); + if (blockState.getValue(FACING).getAxis().isHorizontal()) { + BlockState referenceState = blockState.rotate(tile.getLevel(), tile.getBlockPos(), Rotation.CLOCKWISE_180); + Direction facing = referenceState.getValue(FACING); return getRotatingMaterial().getModel(AllBlockPartials.SHAFT_HALF, referenceState, facing); } else { return getRotatingMaterial().getModel(shaft()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 3d0ab3a95..91e468f99 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -4,6 +4,7 @@ import static net.minecraft.state.properties.BlockStateProperties.FACING; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.core.PartialModel; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; @@ -17,7 +18,6 @@ import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; @@ -50,7 +50,7 @@ public class SawRenderer extends SafeTileEntityRenderer { FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); if (Backend.getInstance() - .canUseInstancing(te.getWorld())) + .canUseInstancing(te.getLevel())) return; renderShaft(te, ms, buffer, light, overlay); @@ -79,7 +79,7 @@ public class SawRenderer extends SafeTileEntityRenderer { partial = AllBlockPartials.SAW_BLADE_VERTICAL_INACTIVE; } - if (!blockState.get(SawBlock.AXIS_ALONG_FIRST_COORDINATE)) + if (!blockState.getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE)) rotate = true; } @@ -89,22 +89,22 @@ public class SawRenderer extends SafeTileEntityRenderer { } superBuffer.color(0xFFFFFF) .light(light) - .renderInto(ms, buffer.getBuffer(RenderType.getCutoutMipped())); + .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); } protected void renderShaft(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te), ms, - buffer.getBuffer(RenderType.getSolid()), light); + buffer.getBuffer(RenderType.solid()), light); } protected void renderItems(SawTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { boolean processingMode = te.getBlockState() - .get(SawBlock.FACING) == Direction.UP; + .getValue(SawBlock.FACING) == Direction.UP; if (processingMode && !te.inventory.isEmpty()) { boolean alongZ = !te.getBlockState() - .get(SawBlock.AXIS_ALONG_FIRST_COORDINATE); - ms.push(); + .getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE); + ms.pushPose(); boolean moving = te.inventory.recipeDuration != 0; float offset = moving ? (float) (te.inventory.remainingTime) / te.inventory.recipeDuration : 0; @@ -129,30 +129,30 @@ public class SawRenderer extends SafeTileEntityRenderer { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); - IBakedModel modelWithOverrides = itemRenderer.getItemModelWithOverrides(stack, te.getWorld(), null); + IBakedModel modelWithOverrides = itemRenderer.getModel(stack, te.getLevel(), null); boolean blockItem = modelWithOverrides.isGui3d(); ms.translate(alongZ ? offset : .5, blockItem ? .925f : 13f / 16f, alongZ ? .5 : offset); ms.scale(.5f, .5f, .5f); if (alongZ) - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(90)); - ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(90)); - itemRenderer.renderItem(stack, ItemCameraTransforms.TransformType.FIXED, light, overlay, ms, buffer); + ms.mulPose(Vector3f.YP.rotationDegrees(90)); + ms.mulPose(Vector3f.XP.rotationDegrees(90)); + itemRenderer.renderStatic(stack, ItemCameraTransforms.TransformType.FIXED, light, overlay, ms, buffer); break; } - ms.pop(); + ms.popPose(); } } protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { BlockState state = te.getBlockState(); - if (state.get(FACING) + if (state.getValue(FACING) .getAxis() .isHorizontal()) return PartialBufferer.getFacing(AllBlockPartials.SHAFT_HALF, - state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); + state.rotate(te.getLevel(), te.getBlockPos(), Rotation.CLOCKWISE_180)); return CreateClient.BUFFER_CACHE.renderBlockIn(KineticTileEntityRenderer.KINETIC_TILE, getRenderedBlockState(te)); } @@ -164,13 +164,13 @@ public class SawRenderer extends SafeTileEntityRenderer { public static void renderInContraption(MovementContext context, PlacementSimulationWorld renderWorld, ContraptionMatrices matrices, IRenderTypeBuffer buffer) { BlockState state = context.state; - Direction facing = state.get(SawBlock.FACING); + Direction facing = state.getValue(SawBlock.FACING); - Vector3d facingVec = Vector3d.of(context.state.get(SawBlock.FACING) - .getDirectionVec()); + Vector3d facingVec = Vector3d.atLowerCornerOf(context.state.getValue(SawBlock.FACING) + .getNormal()); facingVec = context.rotation.apply(facingVec); - Direction closestToFacing = Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z); + Direction closestToFacing = Direction.getNearest(facingVec.x, facingVec.y, facingVec.z); boolean horizontal = closestToFacing.getAxis() .isHorizontal(); @@ -193,22 +193,22 @@ public class SawRenderer extends SafeTileEntityRenderer { } MatrixStack m = matrices.contraptionStack; - m.push(); - MatrixStacker.of(m) + m.pushPose(); + MatrixTransformStack.of(m) .centre() .rotateY(AngleHelper.horizontalAngle(facing)) .rotateX(AngleHelper.verticalAngle(facing)); if (!SawBlock.isHorizontal(state)) - MatrixStacker.of(m) - .rotateZ(state.get(SawBlock.AXIS_ALONG_FIRST_COORDINATE) ? 0 : 90); - MatrixStacker.of(m) + MatrixTransformStack.of(m) + .rotateZ(state.getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE) ? 0 : 90); + MatrixTransformStack.of(m) .unCentre(); superBuffer.transform(m) .light(matrices.entityMatrix, ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld)) - .renderInto(matrices.entityStack, buffer.getBuffer(RenderType.getCutoutMipped())); + .renderInto(matrices.entityStack, buffer.getBuffer(RenderType.cutoutMipped())); - m.pop(); + m.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java index 4ce0f6878..f05dba37e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java @@ -22,6 +22,7 @@ import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.utility.AbstractBlockBreakQueue; import com.simibubi.create.foundation.utility.TreeCutter; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.recipe.RecipeConditions; @@ -55,6 +56,7 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.LazyValue; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; @@ -70,9 +72,11 @@ import net.minecraftforge.items.IItemHandler; @MethodsReturnNonnullByDefault public class SawTileEntity extends BlockBreakingKineticTileEntity { + private static final AxisAlignedBB RENDER_BOX = new AxisAlignedBB(0, 0, 0, 1, 1, 1); + private static final Object cuttingRecipesKey = new Object(); public static final LazyValue> woodcuttingRecipeType = - new LazyValue<>(() -> Registry.RECIPE_TYPE.getOrDefault(new ResourceLocation("druidcraft", "woodcutting"))); + new LazyValue<>(() -> Registry.RECIPE_TYPE.get(new ResourceLocation("druidcraft", "woodcutting"))); public ProcessingInventory inventory; private int recipeIndex; @@ -116,7 +120,14 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { inventory.deserializeNBT(compound.getCompound("Inventory")); recipeIndex = compound.getInt("RecipeIndex"); if (compound.contains("PlayEvent")) - playEvent = ItemStack.read(compound.getCompound("PlayEvent")); + playEvent = ItemStack.of(compound.getCompound("PlayEvent")); + } + + @Override + protected AxisAlignedBB makeRenderBoundingBox() { + Direction facing = getBlockState().getValue(SawBlock.FACING); + AxisAlignedBB box = RENDER_BOX.expandTowards(facing.getStepX() * 0.125f, facing.getStepY() * 0.125f, facing.getStepZ() * 0.125f); + return box.move(worldPosition); } @Override @@ -131,14 +142,14 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { Item item = playEvent.getItem(); if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - isWood = block.getSoundType(block.getDefaultState(), world, pos, null) == SoundType.WOOD; + isWood = block.getSoundType(block.defaultBlockState(), level, worldPosition, null) == SoundType.WOOD; } spawnEventParticles(playEvent); playEvent = ItemStack.EMPTY; if (!isWood) - AllSoundEvents.SAW_ACTIVATE_STONE.playAt(world, pos, 3, 1, true); + AllSoundEvents.SAW_ACTIVATE_STONE.playAt(level, worldPosition, 3, 1, true); else - AllSoundEvents.SAW_ACTIVATE_WOOD.playAt(world, pos, 3, 1, true); + AllSoundEvents.SAW_ACTIVATE_WOOD.playAt(level, worldPosition, 3, 1, true); return; } } @@ -166,7 +177,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { spawnParticles(inventory.getStackInSlot(0)); if (inventory.remainingTime < 5 && !inventory.appliedRecipe) { - if (world.isRemote && !isVirtual()) + if (level.isClientSide && !isVirtual()) return; playEvent = inventory.getStackInSlot(0); applyRecipe(); @@ -178,7 +189,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { } Vector3d itemMovement = getItemMovementVec(); - Direction itemMovementFacing = Direction.getFacingFromVector(itemMovement.x, itemMovement.y, itemMovement.z); + Direction itemMovementFacing = Direction.getNearest(itemMovement.x, itemMovement.y, itemMovement.z); if (inventory.remainingTime > 0) return; inventory.remainingTime = 0; @@ -200,13 +211,13 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { } } - BlockPos nextPos = pos.add(itemMovement.x, itemMovement.y, itemMovement.z); - DirectBeltInputBehaviour behaviour = TileEntityBehaviour.get(world, nextPos, DirectBeltInputBehaviour.TYPE); + BlockPos nextPos = worldPosition.offset(itemMovement.x, itemMovement.y, itemMovement.z); + DirectBeltInputBehaviour behaviour = TileEntityBehaviour.get(level, nextPos, DirectBeltInputBehaviour.TYPE); if (behaviour != null) { boolean changed = false; if (!behaviour.canInsertFromSide(itemMovementFacing)) return; - if (world.isRemote && !isVirtual()) + if (level.isClientSide && !isVirtual()) return; for (int slot = 0; slot < inventory.getSlots(); slot++) { ItemStack stack = inventory.getStackInSlot(slot); @@ -219,14 +230,14 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { changed = true; } if (changed) { - markDirty(); + setChanged(); sendData(); } return; } // Eject Items - Vector3d outPos = VecHelper.getCenterOf(pos) + Vector3d outPos = VecHelper.getCenterOf(worldPosition) .add(itemMovement.scale(.5f) .add(0, .5, 0)); Vector3d outMotion = itemMovement.scale(.0625) @@ -235,20 +246,20 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { ItemStack stack = inventory.getStackInSlot(slot); if (stack.isEmpty()) continue; - ItemEntity entityIn = new ItemEntity(world, outPos.x, outPos.y, outPos.z, stack); - entityIn.setMotion(outMotion); - world.addEntity(entityIn); + ItemEntity entityIn = new ItemEntity(level, outPos.x, outPos.y, outPos.z, stack); + entityIn.setDeltaMovement(outMotion); + level.addFreshEntity(entityIn); } inventory.clear(); - world.updateComparatorOutputLevel(pos, getBlockState().getBlock()); + level.updateNeighbourForOutputSignal(worldPosition, getBlockState().getBlock()); inventory.remainingTime = -1; sendData(); } @Override - public void remove() { + public void setRemoved() { invProvider.invalidate(); - super.remove(); + super.setRemoved(); } @Override @@ -265,16 +276,16 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { IParticleData particleData = null; if (stack.getItem() instanceof BlockItem) particleData = new BlockParticleData(ParticleTypes.BLOCK, ((BlockItem) stack.getItem()).getBlock() - .getDefaultState()); + .defaultBlockState()); else particleData = new ItemParticleData(ParticleTypes.ITEM, stack); - Random r = world.rand; - Vector3d v = VecHelper.getCenterOf(this.pos) + Random r = level.random; + Vector3d v = VecHelper.getCenterOf(this.worldPosition) .add(0, 5 / 16f, 0); for (int i = 0; i < 10; i++) { Vector3d m = VecHelper.offsetRandomly(new Vector3d(0, 0.25f, 0), r, .125f); - world.addParticle(particleData, v.x, v.y, v.z, m.x, m.y, m.y); + level.addParticle(particleData, v.x, v.y, v.z, m.x, m.y, m.y); } } @@ -286,25 +297,25 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { float speed = 1; if (stack.getItem() instanceof BlockItem) particleData = new BlockParticleData(ParticleTypes.BLOCK, ((BlockItem) stack.getItem()).getBlock() - .getDefaultState()); + .defaultBlockState()); else { particleData = new ItemParticleData(ParticleTypes.ITEM, stack); speed = .125f; } - Random r = world.rand; + Random r = level.random; Vector3d vec = getItemMovementVec(); - Vector3d pos = VecHelper.getCenterOf(this.pos); + Vector3d pos = VecHelper.getCenterOf(this.worldPosition); float offset = inventory.recipeDuration != 0 ? (float) (inventory.remainingTime) / inventory.recipeDuration : 0; offset /= 2; if (inventory.appliedRecipe) offset -= .5f; - world.addParticle(particleData, pos.getX() + -vec.x * offset, pos.getY() + .45f, pos.getZ() + -vec.z * offset, + level.addParticle(particleData, pos.x() + -vec.x * offset, pos.y() + .45f, pos.z() + -vec.z * offset, -vec.x * speed, r.nextFloat() * speed, -vec.z * speed); } public Vector3d getItemMovementVec() { - boolean alongX = !getBlockState().get(SawBlock.AXIS_ALONG_FIRST_COORDINATE); + boolean alongX = !getBlockState().getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE); int offset = getSpeed() < 0 ? -1 : 1; return new Vector3d(offset * (alongX ? 1 : 0), 0, offset * (alongX ? 0 : -1)); } @@ -327,8 +338,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { List results = new LinkedList(); if (recipe instanceof CuttingRecipe) results = ((CuttingRecipe) recipe).rollResults(); - else if (recipe instanceof StonecuttingRecipe || recipe.getType() == woodcuttingRecipeType.getValue()) - results.add(recipe.getRecipeOutput() + else if (recipe instanceof StonecuttingRecipe || recipe.getType() == woodcuttingRecipeType.get()) + results.add(recipe.getResultItem() .copy()); for (int i = 0; i < results.size(); i++) { @@ -343,17 +354,17 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { } private List> getRecipes() { - Optional assemblyRecipe = SequencedAssemblyRecipe.getRecipe(world, inventory.getStackInSlot(0), + Optional assemblyRecipe = SequencedAssemblyRecipe.getRecipe(level, inventory.getStackInSlot(0), AllRecipeTypes.CUTTING.getType(), CuttingRecipe.class); if (assemblyRecipe.isPresent() && filtering.test(assemblyRecipe.get() - .getRecipeOutput())) + .getResultItem())) return ImmutableList.of(assemblyRecipe.get()); Predicate> types = RecipeConditions.isOfType(AllRecipeTypes.CUTTING.getType(), AllConfigs.SERVER.recipes.allowStonecuttingOnSaw.get() ? IRecipeType.STONECUTTING : null, - AllConfigs.SERVER.recipes.allowWoodcuttingOnSaw.get() ? woodcuttingRecipeType.getValue() : null); + AllConfigs.SERVER.recipes.allowWoodcuttingOnSaw.get() ? woodcuttingRecipeType.get() : null); - List> startedSearch = RecipeFinder.get(cuttingRecipesKey, world, types); + List> startedSearch = RecipeFinder.get(cuttingRecipesKey, level, types); return startedSearch.stream() .filter(RecipeConditions.outputMatchesFilter(filtering)) .filter(RecipeConditions.firstIngredientMatches(inventory.getStackInSlot(0))) @@ -367,7 +378,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { return; if (!entity.isAlive()) return; - if (world.isRemote) + if (level.isClientSide) return; inventory.clear(); @@ -384,7 +395,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { return; if (inventory.isEmpty()) return; - if (world.isRemote && !isVirtual()) + if (level.isClientSide && !isVirtual()) return; List> recipes = getRecipes(); @@ -416,37 +427,43 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { } protected boolean canProcess() { - return getBlockState().get(SawBlock.FACING) == Direction.UP; + return getBlockState().getValue(SawBlock.FACING) == Direction.UP; } // Block Breaker @Override protected boolean shouldRun() { - return getBlockState().get(SawBlock.FACING) + return getBlockState().getValue(SawBlock.FACING) .getAxis() .isHorizontal(); } @Override protected BlockPos getBreakingPos() { - return getPos().offset(getBlockState().get(SawBlock.FACING)); + return getBlockPos().relative(getBlockState().getValue(SawBlock.FACING)); } @Override public void onBlockBroken(BlockState stateToBreak) { + Optional dynamicTree = TreeCutter.findDynamicTree(stateToBreak.getBlock(), breakingPos); + if (dynamicTree.isPresent()) { + dynamicTree.get().destroyBlocks(level, null, this::dropItemFromCutTree); + return; + } + super.onBlockBroken(stateToBreak); - TreeCutter.findTree(world, breakingPos) - .destroyBlocks(world, null, this::dropItemFromCutTree); + TreeCutter.findTree(level, breakingPos) + .destroyBlocks(level, null, this::dropItemFromCutTree); } public void dropItemFromCutTree(BlockPos pos, ItemStack stack) { - float distance = (float) Math.sqrt(pos.distanceSq(breakingPos)); + float distance = (float) Math.sqrt(pos.distSqr(breakingPos)); Vector3d dropPos = VecHelper.getCenterOf(pos); - ItemEntity entity = new ItemEntity(world, dropPos.x, dropPos.y, dropPos.z, stack); - entity.setMotion(Vector3d.of(breakingPos.subtract(this.pos)) + ItemEntity entity = new ItemEntity(level, dropPos.x, dropPos.y, dropPos.z, stack); + entity.setDeltaMovement(Vector3d.atLowerCornerOf(breakingPos.subtract(this.worldPosition)) .scale(distance / 20f)); - world.addEntity(entity); + level.addFreshEntity(entity); } @Override @@ -456,8 +473,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { } public static boolean isSawable(BlockState stateToBreak) { - if (stateToBreak.isIn(BlockTags.LOGS) || AllTags.AllBlockTags.SLIMY_LOGS.matches(stateToBreak) - || stateToBreak.isIn(BlockTags.LEAVES)) + if (stateToBreak.is(BlockTags.LOGS) || AllTags.AllBlockTags.SLIMY_LOGS.matches(stateToBreak) + || stateToBreak.is(BlockTags.LEAVES)) return true; Block block = stateToBreak.getBlock(); if (block instanceof BambooBlock) @@ -474,6 +491,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { return true; if (block instanceof ChorusPlantBlock) return true; + if (TreeCutter.canDynamicTreeCutFrom(block)) + return true; return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index d898d12c3..f49dea4c7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -58,7 +58,7 @@ import net.minecraftforge.fml.network.PacketDistributor; public abstract class AbstractContraptionEntity extends Entity implements IEntityAdditionalSpawnData { private static final DataParameter STALLED = - EntityDataManager.createKey(AbstractContraptionEntity.class, DataSerializers.BOOLEAN); + EntityDataManager.defineId(AbstractContraptionEntity.class, DataSerializers.BOOLEAN); public final Map collidingEntities; @@ -77,7 +77,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit this.contraption = contraption; if (contraption == null) return; - if (world.isRemote) + if (level.isClientSide) return; contraption.onEntityCreated(this); } @@ -87,7 +87,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } protected void contraptionInitialize() { - contraption.onEntityInitialize(world, this); + contraption.onEntityInitialize(level, this); initialized = true; } @@ -97,32 +97,32 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit public void addSittingPassenger(Entity passenger, int seatIndex) { passenger.startRiding(this, true); - if (world.isRemote) + if (level.isClientSide) return; contraption.getSeatMapping() - .put(passenger.getUniqueID(), seatIndex); + .put(passenger.getUUID(), seatIndex); AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), - new ContraptionSeatMappingPacket(getEntityId(), contraption.getSeatMapping())); + new ContraptionSeatMappingPacket(getId(), contraption.getSeatMapping())); } @Override protected void removePassenger(Entity passenger) { Vector3d transformedVector = getPassengerPosition(passenger, 1); super.removePassenger(passenger); - if (world.isRemote) + if (level.isClientSide) return; if (transformedVector != null) passenger.getPersistentData() .put("ContraptionDismountLocation", VecHelper.writeNBT(transformedVector)); contraption.getSeatMapping() - .remove(passenger.getUniqueID()); + .remove(passenger.getUUID()); AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), - new ContraptionSeatMappingPacket(getEntityId(), contraption.getSeatMapping())); + new ContraptionSeatMappingPacket(getId(), contraption.getSeatMapping())); } @Override - public void updatePassengerPosition(Entity passenger, IMoveCallback callback) { - if (!isPassenger(passenger)) + public void positionRider(Entity passenger, IMoveCallback callback) { + if (!hasPassenger(passenger)) return; Vector3d transformedVector = getPassengerPosition(passenger, 1); if (transformedVector == null) @@ -131,7 +131,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } protected Vector3d getPassengerPosition(Entity passenger, float partialTicks) { - UUID id = passenger.getUniqueID(); + UUID id = passenger.getUUID(); if (passenger instanceof OrientedContraptionEntity) { BlockPos localPos = contraption.getBearingPosOf(id); if (localPos != null) @@ -141,18 +141,18 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } AxisAlignedBB bb = passenger.getBoundingBox(); - double ySize = bb.getYSize(); + double ySize = bb.getYsize(); BlockPos seat = contraption.getSeatOf(id); if (seat == null) return null; - Vector3d transformedVector = toGlobalVector(Vector3d.of(seat) - .add(.5, passenger.getYOffset() + ySize - .15f, .5), partialTicks).add(VecHelper.getCenterOf(BlockPos.ZERO)) + Vector3d transformedVector = toGlobalVector(Vector3d.atLowerCornerOf(seat) + .add(.5, passenger.getMyRidingOffset() + ySize - .15f, .5), partialTicks).add(VecHelper.getCenterOf(BlockPos.ZERO)) .subtract(0.5, ySize, 0.5); return transformedVector; } @Override - protected boolean canFitPassenger(Entity p_184219_1_) { + protected boolean canAddPassenger(Entity p_184219_1_) { if (p_184219_1_ instanceof OrientedContraptionEntity) return true; return contraption.getSeatMapping() @@ -175,7 +175,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit continue; for (Entity entity : getPassengers()) { if (!entry.getKey() - .equals(entity.getUniqueID())) + .equals(entity.getUUID())) continue; if (entity instanceof PlayerEntity) return false; @@ -183,14 +183,14 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } } - if (toDismount != null && !world.isRemote) { + if (toDismount != null && !level.isClientSide) { Vector3d transformedVector = getPassengerPosition(toDismount, 1); toDismount.stopRiding(); if (transformedVector != null) - toDismount.setPositionAndUpdate(transformedVector.x, transformedVector.y, transformedVector.z); + toDismount.teleportTo(transformedVector.x, transformedVector.y, transformedVector.z); } - if (world.isRemote) + if (level.isClientSide) return true; addSittingPassenger(player, indexOfSeat); return true; @@ -228,14 +228,14 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit .incrementAndGet() > 3) iterator.remove(); - prevPosX = getX(); - prevPosY = getY(); - prevPosZ = getZ(); + xo = getX(); + yo = getY(); + zo = getZ(); prevPosInvalid = false; if (!initialized) contraptionInitialize(); - contraption.onEntityTick(world); + contraption.onEntityTick(level); tickContraption(); super.tick(); } @@ -249,7 +249,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit public void tickActors() { boolean stalledPreviously = contraption.stalled; - if (!world.isRemote) + if (!level.isClientSide) contraption.stalled = false; ticking = true; @@ -286,7 +286,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit contraption.stalled |= context.stall; } if (!isAlive()) { - contraption.stop(world); + contraption.stop(level); return; } ticking = false; @@ -294,7 +294,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit for (Entity entity : getPassengers()) { if (!(entity instanceof OrientedContraptionEntity)) continue; - if (!contraption.stabilizedSubContraptions.containsKey(entity.getUniqueID())) + if (!contraption.stabilizedSubContraptions.containsKey(entity.getUUID())) continue; OrientedContraptionEntity orientedCE = (OrientedContraptionEntity) entity; if (orientedCE.contraption != null && orientedCE.contraption.stalled) { @@ -303,10 +303,10 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } } - if (!world.isRemote) { + if (!level.isClientSide) { if (!stalledPreviously && contraption.stalled) onContraptionStalled(); - dataManager.set(STALLED, contraption.stalled); + entityData.set(STALLED, contraption.stalled); return; } @@ -315,7 +315,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit protected void onContraptionStalled() { AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), - new ContraptionStallPacket(getEntityId(), getX(), getY(), getZ(), getStalledAngle())); + new ContraptionStallPacket(getId(), getX(), getY(), getZ(), getStalledAngle())); } protected boolean shouldActorTrigger(MovementContext context, BlockInfo blockInfo, MovementBehaviour actor, @@ -333,11 +333,11 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } public void move(double x, double y, double z) { - setPosition(getX() + x, getY() + y, getZ() + z); + setPos(getX() + x, getY() + y, getZ() + z); } public Vector3d getAnchorVec() { - return getPositionVec(); + return position(); } public float getYawOffset() { @@ -345,15 +345,15 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } @Override - public void setPosition(double x, double y, double z) { - super.setPosition(x, y, z); + public void setPos(double x, double y, double z) { + super.setPos(x, y, z); if (contraption == null) return; AxisAlignedBB cbox = contraption.bounds; if (cbox == null) return; Vector3d actualVec = getAnchorVec(); - setBoundingBox(cbox.offset(actualVec)); + setBoundingBox(cbox.move(actualVec)); } public static float yawFromVector(Vector3d vec) { @@ -368,16 +368,16 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit @SuppressWarnings("unchecked") EntityType.Builder entityBuilder = (EntityType.Builder) builder; - return entityBuilder.size(1, 1); + return entityBuilder.sized(1, 1); } @Override - protected void registerData() { - this.dataManager.register(STALLED, false); + protected void defineSynchedData() { + this.entityData.define(STALLED, false); } @Override - public IPacket createSpawnPacket() { + public IPacket getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } @@ -393,22 +393,22 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit int estimatedPacketSize = byteArray.length; if (estimatedPacketSize > 2_000_000) { Create.LOGGER.warn("Could not send Contraption Spawn Data (Packet too big): " - + getContraption().getType().id + " @" + getPositionVec() + " (" + getUniqueID().toString() + ")"); - buffer.writeCompoundTag(new CompoundNBT()); + + getContraption().getType().id + " @" + position() + " (" + getUUID().toString() + ")"); + buffer.writeNbt(new CompoundNBT()); return; } } catch (IOException e) { e.printStackTrace(); - buffer.writeCompoundTag(new CompoundNBT()); + buffer.writeNbt(new CompoundNBT()); return; } - buffer.writeCompoundTag(compound); + buffer.writeNbt(compound); } @Override - protected final void writeAdditional(CompoundNBT compound) { + protected final void addAdditionalSaveData(CompoundNBT compound) { writeAdditional(compound, false); } @@ -421,11 +421,11 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit @Override public void readSpawnData(PacketBuffer additionalData) { - readAdditional(additionalData.readCompoundTag(), true); + readAdditional(additionalData.readNbt(), true); } @Override - protected final void readAdditional(CompoundNBT compound) { + protected final void readAdditionalSaveData(CompoundNBT compound) { readAdditional(compound, false); } @@ -434,9 +434,9 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit return; initialized = compound.getBoolean("Initialized"); - contraption = Contraption.fromNBT(world, compound.getCompound("Contraption"), spawnData); + contraption = Contraption.fromNBT(level, compound.getCompound("Contraption"), spawnData); contraption.entity = this; - dataManager.set(STALLED, compound.getBoolean("Stalled")); + entityData.set(STALLED, compound.getBoolean("Stalled")); } public void disassemble() { @@ -449,45 +449,45 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit StructureTransform transform = makeStructureTransform(); AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), - new ContraptionDisassemblyPacket(this.getEntityId(), transform)); + new ContraptionDisassemblyPacket(this.getId(), transform)); - contraption.addBlocksToWorld(world, transform); - contraption.addPassengersToWorld(world, transform, getPassengers()); + contraption.addBlocksToWorld(level, transform); + contraption.addPassengersToWorld(level, transform, getPassengers()); for (Entity entity : getPassengers()) { if (!(entity instanceof OrientedContraptionEntity)) continue; - UUID id = entity.getUniqueID(); + UUID id = entity.getUUID(); if (!contraption.stabilizedSubContraptions.containsKey(id)) continue; BlockPos transformed = transform.apply(contraption.stabilizedSubContraptions.get(id) .getConnectedPos()); - entity.setPosition(transformed.getX(), transformed.getY(), transformed.getZ()); + entity.setPos(transformed.getX(), transformed.getY(), transformed.getZ()); ((AbstractContraptionEntity) entity).disassemble(); } - removePassengers(); + ejectPassengers(); moveCollidedEntitiesOnDisassembly(transform); - AllSoundEvents.CONTRAPTION_DISASSEMBLE.playOnServer(world, getBlockPos()); + AllSoundEvents.CONTRAPTION_DISASSEMBLE.playOnServer(level, blockPosition()); } private void moveCollidedEntitiesOnDisassembly(StructureTransform transform) { for (Entity entity : collidingEntities.keySet()) { - Vector3d localVec = toLocalVector(entity.getPositionVec(), 0); + Vector3d localVec = toLocalVector(entity.position(), 0); Vector3d transformed = transform.apply(localVec); - if (world.isRemote) - entity.setPosition(transformed.x, transformed.y + 1 / 16f, transformed.z); + if (level.isClientSide) + entity.setPos(transformed.x, transformed.y + 1 / 16f, transformed.z); else - entity.setPositionAndUpdate(transformed.x, transformed.y + 1 / 16f, transformed.z); + entity.teleportTo(transformed.x, transformed.y + 1 / 16f, transformed.z); } } @SuppressWarnings("deprecation") @Override public void remove(boolean keepData) { - if (!world.isRemote && !removed && contraption != null) { + if (!level.isClientSide && !removed && contraption != null) { if (!ticking) - contraption.stop(world); + contraption.stop(level); } if (contraption != null) contraption.onEntityRemoved(this); @@ -497,21 +497,21 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit protected abstract StructureTransform makeStructureTransform(); @Override - public void onKillCommand() { - removePassengers(); - super.onKillCommand(); + public void kill() { + ejectPassengers(); + super.kill(); } @Override protected void outOfWorld() { - removePassengers(); + ejectPassengers(); super.outOfWorld(); } @Override public void onRemovedFromWorld() { super.onRemovedFromWorld(); - if (world != null && world.isRemote) + if (level != null && level.isClientSide) return; getPassengers().forEach(Entity::remove); } @@ -524,12 +524,12 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } public boolean isStalled() { - return dataManager.get(STALLED); + return entityData.get(STALLED); } @OnlyIn(Dist.CLIENT) static void handleStallPacket(ContraptionStallPacket packet) { - Entity entity = Minecraft.getInstance().world.getEntityByID(packet.entityID); + Entity entity = Minecraft.getInstance().level.getEntity(packet.entityID); if (!(entity instanceof AbstractContraptionEntity)) return; AbstractContraptionEntity ce = (AbstractContraptionEntity) entity; @@ -538,7 +538,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit @OnlyIn(Dist.CLIENT) static void handleDisassemblyPacket(ContraptionDisassemblyPacket packet) { - Entity entity = Minecraft.getInstance().world.getEntityByID(packet.entityID); + Entity entity = Minecraft.getInstance().level.getEntity(packet.entityID); if (!(entity instanceof AbstractContraptionEntity)) return; AbstractContraptionEntity ce = (AbstractContraptionEntity) entity; @@ -551,8 +551,8 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit @Override @SuppressWarnings("deprecation") - public CompoundNBT writeWithoutTypeId(CompoundNBT nbt) { - Vector3d vec = getPositionVec(); + public CompoundNBT saveWithoutId(CompoundNBT nbt) { + Vector3d vec = position(); List passengers = getPassengers(); for (Entity entity : passengers) { @@ -560,43 +560,43 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit entity.removed = true; // Gather passengers into same chunk when saving - Vector3d prevVec = entity.getPositionVec(); - entity.setPos(vec.x, prevVec.y, vec.z); + Vector3d prevVec = entity.position(); + entity.setPosRaw(vec.x, prevVec.y, vec.z); // Super requires all passengers to not be removed in order to write them to the // tag entity.removed = false; } - CompoundNBT tag = super.writeWithoutTypeId(nbt); + CompoundNBT tag = super.saveWithoutId(nbt); return tag; } @Override // Make sure nothing can move contraptions out of the way - public void setMotion(Vector3d motionIn) {} + public void setDeltaMovement(Vector3d motionIn) {} @Override - public PushReaction getPushReaction() { + public PushReaction getPistonPushReaction() { return PushReaction.IGNORE; } public void setContraptionMotion(Vector3d vec) { - super.setMotion(vec); + super.setDeltaMovement(vec); } @Override - public boolean canBeCollidedWith() { + public boolean isPickable() { return false; } @Override - public boolean attackEntityFrom(DamageSource source, float amount) { + public boolean hurt(DamageSource source, float amount) { return false; } public Vector3d getPrevPositionVec() { - return prevPosInvalid ? getPositionVec() : new Vector3d(prevPosX, prevPosY, prevPosZ); + return prevPosInvalid ? position() : new Vector3d(xo, yo, zo); } public abstract ContraptionRotationState getRotationState(); @@ -606,13 +606,13 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit return Vector3d.ZERO; Vector3d contactPoint = toGlobalVector(toLocalVector(globalContactPoint, 0), 1); return contactPoint.subtract(globalContactPoint) - .add(getPositionVec().subtract(getPrevPositionVec())); + .add(position().subtract(getPrevPositionVec())); } public boolean canCollideWith(Entity e) { if (e instanceof PlayerEntity && e.isSpectator()) return false; - if (e.noClip) + if (e.noPhysics) return false; if (e instanceof HangingEntity) return false; @@ -624,21 +624,21 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit return false; if (e instanceof ProjectileEntity) return false; - if (e.getRidingEntity() != null) + if (e.getVehicle() != null) return false; - Entity riding = this.getRidingEntity(); + Entity riding = this.getVehicle(); while (riding != null) { if (riding == e) return false; - riding = riding.getRidingEntity(); + riding = riding.getVehicle(); } - return e.getPushReaction() == PushReaction.NORMAL; + return e.getPistonPushReaction() == PushReaction.NORMAL; } @Override - public boolean isOnePlayerRiding() { + public boolean hasOnePlayerPassenger() { return false; } @@ -680,7 +680,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit @Override - protected boolean updateWaterState() { + protected boolean updateInWaterStateAndDoFluidPushing() { /* * Override this with an empty method to reduce enormous calculation time when contraptions are in water * WARNING: THIS HAS A BUNCH OF SIDE EFFECTS! @@ -695,7 +695,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } @Override - public void setFire(int p_70015_1_) { + public void setSecondsOnFire(int p_70015_1_) { // Contraptions no longer catch fire } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java index 51eb14340..0f1972ad4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java @@ -22,7 +22,7 @@ public class AssemblyException extends Exception { nbt.putString("Component", ITextComponent.Serializer.toJson(exception.component)); if (exception.hasPosition()) nbt.putLong("Position", exception.getPosition() - .toLong()); + .asLong()); compound.put("LastException", nbt); } @@ -35,7 +35,7 @@ public class AssemblyException extends Exception { String string = nbt.getString("Component"); AssemblyException exception = new AssemblyException(ITextComponent.Serializer.fromJson(string)); if (nbt.contains("Position")) - exception.position = BlockPos.fromLong(nbt.getLong("Position")); + exception.position = BlockPos.of(nbt.getLong("Position")); return exception; } @@ -51,7 +51,7 @@ public class AssemblyException extends Exception { public static AssemblyException unmovableBlock(BlockPos pos, BlockState state) { AssemblyException e = new AssemblyException("unmovableBlock", pos.getX(), pos.getY(), pos.getZ(), new TranslationTextComponent(state.getBlock() - .getTranslationKey())); + .getDescriptionId())); e.position = pos; return e; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java index f2d12f89d..c1b5b796b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java @@ -191,7 +191,7 @@ public class BlockMovementChecks { Block block = state.getBlock(); if (block instanceof AbstractChassisBlock) return true; - if (state.getBlockHardness(world, pos) == -1) + if (state.getDestroySpeed(world, pos) == -1) return false; if (state.getBlock().getTags().contains(NON_MOVABLE)) return false; @@ -200,25 +200,25 @@ public class BlockMovementChecks { return false; // Move controllers only when they aren't moving - if (block instanceof MechanicalPistonBlock && state.get(MechanicalPistonBlock.STATE) != PistonState.MOVING) + if (block instanceof MechanicalPistonBlock && state.getValue(MechanicalPistonBlock.STATE) != PistonState.MOVING) return true; if (block instanceof MechanicalBearingBlock) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (te instanceof MechanicalBearingTileEntity) return !((MechanicalBearingTileEntity) te).isRunning(); } if (block instanceof WindmillBearingBlock) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (te instanceof WindmillBearingTileEntity) return !((WindmillBearingTileEntity) te).isRunning(); } if (block instanceof ClockworkBearingBlock) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (te instanceof ClockworkBearingTileEntity) return !((ClockworkBearingTileEntity) te).isRunning(); } if (block instanceof PulleyBlock) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (te instanceof PulleyTileEntity) return !((PulleyTileEntity) te).running; } @@ -227,12 +227,12 @@ public class BlockMovementChecks { return true; if (state.getBlock() instanceof GrindstoneBlock) return true; - return state.getPushReaction() != PushReaction.BLOCK; + return state.getPistonPushReaction() != PushReaction.BLOCK; } private static boolean isBrittleFallback(BlockState state) { Block block = state.getBlock(); - if (state.contains(BlockStateProperties.HANGING)) + if (state.hasProperty(BlockStateProperties.HANGING)) return true; if (block instanceof LadderBlock) @@ -262,28 +262,28 @@ public class BlockMovementChecks { Direction direction) { Block block = state.getBlock(); if (block instanceof LadderBlock) - return state.get(LadderBlock.FACING) == direction.getOpposite(); + return state.getValue(LadderBlock.FACING) == direction.getOpposite(); if (block instanceof WallTorchBlock) - return state.get(WallTorchBlock.HORIZONTAL_FACING) == direction.getOpposite(); + return state.getValue(WallTorchBlock.FACING) == direction.getOpposite(); if (block instanceof WallSignBlock) - return state.get(WallSignBlock.FACING) == direction.getOpposite(); + return state.getValue(WallSignBlock.FACING) == direction.getOpposite(); if (block instanceof StandingSignBlock) return direction == Direction.DOWN; if (block instanceof AbstractPressurePlateBlock) return direction == Direction.DOWN; if (block instanceof DoorBlock) { - if (state.get(DoorBlock.HALF) == DoubleBlockHalf.LOWER && direction == Direction.UP) + if (state.getValue(DoorBlock.HALF) == DoubleBlockHalf.LOWER && direction == Direction.UP) return true; return direction == Direction.DOWN; } if (block instanceof BedBlock) { - Direction facing = state.get(BedBlock.HORIZONTAL_FACING); - if (state.get(BedBlock.PART) == BedPart.HEAD) + Direction facing = state.getValue(BedBlock.FACING); + if (state.getValue(BedBlock.PART) == BedPart.HEAD) facing = facing.getOpposite(); return direction == facing; } if (block instanceof RedstoneLinkBlock) - return direction.getOpposite() == state.get(RedstoneLinkBlock.FACING); + return direction.getOpposite() == state.getValue(RedstoneLinkBlock.FACING); if (block instanceof FlowerPotBlock) return direction == Direction.DOWN; if (block instanceof RedstoneDiodeBlock) @@ -293,82 +293,82 @@ public class BlockMovementChecks { if (block instanceof CarpetBlock) return direction == Direction.DOWN; if (block instanceof RedstoneWallTorchBlock) - return state.get(RedstoneWallTorchBlock.FACING) == direction.getOpposite(); + return state.getValue(RedstoneWallTorchBlock.FACING) == direction.getOpposite(); if (block instanceof TorchBlock) return direction == Direction.DOWN; if (block instanceof HorizontalFaceBlock) { - AttachFace attachFace = state.get(HorizontalFaceBlock.FACE); + AttachFace attachFace = state.getValue(HorizontalFaceBlock.FACE); if (attachFace == AttachFace.CEILING) return direction == Direction.UP; if (attachFace == AttachFace.FLOOR) return direction == Direction.DOWN; if (attachFace == AttachFace.WALL) - return direction.getOpposite() == state.get(HorizontalFaceBlock.HORIZONTAL_FACING); + return direction.getOpposite() == state.getValue(HorizontalFaceBlock.FACING); } - if (state.contains(BlockStateProperties.HANGING)) - return direction == (state.get(BlockStateProperties.HANGING) ? Direction.UP : Direction.DOWN); + if (state.hasProperty(BlockStateProperties.HANGING)) + return direction == (state.getValue(BlockStateProperties.HANGING) ? Direction.UP : Direction.DOWN); if (block instanceof AbstractRailBlock) return direction == Direction.DOWN; if (block instanceof AttachedActorBlock) - return direction == state.get(HarvesterBlock.HORIZONTAL_FACING) + return direction == state.getValue(HarvesterBlock.FACING) .getOpposite(); if (block instanceof HandCrankBlock) - return direction == state.get(HandCrankBlock.FACING) + return direction == state.getValue(HandCrankBlock.FACING) .getOpposite(); if (block instanceof NozzleBlock) - return direction == state.get(NozzleBlock.FACING) + return direction == state.getValue(NozzleBlock.FACING) .getOpposite(); if (block instanceof EngineBlock) - return direction == state.get(EngineBlock.HORIZONTAL_FACING) + return direction == state.getValue(EngineBlock.FACING) .getOpposite(); if (block instanceof BellBlock) { - BellAttachment attachment = state.get(BlockStateProperties.BELL_ATTACHMENT); + BellAttachment attachment = state.getValue(BlockStateProperties.BELL_ATTACHMENT); if (attachment == BellAttachment.FLOOR) return direction == Direction.DOWN; if (attachment == BellAttachment.CEILING) return direction == Direction.UP; - return direction == state.get(HorizontalBlock.HORIZONTAL_FACING); + return direction == state.getValue(HorizontalBlock.FACING); } if (state.getBlock() instanceof SailBlock) - return direction.getAxis() != state.get(SailBlock.FACING) + return direction.getAxis() != state.getValue(SailBlock.FACING) .getAxis(); if (state.getBlock() instanceof FluidTankBlock) - return FluidTankConnectivityHandler.isConnected(world, pos, pos.offset(direction)); - if (AllBlocks.STICKER.has(state) && state.get(StickerBlock.EXTENDED)) { - return direction == state.get(StickerBlock.FACING) - && !isNotSupportive(world.getBlockState(pos.offset(direction)), direction.getOpposite()); + return FluidTankConnectivityHandler.isConnected(world, pos, pos.relative(direction)); + if (AllBlocks.STICKER.has(state) && state.getValue(StickerBlock.EXTENDED)) { + return direction == state.getValue(StickerBlock.FACING) + && !isNotSupportive(world.getBlockState(pos.relative(direction)), direction.getOpposite()); } return false; } private static boolean isNotSupportiveFallback(BlockState state, Direction facing) { if (AllBlocks.MECHANICAL_DRILL.has(state)) - return state.get(BlockStateProperties.FACING) == facing; + return state.getValue(BlockStateProperties.FACING) == facing; if (AllBlocks.MECHANICAL_BEARING.has(state)) - return state.get(BlockStateProperties.FACING) == facing; + return state.getValue(BlockStateProperties.FACING) == facing; if (AllBlocks.CART_ASSEMBLER.has(state)) return Direction.DOWN == facing; if (AllBlocks.MECHANICAL_SAW.has(state)) - return state.get(BlockStateProperties.FACING) == facing; + return state.getValue(BlockStateProperties.FACING) == facing; if (AllBlocks.PORTABLE_STORAGE_INTERFACE.has(state)) - return state.get(PortableStorageInterfaceBlock.FACING) == facing; + return state.getValue(PortableStorageInterfaceBlock.FACING) == facing; if (state.getBlock() instanceof AttachedActorBlock) - return state.get(BlockStateProperties.HORIZONTAL_FACING) == facing; + return state.getValue(BlockStateProperties.HORIZONTAL_FACING) == facing; if (AllBlocks.ROPE_PULLEY.has(state)) return facing == Direction.DOWN; if (state.getBlock() instanceof CarpetBlock) return facing == Direction.UP; if (state.getBlock() instanceof SailBlock) - return facing.getAxis() == state.get(SailBlock.FACING) + return facing.getAxis() == state.getValue(SailBlock.FACING) .getAxis(); if (AllBlocks.PISTON_EXTENSION_POLE.has(state)) - return facing.getAxis() != state.get(BlockStateProperties.FACING) + return facing.getAxis() != state.getValue(BlockStateProperties.FACING) .getAxis(); if (AllBlocks.MECHANICAL_PISTON_HEAD.has(state)) - return facing.getAxis() != state.get(BlockStateProperties.FACING) + return facing.getAxis() != state.getValue(BlockStateProperties.FACING) .getAxis(); - if (AllBlocks.STICKER.has(state) && !state.get(StickerBlock.EXTENDED)) - return facing == state.get(StickerBlock.FACING); + if (AllBlocks.STICKER.has(state) && !state.getValue(StickerBlock.EXTENDED)) + return facing == state.getValue(StickerBlock.FACING); return isBrittle(state); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 761949ae4..e36065d43 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -84,6 +84,7 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.INBT; import net.minecraft.nbt.ListNBT; import net.minecraft.nbt.NBTUtil; +import net.minecraft.network.DebugPacketSender; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.ChestType; import net.minecraft.state.properties.PistonType; @@ -102,6 +103,7 @@ import net.minecraft.village.PointOfInterestType; import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template.BlockInfo; +import net.minecraft.world.server.ServerWorld; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.Constants.BlockFlags; @@ -168,7 +170,7 @@ public abstract class Contraption { public ContraptionWorld getContraptionWorld() { if (world == null) - world = new ContraptionWorld(entity.world, this); + world = new ContraptionWorld(entity.level, this); return world; } @@ -230,7 +232,7 @@ public abstract class Contraption { for (BlockFace blockFace : pendingSubContraptions) { Direction face = blockFace.getFace(); StabilizedContraption subContraption = new StabilizedContraption(face); - World world = entity.world; + World world = entity.level; BlockPos pos = blockFace.getPos(); try { if (!subContraption.assemble(world, pos)) @@ -241,9 +243,9 @@ public abstract class Contraption { subContraption.removeBlocksFromWorld(world, BlockPos.ZERO); OrientedContraptionEntity movedContraption = OrientedContraptionEntity.create(world, subContraption, face); BlockPos anchor = blockFace.getConnectedPos(); - movedContraption.setPosition(anchor.getX() + .5f, anchor.getY(), anchor.getZ() + .5f); - world.addEntity(movedContraption); - stabilizedSubContraptions.put(movedContraption.getUniqueID(), new BlockFace(toLocalPos(pos), face)); + movedContraption.setPos(anchor.getX() + .5f, anchor.getY(), anchor.getZ() + .5f); + world.addFreshEntity(movedContraption); + stabilizedSubContraptions.put(movedContraption.getUUID(), new BlockFace(toLocalPos(pos), face)); } // Gather itemhandlers of mounted storage @@ -270,13 +272,13 @@ public abstract class Contraption { } public void onEntityInitialize(World world, AbstractContraptionEntity contraptionEntity) { - if (world.isRemote) + if (world.isClientSide) return; - for (OrientedContraptionEntity orientedCE : world.getEntitiesWithinAABB(OrientedContraptionEntity.class, + for (OrientedContraptionEntity orientedCE : world.getEntitiesOfClass(OrientedContraptionEntity.class, contraptionEntity.getBoundingBox() - .grow(1))) - if (stabilizedSubContraptions.containsKey(orientedCE.getUniqueID())) + .inflate(1))) + if (stabilizedSubContraptions.containsKey(orientedCE.getUUID())) orientedCE.startRiding(contraptionEntity); for (BlockPos seatPos : getSeats()) { @@ -291,7 +293,7 @@ public abstract class Contraption { } public void onEntityTick(World world) { - fluidStorage.forEach((pos, mfs) -> mfs.tick(entity, pos, world.isRemote)); + fluidStorage.forEach((pos, mfs) -> mfs.tick(entity, pos, world.isClientSide)); } /** move the first block in frontier queue */ @@ -304,7 +306,7 @@ public abstract class Contraption { if (World.isOutsideBuildHeight(pos)) return true; - if (!world.isBlockPresent(pos)) + if (!world.isLoaded(pos)) throw AssemblyException.unloadedChunk(pos); if (isAnchoringBlockAt(pos)) return true; @@ -329,9 +331,9 @@ public abstract class Contraption { if (AllBlocks.GANTRY_SHAFT.has(state)) moveGantryShaft(world, pos, frontier, visited, state); - if (AllBlocks.STICKER.has(state) && state.get(StickerBlock.EXTENDED)) { - Direction offset = state.get(StickerBlock.FACING); - BlockPos attached = pos.offset(offset); + if (AllBlocks.STICKER.has(state) && state.getValue(StickerBlock.EXTENDED)) { + Direction offset = state.getValue(StickerBlock.FACING); + BlockPos attached = pos.relative(offset); if (!visited.contains(attached) && !BlockMovementChecks.isNotSupportive(world.getBlockState(attached), offset.getOpposite())) frontier.add(attached); @@ -363,7 +365,7 @@ public abstract class Contraption { movePistonHead(world, pos, frontier, visited, state); // Cart assemblers attach themselves - BlockPos posDown = pos.down(); + BlockPos posDown = pos.below(); BlockState stateBelow = world.getBlockState(posDown); if (!visited.contains(posDown) && AllBlocks.CART_ASSEMBLER.has(stateBelow)) frontier.add(posDown); @@ -372,7 +374,7 @@ public abstract class Contraption { // Slime blocks and super glue drag adjacent blocks if possible for (Direction offset : Iterate.directions) { - BlockPos offsetPos = pos.offset(offset); + BlockPos offsetPos = pos.relative(offset); BlockState blockState = world.getBlockState(offsetPos); if (isAnchoringBlockAt(offsetPos)) continue; @@ -389,8 +391,8 @@ public abstract class Contraption { boolean brittle = BlockMovementChecks.isBrittle(blockState); boolean canStick = !brittle && state.canStickTo(blockState) && blockState.canStickTo(state); if (canStick) { - if (state.getPushReaction() == PushReaction.PUSH_ONLY - || blockState.getPushReaction() == PushReaction.PUSH_ONLY) { + if (state.getPistonPushReaction() == PushReaction.PUSH_ONLY + || blockState.getPistonPushReaction() == PushReaction.PUSH_ONLY) { canStick = false; } if (BlockMovementChecks.isNotSupportive(state, offset)) { @@ -417,21 +419,21 @@ public abstract class Contraption { protected void movePistonHead(World world, BlockPos pos, Queue frontier, Set visited, BlockState state) { - Direction direction = state.get(MechanicalPistonHeadBlock.FACING); - BlockPos offset = pos.offset(direction.getOpposite()); + Direction direction = state.getValue(MechanicalPistonHeadBlock.FACING); + BlockPos offset = pos.relative(direction.getOpposite()); if (!visited.contains(offset)) { BlockState blockState = world.getBlockState(offset); - if (isExtensionPole(blockState) && blockState.get(PistonExtensionPoleBlock.FACING) + if (isExtensionPole(blockState) && blockState.getValue(PistonExtensionPoleBlock.FACING) .getAxis() == direction.getAxis()) frontier.add(offset); if (blockState.getBlock() instanceof MechanicalPistonBlock) { - Direction pistonFacing = blockState.get(MechanicalPistonBlock.FACING); - if (pistonFacing == direction && blockState.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) + Direction pistonFacing = blockState.getValue(MechanicalPistonBlock.FACING); + if (pistonFacing == direction && blockState.getValue(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) frontier.add(offset); } } - if (state.get(MechanicalPistonHeadBlock.TYPE) == PistonType.STICKY) { - BlockPos attached = pos.offset(direction); + if (state.getValue(MechanicalPistonHeadBlock.TYPE) == PistonType.STICKY) { + BlockPos attached = pos.relative(direction); if (!visited.contains(attached)) frontier.add(attached); } @@ -439,21 +441,21 @@ public abstract class Contraption { protected void movePistonPole(World world, BlockPos pos, Queue frontier, Set visited, BlockState state) { - for (Direction d : Iterate.directionsInAxis(state.get(PistonExtensionPoleBlock.FACING) + for (Direction d : Iterate.directionsInAxis(state.getValue(PistonExtensionPoleBlock.FACING) .getAxis())) { - BlockPos offset = pos.offset(d); + BlockPos offset = pos.relative(d); if (!visited.contains(offset)) { BlockState blockState = world.getBlockState(offset); - if (isExtensionPole(blockState) && blockState.get(PistonExtensionPoleBlock.FACING) + if (isExtensionPole(blockState) && blockState.getValue(PistonExtensionPoleBlock.FACING) .getAxis() == d.getAxis()) frontier.add(offset); - if (isPistonHead(blockState) && blockState.get(MechanicalPistonHeadBlock.FACING) + if (isPistonHead(blockState) && blockState.getValue(MechanicalPistonHeadBlock.FACING) .getAxis() == d.getAxis()) frontier.add(offset); if (blockState.getBlock() instanceof MechanicalPistonBlock) { - Direction pistonFacing = blockState.get(MechanicalPistonBlock.FACING); + Direction pistonFacing = blockState.getValue(MechanicalPistonBlock.FACING); if (pistonFacing == d || pistonFacing == d.getOpposite() - && blockState.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) + && blockState.getValue(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) frontier.add(offset); } } @@ -462,14 +464,14 @@ public abstract class Contraption { protected void moveGantryPinion(World world, BlockPos pos, Queue frontier, Set visited, BlockState state) { - BlockPos offset = pos.offset(state.get(GantryCarriageBlock.FACING)); + BlockPos offset = pos.relative(state.getValue(GantryCarriageBlock.FACING)); if (!visited.contains(offset)) frontier.add(offset); Axis rotationAxis = ((IRotate) state.getBlock()).getRotationAxis(state); for (Direction d : Iterate.directionsInAxis(rotationAxis)) { - offset = pos.offset(d); + offset = pos.relative(d); BlockState offsetState = world.getBlockState(offset); - if (AllBlocks.GANTRY_SHAFT.has(offsetState) && offsetState.get(GantryShaftBlock.FACING) + if (AllBlocks.GANTRY_SHAFT.has(offsetState) && offsetState.getValue(GantryShaftBlock.FACING) .getAxis() == d.getAxis()) if (!visited.contains(offset)) frontier.add(offset); @@ -479,30 +481,30 @@ public abstract class Contraption { protected void moveGantryShaft(World world, BlockPos pos, Queue frontier, Set visited, BlockState state) { for (Direction d : Iterate.directions) { - BlockPos offset = pos.offset(d); + BlockPos offset = pos.relative(d); if (!visited.contains(offset)) { BlockState offsetState = world.getBlockState(offset); - Direction facing = state.get(GantryShaftBlock.FACING); + Direction facing = state.getValue(GantryShaftBlock.FACING); if (d.getAxis() == facing.getAxis() && AllBlocks.GANTRY_SHAFT.has(offsetState) - && offsetState.get(GantryShaftBlock.FACING) == facing) + && offsetState.getValue(GantryShaftBlock.FACING) == facing) frontier.add(offset); - else if (AllBlocks.GANTRY_CARRIAGE.has(offsetState) && offsetState.get(GantryCarriageBlock.FACING) == d) + else if (AllBlocks.GANTRY_CARRIAGE.has(offsetState) && offsetState.getValue(GantryCarriageBlock.FACING) == d) frontier.add(offset); } } } private void moveWindmillBearing(BlockPos pos, Queue frontier, Set visited, BlockState state) { - Direction facing = state.get(WindmillBearingBlock.FACING); - BlockPos offset = pos.offset(facing); + Direction facing = state.getValue(WindmillBearingBlock.FACING); + BlockPos offset = pos.relative(facing); if (!visited.contains(offset)) frontier.add(offset); } private void moveBearing(BlockPos pos, Queue frontier, Set visited, BlockState state) { - Direction facing = state.get(MechanicalBearingBlock.FACING); + Direction facing = state.getValue(MechanicalBearingBlock.FACING); if (!canBeStabilized(facing, pos.subtract(anchor))) { - BlockPos offset = pos.offset(facing); + BlockPos offset = pos.relative(facing); if (!visited.contains(offset)) frontier.add(offset); return; @@ -522,7 +524,7 @@ public abstract class Contraption { private void moveSeat(World world, BlockPos pos) { BlockPos local = toLocalPos(pos); getSeats().add(local); - List seatsEntities = world.getEntitiesWithinAABB(SeatEntity.class, new AxisAlignedBB(pos)); + List seatsEntities = world.getEntitiesOfClass(SeatEntity.class, new AxisAlignedBB(pos)); if (!seatsEntities.isEmpty()) { SeatEntity seat = seatsEntities.get(0); List passengers = seat.getPassengers(); @@ -535,8 +537,8 @@ public abstract class Contraption { int limit = AllConfigs.SERVER.kinetics.maxRopeLength.get(); BlockPos ropePos = pos; while (limit-- >= 0) { - ropePos = ropePos.down(); - if (!world.isBlockPresent(ropePos)) + ropePos = ropePos.below(); + if (!world.isLoaded(ropePos)) break; BlockState ropeState = world.getBlockState(ropePos); Block block = ropeState.getBlock(); @@ -551,21 +553,21 @@ public abstract class Contraption { private boolean moveMechanicalPiston(World world, BlockPos pos, Queue frontier, Set visited, BlockState state) throws AssemblyException { - Direction direction = state.get(MechanicalPistonBlock.FACING); - PistonState pistonState = state.get(MechanicalPistonBlock.STATE); + Direction direction = state.getValue(MechanicalPistonBlock.FACING); + PistonState pistonState = state.getValue(MechanicalPistonBlock.STATE); if (pistonState == PistonState.MOVING) return false; - BlockPos offset = pos.offset(direction.getOpposite()); + BlockPos offset = pos.relative(direction.getOpposite()); if (!visited.contains(offset)) { BlockState poleState = world.getBlockState(offset); - if (AllBlocks.PISTON_EXTENSION_POLE.has(poleState) && poleState.get(PistonExtensionPoleBlock.FACING) + if (AllBlocks.PISTON_EXTENSION_POLE.has(poleState) && poleState.getValue(PistonExtensionPoleBlock.FACING) .getAxis() == direction.getAxis()) frontier.add(offset); } if (pistonState == PistonState.EXTENDED || MechanicalPistonBlock.isStickyPiston(state)) { - offset = pos.offset(direction); + offset = pos.relative(direction); if (!visited.contains(offset)) frontier.add(offset); } @@ -575,7 +577,7 @@ public abstract class Contraption { private boolean moveChassis(World world, BlockPos pos, Direction movementDirection, Queue frontier, Set visited) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (!(te instanceof ChassisTileEntity)) return false; ChassisTileEntity chassis = (ChassisTileEntity) te; @@ -592,23 +594,23 @@ public abstract class Contraption { protected Pair capture(World world, BlockPos pos) { BlockState blockstate = world.getBlockState(pos); if (blockstate.getBlock() instanceof ChestBlock) - blockstate = blockstate.with(ChestBlock.TYPE, ChestType.SINGLE); + blockstate = blockstate.setValue(ChestBlock.TYPE, ChestType.SINGLE); if (AllBlocks.ADJUSTABLE_CRATE.has(blockstate)) - blockstate = blockstate.with(AdjustableCrateBlock.DOUBLE, false); + blockstate = blockstate.setValue(AdjustableCrateBlock.DOUBLE, false); if (AllBlocks.REDSTONE_CONTACT.has(blockstate)) - blockstate = blockstate.with(RedstoneContactBlock.POWERED, true); + blockstate = blockstate.setValue(RedstoneContactBlock.POWERED, true); if (blockstate.getBlock() instanceof AbstractButtonBlock) { - blockstate = blockstate.with(AbstractButtonBlock.POWERED, false); - world.getPendingBlockTicks() + blockstate = blockstate.setValue(AbstractButtonBlock.POWERED, false); + world.getBlockTicks() .scheduleTick(pos, blockstate.getBlock(), -1); } if (blockstate.getBlock() instanceof PressurePlateBlock) { - blockstate = blockstate.with(PressurePlateBlock.POWERED, false); - world.getPendingBlockTicks() + blockstate = blockstate.setValue(PressurePlateBlock.POWERED, false); + world.getBlockTicks() .scheduleTick(pos, blockstate.getBlock(), -1); } CompoundNBT compoundnbt = getTileEntityNBT(world, pos); - TileEntity tileentity = world.getTileEntity(pos); + TileEntity tileentity = world.getBlockEntity(pos); return Pair.of(new BlockInfo(pos, blockstate, compoundnbt), tileentity); } @@ -619,7 +621,7 @@ public abstract class Contraption { if (blocks.put(localPos, blockInfo) != null) return; - bounds = bounds.union(new AxisAlignedBB(localPos)); + bounds = bounds.minmax(new AxisAlignedBB(localPos)); TileEntity te = pair.getValue(); if (te != null && MountedStorage.canUseAsStorage(te)) @@ -637,10 +639,10 @@ public abstract class Contraption { @Nullable protected CompoundNBT getTileEntityNBT(World world, BlockPos pos) { - TileEntity tileentity = world.getTileEntity(pos); + TileEntity tileentity = world.getBlockEntity(pos); if (tileentity == null) return null; - CompoundNBT nbt = tileentity.write(new CompoundNBT()); + CompoundNBT nbt = tileentity.save(new CompoundNBT()); nbt.remove("x"); nbt.remove("y"); nbt.remove("z"); @@ -693,18 +695,18 @@ public abstract class Contraption { superglue.clear(); NBTHelper.iterateCompoundList(nbt.getList("Superglue", NBT.TAG_COMPOUND), c -> superglue - .add(Pair.of(NBTUtil.readBlockPos(c.getCompound("Pos")), Direction.byIndex(c.getByte("Direction"))))); + .add(Pair.of(NBTUtil.readBlockPos(c.getCompound("Pos")), Direction.from3DDataValue(c.getByte("Direction"))))); seats.clear(); NBTHelper.iterateCompoundList(nbt.getList("Seats", NBT.TAG_COMPOUND), c -> seats.add(NBTUtil.readBlockPos(c))); seatMapping.clear(); NBTHelper.iterateCompoundList(nbt.getList("Passengers", NBT.TAG_COMPOUND), - c -> seatMapping.put(NBTUtil.readUniqueId(NBTHelper.getINBT(c, "Id")), c.getInt("Seat"))); + c -> seatMapping.put(NBTUtil.loadUUID(NBTHelper.getINBT(c, "Id")), c.getInt("Seat"))); stabilizedSubContraptions.clear(); NBTHelper.iterateCompoundList(nbt.getList("SubContraptions", NBT.TAG_COMPOUND), - c -> stabilizedSubContraptions.put(c.getUniqueId("Id"), BlockFace.fromNBT(c.getCompound("Location")))); + c -> stabilizedSubContraptions.put(c.getUUID("Id"), BlockFace.fromNBT(c.getCompound("Location")))); storage.clear(); NBTHelper.iterateCompoundList(nbt.getList("Storage", NBT.TAG_COMPOUND), c -> storage @@ -772,7 +774,7 @@ public abstract class Contraption { CompoundNBT c = new CompoundNBT(); c.put("Pos", NBTUtil.writeBlockPos(glueEntry.getKey())); c.putByte("Direction", (byte) glueEntry.getValue() - .getIndex()); + .get3DDataValue()); superglueNBT.add(c); } @@ -801,14 +803,14 @@ public abstract class Contraption { nbt.put("Seats", NBTHelper.writeCompoundList(getSeats(), NBTUtil::writeBlockPos)); nbt.put("Passengers", NBTHelper.writeCompoundList(getSeatMapping().entrySet(), e -> { CompoundNBT tag = new CompoundNBT(); - tag.put("Id", NBTUtil.fromUuid(e.getKey())); + tag.put("Id", NBTUtil.createUUID(e.getKey())); tag.putInt("Seat", e.getValue()); return tag; })); nbt.put("SubContraptions", NBTHelper.writeCompoundList(stabilizedSubContraptions.entrySet(), e -> { CompoundNBT tag = new CompoundNBT(); - tag.putUniqueId("Id", e.getKey()); + tag.putUUID("Id", e.getKey()); tag.put("Location", e.getValue() .serializeNBT()); return tag; @@ -841,7 +843,7 @@ public abstract class Contraption { for (BlockInfo block : this.blocks.values()) { int id = palette.idFor(block.state); CompoundNBT c = new CompoundNBT(); - c.putLong("Pos", block.pos.toLong()); + c.putLong("Pos", block.pos.asLong()); c.putInt("State", id); if (block.nbt != null) c.put("Data", block.nbt); @@ -849,7 +851,7 @@ public abstract class Contraption { } ListNBT paletteNBT = new ListNBT(); - palette.writePaletteToList(paletteNBT); + palette.write(paletteNBT); compound.put("Palette", paletteNBT); compound.put("BlockList", blockList); @@ -879,7 +881,7 @@ public abstract class Contraption { this.blocks.put(info.pos, info); - if (world.isRemote) { + if (world.isClientSide) { Block block = info.state.getBlock(); CompoundNBT tag = info.nbt; MovementBehaviour movementBehaviour = AllMovementBehaviours.of(block); @@ -890,10 +892,10 @@ public abstract class Contraption { tag.putInt("y", info.pos.getY()); tag.putInt("z", info.pos.getZ()); - TileEntity te = TileEntity.createFromTag(info.state, tag); + TileEntity te = TileEntity.loadStatic(info.state, tag); if (te == null) return; - te.setLocation(new ContraptionTileWorld(world, te, info), te.getPos()); + te.setLevelAndPosition(new ContraptionTileWorld(world, te, info), te.getBlockPos()); if (te instanceof KineticTileEntity) ((KineticTileEntity) te).setSpeed(0); te.getBlockState(); @@ -912,8 +914,8 @@ public abstract class Contraption { } private static BlockInfo readBlockInfo(CompoundNBT blockListEntry, HashMapPalette palette) { - return new BlockInfo(BlockPos.fromLong(blockListEntry.getLong("Pos")), - Objects.requireNonNull(palette.get(blockListEntry.getInt("State"))), + return new BlockInfo(BlockPos.of(blockListEntry.getLong("Pos")), + Objects.requireNonNull(palette.valueFor(blockListEntry.getInt("State"))), blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null); } @@ -937,34 +939,47 @@ public abstract class Contraption { if (brittles != BlockMovementChecks.isBrittle(block.state)) continue; - BlockPos add = block.pos.add(anchor) - .add(offset); + BlockPos add = block.pos.offset(anchor) + .offset(offset); if (customBlockRemoval(world, add, block.state)) continue; BlockState oldState = world.getBlockState(add); Block blockIn = oldState.getBlock(); if (block.state.getBlock() != blockIn) iterator.remove(); - world.removeTileEntity(add); + world.removeBlockEntity(add); int flags = BlockFlags.IS_MOVING | BlockFlags.NO_NEIGHBOR_DROPS | BlockFlags.UPDATE_NEIGHBORS | BlockFlags.BLOCK_UPDATE | BlockFlags.RERENDER_MAIN_THREAD; - if (blockIn instanceof IWaterLoggable && oldState.contains(BlockStateProperties.WATERLOGGED) - && oldState.get(BlockStateProperties.WATERLOGGED) - .booleanValue()) { - world.setBlockState(add, Blocks.WATER.getDefaultState(), flags); + if (blockIn instanceof IWaterLoggable && oldState.hasProperty(BlockStateProperties.WATERLOGGED) + && oldState.getValue(BlockStateProperties.WATERLOGGED)) { + world.setBlock(add, Blocks.WATER.defaultBlockState(), flags); continue; } - world.setBlockState(add, Blocks.AIR.getDefaultState(), flags); + world.setBlock(add, Blocks.AIR.defaultBlockState(), flags); } } for (BlockInfo block : blocks.values()) { - BlockPos add = block.pos.add(anchor) - .add(offset); + BlockPos add = block.pos.offset(anchor) + .offset(offset); // if (!shouldUpdateAfterMovement(block)) // continue; + int flags = BlockFlags.IS_MOVING | BlockFlags.DEFAULT; - world.notifyBlockUpdate(add, block.state, Blocks.AIR.getDefaultState(), flags); - block.state.updateDiagonalNeighbors(world, add, flags & -2); + world.sendBlockUpdated(add, block.state, Blocks.AIR.defaultBlockState(), flags); + + // when the blockstate is set to air, the block's POI data is removed, but markAndNotifyBlock tries to + // remove it again, so to prevent an error from being logged by double-removal we add the POI data back now + // (code copied from ServerWorld.onBlockStateChange) + ServerWorld serverWorld = (ServerWorld) world; + PointOfInterestType.forState(block.state).ifPresent(poiType -> { + world.getServer().execute(() -> { + serverWorld.getPoiManager().add(add, poiType); + DebugPacketSender.sendPoiAddedPacket(serverWorld, add); + }); + }); + + world.markAndNotifyBlock(add, world.getChunkAt(add), block.state, Blocks.AIR.defaultBlockState(), flags, 512); + block.state.updateIndirectNeighbourShapes(world, add, flags & -2); } } @@ -982,27 +997,27 @@ public abstract class Contraption { if (nonBrittles) for (Direction face : Iterate.directions) - state = state.updatePostPlacement(face, world.getBlockState(targetPos.offset(face)), world, - targetPos, targetPos.offset(face)); + state = state.updateShape(face, world.getBlockState(targetPos.relative(face)), world, + targetPos, targetPos.relative(face)); BlockState blockState = world.getBlockState(targetPos); - if (blockState.getBlockHardness(world, targetPos) == -1 || (state.getCollisionShape(world, targetPos) + if (blockState.getDestroySpeed(world, targetPos) == -1 || (state.getCollisionShape(world, targetPos) .isEmpty() && !blockState.getCollisionShape(world, targetPos) .isEmpty())) { if (targetPos.getY() == 0) - targetPos = targetPos.up(); - world.playEvent(2001, targetPos, Block.getStateId(state)); - Block.spawnDrops(state, world, targetPos, null); + targetPos = targetPos.above(); + world.levelEvent(2001, targetPos, Block.getId(state)); + Block.dropResources(state, world, targetPos, null); continue; } - if (state.getBlock() instanceof IWaterLoggable && state.contains(BlockStateProperties.WATERLOGGED)) { + if (state.getBlock() instanceof IWaterLoggable && state.hasProperty(BlockStateProperties.WATERLOGGED)) { FluidState FluidState = world.getFluidState(targetPos); - state = state.with(BlockStateProperties.WATERLOGGED, FluidState.getFluid() == Fluids.WATER); + state = state.setValue(BlockStateProperties.WATERLOGGED, FluidState.getType() == Fluids.WATER); } world.destroyBlock(targetPos, true); - world.setBlockState(targetPos, state, 3 | BlockFlags.IS_MOVING); + world.setBlock(targetPos, state, 3 | BlockFlags.IS_MOVING); boolean verticalRotation = transform.rotationAxis == null || transform.rotationAxis.isHorizontal(); verticalRotation = verticalRotation && transform.rotation != Rotation.NONE; @@ -1011,7 +1026,7 @@ public abstract class Contraption { world.destroyBlock(targetPos, true); } - TileEntity tileEntity = world.getTileEntity(targetPos); + TileEntity tileEntity = world.getBlockEntity(targetPos); CompoundNBT tag = block.nbt; if (tileEntity != null) tag = NBTProcessors.process(tileEntity, tag, false); @@ -1026,9 +1041,9 @@ public abstract class Contraption { } if (tileEntity instanceof FluidTankTileEntity && tag.contains("LastKnownPos")) - tag.put("LastKnownPos", NBTUtil.writeBlockPos(BlockPos.ZERO.down())); + tag.put("LastKnownPos", NBTUtil.writeBlockPos(BlockPos.ZERO.below())); - tileEntity.fromTag(block.state, tag); + tileEntity.load(block.state, tag); if (storage.containsKey(block.pos)) { MountedStorage mountedStorage = storage.get(block.pos); @@ -1042,6 +1057,8 @@ public abstract class Contraption { mountedStorage.addStorageToWorld(tileEntity); } } + + transform.apply(tileEntity); } } for (BlockInfo block : blocks.values()) { @@ -1065,8 +1082,8 @@ public abstract class Contraption { SuperGlueEntity entity = new SuperGlueEntity(world, targetPos, targetFacing); if (entity.onValidSurface()) { - if (!world.isRemote) - world.addEntity(entity); + if (!world.isClientSide) + world.addFreshEntity(entity); } } } @@ -1075,7 +1092,7 @@ public abstract class Contraption { for (Entity seatedEntity : seatedEntities) { if (getSeatMapping().isEmpty()) continue; - Integer seatIndex = getSeatMapping().get(seatedEntity.getUniqueID()); + Integer seatIndex = getSeatMapping().get(seatedEntity.getUUID()); BlockPos seatPos = getSeats().get(seatIndex); seatPos = transform.apply(seatPos); if (!(world.getBlockState(seatPos) @@ -1199,11 +1216,11 @@ public abstract class Contraption { VoxelShape collisionShape = info.state.getCollisionShape(world, localPos); if (collisionShape.isEmpty()) continue; - combinedShape = VoxelShapes.combine(combinedShape, - collisionShape.withOffset(localPos.getX(), localPos.getY(), localPos.getZ()), IBooleanFunction.OR); + combinedShape = VoxelShapes.joinUnoptimized(combinedShape, + collisionShape.move(localPos.getX(), localPos.getY(), localPos.getZ()), IBooleanFunction.OR); } - return combinedShape.simplify() - .toBoundingBoxList(); + return combinedShape.optimize() + .toAabbs(); }) .thenAccept(r -> { simplifiedEntityColliders = Optional.of(r); @@ -1252,14 +1269,14 @@ public abstract class Contraption { @Override public BlockState getBlockState(BlockPos pos) { - if (!pos.equals(te.getPos())) - return Blocks.AIR.getDefaultState(); + if (!pos.equals(te.getBlockPos())) + return Blocks.AIR.defaultBlockState(); return info.state; } @Override - public boolean isBlockPresent(BlockPos pos) { - return pos.equals(te.getPos()); + public boolean isLoaded(BlockPos pos) { + return pos.equals(te.getBlockPos()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java index 0c0bee7e1..f07a194b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import static net.minecraft.entity.Entity.collideBoundingBoxHeuristically; -import static net.minecraft.entity.Entity.horizontalMag; +import static net.minecraft.entity.Entity.getHorizontalDistanceSqr; import java.util.ArrayList; import java.util.List; @@ -60,7 +60,7 @@ public class ContraptionCollider { } static void collideEntities(AbstractContraptionEntity contraptionEntity) { - World world = contraptionEntity.getEntityWorld(); + World world = contraptionEntity.getCommandSenderWorld(); Contraption contraption = contraptionEntity.getContraption(); AxisAlignedBB bounds = contraptionEntity.getBoundingBox(); @@ -69,7 +69,7 @@ public class ContraptionCollider { if (bounds == null) return; - Vector3d contraptionPosition = contraptionEntity.getPositionVec(); + Vector3d contraptionPosition = contraptionEntity.position(); Vector3d contraptionMotion = contraptionPosition.subtract(contraptionEntity.getPrevPositionVec()); Vector3d anchorVec = contraptionEntity.getAnchorVec(); ContraptionRotationState rotation = null; @@ -77,8 +77,8 @@ public class ContraptionCollider { // After death, multiple refs to the client player may show up in the area boolean skipClientPlayer = false; - List entitiesWithinAABB = world.getEntitiesWithinAABB(Entity.class, bounds.grow(2) - .expand(0, 32, 0), contraptionEntity::canCollideWith); + List entitiesWithinAABB = world.getEntitiesOfClass(Entity.class, bounds.inflate(2) + .expandTowards(0, 32, 0), contraptionEntity::canCollideWith); for (Entity entity : entitiesWithinAABB) { PlayerType playerType = getPlayerType(entity); @@ -86,7 +86,7 @@ public class ContraptionCollider { continue; if (playerType == PlayerType.SERVER && entity instanceof ServerPlayerEntity) { - ((ServerPlayerEntity) entity).connection.floatingTickCount = 0; + ((ServerPlayerEntity) entity).connection.aboveGroundTickCount = 0; continue; } @@ -102,30 +102,30 @@ public class ContraptionCollider { Matrix3d rotationMatrix = rotation.asMatrix(); // Transform entity position and motion to local space - Vector3d entityPosition = entity.getPositionVec(); + Vector3d entityPosition = entity.position(); AxisAlignedBB entityBounds = entity.getBoundingBox(); - Vector3d motion = entity.getMotion(); + Vector3d motion = entity.getDeltaMovement(); float yawOffset = rotation.getYawOffset(); Vector3d position = getWorldToLocalTranslation(entity, anchorVec, rotationMatrix, yawOffset); // Prepare entity bounds - AxisAlignedBB localBB = entityBounds.offset(position) - .grow(1.0E-7D); + AxisAlignedBB localBB = entityBounds.move(position) + .inflate(1.0E-7D); OrientedBB obb = new OrientedBB(localBB); obb.setRotation(rotationMatrix); motion = motion.subtract(contraptionMotion); motion = rotationMatrix.transform(motion); - // Use simplified bbs when present + // Use simplified bbs when present final Vector3d motionCopy = motion; List collidableBBs = contraption.simplifiedEntityColliders.orElseGet(() -> { // Else find 'nearby' individual block shapes to collide with List bbs = new ArrayList<>(); ReuseableStream potentialHits = - getPotentiallyCollidedShapes(world, contraption, localBB.expand(motionCopy)); - potentialHits.createStream() - .forEach(shape -> shape.toBoundingBoxList() + getPotentiallyCollidedShapes(world, contraption, localBB.expandTowards(motionCopy)); + potentialHits.getStream() + .forEach(shape -> shape.toAabbs() .forEach(bbs::add)); return bbs; @@ -147,12 +147,12 @@ public class ContraptionCollider { Vector3d currentResponse = collisionResponse.getValue(); Vector3d currentCenter = obbCenter.add(currentResponse); - if (Math.abs(currentCenter.x - bb.getCenter().x) - entityBounds.getXSize() - 1 > bb.getXSize() / 2) + if (Math.abs(currentCenter.x - bb.getCenter().x) - entityBounds.getXsize() - 1 > bb.getXsize() / 2) continue; - if (Math.abs((currentCenter.y + motion.y) - bb.getCenter().y) - entityBounds.getYSize() - - 1 > bb.getYSize() / 2) + if (Math.abs((currentCenter.y + motion.y) - bb.getCenter().y) - entityBounds.getYsize() + - 1 > bb.getYsize() / 2) continue; - if (Math.abs(currentCenter.z - bb.getCenter().z) - entityBounds.getZSize() - 1 > bb.getZSize() / 2) + if (Math.abs(currentCenter.z - bb.getCenter().z) - entityBounds.getZsize() - 1 > bb.getZsize() / 2) continue; obb.setCenter(currentCenter); @@ -169,7 +169,7 @@ public class ContraptionCollider { Vector3d collisionPosition = intersect.getCollisionPosition(); if (!isTemporal) { - Vector3d separation = intersect.asSeparationVec(entity.stepHeight); + Vector3d separation = intersect.asSeparationVec(entity.maxUpStep); if (separation != null && !separation.equals(Vector3d.ZERO)) { collisionResponse.setValue(currentResponse.add(separation)); timeOfImpact = 0; @@ -198,12 +198,12 @@ public class ContraptionCollider { // Re-run collisions with horizontal offset collisionResponse.setValue(collisionResponse.getValue() - .mul(129 / 128f, 0, 129 / 128f)); + .multiply(129 / 128f, 0, 129 / 128f)); continue; } // Resolve collision - Vector3d entityMotion = entity.getMotion(); + Vector3d entityMotion = entity.getDeltaMovement(); Vector3d entityMotionNoTemporal = entityMotion; Vector3d collisionNormal = normal.getValue(); Vector3d collisionLocation = location.getValue(); @@ -230,7 +230,7 @@ public class ContraptionCollider { double slide = 0; if (!collisionLocation.equals(Vector3d.ZERO)) { - collisionLocation = collisionLocation.add(entity.getPositionVec() + collisionLocation = collisionLocation.add(entity.position() .add(entity.getBoundingBox() .getCenter()) .scale(.5f)); @@ -250,8 +250,8 @@ public class ContraptionCollider { boolean anyCollision = hardCollision || temporalCollision; if (bounce > 0 && hasNormal && anyCollision && bounceEntity(entity, collisionNormal, contraptionEntity, bounce)) { - entity.world.playSound(playerType == PlayerType.CLIENT ? (PlayerEntity) entity : null, - entity.getX(), entity.getY(), entity.getZ(), SoundEvents.BLOCK_SLIME_BLOCK_FALL, + entity.level.playSound(playerType == PlayerType.CLIENT ? (PlayerEntity) entity : null, + entity.getX(), entity.getY(), entity.getZ(), SoundEvents.SLIME_BLOCK_FALL, SoundCategory.BLOCKS, .5f, 1); continue; } @@ -259,53 +259,53 @@ public class ContraptionCollider { if (temporalCollision) { double idealVerticalMotion = motionResponse.y; if (idealVerticalMotion != entityMotion.y) { - entity.setMotion(entityMotion.mul(1, 0, 1) + entity.setDeltaMovement(entityMotion.multiply(1, 0, 1) .add(0, idealVerticalMotion, 0)); - entityMotion = entity.getMotion(); + entityMotion = entity.getDeltaMovement(); } } if (hardCollision) { - double motionX = entityMotion.getX(); - double motionY = entityMotion.getY(); - double motionZ = entityMotion.getZ(); - double intersectX = totalResponse.getX(); - double intersectY = totalResponse.getY(); - double intersectZ = totalResponse.getZ(); + double motionX = entityMotion.x(); + double motionY = entityMotion.y(); + double motionZ = entityMotion.z(); + double intersectX = totalResponse.x(); + double intersectY = totalResponse.y(); + double intersectZ = totalResponse.z(); double horizonalEpsilon = 1 / 128f; if (motionX != 0 && Math.abs(intersectX) > horizonalEpsilon && motionX > 0 == intersectX < 0) - entityMotion = entityMotion.mul(0, 1, 1); + entityMotion = entityMotion.multiply(0, 1, 1); if (motionY != 0 && intersectY != 0 && motionY > 0 == intersectY < 0) - entityMotion = entityMotion.mul(1, 0, 1) + entityMotion = entityMotion.multiply(1, 0, 1) .add(0, contraptionMotion.y, 0); if (motionZ != 0 && Math.abs(intersectZ) > horizonalEpsilon && motionZ > 0 == intersectZ < 0) - entityMotion = entityMotion.mul(1, 1, 0); + entityMotion = entityMotion.multiply(1, 1, 0); } if (bounce == 0 && slide > 0 && hasNormal && anyCollision && rotation.hasVerticalRotation()) { - double slideFactor = collisionNormal.mul(1, 0, 1) + double slideFactor = collisionNormal.multiply(1, 0, 1) .length() * 1.25f; - Vector3d motionIn = entityMotionNoTemporal.mul(0, .9, 0) + Vector3d motionIn = entityMotionNoTemporal.multiply(0, .9, 0) .add(0, -.01f, 0); - Vector3d slideNormal = collisionNormal.crossProduct(motionIn.crossProduct(collisionNormal)) + Vector3d slideNormal = collisionNormal.cross(motionIn.cross(collisionNormal)) .normalize(); - Vector3d newMotion = entityMotion.mul(.85, 0, .85) + Vector3d newMotion = entityMotion.multiply(.85, 0, .85) .add(slideNormal.scale((.2f + slide) * motionIn.length() * slideFactor) .add(0, -.1f - collisionNormal.y * .125f, 0)); - entity.setMotion(newMotion); - entityMotion = entity.getMotion(); + entity.setDeltaMovement(newMotion); + entityMotion = entity.getDeltaMovement(); } if (!hardCollision && surfaceCollision.isFalse()) continue; Vector3d allowedMovement = getAllowedMovement(totalResponse, entity); - entity.setPosition(entityPosition.x + allowedMovement.x, entityPosition.y + allowedMovement.y, + entity.setPos(entityPosition.x + allowedMovement.x, entityPosition.y + allowedMovement.y, entityPosition.z + allowedMovement.z); - entityPosition = entity.getPositionVec(); + entityPosition = entity.position(); - entity.velocityChanged = true; + entity.hurtMarked = true; Vector3d contactPointMotion = Vector3d.ZERO; if (surfaceCollision.isTrue()) { @@ -316,21 +316,21 @@ public class ContraptionCollider { if (canWalk) entity.onGround = true; if (entity instanceof ItemEntity) - entityMotion = entityMotion.mul(.5f, 1, .5f); + entityMotion = entityMotion.multiply(.5f, 1, .5f); } contactPointMotion = contraptionEntity.getContactPointMotion(entityPosition); allowedMovement = getAllowedMovement(contactPointMotion, entity); - entity.setPosition(entityPosition.x + allowedMovement.x, entityPosition.y, + entity.setPos(entityPosition.x + allowedMovement.x, entityPosition.y, entityPosition.z + allowedMovement.z); } - entity.setMotion(entityMotion); + entity.setDeltaMovement(entityMotion); if (playerType != PlayerType.CLIENT) continue; - double d0 = entity.getX() - entity.prevPosX - contactPointMotion.x; - double d1 = entity.getZ() - entity.prevPosZ - contactPointMotion.z; + double d0 = entity.getX() - entity.xo - contactPointMotion.x; + double d1 = entity.getZ() - entity.zo - contactPointMotion.z; float limbSwing = MathHelper.sqrt(d0 * d0 + d1 * d1) * 4.0F; if (limbSwing > 1.0F) limbSwing = 1.0F; @@ -342,15 +342,15 @@ public class ContraptionCollider { static boolean bounceEntity(Entity entity, Vector3d normal, AbstractContraptionEntity contraption, double factor) { if (factor == 0) return false; - if (entity.bypassesLandingEffects()) + if (entity.isSuppressingBounce()) return false; - Vector3d contactPointMotion = contraption.getContactPointMotion(entity.getPositionVec()); - Vector3d motion = entity.getMotion().subtract(contactPointMotion); - Vector3d deltav = normal.scale(factor*2*motion.dotProduct(normal)); - if (deltav.dotProduct(deltav) < 0.1f) + Vector3d contactPointMotion = contraption.getContactPointMotion(entity.position()); + Vector3d motion = entity.getDeltaMovement().subtract(contactPointMotion); + Vector3d deltav = normal.scale(factor*2*motion.dot(normal)); + if (deltav.dot(deltav) < 0.1f) return false; - entity.setMotion(entity.getMotion().subtract(deltav)); + entity.setDeltaMovement(entity.getDeltaMovement().subtract(deltav)); return true; } @@ -363,8 +363,8 @@ public class ContraptionCollider { } public static Vector3d getWorldToLocalTranslation(Entity entity, Vector3d anchorVec, Matrix3d rotationMatrix, float yawOffset) { - Vector3d entityPosition = entity.getPositionVec(); - Vector3d centerY = new Vector3d(0, entity.getBoundingBox().getYSize() / 2, 0); + Vector3d entityPosition = entity.position(); + Vector3d centerY = new Vector3d(0, entity.getBoundingBox().getYsize() / 2, 0); Vector3d position = entityPosition; position = position.add(centerY); position = position.subtract(VecHelper.CENTER_OF_ORIGIN); @@ -399,38 +399,38 @@ public class ContraptionCollider { /** From Entity#getAllowedMovement **/ static Vector3d getAllowedMovement(Vector3d movement, Entity e) { AxisAlignedBB bb = e.getBoundingBox(); - ISelectionContext ctx = ISelectionContext.forEntity(e); - World world = e.world; + ISelectionContext ctx = ISelectionContext.of(e); + World world = e.level; VoxelShape voxelshape = world.getWorldBorder() - .getShape(); + .getCollisionShape(); Stream stream = - VoxelShapes.compare(voxelshape, VoxelShapes.create(bb.shrink(1.0E-7D)), IBooleanFunction.AND) + VoxelShapes.joinIsNotEmpty(voxelshape, VoxelShapes.create(bb.deflate(1.0E-7D)), IBooleanFunction.AND) ? Stream.empty() : Stream.of(voxelshape); - Stream stream1 = world.getEntityCollisions(e, bb.expand(movement), entity -> false); // FIXME: 1.15 equivalent translated correctly? + Stream stream1 = world.getEntityCollisions(e, bb.expandTowards(movement), entity -> false); // FIXME: 1.15 equivalent translated correctly? ReuseableStream reuseablestream = new ReuseableStream<>(Stream.concat(stream1, stream)); - Vector3d allowedMovement = movement.lengthSquared() == 0.0D ? movement + Vector3d allowedMovement = movement.lengthSqr() == 0.0D ? movement : collideBoundingBoxHeuristically(e, movement, bb, world, ctx, reuseablestream); boolean xDifferent = movement.x != allowedMovement.x; boolean yDifferent = movement.y != allowedMovement.y; boolean zDifferent = movement.z != allowedMovement.z; boolean notMovingUp = e.isOnGround() || yDifferent && movement.y < 0.0D; - if (e.stepHeight > 0.0F && notMovingUp && (xDifferent || zDifferent)) { - Vector3d allowedStep = collideBoundingBoxHeuristically(e, new Vector3d(movement.x, (double) e.stepHeight, movement.z), + if (e.maxUpStep > 0.0F && notMovingUp && (xDifferent || zDifferent)) { + Vector3d allowedStep = collideBoundingBoxHeuristically(e, new Vector3d(movement.x, (double) e.maxUpStep, movement.z), bb, world, ctx, reuseablestream); - Vector3d allowedStepGivenMovement = collideBoundingBoxHeuristically(e, new Vector3d(0.0D, (double) e.stepHeight, 0.0D), - bb.expand(movement.x, 0.0D, movement.z), world, ctx, reuseablestream); - if (allowedStepGivenMovement.y < (double) e.stepHeight) { + Vector3d allowedStepGivenMovement = collideBoundingBoxHeuristically(e, new Vector3d(0.0D, (double) e.maxUpStep, 0.0D), + bb.expandTowards(movement.x, 0.0D, movement.z), world, ctx, reuseablestream); + if (allowedStepGivenMovement.y < (double) e.maxUpStep) { Vector3d vec3 = collideBoundingBoxHeuristically(e, new Vector3d(movement.x, 0.0D, movement.z), - bb.offset(allowedStepGivenMovement), world, ctx, reuseablestream).add(allowedStepGivenMovement); - if (horizontalMag(vec3) > horizontalMag(allowedStep)) { + bb.move(allowedStepGivenMovement), world, ctx, reuseablestream).add(allowedStepGivenMovement); + if (getHorizontalDistanceSqr(vec3) > getHorizontalDistanceSqr(allowedStep)) { allowedStep = vec3; } } - if (horizontalMag(allowedStep) > horizontalMag(allowedMovement)) { + if (getHorizontalDistanceSqr(allowedStep) > getHorizontalDistanceSqr(allowedMovement)) { return allowedStep.add(collideBoundingBoxHeuristically(e, new Vector3d(0.0D, -allowedStep.y + movement.y, 0.0D), - bb.offset(allowedStep), world, ctx, reuseablestream)); + bb.move(allowedStep), world, ctx, reuseablestream)); } } @@ -440,7 +440,7 @@ public class ContraptionCollider { private static PlayerType getPlayerType(Entity entity) { if (!(entity instanceof PlayerEntity)) return PlayerType.NONE; - if (!entity.world.isRemote) + if (!entity.level.isClientSide) return PlayerType.SERVER; MutableBoolean isClient = new MutableBoolean(false); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> isClient.setValue(isClientPlayerEntity(entity))); @@ -455,17 +455,17 @@ public class ContraptionCollider { private static ReuseableStream getPotentiallyCollidedShapes(World world, Contraption contraption, AxisAlignedBB localBB) { - double height = localBB.getYSize(); - double width = localBB.getXSize(); + double height = localBB.getYsize(); + double width = localBB.getXsize(); double horizontalFactor = (height > width && width != 0) ? height / width : 1; double verticalFactor = (width > height && height != 0) ? width / height : 1; - AxisAlignedBB blockScanBB = localBB.grow(0.5f); - blockScanBB = blockScanBB.grow(horizontalFactor, verticalFactor, horizontalFactor); + AxisAlignedBB blockScanBB = localBB.inflate(0.5f); + blockScanBB = blockScanBB.inflate(horizontalFactor, verticalFactor, horizontalFactor); BlockPos min = new BlockPos(blockScanBB.minX, blockScanBB.minY, blockScanBB.minZ); BlockPos max = new BlockPos(blockScanBB.maxX, blockScanBB.maxY, blockScanBB.maxZ); - ReuseableStream potentialHits = new ReuseableStream<>(BlockPos.getAllInBox(min, max) + ReuseableStream potentialHits = new ReuseableStream<>(BlockPos.betweenClosedStream(min, max) .filter(contraption.getBlocks()::containsKey) .map(p -> { BlockState blockState = contraption.getBlocks() @@ -473,7 +473,7 @@ public class ContraptionCollider { BlockPos pos = contraption.getBlocks() .get(p).pos; VoxelShape collisionShape = blockState.getCollisionShape(world, p); - return collisionShape.withOffset(pos.getX(), pos.getY(), pos.getZ()); + return collisionShape.move(pos.getX(), pos.getY(), pos.getZ()); }) .filter(Predicates.not(VoxelShape::isEmpty))); @@ -484,11 +484,11 @@ public class ContraptionCollider { if (!contraptionEntity.supportsTerrainCollision()) return false; - World world = contraptionEntity.getEntityWorld(); - Vector3d motion = contraptionEntity.getMotion(); + World world = contraptionEntity.getCommandSenderWorld(); + Vector3d motion = contraptionEntity.getDeltaMovement(); TranslatingContraption contraption = (TranslatingContraption) contraptionEntity.getContraption(); AxisAlignedBB bounds = contraptionEntity.getBoundingBox(); - Vector3d position = contraptionEntity.getPositionVec(); + Vector3d position = contraptionEntity.position(); BlockPos gridPos = new BlockPos(position); if (contraption == null) @@ -498,37 +498,37 @@ public class ContraptionCollider { if (motion.equals(Vector3d.ZERO)) return false; - Direction movementDirection = Direction.getFacingFromVector(motion.x, motion.y, motion.z); + Direction movementDirection = Direction.getNearest(motion.x, motion.y, motion.z); // Blocks in the world if (movementDirection.getAxisDirection() == AxisDirection.POSITIVE) - gridPos = gridPos.offset(movementDirection); + gridPos = gridPos.relative(movementDirection); if (isCollidingWithWorld(world, contraption, gridPos, movementDirection)) return true; // Other moving Contraptions - for (ControlledContraptionEntity otherContraptionEntity : world.getEntitiesWithinAABB( - ControlledContraptionEntity.class, bounds.grow(1), e -> !e.equals(contraptionEntity))) { + for (ControlledContraptionEntity otherContraptionEntity : world.getEntitiesOfClass( + ControlledContraptionEntity.class, bounds.inflate(1), e -> !e.equals(contraptionEntity))) { if (!otherContraptionEntity.supportsTerrainCollision()) continue; - Vector3d otherMotion = otherContraptionEntity.getMotion(); + Vector3d otherMotion = otherContraptionEntity.getDeltaMovement(); TranslatingContraption otherContraption = (TranslatingContraption) otherContraptionEntity.getContraption(); AxisAlignedBB otherBounds = otherContraptionEntity.getBoundingBox(); - Vector3d otherPosition = otherContraptionEntity.getPositionVec(); + Vector3d otherPosition = otherContraptionEntity.position(); if (otherContraption == null) return false; if (otherBounds == null) return false; - if (!bounds.offset(motion) - .intersects(otherBounds.offset(otherMotion))) + if (!bounds.move(motion) + .intersects(otherBounds.move(otherMotion))) continue; for (BlockPos colliderPos : contraption.getColliders(world, movementDirection)) { - colliderPos = colliderPos.add(gridPos) + colliderPos = colliderPos.offset(gridPos) .subtract(new BlockPos(otherPosition)); if (!otherContraption.getBlocks() .containsKey(colliderPos)) @@ -543,9 +543,9 @@ public class ContraptionCollider { public static boolean isCollidingWithWorld(World world, TranslatingContraption contraption, BlockPos anchor, Direction movementDirection) { for (BlockPos pos : contraption.getColliders(world, movementDirection)) { - BlockPos colliderPos = pos.add(anchor); + BlockPos colliderPos = pos.offset(anchor); - if (!world.isBlockPresent(colliderPos)) + if (!world.isLoaded(colliderPos)) return true; BlockState collidedState = world.getBlockState(colliderPos); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java index 8d8ed3b62..fe20059fa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java @@ -17,7 +17,7 @@ public class ContraptionEntityRenderer exte } @Override - public ResourceLocation getEntityTexture(C entity) { + public ResourceLocation getTextureLocation(C entity) { return null; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java index a21df0650..ef0a9dedd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java @@ -27,8 +27,8 @@ public class ContraptionHandler { static WorldAttached> queuedAdditions; static { - loadedContraptions = new WorldAttached<>(HashMap::new); - queuedAdditions = new WorldAttached<>(() -> ObjectLists.synchronize(new ObjectArrayList<>())); + loadedContraptions = new WorldAttached<>($ -> new HashMap<>()); + queuedAdditions = new WorldAttached<>($ -> ObjectLists.synchronize(new ObjectArrayList<>())); } public static void tick(World world) { @@ -36,7 +36,7 @@ public class ContraptionHandler { List queued = queuedAdditions.get(world); for (AbstractContraptionEntity contraptionEntity : queued) - map.put(contraptionEntity.getEntityId(), new WeakReference<>(contraptionEntity)); + map.put(contraptionEntity.getId(), new WeakReference<>(contraptionEntity)); queued.clear(); Collection> values = map.values(); @@ -58,14 +58,14 @@ public class ContraptionHandler { } public static void entitiesWhoJustDismountedGetSentToTheRightLocation(LivingEntity entityLiving, World world) { - if (world.isRemote) + if (world.isClientSide) return; CompoundNBT data = entityLiving.getPersistentData(); if (!data.contains("ContraptionDismountLocation")) return; Vector3d position = VecHelper.readNBT(data.getList("ContraptionDismountLocation", NBT.TAG_DOUBLE)); - if (entityLiving.getRidingEntity() == null) - entityLiving.setPositionAndUpdate(position.x, position.y, position.z); + if (entityLiving.getVehicle() == null) + entityLiving.teleportTo(position.x, position.y, position.z); data.remove("ContraptionDismountLocation"); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java index 3ab9bb670..deb7ec47c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java @@ -52,8 +52,8 @@ public class ContraptionHandlerClient { } float limbSwing = data.getFloat("OverrideLimbSwing"); - remotePlayer.prevPosX = remotePlayer.getX() - (limbSwing / 4); - remotePlayer.prevPosZ = remotePlayer.getZ(); + remotePlayer.xo = remotePlayer.getX() - (limbSwing / 4); + remotePlayer.zo = remotePlayer.getZ(); } @SubscribeEvent @@ -65,20 +65,20 @@ public class ContraptionHandlerClient { return; if (player.isPassenger()) return; - if (mc.world == null) + if (mc.level == null) return; if (!event.isUseItem()) return; Vector3d origin = RaycastHelper.getTraceOrigin(player); - double reach = mc.playerController.getBlockReachDistance(); - if (mc.objectMouseOver != null && mc.objectMouseOver.getHitVec() != null) - reach = Math.min(mc.objectMouseOver.getHitVec() + double reach = mc.gameMode.getPickRange(); + if (mc.hitResult != null && mc.hitResult.getLocation() != null) + reach = Math.min(mc.hitResult.getLocation() .distanceTo(origin), reach); Vector3d target = RaycastHelper.getTraceTarget(player, reach, origin); - for (AbstractContraptionEntity contraptionEntity : mc.world - .getEntitiesWithinAABB(AbstractContraptionEntity.class, new AxisAlignedBB(origin, target))) { + for (AbstractContraptionEntity contraptionEntity : mc.level + .getEntitiesOfClass(AbstractContraptionEntity.class, new AxisAlignedBB(origin, target))) { Vector3d localOrigin = contraptionEntity.toLocalVector(origin, 1); Vector3d localTarget = contraptionEntity.toLocalVector(target, 1); @@ -91,10 +91,10 @@ public class ContraptionHandlerClient { if (blockInfo == null) return false; BlockState state = blockInfo.state; - VoxelShape raytraceShape = state.getShape(Minecraft.getInstance().world, BlockPos.ZERO.down()); + VoxelShape raytraceShape = state.getShape(Minecraft.getInstance().level, BlockPos.ZERO.below()); if (raytraceShape.isEmpty()) return false; - BlockRayTraceResult rayTrace = raytraceShape.rayTrace(localOrigin, localTarget, p); + BlockRayTraceResult rayTrace = raytraceShape.clip(localOrigin, localTarget, p); if (rayTrace != null) { mutableResult.setValue(rayTrace); return true; @@ -107,8 +107,8 @@ public class ContraptionHandlerClient { BlockRayTraceResult rayTraceResult = mutableResult.getValue(); Hand hand = event.getHand(); - Direction face = rayTraceResult.getFace(); - BlockPos pos = rayTraceResult.getPos(); + Direction face = rayTraceResult.getDirection(); + BlockPos pos = rayTraceResult.getBlockPos(); if (!contraptionEntity.handlePlayerInteraction(player, pos, face, hand)) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java index 0e5a776b3..7b130e908 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java @@ -24,7 +24,7 @@ public abstract class ContraptionLighter implements ILigh lightVolume = new LightVolume(contraptionBoundsToVolume(bounds.copy())); - lightVolume.initialize(contraption.entity.world); + lightVolume.initialize(contraption.entity.level); scheduleRebuild = true; startListening(); @@ -32,7 +32,7 @@ public abstract class ContraptionLighter implements ILigh public void tick(RenderedContraption owner) { if (scheduleRebuild) { - lightVolume.initialize(owner.contraption.entity.world); + lightVolume.initialize(owner.contraption.entity.level); scheduleRebuild = false; } } @@ -62,4 +62,8 @@ public abstract class ContraptionLighter implements ILigh return bounds; } + + public GridAlignedBB getBounds() { + return bounds; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionWorld.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionWorld.java index bff9499dd..28d9dc99b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionWorld.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionWorld.java @@ -29,7 +29,7 @@ public class ContraptionWorld extends WrappedWorld { if (blockInfo != null) return blockInfo.state; - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); } @Override @@ -43,7 +43,7 @@ public class ContraptionWorld extends WrappedWorld { } @Override - public void playSound(double x, double y, double z, SoundEvent p_184134_7_, SoundCategory p_184134_8_, float p_184134_9_, float p_184134_10_, boolean p_184134_11_) { - world.playSound(x, y, z, p_184134_7_, p_184134_8_, p_184134_9_, p_184134_10_, p_184134_11_); + public void playLocalSound(double x, double y, double z, SoundEvent p_184134_7_, SoundCategory p_184134_8_, float p_184134_9_, float p_184134_10_, boolean p_184134_11_) { + world.playLocalSound(x, y, z, p_184134_7_, p_184134_8_, p_184134_9_, p_184134_10_, p_184134_11_); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java index dbdef7a30..c27d87133 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java @@ -2,10 +2,10 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import static com.simibubi.create.foundation.utility.AngleHelper.angleLerp; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BearingContraption; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; @@ -52,7 +52,7 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { @Override public Vector3d getContactPointMotion(Vector3d globalContactPoint) { if (contraption instanceof TranslatingContraption) - return getMotion(); + return getDeltaMovement(); return super.getContactPointMotion(globalContactPoint); } @@ -124,11 +124,11 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { } @Override - public void setPositionAndUpdate(double p_70634_1_, double p_70634_3_, double p_70634_5_) {} + public void teleportTo(double p_70634_1_, double p_70634_3_, double p_70634_5_) {} @Override @OnlyIn(Dist.CLIENT) - public void setPositionAndRotationDirect(double x, double y, double z, float yw, float pt, int inc, boolean t) {} + public void lerpTo(double x, double y, double z, float yw, float pt, int inc, boolean t) {} protected void tickContraption() { angleDelta = angle - prevAngle; @@ -137,7 +137,7 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { if (controllerPos == null) return; - if (!world.isBlockPresent(controllerPos)) + if (!level.isLoaded(controllerPos)) return; IControlContraption controller = getController(); if (controller == null) { @@ -146,11 +146,11 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { } if (!controller.isAttachedTo(this)) { controller.attach(this); - if (world.isRemote) - setPosition(getX(), getY(), getZ()); + if (level.isClientSide) + setPos(getX(), getY(), getZ()); } - Vector3d motion = getMotion(); + Vector3d motion = getDeltaMovement(); move(motion.x, motion.y, motion.z); if (ContraptionCollider.collideBlocks(this)) getController().collided(); @@ -168,12 +168,12 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { BearingContraption bc = (BearingContraption) contraption; Direction facing = bc.getFacing(); Vector3d activeAreaOffset = actor.getActiveAreaOffset(context); - if (!activeAreaOffset.mul(VecHelper.axisAlingedPlaneOf(Vector3d.of(facing.getDirectionVec()))) + if (!activeAreaOffset.multiply(VecHelper.axisAlingedPlaneOf(Vector3d.atLowerCornerOf(facing.getNormal()))) .equals(Vector3d.ZERO)) return false; if (!VecHelper.onSameAxis(blockInfo.pos, BlockPos.ZERO, facing.getAxis())) return false; - context.motion = Vector3d.of(facing.getDirectionVec()).scale(angleDelta / 360.0); + context.motion = Vector3d.atLowerCornerOf(facing.getNormal()).scale(angleDelta / 360.0); context.relativeMotion = context.motion; int timer = context.data.getInt("StationaryTimer"); if (timer > 0) { @@ -188,9 +188,9 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { protected IControlContraption getController() { if (controllerPos == null) return null; - if (!world.isBlockPresent(controllerPos)) + if (!level.isLoaded(controllerPos)) return null; - TileEntity te = world.getTileEntity(controllerPos); + TileEntity te = level.getBlockEntity(controllerPos); if (!(te instanceof IControlContraption)) return null; return (IControlContraption) te; @@ -220,7 +220,7 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { @Override protected void handleStallInformation(float x, float y, float z, float angle) { - setPos(x, y, z); + setPosRaw(x, y, z); this.angle = angle; } @@ -231,8 +231,8 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { Axis axis = getRotationAxis(); for (MatrixStack stack : matrixStacks) - MatrixStacker.of(stack) - .nudge(getEntityId()) + MatrixTransformStack.of(stack) + .nudge(getId()) .centre() .rotate(angle, axis) .unCentre(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java index 2bf9f5db0..02d7e94cc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java @@ -2,10 +2,10 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import java.util.function.BiPredicate; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.state.properties.BlockStateProperties; @@ -21,13 +21,13 @@ public class DirectionalExtenderScrollOptionSlot extends CenteredSideValueBoxTra @Override protected Vector3d getLocalOffset(BlockState state) { return super.getLocalOffset(state) - .add(Vector3d.of(state.get(BlockStateProperties.FACING).getDirectionVec()).scale(-2 / 16f)); + .add(Vector3d.atLowerCornerOf(state.getValue(BlockStateProperties.FACING).getNormal()).scale(-2 / 16f)); } @Override protected void rotate(BlockState state, MatrixStack ms) { if (!getSide().getAxis().isHorizontal()) - MatrixStacker.of(ms).rotateY(AngleHelper.horizontalAngle(state.get(BlockStateProperties.FACING)) - 90); + MatrixTransformStack.of(ms).rotateY(AngleHelper.horizontalAngle(state.getValue(BlockStateProperties.FACING)) - 90); super.rotate(state, ms); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java index 36455b9cd..80c154e7e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java @@ -24,12 +24,12 @@ public interface IDisplayAssemblyExceptions { if (!tooltip.isEmpty()) tooltip.add(StringTextComponent.EMPTY); - tooltip.add(IHaveGoggleInformation.componentSpacing.copy().append(Lang.translate("gui.assembly.exception").formatted(TextFormatting.GOLD))); + tooltip.add(IHaveGoggleInformation.componentSpacing.plainCopy().append(Lang.translate("gui.assembly.exception").withStyle(TextFormatting.GOLD))); String text = e.component.getString(); Arrays.stream(text.split("\n")) .forEach(l -> TooltipHelper.cutStringTextComponent(l, GRAY, WHITE) - .forEach(c -> tooltip.add(IHaveGoggleInformation.componentSpacing.copy().append(c)))); + .forEach(c -> tooltip.add(IHaveGoggleInformation.componentSpacing.plainCopy().append(c)))); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ITransformableTE.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ITransformableTE.java new file mode 100644 index 000000000..64d77b497 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ITransformableTE.java @@ -0,0 +1,7 @@ +package com.simibubi.create.content.contraptions.components.structureMovement; + +public interface ITransformableTE { + + void transform(StructureTransform transform); + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java index 1709ae7d9..8ef8f2a3a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java @@ -63,7 +63,7 @@ public class MountedFluidStorage { else if (sendPacket) { sendPacket = false; AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), - new ContraptionFluidPacket(entity.getEntityId(), pos, tank.getFluid())); + new ContraptionFluidPacket(entity.getId(), pos, tank.getFluid())); packetCooldown = 8; } return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java index fb49312d3..cc9769c8a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java @@ -62,21 +62,21 @@ public class MountedStorage { // Split double chests if (te.getType() == TileEntityType.CHEST || te.getType() == TileEntityType.TRAPPED_CHEST) { if (te.getBlockState() - .get(ChestBlock.TYPE) != ChestType.SINGLE) - te.getWorld() - .setBlockState(te.getPos(), te.getBlockState() - .with(ChestBlock.TYPE, ChestType.SINGLE)); - te.updateContainingBlockInfo(); + .getValue(ChestBlock.TYPE) != ChestType.SINGLE) + te.getLevel() + .setBlockAndUpdate(te.getBlockPos(), te.getBlockState() + .setValue(ChestBlock.TYPE, ChestType.SINGLE)); + te.clearCache(); } // Split double flexcrates if (AllTileEntities.ADJUSTABLE_CRATE.is(te)) { if (te.getBlockState() - .get(AdjustableCrateBlock.DOUBLE)) - te.getWorld() - .setBlockState(te.getPos(), te.getBlockState() - .with(AdjustableCrateBlock.DOUBLE, false)); - te.updateContainingBlockInfo(); + .getValue(AdjustableCrateBlock.DOUBLE)) + te.getLevel() + .setBlockAndUpdate(te.getBlockPos(), te.getBlockState() + .setValue(AdjustableCrateBlock.DOUBLE, false)); + te.clearCache(); } IItemHandler teHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) @@ -146,7 +146,7 @@ public class MountedStorage { storage.valid = true; if (nbt.contains("Bottomless")) { - ItemStack providedStack = ItemStack.read(nbt.getCompound("ProvidedStack")); + ItemStack providedStack = ItemStack.of(nbt.getCompound("ProvidedStack")); storage.handler = new BottomlessItemHandler(() -> providedStack); return storage; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index e2b035323..b7b3400eb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import javax.annotation.Nullable; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; @@ -39,9 +39,9 @@ public abstract class MovementBehaviour { Vector3d vec = context.position; ItemEntity itemEntity = new ItemEntity(context.world, vec.x, vec.y, vec.z, remainder); - itemEntity.setMotion(context.motion.add(0, 0.5f, 0) - .scale(context.world.rand.nextFloat() * .3f)); - context.world.addEntity(itemEntity); + itemEntity.setDeltaMovement(context.motion.add(0, 0.5f, 0) + .scale(context.world.random.nextFloat() * .3f)); + context.world.addFreshEntity(itemEntity); } public void stopMoving(MovementContext context) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementContext.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementContext.java index fa26f9ca1..d100c6707 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementContext.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementContext.java @@ -49,7 +49,7 @@ public class MovementContext { public float getAnimationSpeed() { int modifier = 1000; double length = -motion.length(); - if (world.isRemote && contraption.stalled) + if (world.isClientSide && contraption.stalled) return 700; if (Math.abs(length) < 1 / 512f) return 0; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java index 50345908c..800ee2a59 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java @@ -14,7 +14,7 @@ public class NonStationaryLighter extends ContraptionLigh GridAlignedBB contraptionBounds = getContraptionBounds(); if (!contraptionBounds.sameAs(bounds)) { - lightVolume.move(contraption.entity.world, contraptionBoundsToVolume(contraptionBounds)); + lightVolume.move(contraption.entity.level, contraptionBoundsToVolume(contraptionBounds)); bounds = contraptionBounds; startListening(); @@ -25,7 +25,7 @@ public class NonStationaryLighter extends ContraptionLigh public GridAlignedBB getContraptionBounds() { GridAlignedBB bb = GridAlignedBB.from(contraption.bounds); - bb.translate(contraption.entity.getBlockPos()); + bb.translate(contraption.entity.blockPosition()); return bb; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java index cbed32edf..47c10d668 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java @@ -7,6 +7,7 @@ import java.util.UUID; import javax.annotation.Nullable; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedContraption; @@ -18,7 +19,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; @@ -55,12 +55,12 @@ import net.minecraftforge.common.util.LazyOptional; */ public class OrientedContraptionEntity extends AbstractContraptionEntity { - private static final Ingredient FUEL_ITEMS = Ingredient.fromItems(Items.COAL, Items.CHARCOAL); + private static final Ingredient FUEL_ITEMS = Ingredient.of(Items.COAL, Items.CHARCOAL); private static final DataParameter> COUPLING = - EntityDataManager.createKey(OrientedContraptionEntity.class, DataSerializers.OPTIONAL_UNIQUE_ID); + EntityDataManager.defineId(OrientedContraptionEntity.class, DataSerializers.OPTIONAL_UUID); private static final DataParameter INITIAL_ORIENTATION = - EntityDataManager.createKey(OrientedContraptionEntity.class, DataSerializers.DIRECTION); + EntityDataManager.defineId(OrientedContraptionEntity.class, DataSerializers.DIRECTION); protected Vector3d motionBeforeStall; protected boolean forceAngle; @@ -105,16 +105,16 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { } public void setInitialOrientation(Direction direction) { - dataManager.set(INITIAL_ORIENTATION, direction); + entityData.set(INITIAL_ORIENTATION, direction); } public Direction getInitialOrientation() { - return dataManager.get(INITIAL_ORIENTATION); + return entityData.get(INITIAL_ORIENTATION); } public void deferOrientation(Direction newInitialAngle) { - dataManager.set(INITIAL_ORIENTATION, Direction.UP); - yaw = initialYawOffset = newInitialAngle.getHorizontalAngle(); + entityData.set(INITIAL_ORIENTATION, Direction.UP); + yaw = initialYawOffset = newInitialAngle.toYRot(); } @Override @@ -123,15 +123,15 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { } public float getInitialYaw() { - return (isInitialOrientationPresent() ? dataManager.get(INITIAL_ORIENTATION) : Direction.SOUTH) - .getHorizontalAngle(); + return (isInitialOrientationPresent() ? entityData.get(INITIAL_ORIENTATION) : Direction.SOUTH) + .toYRot(); } @Override - protected void registerData() { - super.registerData(); - dataManager.register(COUPLING, Optional.empty()); - dataManager.register(INITIAL_ORIENTATION, Direction.UP); + protected void defineSynchedData() { + super.defineSynchedData(); + entityData.define(COUPLING, Optional.empty()); + entityData.define(INITIAL_ORIENTATION, Direction.UP); } @Override @@ -152,7 +152,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { @Override public void stopRiding() { - if (!world.isRemote && isAlive()) + if (!level.isClientSide && isAlive()) disassemble(); super.stopRiding(); } @@ -176,10 +176,10 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { motionBeforeStall = new Vector3d(vecNBT.getDouble(0), vecNBT.getDouble(1), vecNBT.getDouble(2)); if (!motionBeforeStall.equals(Vector3d.ZERO)) targetYaw = prevYaw = yaw += yawFromVector(motionBeforeStall); - setMotion(Vector3d.ZERO); + setDeltaMovement(Vector3d.ZERO); } - setCouplingId(compound.contains("OnCoupling") ? compound.getUniqueId("OnCoupling") : null); + setCouplingId(compound.contains("OnCoupling") ? compound.getUUID("OnCoupling") : null); } @Override @@ -188,9 +188,9 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { if (motionBeforeStall != null) compound.put("CachedMotion", - newDoubleNBTList(motionBeforeStall.x, motionBeforeStall.y, motionBeforeStall.z)); + newDoubleList(motionBeforeStall.x, motionBeforeStall.y, motionBeforeStall.z)); - Direction optional = dataManager.get(INITIAL_ORIENTATION); + Direction optional = entityData.get(INITIAL_ORIENTATION); if (optional.getAxis() .isHorizontal()) NBTHelper.writeEnum(compound, "InitialOrientation", optional); @@ -204,18 +204,18 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { compound.putFloat("Pitch", pitch); if (getCouplingId() != null) - compound.putUniqueId("OnCoupling", getCouplingId()); + compound.putUUID("OnCoupling", getCouplingId()); } @Override - public void notifyDataManagerChange(DataParameter key) { - super.notifyDataManagerChange(key); + public void onSyncedDataUpdated(DataParameter key) { + super.onSyncedDataUpdated(key); if (key == INITIAL_ORIENTATION && isInitialOrientationPresent() && !manuallyPlaced) startAtInitialYaw(); } public boolean isInitialOrientationPresent() { - return dataManager.get(INITIAL_ORIENTATION) + return entityData.get(INITIAL_ORIENTATION) .getAxis() .isHorizontal(); } @@ -232,30 +232,30 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { @Override public Vector3d applyRotation(Vector3d localPos, float partialTicks) { localPos = VecHelper.rotate(localPos, getInitialYaw(), Axis.Y); - localPos = VecHelper.rotate(localPos, getPitch(partialTicks), Axis.Z); - localPos = VecHelper.rotate(localPos, getYaw(partialTicks), Axis.Y); + localPos = VecHelper.rotate(localPos, getViewXRot(partialTicks), Axis.Z); + localPos = VecHelper.rotate(localPos, getViewYRot(partialTicks), Axis.Y); return localPos; } @Override public Vector3d reverseRotation(Vector3d localPos, float partialTicks) { - localPos = VecHelper.rotate(localPos, -getYaw(partialTicks), Axis.Y); - localPos = VecHelper.rotate(localPos, -getPitch(partialTicks), Axis.Z); + localPos = VecHelper.rotate(localPos, -getViewYRot(partialTicks), Axis.Y); + localPos = VecHelper.rotate(localPos, -getViewXRot(partialTicks), Axis.Z); localPos = VecHelper.rotate(localPos, -getInitialYaw(), Axis.Y); return localPos; } - public float getYaw(float partialTicks) { + public float getViewYRot(float partialTicks) { return -(partialTicks == 1.0F ? yaw : angleLerp(partialTicks, prevYaw, yaw)); } - public float getPitch(float partialTicks) { + public float getViewXRot(float partialTicks) { return partialTicks == 1.0F ? pitch : angleLerp(partialTicks, prevPitch, pitch); } @Override protected void tickContraption() { - Entity e = getRidingEntity(); + Entity e = getVehicle(); if (e == null) return; @@ -269,8 +269,8 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { } Entity riding = e; - while (riding.getRidingEntity() != null && !(contraption instanceof StabilizedContraption)) - riding = riding.getRidingEntity(); + while (riding.getVehicle() != null && !(contraption instanceof StabilizedContraption)) + riding = riding.getVehicle(); boolean isOnCoupling = false; UUID couplingId = getCouplingId(); @@ -289,22 +289,22 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { LazyOptional capability = riding.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY); if (capability.isPresent()) { - if (!world.isRemote()) + if (!level.isClientSide()) capability.orElse(null) .setStalledExternally(isStalled); } else { if (isStalled) { if (!wasStalled) - motionBeforeStall = riding.getMotion(); - riding.setMotion(0, 0, 0); + motionBeforeStall = riding.getDeltaMovement(); + riding.setDeltaMovement(0, 0, 0); } if (wasStalled && !isStalled) { - riding.setMotion(motionBeforeStall); + riding.setDeltaMovement(motionBeforeStall); motionBeforeStall = Vector3d.ZERO; } } - if (world.isRemote) + if (level.isClientSide) return; if (!isStalled()) { @@ -328,10 +328,10 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { Vector3d positionVec = coupledCarts.getFirst() .cart() - .getPositionVec(); + .position(); Vector3d coupledVec = coupledCarts.getSecond() .cart() - .getPositionVec(); + .position(); double diffX = positionVec.x - coupledVec.x; double diffY = positionVec.y - coupledVec.y; @@ -342,7 +342,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { yaw = (float) (MathHelper.atan2(diffZ, diffX) * 180 / Math.PI); pitch = (float) (Math.atan2(diffY, Math.sqrt(diffX * diffX + diffZ * diffZ)) * 180 / Math.PI); - if (getCouplingId().equals(riding.getUniqueID())) { + if (getCouplingId().equals(riding.getUUID())) { pitch *= -1; yaw += 180; } @@ -359,7 +359,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { return false; OrientedContraptionEntity parent = (OrientedContraptionEntity) riding; prevYaw = yaw; - yaw = -parent.getYaw(1); + yaw = -parent.getViewYRot(1); return false; } @@ -368,9 +368,9 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { return false; boolean rotating = false; - Vector3d movementVector = riding.getMotion(); - Vector3d locationDiff = riding.getPositionVec() - .subtract(riding.prevPosX, riding.prevPosY, riding.prevPosZ); + Vector3d movementVector = riding.getDeltaMovement(); + Vector3d locationDiff = riding.position() + .subtract(riding.xo, riding.yo, riding.zo); if (!(riding instanceof AbstractMinecartEntity)) movementVector = locationDiff; Vector3d motion = movementVector.normalize(); @@ -379,11 +379,11 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { if (riding instanceof AbstractMinecartEntity) { AbstractMinecartEntity minecartEntity = (AbstractMinecartEntity) riding; BlockPos railPosition = minecartEntity.getCurrentRailPosition(); - BlockState blockState = world.getBlockState(railPosition); + BlockState blockState = level.getBlockState(railPosition); if (blockState.getBlock() instanceof AbstractRailBlock) { AbstractRailBlock abstractRailBlock = (AbstractRailBlock) blockState.getBlock(); RailShape railDirection = - abstractRailBlock.getRailDirection(blockState, world, railPosition, minecartEntity); + abstractRailBlock.getRailDirection(blockState, level, railPosition, minecartEntity); motion = VecHelper.project(motion, MinecartSim2020.getRailVec(railDirection)); } } @@ -397,7 +397,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { } prevYaw = yaw; - float maxApproachSpeed = (float) (motion.length() * 12f / (Math.max(1, getBoundingBox().getXSize() / 6f))); + float maxApproachSpeed = (float) (motion.length() * 12f / (Math.max(1, getBoundingBox().getXsize() / 6f))); float approach = AngleHelper.getShortestAngleDiff(yaw, targetYaw); approach = MathHelper.clamp(approach, -maxApproachSpeed, maxApproachSpeed); yaw += approach; @@ -427,15 +427,15 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { int i = MathHelper.floor(furnaceCart.getX()); int j = MathHelper.floor(furnaceCart.getY()); int k = MathHelper.floor(furnaceCart.getZ()); - if (furnaceCart.world.getBlockState(new BlockPos(i, j - 1, k)) - .isIn(BlockTags.RAILS)) + if (furnaceCart.level.getBlockState(new BlockPos(i, j - 1, k)) + .is(BlockTags.RAILS)) --j; BlockPos blockpos = new BlockPos(i, j, k); - BlockState blockstate = this.world.getBlockState(blockpos); - if (furnaceCart.canUseRail() && blockstate.isIn(BlockTags.RAILS)) + BlockState blockstate = this.level.getBlockState(blockpos); + if (furnaceCart.canUseRail() && blockstate.is(BlockTags.RAILS)) if (fuel > 1) - riding.setMotion(riding.getMotion() + riding.setDeltaMovement(riding.getDeltaMovement() .normalize() .scale(1)); if (fuel < 5 && contraption != null) { @@ -457,11 +457,11 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { UUID couplingId = getCouplingId(); if (couplingId == null) return null; - MinecartController controller = CapabilityMinecartController.getIfPresent(world, couplingId); + MinecartController controller = CapabilityMinecartController.getIfPresent(level, couplingId); if (controller == null || !controller.isPresent()) return null; UUID coupledCart = controller.getCoupledCart(true); - MinecartController coupledController = CapabilityMinecartController.getIfPresent(world, coupledCart); + MinecartController coupledController = CapabilityMinecartController.getIfPresent(level, coupledCart); if (coupledController == null || !coupledController.isPresent()) return null; return Couple.create(controller, coupledController); @@ -480,18 +480,18 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { } @Override - public CompoundNBT writeWithoutTypeId(CompoundNBT nbt) { - return isSerializingFurnaceCart ? nbt : super.writeWithoutTypeId(nbt); + public CompoundNBT saveWithoutId(CompoundNBT nbt) { + return isSerializingFurnaceCart ? nbt : super.saveWithoutId(nbt); } @Nullable public UUID getCouplingId() { - Optional uuid = dataManager.get(COUPLING); + Optional uuid = entityData.get(COUPLING); return uuid == null ? null : uuid.isPresent() ? uuid.get() : null; } public void setCouplingId(UUID id) { - dataManager.set(COUPLING, Optional.ofNullable(id)); + entityData.set(COUPLING, Optional.ofNullable(id)); } @Override @@ -519,25 +519,25 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { @OnlyIn(Dist.CLIENT) public void doLocalTransforms(float partialTicks, MatrixStack[] matrixStacks) { float angleInitialYaw = getInitialYaw(); - float angleYaw = getYaw(partialTicks); - float anglePitch = getPitch(partialTicks); + float angleYaw = getViewYRot(partialTicks); + float anglePitch = getViewXRot(partialTicks); for (MatrixStack stack : matrixStacks) stack.translate(-.5f, 0, -.5f); - Entity ridingEntity = getRidingEntity(); + Entity ridingEntity = getVehicle(); if (ridingEntity instanceof AbstractMinecartEntity) repositionOnCart(partialTicks, matrixStacks, ridingEntity); else if (ridingEntity instanceof AbstractContraptionEntity) { - if (ridingEntity.getRidingEntity() instanceof AbstractMinecartEntity) - repositionOnCart(partialTicks, matrixStacks, ridingEntity.getRidingEntity()); + if (ridingEntity.getVehicle() instanceof AbstractMinecartEntity) + repositionOnCart(partialTicks, matrixStacks, ridingEntity.getVehicle()); else repositionOnContraption(partialTicks, matrixStacks, ridingEntity); } for (MatrixStack stack : matrixStacks) - MatrixStacker.of(stack) - .nudge(getEntityId()) + MatrixTransformStack.of(stack) + .nudge(getId()) .centre() .rotateY(angleYaw) .rotateZ(anglePitch) @@ -569,9 +569,9 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { private Vector3d getContraptionOffset(float partialTicks, Entity ridingEntity) { AbstractContraptionEntity parent = (AbstractContraptionEntity) ridingEntity; Vector3d passengerPosition = parent.getPassengerPosition(this, partialTicks); - double x = passengerPosition.x - MathHelper.lerp(partialTicks, this.lastTickPosX, this.getX()); - double y = passengerPosition.y - MathHelper.lerp(partialTicks, this.lastTickPosY, this.getY()); - double z = passengerPosition.z - MathHelper.lerp(partialTicks, this.lastTickPosZ, this.getZ()); + double x = passengerPosition.x - MathHelper.lerp(partialTicks, this.xOld, this.getX()); + double y = passengerPosition.y - MathHelper.lerp(partialTicks, this.yOld, this.getY()); + double z = passengerPosition.z - MathHelper.lerp(partialTicks, this.zOld, this.getZ()); return new Vector3d(x, y, z); } @@ -579,14 +579,14 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { @OnlyIn(Dist.CLIENT) private Vector3d getCartOffset(float partialTicks, Entity ridingEntity) { AbstractMinecartEntity cart = (AbstractMinecartEntity) ridingEntity; - double cartX = MathHelper.lerp(partialTicks, cart.lastTickPosX, cart.getX()); - double cartY = MathHelper.lerp(partialTicks, cart.lastTickPosY, cart.getY()); - double cartZ = MathHelper.lerp(partialTicks, cart.lastTickPosZ, cart.getZ()); + double cartX = MathHelper.lerp(partialTicks, cart.xOld, cart.getX()); + double cartY = MathHelper.lerp(partialTicks, cart.yOld, cart.getY()); + double cartZ = MathHelper.lerp(partialTicks, cart.zOld, cart.getZ()); Vector3d cartPos = cart.getPos(cartX, cartY, cartZ); if (cartPos != null) { - Vector3d cartPosFront = cart.getPosOffset(cartX, cartY, cartZ, (double) 0.3F); - Vector3d cartPosBack = cart.getPosOffset(cartX, cartY, cartZ, (double) -0.3F); + Vector3d cartPosFront = cart.getPosOffs(cartX, cartY, cartZ, (double) 0.3F); + Vector3d cartPosBack = cart.getPosOffs(cartX, cartY, cartZ, (double) -0.3F); if (cartPosFront == null) cartPosFront = cartPos; if (cartPosBack == null) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java index d1cfea7c5..a2fa2b4ab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java @@ -15,7 +15,7 @@ public class OrientedContraptionEntityRenderer extends ContraptionEntityRenderer if (!super.shouldRender(entity, p_225626_2_, p_225626_3_, p_225626_5_, p_225626_7_)) return false; if (entity.getContraption() - .getType() == ContraptionType.MOUNTED && entity.getRidingEntity() == null) + .getType() == ContraptionType.MOUNTED && entity.getVehicle() == null) return false; return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java index 1d47d2554..67aab845a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java @@ -27,9 +27,11 @@ import net.minecraft.state.properties.BellAttachment; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.Half; import net.minecraft.state.properties.SlabType; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3d; @@ -41,27 +43,33 @@ public class StructureTransform { int angle; Axis rotationAxis; BlockPos offset; + Mirror mirror; - private StructureTransform(BlockPos offset, int angle, Axis axis, Rotation rotation) { + private StructureTransform(BlockPos offset, int angle, Axis axis, Rotation rotation, Mirror mirror) { this.offset = offset; this.angle = angle; rotationAxis = axis; this.rotation = rotation; + this.mirror = mirror; + } + + public StructureTransform(BlockPos offset, Axis axis, Rotation rotation, Mirror mirror) { + this(offset, rotation == Rotation.NONE ? 0 : (4 - rotation.ordinal())*90, axis, rotation, mirror); } public StructureTransform(BlockPos offset, float xRotation, float yRotation, float zRotation) { this.offset = offset; if (xRotation != 0) { rotationAxis = Axis.X; - angle = (int) (Math.round(xRotation / 90) * 90); + angle = Math.round(xRotation / 90) * 90; } if (yRotation != 0) { rotationAxis = Axis.Y; - angle = (int) (Math.round(yRotation / 90) * 90); + angle = Math.round(yRotation / 90) * 90; } if (zRotation != 0) { rotationAxis = Axis.Z; - angle = (int) (Math.round(zRotation / 90) * 90); + angle = Math.round(zRotation / 90) * 90; } angle %= 360; @@ -76,22 +84,33 @@ public class StructureTransform { if (angle == 180) this.rotation = Rotation.CLOCKWISE_180; + mirror = Mirror.NONE; } - public Vector3d apply(Vector3d localVec) { + public Vector3d applyWithoutOffset(Vector3d localVec) { Vector3d vec = localVec; + if (mirror != null) + vec = VecHelper.mirrorCentered(vec, mirror); if (rotationAxis != null) vec = VecHelper.rotateCentered(vec, angle, rotationAxis); - vec = vec.add(Vector3d.of(offset)); return vec; } + public Vector3d apply(Vector3d localVec) { + return applyWithoutOffset(localVec).add(Vector3d.atLowerCornerOf(offset)); + } + + public BlockPos applyWithoutOffset(BlockPos localPos) { + return new BlockPos(applyWithoutOffset(VecHelper.getCenterOf(localPos))); + } + public BlockPos apply(BlockPos localPos) { - Vector3d vec = VecHelper.getCenterOf(localPos); - if (rotationAxis != null) - vec = VecHelper.rotateCentered(vec, angle, rotationAxis); - localPos = new BlockPos(vec); - return localPos.add(offset); + return applyWithoutOffset(localPos).offset(offset); + } + + public void apply(TileEntity te) { + if (te instanceof ITransformableTE) + ((ITransformableTE) te).transform(this); } /** @@ -100,15 +119,18 @@ public class StructureTransform { * horizontal axes */ public BlockState apply(BlockState state) { + if (mirror != null) + state = state.mirror(mirror); + Block block = state.getBlock(); if (rotationAxis == Axis.Y) { if (block instanceof BellBlock) { - if (state.get(BlockStateProperties.BELL_ATTACHMENT) == BellAttachment.DOUBLE_WALL) { - state = state.with(BlockStateProperties.BELL_ATTACHMENT, BellAttachment.SINGLE_WALL); + if (state.getValue(BlockStateProperties.BELL_ATTACHMENT) == BellAttachment.DOUBLE_WALL) { + state = state.setValue(BlockStateProperties.BELL_ATTACHMENT, BellAttachment.SINGLE_WALL); } - return state.with(HorizontalFaceBlock.HORIZONTAL_FACING, - rotation.rotate(state.get(HorizontalFaceBlock.HORIZONTAL_FACING))); + return state.setValue(HorizontalFaceBlock.FACING, + rotation.rotate(state.getValue(HorizontalFaceBlock.FACING))); } return state.rotate(rotation); } @@ -117,30 +139,30 @@ public class StructureTransform { return rotateChassis(state); if (block instanceof HorizontalFaceBlock) { - Direction stateFacing = state.get(HorizontalFaceBlock.HORIZONTAL_FACING); - AttachFace stateFace = state.get(FACE); + Direction stateFacing = state.getValue(HorizontalFaceBlock.FACING); + AttachFace stateFace = state.getValue(FACE); Direction forcedAxis = rotationAxis == Axis.Z ? Direction.EAST : Direction.SOUTH; if (stateFacing.getAxis() == rotationAxis && stateFace == AttachFace.WALL) return state; for (int i = 0; i < rotation.ordinal(); i++) { - stateFace = state.get(FACE); - stateFacing = state.get(HorizontalFaceBlock.HORIZONTAL_FACING); + stateFace = state.getValue(FACE); + stateFacing = state.getValue(HorizontalFaceBlock.FACING); - boolean b = state.get(FACE) == AttachFace.CEILING; - state = state.with(HORIZONTAL_FACING, b ? forcedAxis : forcedAxis.getOpposite()); + boolean b = state.getValue(FACE) == AttachFace.CEILING; + state = state.setValue(HORIZONTAL_FACING, b ? forcedAxis : forcedAxis.getOpposite()); if (stateFace != AttachFace.WALL) { - state = state.with(FACE, AttachFace.WALL); + state = state.setValue(FACE, AttachFace.WALL); continue; } if (stateFacing.getAxisDirection() == AxisDirection.POSITIVE) { - state = state.with(FACE, AttachFace.FLOOR); + state = state.setValue(FACE, AttachFace.FLOOR); continue; } - state = state.with(FACE, AttachFace.CEILING); + state = state.setValue(FACE, AttachFace.CEILING); } return state; @@ -157,51 +179,51 @@ public class StructureTransform { return state; } - if (state.contains(FACING)) { - Direction newFacing = transformFacing(state.get(FACING)); - if (state.contains(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE)) { + if (state.hasProperty(FACING)) { + Direction newFacing = transformFacing(state.getValue(FACING)); + if (state.hasProperty(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE)) { if (rotationAxis == newFacing.getAxis() && rotation.ordinal() % 2 == 1) state = state.cycle(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE); } - state = state.with(FACING, newFacing); + state = state.setValue(FACING, newFacing); - } else if (state.contains(AXIS)) { - state = state.with(AXIS, transformAxis(state.get(AXIS))); + } else if (state.hasProperty(AXIS)) { + state = state.setValue(AXIS, transformAxis(state.getValue(AXIS))); } else if (halfTurn) { - if (state.contains(FACING)) { - Direction stateFacing = state.get(FACING); + if (state.hasProperty(FACING)) { + Direction stateFacing = state.getValue(FACING); if (stateFacing.getAxis() == rotationAxis) return state; } - if (state.contains(HORIZONTAL_FACING)) { - Direction stateFacing = state.get(HORIZONTAL_FACING); + if (state.hasProperty(HORIZONTAL_FACING)) { + Direction stateFacing = state.getValue(HORIZONTAL_FACING); if (stateFacing.getAxis() == rotationAxis) return state; } state = state.rotate(rotation); - if (state.contains(SlabBlock.TYPE) && state.get(SlabBlock.TYPE) != SlabType.DOUBLE) - state = state.with(SlabBlock.TYPE, - state.get(SlabBlock.TYPE) == SlabType.BOTTOM ? SlabType.TOP : SlabType.BOTTOM); + if (state.hasProperty(SlabBlock.TYPE) && state.getValue(SlabBlock.TYPE) != SlabType.DOUBLE) + state = state.setValue(SlabBlock.TYPE, + state.getValue(SlabBlock.TYPE) == SlabType.BOTTOM ? SlabType.TOP : SlabType.BOTTOM); } return state; } protected BlockState transformStairs(BlockState state, boolean halfTurn) { - if (state.get(StairsBlock.FACING) + if (state.getValue(StairsBlock.FACING) .getAxis() != rotationAxis) { for (int i = 0; i < rotation.ordinal(); i++) { - Direction direction = state.get(StairsBlock.FACING); - Half half = state.get(StairsBlock.HALF); + Direction direction = state.getValue(StairsBlock.FACING); + Half half = state.getValue(StairsBlock.HALF); if (direction.getAxisDirection() == AxisDirection.POSITIVE ^ half == Half.BOTTOM ^ direction.getAxis() == Axis.Z) state = state.cycle(StairsBlock.HALF); else - state = state.with(StairsBlock.FACING, direction.getOpposite()); + state = state.setValue(StairsBlock.FACING, direction.getOpposite()); } } else { if (halfTurn) { @@ -212,14 +234,14 @@ public class StructureTransform { } protected BlockState transformBelt(BlockState state, boolean halfTurn) { - Direction initialDirection = state.get(BeltBlock.HORIZONTAL_FACING); + Direction initialDirection = state.getValue(BeltBlock.HORIZONTAL_FACING); boolean diagonal = - state.get(BeltBlock.SLOPE) == BeltSlope.DOWNWARD || state.get(BeltBlock.SLOPE) == BeltSlope.UPWARD; + state.getValue(BeltBlock.SLOPE) == BeltSlope.DOWNWARD || state.getValue(BeltBlock.SLOPE) == BeltSlope.UPWARD; if (!diagonal) { for (int i = 0; i < rotation.ordinal(); i++) { - Direction direction = state.get(BeltBlock.HORIZONTAL_FACING); - BeltSlope slope = state.get(BeltBlock.SLOPE); + Direction direction = state.getValue(BeltBlock.HORIZONTAL_FACING); + BeltSlope slope = state.getValue(BeltBlock.SLOPE); boolean vertical = slope == BeltSlope.VERTICAL; boolean horizontal = slope == BeltSlope.HORIZONTAL; boolean sideways = slope == BeltSlope.SIDEWAYS; @@ -229,7 +251,7 @@ public class StructureTransform { if (vertical) { if (direction.getAxis() == rotationAxis) { - newDirection = direction.rotateYCCW(); + newDirection = direction.getCounterClockWise(); newSlope = BeltSlope.SIDEWAYS; } else { newSlope = BeltSlope.HORIZONTAL; @@ -244,7 +266,7 @@ public class StructureTransform { if (direction.getAxis() == rotationAxis) newSlope = BeltSlope.HORIZONTAL; else - newDirection = direction.rotateYCCW(); + newDirection = direction.getCounterClockWise(); } if (horizontal) { @@ -255,50 +277,52 @@ public class StructureTransform { newDirection = direction.getOpposite(); } - state = state.with(BeltBlock.HORIZONTAL_FACING, newDirection); - state = state.with(BeltBlock.SLOPE, newSlope); + state = state.setValue(BeltBlock.HORIZONTAL_FACING, newDirection); + state = state.setValue(BeltBlock.SLOPE, newSlope); } } else if (initialDirection.getAxis() != rotationAxis) { for (int i = 0; i < rotation.ordinal(); i++) { - Direction direction = state.get(BeltBlock.HORIZONTAL_FACING); + Direction direction = state.getValue(BeltBlock.HORIZONTAL_FACING); Direction newDirection = direction.getOpposite(); - BeltSlope slope = state.get(BeltBlock.SLOPE); + BeltSlope slope = state.getValue(BeltBlock.SLOPE); boolean upward = slope == BeltSlope.UPWARD; boolean downward = slope == BeltSlope.DOWNWARD; // Rotate diagonal if (direction.getAxisDirection() == AxisDirection.POSITIVE ^ downward ^ direction.getAxis() == Axis.Z) { - state = state.with(BeltBlock.SLOPE, upward ? BeltSlope.DOWNWARD : BeltSlope.UPWARD); + state = state.setValue(BeltBlock.SLOPE, upward ? BeltSlope.DOWNWARD : BeltSlope.UPWARD); } else { - state = state.with(BeltBlock.HORIZONTAL_FACING, newDirection); + state = state.setValue(BeltBlock.HORIZONTAL_FACING, newDirection); } } } else if (halfTurn) { - Direction direction = state.get(BeltBlock.HORIZONTAL_FACING); + Direction direction = state.getValue(BeltBlock.HORIZONTAL_FACING); Direction newDirection = direction.getOpposite(); - BeltSlope slope = state.get(BeltBlock.SLOPE); + BeltSlope slope = state.getValue(BeltBlock.SLOPE); boolean vertical = slope == BeltSlope.VERTICAL; if (diagonal) { - state = state.with(BeltBlock.SLOPE, slope == BeltSlope.UPWARD ? BeltSlope.DOWNWARD + state = state.setValue(BeltBlock.SLOPE, slope == BeltSlope.UPWARD ? BeltSlope.DOWNWARD : slope == BeltSlope.DOWNWARD ? BeltSlope.UPWARD : slope); } else if (vertical) { - state = state.with(BeltBlock.HORIZONTAL_FACING, newDirection); + state = state.setValue(BeltBlock.HORIZONTAL_FACING, newDirection); } } return state; } public Axis transformAxis(Axis axisIn) { - Direction facing = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axisIn); + Direction facing = Direction.get(AxisDirection.POSITIVE, axisIn); facing = transformFacing(facing); Axis axis = facing.getAxis(); return axis; } public Direction transformFacing(Direction facing) { + if (mirror != null) + facing = mirror.mirror(facing); for (int i = 0; i < rotation.ordinal(); i++) facing = DirectionHelper.rotateAround(facing, rotationAxis); return facing; @@ -308,23 +332,23 @@ public class StructureTransform { if (rotation == Rotation.NONE) return state; - BlockState rotated = state.with(AXIS, transformAxis(state.get(AXIS))); + BlockState rotated = state.setValue(AXIS, transformAxis(state.getValue(AXIS))); AbstractChassisBlock block = (AbstractChassisBlock) state.getBlock(); for (Direction face : Iterate.directions) { BooleanProperty glueableSide = block.getGlueableSide(rotated, face); if (glueableSide != null) - rotated = rotated.with(glueableSide, false); + rotated = rotated.setValue(glueableSide, false); } for (Direction face : Iterate.directions) { BooleanProperty glueableSide = block.getGlueableSide(state, face); - if (glueableSide == null || !state.get(glueableSide)) + if (glueableSide == null || !state.getValue(glueableSide)) continue; Direction rotatedFacing = transformFacing(face); BooleanProperty rotatedGlueableSide = block.getGlueableSide(rotated, rotatedFacing); if (rotatedGlueableSide != null) - rotated = rotated.with(rotatedGlueableSide, true); + rotated = rotated.setValue(rotatedGlueableSide, true); } return rotated; @@ -335,8 +359,10 @@ public class StructureTransform { int readAngle = buffer.readInt(); int axisIndex = buffer.readVarInt(); int rotationIndex = buffer.readVarInt(); + int mirrorIndex = buffer.readVarInt(); return new StructureTransform(readBlockPos, readAngle, axisIndex == -1 ? null : Axis.values()[axisIndex], - rotationIndex == -1 ? null : Rotation.values()[rotationIndex]); + rotationIndex == -1 ? null : Rotation.values()[rotationIndex], + mirrorIndex == -1 ? null : Mirror.values()[mirrorIndex]); } public void writeToBuffer(PacketBuffer buffer) { @@ -344,6 +370,7 @@ public class StructureTransform { buffer.writeInt(angle); buffer.writeVarInt(rotationAxis == null ? -1 : rotationAxis.ordinal()); buffer.writeVarInt(rotation == null ? -1 : rotation.ordinal()); + buffer.writeVarInt(mirror == null ? - 1 : mirror.ordinal()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java index a692a112a..a28788f0e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/TranslatingContraption.java @@ -22,7 +22,7 @@ public abstract class TranslatingContraption extends Contraption { cachedColliderDirection = movementDirection; for (BlockInfo info : getBlocks().values()) { - BlockPos offsetPos = info.pos.offset(movementDirection); + BlockPos offsetPos = info.pos.relative(movementDirection); if (info.state.getCollisionShape(world, offsetPos) .isEmpty()) continue; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingBlock.java index 66e55acbe..daa19daa7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingBlock.java @@ -19,12 +19,12 @@ public abstract class BearingBlock extends DirectionalKineticBlock { @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face == state.get(FACING).getOpposite(); + return face == state.getValue(FACING).getOpposite(); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(FACING).getAxis(); + return state.getValue(FACING).getAxis(); } @Override @@ -35,8 +35,8 @@ public abstract class BearingBlock extends DirectionalKineticBlock { @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { ActionResultType resultType = super.onWrenched(state, context); - if (!context.getWorld().isRemote && resultType.isAccepted()) { - TileEntity te = context.getWorld().getTileEntity(context.getPos()); + if (!context.getLevel().isClientSide && resultType.consumesAction()) { + TileEntity te = context.getLevel().getBlockEntity(context.getClickedPos()); if (te instanceof MechanicalBearingTileEntity) { ((MechanicalBearingTileEntity) te).disassemble(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java index 8e1e60aa6..871ce7a0f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java @@ -34,7 +34,7 @@ public class BearingContraption extends Contraption { @Override public boolean assemble(World world, BlockPos pos) throws AssemblyException { - BlockPos offset = pos.offset(facing); + BlockPos offset = pos.relative(facing); if (!searchMovedStructure(world, offset, null)) return false; startMoving(world); @@ -53,7 +53,7 @@ public class BearingContraption extends Contraption { @Override protected boolean isAnchoringBlockAt(BlockPos pos) { - return pos.equals(anchor.offset(facing.getOpposite())); + return pos.equals(anchor.relative(facing.getOpposite())); } @Override @@ -68,14 +68,14 @@ public class BearingContraption extends Contraption { public CompoundNBT writeNBT(boolean spawnPacket) { CompoundNBT tag = super.writeNBT(spawnPacket); tag.putInt("Sails", sailBlocks); - tag.putInt("Facing", facing.getIndex()); + tag.putInt("Facing", facing.get3DDataValue()); return tag; } @Override public void readNBT(World world, CompoundNBT tag, boolean spawnData) { sailBlocks = tag.getInt("Sails"); - facing = Direction.byIndex(tag.getInt("Facing")); + facing = Direction.from3DDataValue(tag.getInt("Facing")); super.readNBT(world, tag, spawnData); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java index 52febb972..f9ce8806d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.materials.OrientedData; import com.simibubi.create.AllBlockPartials; @@ -27,8 +27,8 @@ public class BearingInstance e super(modelManager, tile); this.bearing = tile; - Direction facing = blockState.get(BlockStateProperties.FACING); - rotationAxis = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector(); + Direction facing = blockState.getValue(BlockStateProperties.FACING); + rotationAxis = Direction.get(Direction.AxisDirection.POSITIVE, axis).step(); blockOrientation = getBlockStateOrientation(facing); @@ -44,9 +44,9 @@ public class BearingInstance e public void beginFrame() { float interpolatedAngle = bearing.getInterpolatedAngle(AnimationTickHolder.getPartialTicks() - 1); - Quaternion rot = rotationAxis.getDegreesQuaternion(interpolatedAngle); + Quaternion rot = rotationAxis.rotationDegrees(interpolatedAngle); - rot.multiply(blockOrientation); + rot.mul(blockOrientation); topInstance.setRotation(rot); } @@ -67,12 +67,12 @@ public class BearingInstance e Quaternion orientation; if (facing.getAxis().isHorizontal()) { - orientation = Vector3f.POSITIVE_Y.getDegreesQuaternion(AngleHelper.horizontalAngle(facing.getOpposite())); + orientation = Vector3f.YP.rotationDegrees(AngleHelper.horizontalAngle(facing.getOpposite())); } else { - orientation = Quaternion.IDENTITY.copy(); + orientation = Quaternion.ONE.copy(); } - orientation.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-90 - AngleHelper.verticalAngle(facing))); + orientation.mul(Vector3f.XP.rotationDegrees(-90 - AngleHelper.verticalAngle(facing))); return orientation; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index 0d23f7523..e8521f53b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -26,13 +26,13 @@ public class BearingRenderer extends KineticTileEntityRenderer { protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; super.renderSafe(te, partialTicks, ms, buffer, light, overlay); IBearingTileEntity bearingTe = (IBearingTileEntity) te; final Direction facing = te.getBlockState() - .get(BlockStateProperties.FACING); + .getValue(BlockStateProperties.FACING); PartialModel top = bearingTe.isWoodenTop() ? AllBlockPartials.BEARING_TOP_WOODEN : AllBlockPartials.BEARING_TOP; SuperByteBuffer superBuffer = PartialBufferer.get(top, te.getBlockState()); @@ -45,13 +45,13 @@ public class BearingRenderer extends KineticTileEntityRenderer { superBuffer.rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing.getOpposite()))); superBuffer.rotateCentered(Direction.EAST, AngleHelper.rad(-90 - AngleHelper.verticalAngle(facing))); - superBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + superBuffer.renderInto(ms, buffer.getBuffer(RenderType.solid())); } @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { return PartialBufferer.getFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), te.getBlockState() - .get(BearingBlock.FACING) + .getValue(BearingBlock.FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingBlock.java index 125950656..240e1a23f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingBlock.java @@ -26,14 +26,14 @@ public class ClockworkBearingBlock extends BearingBlock implements ITE { if (te.running) { te.disassemble(); @@ -55,8 +55,8 @@ public class ClockworkBearingBlock extends BearingBlock implements ITE contraption; try { - contraption = ClockworkContraption.assembleClockworkAt(world, pos, direction); + contraption = ClockworkContraption.assembleClockworkAt(level, worldPosition, direction); lastException = null; } catch (AssemblyException e) { lastException = e; @@ -230,25 +230,25 @@ public class ClockworkBearingTileEntity extends KineticTileEntity .getBlocks() .isEmpty()) return; - BlockPos anchor = pos.offset(direction); + BlockPos anchor = worldPosition.relative(direction); contraption.getLeft() - .removeBlocksFromWorld(world, BlockPos.ZERO); - hourHand = ControlledContraptionEntity.create(world, this, contraption.getLeft()); - hourHand.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); + .removeBlocksFromWorld(level, BlockPos.ZERO); + hourHand = ControlledContraptionEntity.create(level, this, contraption.getLeft()); + hourHand.setPos(anchor.getX(), anchor.getY(), anchor.getZ()); hourHand.setRotationAxis(direction.getAxis()); - world.addEntity(hourHand); + level.addFreshEntity(hourHand); - AllTriggers.triggerForNearbyPlayers(AllTriggers.CLOCKWORK_BEARING, world, pos, 5); + AllTriggers.triggerForNearbyPlayers(AllTriggers.CLOCKWORK_BEARING, level, worldPosition, 5); if (contraption.getRight() != null) { - anchor = pos.offset(direction, contraption.getRight().offset + 1); + anchor = worldPosition.relative(direction, contraption.getRight().offset + 1); contraption.getRight() - .removeBlocksFromWorld(world, BlockPos.ZERO); - minuteHand = ControlledContraptionEntity.create(world, this, contraption.getRight()); - minuteHand.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); + .removeBlocksFromWorld(level, BlockPos.ZERO); + minuteHand = ControlledContraptionEntity.create(level, this, contraption.getRight()); + minuteHand.setPos(anchor.getX(), anchor.getY(), anchor.getZ()); minuteHand.setRotationAxis(direction.getAxis()); - world.addEntity(minuteHand); + level.addFreshEntity(minuteHand); } // Run @@ -284,17 +284,17 @@ public class ClockworkBearingTileEntity extends KineticTileEntity return; ClockworkContraption cc = (ClockworkContraption) contraption.getContraption(); - markDirty(); - Direction facing = getBlockState().get(BlockStateProperties.FACING); - BlockPos anchor = pos.offset(facing, cc.offset + 1); + setChanged(); + Direction facing = getBlockState().getValue(BlockStateProperties.FACING); + BlockPos anchor = worldPosition.relative(facing, cc.offset + 1); if (cc.handType == HandType.HOUR) { this.hourHand = contraption; - hourHand.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); + hourHand.setPos(anchor.getX(), anchor.getY(), anchor.getZ()); } else { this.minuteHand = contraption; - minuteHand.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); + minuteHand.setPos(anchor.getX(), anchor.getY(), anchor.getZ()); } - if (!world.isRemote) { + if (!level.isClientSide) { this.running = true; sendData(); } @@ -356,15 +356,15 @@ public class ClockworkBearingTileEntity extends KineticTileEntity @Override public void onStall() { - if (!world.isRemote) + if (!level.isClientSide) sendData(); } @Override - public void remove() { - if (!world.isRemote) + public void setRemoved() { + if (!level.isClientSide) disassemble(); - super.remove(); + super.setRemoved(); } @Override @@ -415,7 +415,7 @@ public class ClockworkBearingTileEntity extends KineticTileEntity @Override public BlockPos getBlockPosition() { - return pos; + return worldPosition; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java index 949228ba9..7c0af2c70 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java @@ -31,12 +31,12 @@ public class ClockworkContraption extends Contraption { private void ignoreBlocks(Set blocks, BlockPos anchor) { for (BlockPos blockPos : blocks) - ignoreBlocks.add(anchor.add(blockPos)); + ignoreBlocks.add(anchor.offset(blockPos)); } @Override protected boolean isAnchoringBlockAt(BlockPos pos) { - return pos.equals(anchor.offset(facing.getOpposite(), offset + 1)); + return pos.equals(anchor.relative(facing.getOpposite(), offset + 1)); } public static Pair assembleClockworkAt(World world, BlockPos pos, @@ -51,7 +51,7 @@ public class ClockworkContraption extends Contraption { if (!hourArm.assemble(world, pos)) return null; for (int i = 0; i < 16; i++) { - BlockPos offsetPos = BlockPos.ZERO.offset(direction, i); + BlockPos offsetPos = BlockPos.ZERO.relative(direction, i); if (hourArm.getBlocks() .containsKey(offsetPos)) continue; @@ -89,7 +89,7 @@ public class ClockworkContraption extends Contraption { @Override public boolean searchMovedStructure(World world, BlockPos pos, Direction direction) throws AssemblyException { - return super.searchMovedStructure(world, pos.offset(direction, offset + 1), null); + return super.searchMovedStructure(world, pos.relative(direction, offset + 1), null); } @Override @@ -105,7 +105,7 @@ public class ClockworkContraption extends Contraption { @Override public CompoundNBT writeNBT(boolean spawnPacket) { CompoundNBT tag = super.writeNBT(spawnPacket); - tag.putInt("facing", facing.getIndex()); + tag.putInt("facing", facing.get3DDataValue()); tag.putInt("offset", offset); NBTHelper.writeEnum(tag, "HandType", handType); return tag; @@ -113,7 +113,7 @@ public class ClockworkContraption extends Contraption { @Override public void readNBT(World world, CompoundNBT tag, boolean spawnData) { - facing = Direction.byIndex(tag.getInt("facing")); + facing = Direction.from3DDataValue(tag.getInt("facing")); handType = NBTHelper.readEnum(tag, "HandType", HandType.class); offset = tag.getInt("offset"); super.readNBT(world, tag, spawnData); @@ -121,7 +121,7 @@ public class ClockworkContraption extends Contraption { @Override public boolean canBeStabilized(Direction facing, BlockPos localPos) { - if (BlockPos.ZERO.equals(localPos) || BlockPos.ZERO.equals(localPos.offset(facing))) + if (BlockPos.ZERO.equals(localPos) || BlockPos.ZERO.equals(localPos.relative(facing))) return false; return facing.getAxis() == this.facing.getAxis(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java index e729feae4..af8a52b22 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java @@ -15,7 +15,7 @@ public interface IBearingTileEntity extends IControlContraption { default ValueBoxTransform getMovementModeSlot() { return new DirectionalExtenderScrollOptionSlot((state, d) -> { Axis axis = d.getAxis(); - Axis bearingAxis = state.get(BearingBlock.FACING) + Axis bearingAxis = state.getValue(BearingBlock.FACING) .getAxis(); return bearingAxis != axis; }); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlock.java index 9bf59c537..005f57692 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlock.java @@ -25,15 +25,15 @@ public class MechanicalBearingBlock extends BearingBlock implements ITE { if (te.running) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index ef692c0a3..650fda752 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -60,10 +60,10 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity } @Override - public void remove() { - if (!world.isRemote) + public void setRemoved() { + if (!level.isClientSide) disassemble(); - super.remove(); + super.setRemoved(); } @Override @@ -111,7 +111,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity if (movedContraption != null && Math.signum(prevSpeed) != Math.signum(getSpeed()) && prevSpeed != 0) { movedContraption.getContraption() - .stop(world); + .stop(level); } } @@ -119,7 +119,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity float speed = convertToAngular(isWindmill() ? getGeneratedSpeed() : getSpeed()); if (getSpeed() == 0) speed = 0; - if (world.isRemote) { + if (level.isClientSide) { speed *= ServerSpeedProvider.get(); speed += clientAngleDiff / 3f; } @@ -137,18 +137,18 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity @Override public BlockPos getBlockPosition() { - return pos; + return worldPosition; } public void assemble() { - if (!(world.getBlockState(pos) + if (!(level.getBlockState(worldPosition) .getBlock() instanceof BearingBlock)) return; - Direction direction = getBlockState().get(FACING); + Direction direction = getBlockState().getValue(FACING); BearingContraption contraption = new BearingContraption(isWindmill(), direction); try { - if (!contraption.assemble(world, pos)) + if (!contraption.assemble(level, worldPosition)) return; lastException = null; @@ -159,18 +159,18 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity } if (isWindmill()) - AllTriggers.triggerForNearbyPlayers(AllTriggers.WINDMILL, world, pos, 5); + AllTriggers.triggerForNearbyPlayers(AllTriggers.WINDMILL, level, worldPosition, 5); if (contraption.getSailBlocks() >= 16 * 8) - AllTriggers.triggerForNearbyPlayers(AllTriggers.MAXED_WINDMILL, world, pos, 5); + AllTriggers.triggerForNearbyPlayers(AllTriggers.MAXED_WINDMILL, level, worldPosition, 5); - contraption.removeBlocksFromWorld(world, BlockPos.ZERO); - movedContraption = ControlledContraptionEntity.create(world, this, contraption); - BlockPos anchor = pos.offset(direction); - movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); + contraption.removeBlocksFromWorld(level, BlockPos.ZERO); + movedContraption = ControlledContraptionEntity.create(level, this, contraption); + BlockPos anchor = worldPosition.relative(direction); + movedContraption.setPos(anchor.getX(), anchor.getY(), anchor.getZ()); movedContraption.setRotationAxis(direction.getAxis()); - world.addEntity(movedContraption); + level.addFreshEntity(movedContraption); - AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(world, pos); + AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(level, worldPosition); running = true; angle = 0; @@ -186,7 +186,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity applyRotation(); if (movedContraption != null) { movedContraption.disassemble(); - AllSoundEvents.CONTRAPTION_DISASSEMBLE.playOnServer(world, pos); + AllSoundEvents.CONTRAPTION_DISASSEMBLE.playOnServer(level, worldPosition); } movedContraption = null; @@ -201,10 +201,10 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity super.tick(); prevAngle = angle; - if (world.isRemote) + if (level.isClientSide) clientAngleDiff /= 2; - if (!world.isRemote && assembleNextTick) { + if (!level.isClientSide && assembleNextTick) { assembleNextTick = false; if (running) { boolean canDisassemble = movementMode.get() == RotationMode.ROTATE_PLACE @@ -214,7 +214,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity .isEmpty())) { if (movedContraption != null) movedContraption.getContraption() - .stop(world); + .stop(level); disassemble(); return; } @@ -244,7 +244,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity @Override public void lazyTick() { super.lazyTick(); - if (movedContraption != null && !world.isRemote) + if (movedContraption != null && !level.isClientSide) sendData(); } @@ -253,8 +253,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity return; movedContraption.setAngle(angle); BlockState blockState = getBlockState(); - if (blockState.contains(BlockStateProperties.FACING)) - movedContraption.setRotationAxis(blockState.get(BlockStateProperties.FACING) + if (blockState.hasProperty(BlockStateProperties.FACING)) + movedContraption.setRotationAxis(blockState.getValue(BlockStateProperties.FACING) .getAxis()); } @@ -263,14 +263,14 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity BlockState blockState = getBlockState(); if (!(contraption.getContraption() instanceof BearingContraption)) return; - if (!blockState.contains(FACING)) + if (!blockState.hasProperty(FACING)) return; this.movedContraption = contraption; - markDirty(); - BlockPos anchor = pos.offset(blockState.get(FACING)); - movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); - if (!world.isRemote) { + setChanged(); + BlockPos anchor = worldPosition.relative(blockState.getValue(FACING)); + movedContraption.setPos(anchor.getX(), anchor.getY(), anchor.getZ()); + if (!level.isClientSide) { this.running = true; sendData(); } @@ -278,7 +278,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity @Override public void onStall() { - if (!world.isRemote) + if (!level.isClientSide) sendData(); } @@ -313,7 +313,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity if (!(state.getBlock() instanceof BearingBlock)) return false; - BlockState attachedState = world.getBlockState(pos.offset(state.get(BearingBlock.FACING))); + BlockState attachedState = level.getBlockState(worldPosition.relative(state.getValue(BearingBlock.FACING))); if (attachedState.getMaterial() .isReplaceable()) return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java index b4cfaea85..73fd3b67e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java @@ -63,19 +63,19 @@ public class SailBlock extends ProperDirectionalBlock { @Override public BlockState getStateForPlacement(BlockItemUseContext context) { BlockState state = super.getStateForPlacement(context); - return state.with(FACING, state.get(FACING).getOpposite()); + return state.setValue(FACING, state.getValue(FACING).getOpposite()); } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { - ItemStack heldItem = player.getHeldItem(hand); + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { + ItemStack heldItem = player.getItemInHand(hand); IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId); if (placementHelper.matchesItem(heldItem)) return placementHelper.getOffset(player, world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); if (heldItem.getItem() instanceof ShearsItem) { - if (!world.isRemote) + if (!world.isClientSide) applyDye(state, world, pos, null); return ActionResultType.SUCCESS; } @@ -85,9 +85,9 @@ public class SailBlock extends ProperDirectionalBlock { for (DyeColor color : DyeColor.values()) { if (!heldItem.getItem() - .isIn(DyeHelper.getTagOfDye(color))) + .is(DyeHelper.getTagOfDye(color))) continue; - if (!world.isRemote) + if (!world.isClientSide) applyDye(state, world, pos, color); return ActionResultType.SUCCESS; } @@ -98,27 +98,27 @@ public class SailBlock extends ProperDirectionalBlock { protected void applyDye(BlockState state, World world, BlockPos pos, @Nullable DyeColor color) { BlockState newState = (color == null ? AllBlocks.SAIL_FRAME : AllBlocks.DYED_SAILS.get(color)).getDefaultState() - .with(FACING, state.get(FACING)); + .setValue(FACING, state.getValue(FACING)); // Dye the block itself if (state != newState) { - world.setBlockState(pos, newState); + world.setBlockAndUpdate(pos, newState); return; } // Dye all adjacent for (Direction d : Iterate.directions) { - if (d.getAxis() == state.get(FACING) + if (d.getAxis() == state.getValue(FACING) .getAxis()) continue; - BlockPos offset = pos.offset(d); + BlockPos offset = pos.relative(d); BlockState adjacentState = world.getBlockState(offset); Block block = adjacentState.getBlock(); if (!(block instanceof SailBlock) || ((SailBlock) block).frame) continue; if (state == adjacentState) continue; - world.setBlockState(offset, newState); + world.setBlockAndUpdate(offset, newState); return; } @@ -135,10 +135,10 @@ public class SailBlock extends ProperDirectionalBlock { visited.add(currentPos); for (Direction d : Iterate.directions) { - if (d.getAxis() == state.get(FACING) + if (d.getAxis() == state.getValue(FACING) .getAxis()) continue; - BlockPos offset = currentPos.offset(d); + BlockPos offset = currentPos.relative(d); if (visited.contains(offset)) continue; BlockState adjacentState = world.getBlockState(offset); @@ -146,7 +146,7 @@ public class SailBlock extends ProperDirectionalBlock { if (!(block instanceof SailBlock) || ((SailBlock) block).frame && color != null) continue; if (state != adjacentState) - world.setBlockState(offset, newState); + world.setBlockAndUpdate(offset, newState); frontier.add(offset); visited.add(offset); } @@ -155,13 +155,13 @@ public class SailBlock extends ProperDirectionalBlock { @Override public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - return (frame ? AllShapes.SAIL_FRAME : AllShapes.SAIL).get(state.get(FACING)); + return (frame ? AllShapes.SAIL_FRAME : AllShapes.SAIL).get(state.getValue(FACING)); } @Override public VoxelShape getCollisionShape(BlockState state, IBlockReader p_220071_2_, BlockPos p_220071_3_, ISelectionContext p_220071_4_) { if (frame) - return AllShapes.SAIL_FRAME_COLLISION.get(state.get(FACING)); + return AllShapes.SAIL_FRAME_COLLISION.get(state.getValue(FACING)); return getShape(state, p_220071_2_, p_220071_3_, p_220071_4_); } @@ -174,31 +174,31 @@ public class SailBlock extends ProperDirectionalBlock { return pickBlock; } - public void onFallenUpon(World p_180658_1_, BlockPos p_180658_2_, Entity p_180658_3_, float p_180658_4_) { + public void fallOn(World p_180658_1_, BlockPos p_180658_2_, Entity p_180658_3_, float p_180658_4_) { if (frame) - super.onFallenUpon(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_); - super.onFallenUpon(p_180658_1_, p_180658_2_, p_180658_3_, 0); + super.fallOn(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_); + super.fallOn(p_180658_1_, p_180658_2_, p_180658_3_, 0); } - public void onLanded(IBlockReader p_176216_1_, Entity p_176216_2_) { - if (frame || p_176216_2_.bypassesLandingEffects()) { - super.onLanded(p_176216_1_, p_176216_2_); + public void updateEntityAfterFallOn(IBlockReader p_176216_1_, Entity p_176216_2_) { + if (frame || p_176216_2_.isSuppressingBounce()) { + super.updateEntityAfterFallOn(p_176216_1_, p_176216_2_); } else { this.bounce(p_176216_2_); } } private void bounce(Entity p_226860_1_) { - Vector3d Vector3d = p_226860_1_.getMotion(); + Vector3d Vector3d = p_226860_1_.getDeltaMovement(); if (Vector3d.y < 0.0D) { double d0 = p_226860_1_ instanceof LivingEntity ? 1.0D : 0.8D; - p_226860_1_.setMotion(Vector3d.x, -Vector3d.y * (double) 0.26F * d0, Vector3d.z); + p_226860_1_.setDeltaMovement(Vector3d.x, -Vector3d.y * (double) 0.26F * d0, Vector3d.z); } } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } @@ -216,12 +216,12 @@ public class SailBlock extends ProperDirectionalBlock { @Override public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { - List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(SailBlock.FACING).getAxis(), dir -> world.getBlockState(pos.offset(dir)).getMaterial().isReplaceable()); + List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getLocation(), state.getValue(SailBlock.FACING).getAxis(), dir -> world.getBlockState(pos.relative(dir)).getMaterial().isReplaceable()); if (directions.isEmpty()) return PlacementOffset.fail(); else { - return PlacementOffset.success(pos.offset(directions.get(0)), s -> s.with(FACING, state.get(FACING))); + return PlacementOffset.success(pos.relative(directions.get(0)), s -> s.setValue(FACING, state.getValue(FACING))); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingInstance.java index 9f7080e50..67de1bc5f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingInstance.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.OrientedData; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; @@ -27,12 +28,14 @@ public class StabilizedBearingInstance extends ActorInstance { BlockState blockState = context.state; - facing = blockState.get(BlockStateProperties.FACING); - rotationAxis = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, facing.getAxis()).getUnitVector(); + facing = blockState.getValue(BlockStateProperties.FACING); + rotationAxis = Direction.get(Direction.AxisDirection.POSITIVE, facing.getAxis()).step(); blockOrientation = BearingInstance.getBlockStateOrientation(facing); - topInstance = materialManager.getOrientedMaterial().getModel(AllBlockPartials.BEARING_TOP, blockState).createInstance(); + topInstance = materialManager.defaultSolid() + .material(Materials.ORIENTED) + .getModel(AllBlockPartials.BEARING_TOP, blockState).createInstance(); topInstance.setPosition(context.localPos) .setRotation(blockOrientation) @@ -43,9 +46,9 @@ public class StabilizedBearingInstance extends ActorInstance { public void beginFrame() { float counterRotationAngle = StabilizedBearingMovementBehaviour.getCounterRotationAngle(context, facing, AnimationTickHolder.getPartialTicks()); - Quaternion rotation = rotationAxis.getDegreesQuaternion(counterRotationAngle); + Quaternion rotation = rotationAxis.rotationDegrees(counterRotationAngle); - rotation.multiply(blockOrientation); + rotation.mul(blockOrientation); topInstance.setRotation(rotation); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index 3ca4d5d17..82ae9b925 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import javax.annotation.Nullable; import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; @@ -36,7 +36,7 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour { ContraptionMatrices matrices, IRenderTypeBuffer buffer) { if (Backend.getInstance().canUseInstancing()) return; - Direction facing = context.state.get(BlockStateProperties.FACING); + Direction facing = context.state.getValue(BlockStateProperties.FACING); PartialModel top = AllBlockPartials.BEARING_TOP; SuperByteBuffer superBuffer = PartialBufferer.get(top, context.state); float renderPartialTicks = AnimationTickHolder.getPartialTicks(); @@ -45,11 +45,11 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour { Quaternion orientation = BearingInstance.getBlockStateOrientation(facing); // rotate against parent - float angle = getCounterRotationAngle(context, facing, renderPartialTicks) * facing.getAxisDirection().getOffset(); + float angle = getCounterRotationAngle(context, facing, renderPartialTicks) * facing.getAxisDirection().getStep(); - Quaternion rotation = facing.getUnitVector().getDegreesQuaternion(angle); + Quaternion rotation = facing.step().rotationDegrees(angle); - rotation.multiply(orientation); + rotation.mul(orientation); orientation = rotation; @@ -60,7 +60,7 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour { superBuffer .light(matrices.entityMatrix, ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld)) - .renderInto(matrices.entityStack, buffer.getBuffer(RenderType.getSolid())); + .renderInto(matrices.entityStack, buffer.getBuffer(RenderType.solid())); } @Override @@ -88,11 +88,11 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour { } else if (entity instanceof OrientedContraptionEntity) { OrientedContraptionEntity orientedCE = (OrientedContraptionEntity) entity; if (axis.isVertical()) - offset = -orientedCE.getYaw(renderPartialTicks); + offset = -orientedCE.getViewYRot(renderPartialTicks); else { if (orientedCE.isInitialOrientationPresent() && orientedCE.getInitialOrientation() .getAxis() == axis) - offset = -orientedCE.getPitch(renderPartialTicks); + offset = -orientedCE.getViewXRot(renderPartialTicks); } } return offset; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java index 4eec742bc..e3f96872d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java @@ -23,7 +23,7 @@ public class StabilizedContraption extends Contraption { @Override public boolean assemble(World world, BlockPos pos) throws AssemblyException { - BlockPos offset = pos.offset(facing); + BlockPos offset = pos.relative(facing); if (!searchMovedStructure(world, offset, null)) return false; startMoving(world); @@ -45,13 +45,13 @@ public class StabilizedContraption extends Contraption { @Override public CompoundNBT writeNBT(boolean spawnPacket) { CompoundNBT tag = super.writeNBT(spawnPacket); - tag.putInt("Facing", facing.getIndex()); + tag.putInt("Facing", facing.get3DDataValue()); return tag; } @Override public void readNBT(World world, CompoundNBT tag, boolean spawnData) { - facing = Direction.byIndex(tag.getInt("Facing")); + facing = Direction.from3DDataValue(tag.getInt("Facing")); super.readNBT(world, tag, spawnData); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java index 0f5bb749f..0c6e037f9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java @@ -25,15 +25,15 @@ public class WindmillBearingBlock extends BearingBlock implements ITE { if (te.running) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java index ccd717284..ff43fe15d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java @@ -82,7 +82,7 @@ public class WindmillBearingTileEntity extends MechanicalBearingTileEntity { private void onDirectionChanged() { if (!running) return; - if (!world.isRemote) + if (!level.isClientSide) updateGeneratedRotation(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java index 2156411af..7ba1ceba3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java @@ -42,51 +42,51 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - if (!player.isAllowEdit()) + if (!player.mayBuild()) return ActionResultType.PASS; - ItemStack heldItem = player.getHeldItem(handIn); + ItemStack heldItem = player.getItemInHand(handIn); boolean isSlimeBall = heldItem.getItem() - .isIn(Tags.Items.SLIMEBALLS) || AllItems.SUPER_GLUE.isIn(heldItem); + .is(Tags.Items.SLIMEBALLS) || AllItems.SUPER_GLUE.isIn(heldItem); - BooleanProperty affectedSide = getGlueableSide(state, hit.getFace()); + BooleanProperty affectedSide = getGlueableSide(state, hit.getDirection()); if (affectedSide == null) return ActionResultType.PASS; - if (isSlimeBall && state.get(affectedSide)) { + if (isSlimeBall && state.getValue(affectedSide)) { for (Direction face : Iterate.directions) { BooleanProperty glueableSide = getGlueableSide(state, face); - if (glueableSide != null && !state.get(glueableSide) && glueAllowedOnSide(worldIn, pos, state, face)) { - if (worldIn.isRemote) { - Vector3d vec = hit.getHitVec(); + if (glueableSide != null && !state.getValue(glueableSide) && glueAllowedOnSide(worldIn, pos, state, face)) { + if (worldIn.isClientSide) { + Vector3d vec = hit.getLocation(); worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0); return ActionResultType.SUCCESS; } AllSoundEvents.SLIME_ADDED.playOnServer(worldIn, pos, .5f, 1); - state = state.with(glueableSide, true); + state = state.setValue(glueableSide, true); } } - if (!worldIn.isRemote) - worldIn.setBlockState(pos, state); + if (!worldIn.isClientSide) + worldIn.setBlockAndUpdate(pos, state); return ActionResultType.SUCCESS; } - if ((!heldItem.isEmpty() || !player.isSneaking()) && !isSlimeBall) + if ((!heldItem.isEmpty() || !player.isShiftKeyDown()) && !isSlimeBall) return ActionResultType.PASS; - if (state.get(affectedSide) == isSlimeBall) + if (state.getValue(affectedSide) == isSlimeBall) return ActionResultType.PASS; - if (!glueAllowedOnSide(worldIn, pos, state, hit.getFace())) + if (!glueAllowedOnSide(worldIn, pos, state, hit.getDirection())) return ActionResultType.PASS; - if (worldIn.isRemote) { - Vector3d vec = hit.getHitVec(); + if (worldIn.isClientSide) { + Vector3d vec = hit.getLocation(); worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0); return ActionResultType.SUCCESS; } AllSoundEvents.SLIME_ADDED.playOnServer(worldIn, pos, .5f, 1); - worldIn.setBlockState(pos, state.with(affectedSide, isSlimeBall)); + worldIn.setBlockAndUpdate(pos, state.setValue(affectedSide, isSlimeBall)); return ActionResultType.SUCCESS; } @@ -100,17 +100,17 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements for (Direction face : Iterate.directions) { BooleanProperty glueableSide = getGlueableSide(rotated, face); if (glueableSide != null) - rotated = rotated.with(glueableSide, false); + rotated = rotated.setValue(glueableSide, false); } for (Direction face : Iterate.directions) { BooleanProperty glueableSide = getGlueableSide(state, face); - if (glueableSide == null || !state.get(glueableSide)) + if (glueableSide == null || !state.getValue(glueableSide)) continue; Direction rotatedFacing = rotation.rotate(face); BooleanProperty rotatedGlueableSide = getGlueableSide(rotated, rotatedFacing); if (rotatedGlueableSide != null) - rotated = rotated.with(rotatedGlueableSide, true); + rotated = rotated.setValue(rotatedGlueableSide, true); } return rotated; @@ -125,17 +125,17 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements for (Direction face : Iterate.directions) { BooleanProperty glueableSide = getGlueableSide(mirrored, face); if (glueableSide != null) - mirrored = mirrored.with(glueableSide, false); + mirrored = mirrored.setValue(glueableSide, false); } for (Direction face : Iterate.directions) { BooleanProperty glueableSide = getGlueableSide(state, face); - if (glueableSide == null || !state.get(glueableSide)) + if (glueableSide == null || !state.getValue(glueableSide)) continue; Direction mirroredFacing = mirrorIn.mirror(face); BooleanProperty mirroredGlueableSide = getGlueableSide(mirrored, mirroredFacing); if (mirroredGlueableSide != null) - mirrored = mirrored.with(mirroredGlueableSide, true); + mirrored = mirrored.setValue(mirroredGlueableSide, true); } return mirrored; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java index fee951e82..5477f449e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java @@ -43,7 +43,7 @@ public class ChassisRangeDisplay { } protected Object getOutlineKey() { - return Pair.of(te.getPos(), 1); + return Pair.of(te.getBlockPos(), 1); } protected Set createSelection(ChassisTileEntity chassis) { @@ -88,8 +88,8 @@ public class ChassisRangeDisplay { public static void tick() { PlayerEntity player = Minecraft.getInstance().player; - World world = Minecraft.getInstance().world; - boolean hasWrench = AllItems.WRENCH.isIn(player.getHeldItemMainhand()); + World world = Minecraft.getInstance().level; + boolean hasWrench = AllItems.WRENCH.isIn(player.getMainHandItem()); for (Iterator iterator = entries.keySet() .iterator(); iterator.hasNext();) { @@ -113,12 +113,12 @@ public class ChassisRangeDisplay { if (!hasWrench) return; - RayTraceResult over = Minecraft.getInstance().objectMouseOver; + RayTraceResult over = Minecraft.getInstance().hitResult; if (!(over instanceof BlockRayTraceResult)) return; BlockRayTraceResult ray = (BlockRayTraceResult) over; - BlockPos pos = ray.getPos(); - TileEntity tileEntity = world.getTileEntity(pos); + BlockPos pos = ray.getBlockPos(); + TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity == null || tileEntity.isRemoved()) return; if (!(tileEntity instanceof ChassisTileEntity)) @@ -131,7 +131,7 @@ public class ChassisRangeDisplay { GroupEntry existingGroupForPos = getExistingGroupForPos(pos); if (existingGroupForPos != null) { for (ChassisTileEntity included : existingGroupForPos.includedTEs) - entries.remove(included.getPos()); + entries.remove(included.getBlockPos()); existingGroupForPos.timer = DISPLAY_TIME; return; } @@ -147,11 +147,11 @@ public class ChassisRangeDisplay { private static boolean tickEntry(Entry entry, boolean hasWrench) { ChassisTileEntity chassisTileEntity = entry.te; - World teWorld = chassisTileEntity.getWorld(); - World world = Minecraft.getInstance().world; + World teWorld = chassisTileEntity.getLevel(); + World world = Minecraft.getInstance().level; if (chassisTileEntity.isRemoved() || teWorld == null || teWorld != world - || !world.isBlockPresent(chassisTileEntity.getPos())) { + || !world.isLoaded(chassisTileEntity.getBlockPos())) { return true; } @@ -173,7 +173,7 @@ public class ChassisRangeDisplay { GroupEntry hoveredGroup = new GroupEntry(chassis); for (ChassisTileEntity included : hoveredGroup.includedTEs) - CreateClient.OUTLINER.remove(included.getPos()); + CreateClient.OUTLINER.remove(included.getBlockPos()); groupEntries.forEach(entry -> CreateClient.OUTLINER.remove(entry.getOutlineKey())); groupEntries.clear(); @@ -183,7 +183,7 @@ public class ChassisRangeDisplay { } // Display an individual chassis and kill any group selections that contained it - BlockPos pos = chassis.getPos(); + BlockPos pos = chassis.getBlockPos(); GroupEntry entry = getExistingGroupForPos(pos); if (entry != null) CreateClient.OUTLINER.remove(entry.getOutlineKey()); @@ -197,7 +197,7 @@ public class ChassisRangeDisplay { private static GroupEntry getExistingGroupForPos(BlockPos pos) { for (GroupEntry groupEntry : groupEntries) for (ChassisTileEntity chassis : groupEntry.includedTEs) - if (pos.equals(chassis.getPos())) + if (pos.equals(chassis.getBlockPos())) return groupEntry; return null; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java index 51e17c7fc..a5590caf6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java @@ -73,20 +73,20 @@ public class ChassisTileEntity extends SmartTileEntity { } protected boolean isRadial() { - return world.getBlockState(pos).getBlock() instanceof RadialChassisBlock; + return level.getBlockState(worldPosition).getBlock() instanceof RadialChassisBlock; } public List collectChassisGroup() { Queue frontier = new LinkedList<>(); List collected = new ArrayList<>(); Set visited = new HashSet<>(); - frontier.add(pos); + frontier.add(worldPosition); while (!frontier.isEmpty()) { BlockPos current = frontier.poll(); if (visited.contains(current)) continue; visited.add(current); - TileEntity tileEntity = world.getTileEntity(current); + TileEntity tileEntity = level.getBlockEntity(current); if (tileEntity instanceof ChassisTileEntity) { ChassisTileEntity chassis = (ChassisTileEntity) tileEntity; collected.add(chassis); @@ -101,20 +101,20 @@ public class ChassisTileEntity extends SmartTileEntity { BlockState state = getBlockState(); if (!(state.getBlock() instanceof AbstractChassisBlock)) return false; - Axis axis = state.get(AbstractChassisBlock.AXIS); + Axis axis = state.getValue(AbstractChassisBlock.AXIS); if (isRadial()) { // Collect chain of radial chassis for (int offset : new int[] { -1, 1 }) { - Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); - BlockPos currentPos = pos.offset(direction, offset); - if (!world.isBlockPresent(currentPos)) + Direction direction = Direction.get(AxisDirection.POSITIVE, axis); + BlockPos currentPos = worldPosition.relative(direction, offset); + if (!level.isLoaded(currentPos)) return false; - BlockState neighbourState = world.getBlockState(currentPos); + BlockState neighbourState = level.getBlockState(currentPos); if (!AllBlocks.RADIAL_CHASSIS.has(neighbourState)) continue; - if (axis != neighbourState.get(BlockStateProperties.AXIS)) + if (axis != neighbourState.getValue(BlockStateProperties.AXIS)) continue; if (!visited.contains(currentPos)) frontier.add(currentPos); @@ -125,18 +125,18 @@ public class ChassisTileEntity extends SmartTileEntity { // Collect group of connected linear chassis for (Direction offset : Iterate.directions) { - BlockPos current = pos.offset(offset); + BlockPos current = worldPosition.relative(offset); if (visited.contains(current)) continue; - if (!world.isBlockPresent(current)) + if (!level.isLoaded(current)) return false; - BlockState neighbourState = world.getBlockState(current); + BlockState neighbourState = level.getBlockState(current); if (!LinearChassisBlock.isChassis(neighbourState)) continue; if (!LinearChassisBlock.sameKind(state, neighbourState)) continue; - if (neighbourState.get(AXIS) != axis) + if (neighbourState.getValue(AXIS) != axis) continue; frontier.add(current); @@ -149,23 +149,23 @@ public class ChassisTileEntity extends SmartTileEntity { List positions = new ArrayList<>(); BlockState state = getBlockState(); AbstractChassisBlock block = (AbstractChassisBlock) state.getBlock(); - Axis axis = state.get(AbstractChassisBlock.AXIS); - Direction facing = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); + Axis axis = state.getValue(AbstractChassisBlock.AXIS); + Direction facing = Direction.get(AxisDirection.POSITIVE, axis); int chassisRange = visualize ? range.scrollableValue : getRange(); for (int offset : new int[] { 1, -1 }) { if (offset == -1) facing = facing.getOpposite(); - boolean sticky = state.get(block.getGlueableSide(state, facing)); + boolean sticky = state.getValue(block.getGlueableSide(state, facing)); for (int i = 1; i <= chassisRange; i++) { - BlockPos current = pos.offset(facing, i); - BlockState currentState = world.getBlockState(current); + BlockPos current = worldPosition.relative(facing, i); + BlockState currentState = level.getBlockState(current); if (forcedMovement != facing && !sticky) break; // Ignore replaceable Blocks and Air-like - if (!BlockMovementChecks.isMovementNecessary(currentState, world, current)) + if (!BlockMovementChecks.isMovementNecessary(currentState, level, current)) break; if (BlockMovementChecks.isBrittle(currentState)) break; @@ -182,48 +182,48 @@ public class ChassisTileEntity extends SmartTileEntity { private List getIncludedBlockPositionsRadial(Direction forcedMovement, boolean visualize) { List positions = new ArrayList<>(); - BlockState state = world.getBlockState(pos); - Axis axis = state.get(AbstractChassisBlock.AXIS); + BlockState state = level.getBlockState(worldPosition); + Axis axis = state.getValue(AbstractChassisBlock.AXIS); AbstractChassisBlock block = (AbstractChassisBlock) state.getBlock(); int chassisRange = visualize ? range.scrollableValue : getRange(); for (Direction facing : Iterate.directions) { if (facing.getAxis() == axis) continue; - if (!state.get(block.getGlueableSide(state, facing))) + if (!state.getValue(block.getGlueableSide(state, facing))) continue; - BlockPos startPos = pos.offset(facing); + BlockPos startPos = worldPosition.relative(facing); List localFrontier = new LinkedList<>(); Set localVisited = new HashSet<>(); localFrontier.add(startPos); while (!localFrontier.isEmpty()) { BlockPos searchPos = localFrontier.remove(0); - BlockState searchedState = world.getBlockState(searchPos); + BlockState searchedState = level.getBlockState(searchPos); if (localVisited.contains(searchPos)) continue; - if (!searchPos.withinDistance(pos, chassisRange + .5f)) + if (!searchPos.closerThan(worldPosition, chassisRange + .5f)) continue; - if (!BlockMovementChecks.isMovementNecessary(searchedState, world, searchPos)) + if (!BlockMovementChecks.isMovementNecessary(searchedState, level, searchPos)) continue; if (BlockMovementChecks.isBrittle(searchedState)) continue; localVisited.add(searchPos); - if (!searchPos.equals(pos)) + if (!searchPos.equals(worldPosition)) positions.add(searchPos); for (Direction offset : Iterate.directions) { if (offset.getAxis() == axis) continue; - if (searchPos.equals(pos) && offset != facing) + if (searchPos.equals(worldPosition) && offset != facing) continue; if (BlockMovementChecks.isNotSupportive(searchedState, offset)) continue; - localFrontier.add(searchPos.offset(offset)); + localFrontier.add(searchPos.relative(offset)); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java index c10ea95da..3c35b4573 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java @@ -25,54 +25,54 @@ public class LinearChassisBlock extends AbstractChassisBlock { public LinearChassisBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(STICKY_TOP, false) - .with(STICKY_BOTTOM, false)); + registerDefaultState(defaultBlockState().setValue(STICKY_TOP, false) + .setValue(STICKY_BOTTOM, false)); } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(STICKY_TOP, STICKY_BOTTOM); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockPos placedOnPos = context.getPos() - .offset(context.getFace() + BlockPos placedOnPos = context.getClickedPos() + .relative(context.getClickedFace() .getOpposite()); - BlockState blockState = context.getWorld() + BlockState blockState = context.getLevel() .getBlockState(placedOnPos); if (context.getPlayer() == null || !context.getPlayer() - .isSneaking()) { + .isShiftKeyDown()) { if (isChassis(blockState)) - return getDefaultState().with(AXIS, blockState.get(AXIS)); - return getDefaultState().with(AXIS, context.getNearestLookingDirection() + return defaultBlockState().setValue(AXIS, blockState.getValue(AXIS)); + return defaultBlockState().setValue(AXIS, context.getNearestLookingDirection() .getAxis()); } return super.getStateForPlacement(context); } @Override - public BlockState updatePostPlacement(BlockState state, Direction side, BlockState other, IWorld p_196271_4_, + public BlockState updateShape(BlockState state, Direction side, BlockState other, IWorld p_196271_4_, BlockPos p_196271_5_, BlockPos p_196271_6_) { BooleanProperty property = getGlueableSide(state, side); - if (property == null || !sameKind(state, other) || state.get(AXIS) != other.get(AXIS)) + if (property == null || !sameKind(state, other) || state.getValue(AXIS) != other.getValue(AXIS)) return state; - return state.with(property, false); + return state.setValue(property, false); } @Override public BooleanProperty getGlueableSide(BlockState state, Direction face) { - if (face.getAxis() != state.get(AXIS)) + if (face.getAxis() != state.getValue(AXIS)) return null; return face.getAxisDirection() == AxisDirection.POSITIVE ? STICKY_TOP : STICKY_BOTTOM; } @Override protected boolean glueAllowedOnSide(IBlockReader world, BlockPos pos, BlockState state, Direction side) { - BlockState other = world.getBlockState(pos.offset(side)); - return !sameKind(other, state) || state.get(AXIS) != other.get(AXIS); + BlockState other = world.getBlockState(pos.relative(side)); + return !sameKind(other, state) || state.getValue(AXIS) != other.getValue(AXIS); } public static boolean isChassis(BlockState state) { @@ -92,20 +92,20 @@ public class LinearChassisBlock extends AbstractChassisBlock { if (glueableSide == null) return AllBlocks.LINEAR_CHASSIS.has(state) ? AllSpriteShifts.CHASSIS_SIDE : AllSpriteShifts.SECONDARY_CHASSIS_SIDE; - return state.get(glueableSide) ? AllSpriteShifts.CHASSIS_STICKY : AllSpriteShifts.CHASSIS; + return state.getValue(glueableSide) ? AllSpriteShifts.CHASSIS_STICKY : AllSpriteShifts.CHASSIS; } @Override protected Direction getUpDirection(IBlockDisplayReader reader, BlockPos pos, BlockState state, Direction face) { - Axis axis = state.get(AXIS); + Axis axis = state.getValue(AXIS); if (face.getAxis() == axis) return super.getUpDirection(reader, pos, state, face); - return Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); + return Direction.get(AxisDirection.POSITIVE, axis); } @Override protected Direction getRightDirection(IBlockDisplayReader reader, BlockPos pos, BlockState state, Direction face) { - Axis axis = state.get(AXIS); + Axis axis = state.getValue(AXIS); return axis != face.getAxis() && axis.isHorizontal() ? (face.getAxis() .isHorizontal() ? Direction.DOWN : (axis == Axis.X ? Direction.NORTH : Direction.EAST)) : super.getRightDirection(reader, pos, state, face); @@ -113,7 +113,7 @@ public class LinearChassisBlock extends AbstractChassisBlock { @Override protected boolean reverseUVsHorizontally(BlockState state, Direction face) { - Axis axis = state.get(AXIS); + Axis axis = state.getValue(AXIS); boolean side = face.getAxis() != axis; if (side && axis == Axis.X && face.getAxis() .isHorizontal()) @@ -128,7 +128,7 @@ public class LinearChassisBlock extends AbstractChassisBlock { @Override public boolean reverseUVs(BlockState state, Direction face) { - Axis axis = state.get(AXIS); + Axis axis = state.getValue(AXIS); boolean end = face.getAxis() == axis; if (end && axis.isHorizontal() && (face.getAxisDirection() == AxisDirection.POSITIVE)) return true; @@ -140,10 +140,10 @@ public class LinearChassisBlock extends AbstractChassisBlock { @Override public boolean connectsTo(BlockState state, BlockState other, IBlockDisplayReader reader, BlockPos pos, BlockPos otherPos, Direction face) { - Axis axis = state.get(AXIS); + Axis axis = state.getValue(AXIS); boolean superConnect = face.getAxis() == axis ? super.connectsTo(state, other, reader, pos, otherPos, face) : sameKind(state, other); - return superConnect && axis == other.get(AXIS); + return superConnect && axis == other.getValue(AXIS); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/RadialChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/RadialChassisBlock.java index 852c168bb..a54bc4c65 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/RadialChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/RadialChassisBlock.java @@ -16,19 +16,19 @@ public class RadialChassisBlock extends AbstractChassisBlock { public RadialChassisBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(STICKY_EAST, false).with(STICKY_SOUTH, false).with(STICKY_NORTH, false) - .with(STICKY_WEST, false)); + registerDefaultState(defaultBlockState().setValue(STICKY_EAST, false).setValue(STICKY_SOUTH, false).setValue(STICKY_NORTH, false) + .setValue(STICKY_WEST, false)); } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(STICKY_NORTH, STICKY_EAST, STICKY_SOUTH, STICKY_WEST); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override public BooleanProperty getGlueableSide(BlockState state, Direction face) { - Axis axis = state.get(AXIS); + Axis axis = state.getValue(AXIS); if (axis == Axis.X) { if (face == Direction.NORTH) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java index 277223c95..ba22c9f79 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java @@ -32,39 +32,39 @@ public class StickerBlock extends ProperDirectionalBlock implements ITE builder) { - super.fillStateContainer(builder.add(POWERED, EXTENDED)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(POWERED, EXTENDED)); } @Override public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; - boolean previouslyPowered = state.get(POWERED); - if (previouslyPowered != worldIn.isBlockPowered(pos)) { + boolean previouslyPowered = state.getValue(POWERED); + if (previouslyPowered != worldIn.hasNeighborSignal(pos)) { state = state.cycle(POWERED); - if (state.get(POWERED)) + if (state.getValue(POWERED)) state = state.cycle(EXTENDED); - worldIn.setBlockState(pos, state, 2); + worldIn.setBlock(pos, state, 2); } } @@ -92,52 +92,52 @@ public class StickerBlock extends ProperDirectionalBlock implements ITE imple head = getTransformMaterial().getModel(AllBlockPartials.STICKER_HEAD, blockState).createInstance(); - fakeWorld = tile.getWorld() != Minecraft.getInstance().world; - facing = blockState.get(StickerBlock.FACING); - offset = blockState.get(StickerBlock.EXTENDED) ? 1 : 0; + fakeWorld = tile.getLevel() != Minecraft.getInstance().level; + facing = blockState.getValue(StickerBlock.FACING); + offset = blockState.getValue(StickerBlock.EXTENDED) ? 1 : 0; animateHead(offset); } @@ -42,7 +42,7 @@ public class StickerInstance extends TileEntityInstance imple if (fakeWorld) offset = this.offset; - if (MathHelper.epsilonEquals(offset, lastOffset)) + if (MathHelper.equal(offset, lastOffset)) return; animateHead(offset); @@ -52,7 +52,7 @@ public class StickerInstance extends TileEntityInstance imple private void animateHead(float offset) { MatrixStack stack = new MatrixStack(); - MatrixStacker.of(stack) + MatrixTransformStack.of(stack) .translate(getInstancePosition()) .nudge(tile.hashCode()) .centre() diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java index a63c27957..91ef67f06 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java @@ -26,16 +26,16 @@ public class StickerRenderer extends SafeTileEntityRenderer { protected void renderSafe(StickerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; BlockState state = te.getBlockState(); SuperByteBuffer head = PartialBufferer.get(AllBlockPartials.STICKER_HEAD, state); - float offset = te.piston.getValue(AnimationTickHolder.getPartialTicks(te.getWorld())); + float offset = te.piston.getValue(AnimationTickHolder.getPartialTicks(te.getLevel())); - if (te.getWorld() != Minecraft.getInstance().world && !te.isVirtual()) - offset = state.get(StickerBlock.EXTENDED) ? 1 : 0; + if (te.getLevel() != Minecraft.getInstance().level && !te.isVirtual()) + offset = state.getValue(StickerBlock.EXTENDED) ? 1 : 0; - Direction facing = state.get(StickerBlock.FACING); + Direction facing = state.getValue(StickerBlock.FACING); head.matrixStacker() .nudge(te.hashCode()) .centre() @@ -45,7 +45,7 @@ public class StickerRenderer extends SafeTileEntityRenderer { .translate(0, (offset * offset) * 4 / 16f, 0); head.light(light) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + .renderInto(ms, buffer.getBuffer(RenderType.solid())); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java index 7282a1183..6e85209da 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java @@ -39,26 +39,26 @@ public class StickerTileEntity extends SmartTileEntity implements IInstanceRende @Override public void initialize() { super.initialize(); - if (!world.isRemote) + if (!level.isClientSide) return; piston.startWithValue(isBlockStateExtended() ? 1 : 0); } public boolean isBlockStateExtended() { BlockState blockState = getBlockState(); - boolean extended = AllBlocks.STICKER.has(blockState) && blockState.get(StickerBlock.EXTENDED); + boolean extended = AllBlocks.STICKER.has(blockState) && blockState.getValue(StickerBlock.EXTENDED); return extended; } @Override public void tick() { super.tick(); - if (!world.isRemote) + if (!level.isClientSide) return; piston.tickChaser(); if (isAttachedToBlock() && piston.getValue(0) != piston.getValue() && piston.getValue() == 1) { - SuperGlueItem.spawnParticles(world, pos, getBlockState().get(StickerBlock.FACING), true); + SuperGlueItem.spawnParticles(level, worldPosition, getBlockState().getValue(StickerBlock.FACING), true); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> playSound(true)); } @@ -77,8 +77,8 @@ public class StickerTileEntity extends SmartTileEntity implements IInstanceRende BlockState blockState = getBlockState(); if (!AllBlocks.STICKER.has(blockState)) return false; - Direction direction = blockState.get(StickerBlock.FACING); - return SuperGlueEntity.isValidFace(world, pos.offset(direction), direction.getOpposite()); + Direction direction = blockState.getValue(StickerBlock.FACING); + return SuperGlueEntity.isValidFace(level, worldPosition.relative(direction), direction.getOpposite()); } @Override @@ -90,7 +90,8 @@ public class StickerTileEntity extends SmartTileEntity implements IInstanceRende @OnlyIn(Dist.CLIENT) public void playSound(boolean attach) { - AllSoundEvents.SLIME_ADDED.play(world, Minecraft.getInstance().player, pos, 0.35f, attach ? 0.75f : 0.2f); + AllSoundEvents.SLIME_ADDED.play(level, Minecraft.getInstance().player, worldPosition, 0.35f, attach ? 0.75f : 0.2f); } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java index 849bfb36b..1c818a8ca 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java @@ -31,22 +31,22 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements } @Override - public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { - Direction direction = state.get(FACING); - BlockState shaft = world.getBlockState(pos.offset(direction.getOpposite())); - return AllBlocks.GANTRY_SHAFT.has(shaft) && shaft.get(GantryShaftBlock.FACING) + public boolean canSurvive(BlockState state, IWorldReader world, BlockPos pos) { + Direction direction = state.getValue(FACING); + BlockState shaft = world.getBlockState(pos.relative(direction.getOpposite())); + return AllBlocks.GANTRY_SHAFT.has(shaft) && shaft.getValue(GantryShaftBlock.FACING) .getAxis() != direction.getAxis(); } @Override - public void updateDiagonalNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags, int count) { - super.updateDiagonalNeighbors(stateIn, worldIn, pos, flags, count); + public void updateIndirectNeighbourShapes(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags, int count) { + super.updateIndirectNeighbourShapes(stateIn, worldIn, pos, flags, count); withTileEntityDo(worldIn, pos, GantryCarriageTileEntity::checkValidGantryShaft); } @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { - super.onBlockAdded(state, worldIn, pos, oldState, isMoving); + public void onPlace(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { + super.onPlace(state, worldIn, pos, oldState, isMoving); } @Override @@ -56,14 +56,14 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements @Override protected Direction getFacingForPlacement(BlockItemUseContext context) { - return context.getFace(); + return context.getClickedFace(); } - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - if (!player.isAllowEdit() || player.isSneaking()) + if (!player.mayBuild() || player.isShiftKeyDown()) return ActionResultType.PASS; - if (player.getHeldItem(handIn) + if (player.getItemInHand(handIn) .isEmpty()) { withTileEntityDo(worldIn, pos, te -> te.checkValidGantryShaft()); return ActionResultType.SUCCESS; @@ -74,25 +74,25 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements @Override public BlockState getStateForPlacement(BlockItemUseContext context) { BlockState stateForPlacement = super.getStateForPlacement(context); - Direction opposite = stateForPlacement.get(FACING) + Direction opposite = stateForPlacement.getValue(FACING) .getOpposite(); - return cycleAxisIfNecessary(stateForPlacement, opposite, context.getWorld() - .getBlockState(context.getPos() - .offset(opposite))); + return cycleAxisIfNecessary(stateForPlacement, opposite, context.getLevel() + .getBlockState(context.getClickedPos() + .relative(opposite))); } @Override public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos updatePos, boolean p_220069_6_) { - if (updatePos.equals(pos.offset(state.get(FACING) - .getOpposite())) && !isValidPosition(state, world, pos)) + if (updatePos.equals(pos.relative(state.getValue(FACING) + .getOpposite())) && !canSurvive(state, world, pos)) world.destroyBlock(pos, true); } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState otherState, IWorld world, + public BlockState updateShape(BlockState state, Direction direction, BlockState otherState, IWorld world, BlockPos pos, BlockPos p_196271_6_) { - if (state.get(FACING) != direction.getOpposite()) + if (state.getValue(FACING) != direction.getOpposite()) return state; return cycleAxisIfNecessary(state, direction, otherState); } @@ -100,7 +100,7 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements protected BlockState cycleAxisIfNecessary(BlockState state, Direction direction, BlockState otherState) { if (!AllBlocks.GANTRY_SHAFT.has(otherState)) return state; - if (otherState.get(GantryShaftBlock.FACING) + if (otherState.getValue(GantryShaftBlock.FACING) .getAxis() == direction.getAxis()) return state; if (isValidGantryShaftAxis(state, otherState)) @@ -109,7 +109,7 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements } public static boolean isValidGantryShaftAxis(BlockState pinionState, BlockState gantryState) { - return getValidGantryShaftAxis(pinionState) == gantryState.get(GantryShaftBlock.FACING) + return getValidGantryShaftAxis(pinionState) == gantryState.getValue(GantryShaftBlock.FACING) .getAxis(); } @@ -118,7 +118,7 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements return Axis.Y; IRotate block = (IRotate) state.getBlock(); Axis rotationAxis = block.getRotationAxis(state); - Axis facingAxis = state.get(FACING) + Axis facingAxis = state.getValue(FACING) .getAxis(); for (Axis axis : Iterate.axes) if (axis != rotationAxis && axis != facingAxis) @@ -127,7 +127,7 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements } public static Axis getValidGantryPinionAxis(BlockState state, Axis shaftAxis) { - Axis facingAxis = state.get(FACING) + Axis facingAxis = state.getValue(FACING) .getAxis(); for (Axis axis : Iterate.axes) if (axis != shaftAxis && axis != facingAxis) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java index e2d3a8630..5a4d957f5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java @@ -1,8 +1,9 @@ package com.simibubi.create.content.contraptions.components.structureMovement.gantry; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.core.materials.ModelData; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -10,7 +11,6 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -36,15 +36,15 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns .getModel(AllBlockPartials.GANTRY_COGS, blockState) .createInstance(); - facing = blockState.get(GantryCarriageBlock.FACING); - alongFirst = blockState.get(GantryCarriageBlock.AXIS_ALONG_FIRST_COORDINATE); + facing = blockState.getValue(GantryCarriageBlock.FACING); + alongFirst = blockState.getValue(GantryCarriageBlock.AXIS_ALONG_FIRST_COORDINATE); rotationAxis = KineticTileEntityRenderer.getRotationAxisOf(tile); rotationMult = getRotationMultiplier(getGantryAxis(), facing); - visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getPos() - : tile.getPos() - .offset(facing.getOpposite()); + visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getBlockPos() + : tile.getBlockPos() + .relative(facing.getOpposite()); animateCogs(getCogAngle()); } @@ -53,7 +53,7 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns public void beginFrame() { float cogAngle = getCogAngle(); - if (MathHelper.epsilonEquals(cogAngle, lastAngle)) return; + if (MathHelper.equal(cogAngle, lastAngle)) return; animateCogs(cogAngle); } @@ -64,14 +64,14 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns private void animateCogs(float cogAngle) { MatrixStack ms = new MatrixStack(); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .translate(getInstancePosition()) .centre() .rotateY(AngleHelper.horizontalAngle(facing)) .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) .rotateY(alongFirst ^ facing.getAxis() == Direction.Axis.Z ? 90 : 0) .translate(0, -9 / 16f, 0) - .multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-cogAngle)) + .multiply(Vector3f.XP.rotation(-cogAngle)) .translate(0, 9 / 16f, 0) .unCentre(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java index 5ae13bc6d..63efd4fc7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java @@ -32,15 +32,15 @@ public class GantryCarriageRenderer extends KineticTileEntityRenderer { int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; BlockState state = te.getBlockState(); - Direction facing = state.get(GantryCarriageBlock.FACING); - Boolean alongFirst = state.get(GantryCarriageBlock.AXIS_ALONG_FIRST_COORDINATE); + Direction facing = state.getValue(GantryCarriageBlock.FACING); + Boolean alongFirst = state.getValue(GantryCarriageBlock.AXIS_ALONG_FIRST_COORDINATE); Axis rotationAxis = getRotationAxisOf(te); - BlockPos visualPos = facing.getAxisDirection() == AxisDirection.POSITIVE ? te.getPos() - : te.getPos() - .offset(facing.getOpposite()); + BlockPos visualPos = facing.getAxisDirection() == AxisDirection.POSITIVE ? te.getBlockPos() + : te.getBlockPos() + .relative(facing.getOpposite()); float angleForTe = getAngleForTe(te, visualPos, rotationAxis); Axis gantryAxis = Axis.X; @@ -62,17 +62,17 @@ public class GantryCarriageRenderer extends KineticTileEntityRenderer { .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) .rotateY(alongFirst ^ facing.getAxis() == Axis.Z ? 90 : 0) .translate(0, -9 / 16f, 0) - .multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe)) + .multiply(Vector3f.XP.rotation(-angleForTe)) .translate(0, 9 / 16f, 0) .unCentre(); cogs.light(light) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + .renderInto(ms, buffer.getBuffer(RenderType.solid())); } public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) { - float time = AnimationTickHolder.getRenderTime(te.getWorld()); + float time = AnimationTickHolder.getRenderTime(te.getLevel()); float offset = getRotationOffsetForPosition(te, pos, axis); return ((time * te.getSpeed() * 3f / 20 + offset) % 360) / 180 * (float) Math.PI; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java index 897068624..7e516d2dc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java @@ -41,8 +41,8 @@ public class GantryCarriageTileEntity extends KineticTileEntity implements IDisp @Override public void initialize() { super.initialize(); - if (!getBlockState().isValidPosition(world, pos)) - world.destroyBlock(pos, true); + if (!getBlockState().canSurvive(level, worldPosition)) + level.destroyBlock(worldPosition, true); } public void queueAssembly() { @@ -53,7 +53,7 @@ public class GantryCarriageTileEntity extends KineticTileEntity implements IDisp public void tick() { super.tick(); - if (world.isRemote) + if (level.isClientSide) return; if (assembleNextTick) { @@ -72,10 +72,10 @@ public class GantryCarriageTileEntity extends KineticTileEntity implements IDisp if (!(blockState.getBlock() instanceof GantryCarriageBlock)) return; - Direction direction = blockState.get(FACING); + Direction direction = blockState.getValue(FACING); GantryContraption contraption = new GantryContraption(direction); - TileEntity shaftTe = world.getTileEntity(pos.offset(direction.getOpposite())); + TileEntity shaftTe = level.getBlockEntity(worldPosition.relative(direction.getOpposite())); if (!(shaftTe instanceof GantryShaftTileEntity)) return; BlockState shaftState = shaftTe.getBlockState(); @@ -83,14 +83,14 @@ public class GantryCarriageTileEntity extends KineticTileEntity implements IDisp return; float pinionMovementSpeed = ((GantryShaftTileEntity) shaftTe).getPinionMovementSpeed(); - Direction shaftOrientation = shaftState.get(GantryShaftBlock.FACING); + Direction shaftOrientation = shaftState.getValue(GantryShaftBlock.FACING); Direction movementDirection = shaftOrientation; if (pinionMovementSpeed < 0) movementDirection = movementDirection.getOpposite(); try { lastException = null; - if (!contraption.assemble(world, pos)) + if (!contraption.assemble(level, worldPosition)) return; sendData(); @@ -99,17 +99,17 @@ public class GantryCarriageTileEntity extends KineticTileEntity implements IDisp sendData(); return; } - if (ContraptionCollider.isCollidingWithWorld(world, contraption, pos.offset(movementDirection), + if (ContraptionCollider.isCollidingWithWorld(level, contraption, worldPosition.relative(movementDirection), movementDirection)) return; - contraption.removeBlocksFromWorld(world, BlockPos.ZERO); + contraption.removeBlocksFromWorld(level, BlockPos.ZERO); GantryContraptionEntity movedContraption = - GantryContraptionEntity.create(world, contraption, shaftOrientation); - BlockPos anchor = pos; - movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); - AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(world, pos); - world.addEntity(movedContraption); + GantryContraptionEntity.create(level, contraption, shaftOrientation); + BlockPos anchor = worldPosition; + movedContraption.setPos(anchor.getX(), anchor.getY(), anchor.getZ()); + AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(level, worldPosition); + level.addFreshEntity(movedContraption); } @Override @@ -134,19 +134,19 @@ public class GantryCarriageTileEntity extends KineticTileEntity implements IDisp return defaultModifier; if (!AllBlocks.GANTRY_SHAFT.has(stateTo)) return defaultModifier; - if (!stateTo.get(GantryShaftBlock.POWERED)) + if (!stateTo.getValue(GantryShaftBlock.POWERED)) return defaultModifier; - Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ()); - if (stateFrom.get(GantryCarriageBlock.FACING) != direction.getOpposite()) + Direction direction = Direction.getNearest(diff.getX(), diff.getY(), diff.getZ()); + if (stateFrom.getValue(GantryCarriageBlock.FACING) != direction.getOpposite()) return defaultModifier; - return getGantryPinionModifier(stateTo.get(GantryShaftBlock.FACING), stateFrom.get(GantryCarriageBlock.FACING)); + return getGantryPinionModifier(stateTo.getValue(GantryShaftBlock.FACING), stateFrom.getValue(GantryCarriageBlock.FACING)); } public static float getGantryPinionModifier(Direction shaft, Direction pinionDirection) { Axis shaftAxis = shaft.getAxis(); float directionModifier = shaft.getAxisDirection() - .getOffset(); + .getStep(); if (shaftAxis == Axis.Y) if (pinionDirection == Direction.NORTH || pinionDirection == Direction.EAST) return -directionModifier; @@ -163,14 +163,14 @@ public class GantryCarriageTileEntity extends KineticTileEntity implements IDisp BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof GantryCarriageBlock)) return false; - Direction facing = blockState.get(GantryCarriageBlock.FACING) + Direction facing = blockState.getValue(GantryCarriageBlock.FACING) .getOpposite(); - BlockState shaftState = world.getBlockState(pos.offset(facing)); + BlockState shaftState = level.getBlockState(worldPosition.relative(facing)); if (!(shaftState.getBlock() instanceof GantryShaftBlock)) return false; - if (shaftState.get(GantryShaftBlock.POWERED)) + if (shaftState.getValue(GantryShaftBlock.POWERED)) return false; - TileEntity te = world.getTileEntity(pos.offset(facing)); + TileEntity te = level.getBlockEntity(worldPosition.relative(facing)); return te instanceof GantryShaftTileEntity && ((GantryShaftTileEntity) te).canAssembleOn(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java index df6366c73..260da29e1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java @@ -34,19 +34,19 @@ public class GantryContraption extends TranslatingContraption { @Override public CompoundNBT writeNBT(boolean spawnPacket) { CompoundNBT tag = super.writeNBT(spawnPacket); - tag.putInt("Facing", facing.getIndex()); + tag.putInt("Facing", facing.get3DDataValue()); return tag; } @Override public void readNBT(World world, CompoundNBT tag, boolean spawnData) { - facing = Direction.byIndex(tag.getInt("Facing")); + facing = Direction.from3DDataValue(tag.getInt("Facing")); super.readNBT(world, tag, spawnData); } @Override protected boolean isAnchoringBlockAt(BlockPos pos) { - return super.isAnchoringBlockAt(pos.offset(facing)); + return super.isAnchoringBlockAt(pos.relative(facing)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java index 4066c61b4..c49b3bbe1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java @@ -51,27 +51,27 @@ public class GantryContraptionEntity extends AbstractContraptionEntity { return; double prevAxisMotion = axisMotion; - if (world.isRemote) { + if (level.isClientSide) { clientOffsetDiff *= .75f; updateClientMotion(); } checkPinionShaft(); tickActors(); - Vector3d movementVec = getMotion(); + Vector3d movementVec = getDeltaMovement(); if (ContraptionCollider.collideBlocks(this)) { - if (!world.isRemote) + if (!level.isClientSide) disassemble(); return; } - if (!isStalled() && ticksExisted > 2) + if (!isStalled() && tickCount > 2) move(movementVec.x, movementVec.y, movementVec.z); if (Math.signum(prevAxisMotion) != Math.signum(axisMotion) && prevAxisMotion != 0) - contraption.stop(world); - if (!world.isRemote && (prevAxisMotion != axisMotion || ticksExisted % 3 == 0)) + contraption.stop(level); + if (!level.isClientSide && (prevAxisMotion != axisMotion || tickCount % 3 == 0)) sendPacket(); } @@ -79,11 +79,11 @@ public class GantryContraptionEntity extends AbstractContraptionEntity { Vector3d movementVec; Direction facing = ((GantryContraption) contraption).getFacing(); Vector3d currentPosition = getAnchorVec().add(.5, .5, .5); - BlockPos gantryShaftPos = new BlockPos(currentPosition).offset(facing.getOpposite()); + BlockPos gantryShaftPos = new BlockPos(currentPosition).relative(facing.getOpposite()); - TileEntity te = world.getTileEntity(gantryShaftPos); + TileEntity te = level.getBlockEntity(gantryShaftPos); if (!(te instanceof GantryShaftTileEntity) || !AllBlocks.GANTRY_SHAFT.has(te.getBlockState())) { - if (!world.isRemote) { + if (!level.isClientSide) { setContraptionMotion(Vector3d.ZERO); disassemble(); } @@ -91,35 +91,35 @@ public class GantryContraptionEntity extends AbstractContraptionEntity { } BlockState blockState = te.getBlockState(); - Direction direction = blockState.get(GantryShaftBlock.FACING); + Direction direction = blockState.getValue(GantryShaftBlock.FACING); GantryShaftTileEntity gantryShaftTileEntity = (GantryShaftTileEntity) te; float pinionMovementSpeed = gantryShaftTileEntity.getPinionMovementSpeed(); - movementVec = Vector3d.of(direction.getDirectionVec()).scale(pinionMovementSpeed); + movementVec = Vector3d.atLowerCornerOf(direction.getNormal()).scale(pinionMovementSpeed); - if (blockState.get(GantryShaftBlock.POWERED) || pinionMovementSpeed == 0) { + if (blockState.getValue(GantryShaftBlock.POWERED) || pinionMovementSpeed == 0) { setContraptionMotion(Vector3d.ZERO); - if (!world.isRemote) + if (!level.isClientSide) disassemble(); return; } Vector3d nextPosition = currentPosition.add(movementVec); double currentCoord = direction.getAxis() - .getCoordinate(currentPosition.x, currentPosition.y, currentPosition.z); + .choose(currentPosition.x, currentPosition.y, currentPosition.z); double nextCoord = direction.getAxis() - .getCoordinate(nextPosition.x, nextPosition.y, nextPosition.z); + .choose(nextPosition.x, nextPosition.y, nextPosition.z); if ((MathHelper.floor(currentCoord) + .5f < nextCoord != (pinionMovementSpeed * direction.getAxisDirection() - .getOffset() < 0))) + .getStep() < 0))) if (!gantryShaftTileEntity.canAssembleOn()) { setContraptionMotion(Vector3d.ZERO); - if (!world.isRemote) + if (!level.isClientSide) disassemble(); return; } - if (world.isRemote) + if (level.isClientSide) return; axisMotion = pinionMovementSpeed; @@ -158,15 +158,15 @@ public class GantryContraptionEntity extends AbstractContraptionEntity { } @Override - public void setPositionAndUpdate(double p_70634_1_, double p_70634_3_, double p_70634_5_) {} + public void teleportTo(double p_70634_1_, double p_70634_3_, double p_70634_5_) {} @Override @OnlyIn(Dist.CLIENT) - public void setPositionAndRotationDirect(double x, double y, double z, float yw, float pt, int inc, boolean t) {} + public void lerpTo(double x, double y, double z, float yw, float pt, int inc, boolean t) {} @Override protected void handleStallInformation(float x, float y, float z, float angle) { - setPos(x, y, z); + setPosRaw(x, y, z); clientOffsetDiff = 0; } @@ -180,25 +180,25 @@ public class GantryContraptionEntity extends AbstractContraptionEntity { public void updateClientMotion() { float modifier = movementAxis.getAxisDirection() - .getOffset(); - setContraptionMotion(Vector3d.of(movementAxis.getDirectionVec()) + .getStep(); + setContraptionMotion(Vector3d.atLowerCornerOf(movementAxis.getNormal()) .scale((axisMotion + clientOffsetDiff * modifier / 2f) * ServerSpeedProvider.get())); } public double getAxisCoord() { Vector3d anchorVec = getAnchorVec(); return movementAxis.getAxis() - .getCoordinate(anchorVec.x, anchorVec.y, anchorVec.z); + .choose(anchorVec.x, anchorVec.y, anchorVec.z); } public void sendPacket() { AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), - new GantryContraptionUpdatePacket(getEntityId(), getAxisCoord(), axisMotion)); + new GantryContraptionUpdatePacket(getId(), getAxisCoord(), axisMotion)); } @OnlyIn(Dist.CLIENT) public static void handlePacket(GantryContraptionUpdatePacket packet) { - Entity entity = Minecraft.getInstance().world.getEntityByID(packet.entityID); + Entity entity = Minecraft.getInstance().level.getEntity(packet.entityID); if (!(entity instanceof GantryContraptionEntity)) return; GantryContraptionEntity ce = (GantryContraptionEntity) entity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueEffectPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueEffectPacket.java index a70a8d1c7..8811e0208 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueEffectPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueEffectPacket.java @@ -27,13 +27,13 @@ public class GlueEffectPacket extends SimplePacketBase { public GlueEffectPacket(PacketBuffer buffer) { pos = buffer.readBlockPos(); - direction = Direction.byIndex(buffer.readByte()); + direction = Direction.from3DDataValue(buffer.readByte()); fullBlock = buffer.readBoolean(); } public void write(PacketBuffer buffer) { buffer.writeBlockPos(pos); - buffer.writeByte(direction.getIndex()); + buffer.writeByte(direction.get3DDataValue()); buffer.writeBoolean(fullBlock); } @@ -41,9 +41,9 @@ public class GlueEffectPacket extends SimplePacketBase { public void handle(Supplier context) { context.get().enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { Minecraft mc = Minecraft.getInstance(); - if (!mc.player.getBlockPos().withinDistance(pos, 100)) + if (!mc.player.blockPosition().closerThan(pos, 100)) return; - SuperGlueItem.spawnParticles(mc.world, pos, direction, fullBlock); + SuperGlueItem.spawnParticles(mc.level, pos, direction, fullBlock); })); context.get().setPacketHandled(true); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueInstance.java index cc171a904..b8f333dc6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueInstance.java @@ -1,16 +1,22 @@ package com.simibubi.create.content.contraptions.components.structureMovement.glue; +import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.backend.instancing.ITickableInstance; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance; +import com.jozufozu.flywheel.backend.material.MaterialGroup; import com.jozufozu.flywheel.backend.model.BufferedModel; +import com.jozufozu.flywheel.backend.model.ElementBuffer; import com.jozufozu.flywheel.backend.model.IndexedModel; +import com.jozufozu.flywheel.backend.state.TextureRenderState; import com.jozufozu.flywheel.core.Formats; import com.jozufozu.flywheel.core.Materials; +import com.jozufozu.flywheel.core.QuadConverter; import com.jozufozu.flywheel.core.instancing.ConditionalInstance; import com.jozufozu.flywheel.core.materials.OrientedData; +import com.jozufozu.flywheel.core.model.IModel; import com.simibubi.create.AllItems; import com.simibubi.create.AllStitchedTextures; import com.simibubi.create.Create; @@ -29,6 +35,7 @@ import net.minecraft.world.LightType; public class GlueInstance extends EntityInstance implements ITickableInstance { + private static final boolean USE_ATLAS = false; private static final ResourceLocation TEXTURE = new ResourceLocation(Create.ID, "textures/entity/super_glue/slime.png"); private final Quaternion rotation; @@ -37,8 +44,7 @@ public class GlueInstance extends EntityInstance implements ITi public GlueInstance(MaterialManager materialManager, SuperGlueEntity entity) { super(materialManager, entity); - Instancer instancer = materialManager.getMaterial(Materials.ORIENTED) - .get(entity.getType(), GlueInstance::supplyModel); + Instancer instancer = getInstancer(materialManager, entity); Direction face = entity.getFacingDirection(); rotation = new Quaternion(AngleHelper.verticalAngle(face), AngleHelper.horizontalAngleNew(face), 0, true); @@ -49,6 +55,12 @@ public class GlueInstance extends EntityInstance implements ITi .update(); } + private Instancer getInstancer(MaterialManager materialManager, SuperGlueEntity entity) { + MaterialGroup group = USE_ATLAS ? materialManager.defaultSolid() : materialManager.solid(TextureRenderState.get(TEXTURE)); + + return group.material(Materials.ORIENTED).model(entity.getType(), GlueModel::new); + } + @Override public void tick() { model.update(); @@ -75,62 +87,88 @@ public class GlueInstance extends EntityInstance implements ITi private void updateLight(OrientedData model) { BlockPos pos = entity.getHangingPosition(); - model.setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(world.getLightLevel(LightType.SKY, pos)); + model.setBlockLight(world.getBrightness(LightType.BLOCK, pos)) + .setSkyLight(world.getBrightness(LightType.SKY, pos)); } private boolean shouldShow() { PlayerEntity player = Minecraft.getInstance().player; return entity.isVisible() - || AllItems.SUPER_GLUE.isIn(player.getHeldItemMainhand()) - || AllItems.SUPER_GLUE.isIn(player.getHeldItemOffhand()); + || AllItems.SUPER_GLUE.isIn(player.getMainHandItem()) + || AllItems.SUPER_GLUE.isIn(player.getOffhandItem()); } - public static BufferedModel supplyModel() { - Vector3d diff = Vector3d.of(Direction.SOUTH.getDirectionVec()); - Vector3d extension = diff.normalize() - .scale(1 / 32f - 1 / 128f); + public static class GlueModel implements IModel { + @Override + public void buffer(VecBuffer buffer) { + Vector3d diff = Vector3d.atLowerCornerOf(Direction.SOUTH.getNormal()); + Vector3d extension = diff.normalize() + .scale(1 / 32f - 1 / 128f); - Vector3d plane = VecHelper.axisAlingedPlaneOf(diff); - Direction.Axis axis = Direction.getFacingFromVector(diff.x, diff.y, diff.z) - .getAxis(); + Vector3d plane = VecHelper.axisAlingedPlaneOf(diff); + Direction.Axis axis = Direction.getNearest(diff.x, diff.y, diff.z) + .getAxis(); - Vector3d start = Vector3d.ZERO.subtract(extension); - Vector3d end = Vector3d.ZERO.add(extension); + Vector3d start = Vector3d.ZERO.subtract(extension); + Vector3d end = Vector3d.ZERO.add(extension); - plane = plane.scale(1 / 2f); - Vector3d a1 = plane.add(start); - Vector3d b1 = plane.add(end); - plane = VecHelper.rotate(plane, -90, axis); - Vector3d a2 = plane.add(start); - Vector3d b2 = plane.add(end); - plane = VecHelper.rotate(plane, -90, axis); - Vector3d a3 = plane.add(start); - Vector3d b3 = plane.add(end); - plane = VecHelper.rotate(plane, -90, axis); - Vector3d a4 = plane.add(start); - Vector3d b4 = plane.add(end); + plane = plane.scale(1 / 2f); + Vector3d a1 = plane.add(start); + Vector3d b1 = plane.add(end); + plane = VecHelper.rotate(plane, -90, axis); + Vector3d a2 = plane.add(start); + Vector3d b2 = plane.add(end); + plane = VecHelper.rotate(plane, -90, axis); + Vector3d a3 = plane.add(start); + Vector3d b3 = plane.add(end); + plane = VecHelper.rotate(plane, -90, axis); + Vector3d a4 = plane.add(start); + Vector3d b4 = plane.add(end); - VecBuffer buffer = VecBuffer.allocate(Formats.UNLIT_MODEL.getStride() * 8); + float minU; + float maxU; + float minV; + float maxV; - TextureAtlasSprite sprite = AllStitchedTextures.SUPER_GLUE.getSprite(); + if (USE_ATLAS) { + TextureAtlasSprite sprite = AllStitchedTextures.SUPER_GLUE.getSprite(); + minU = sprite.getU0(); + maxU = sprite.getU1(); + minV = sprite.getV0(); + maxV = sprite.getV1(); + } else { + minU = minV = 0; + maxU = maxV = 1; + } - // pos normal uv - // inside quad - buffer.putVec3((float) a1.x, (float) a1.y, (float) a1.z).putVec3((byte) 0, (byte) 0, (byte) -127).putVec2(sprite.getMaxU(), sprite.getMinV()); - buffer.putVec3((float) a2.x, (float) a2.y, (float) a2.z).putVec3((byte) 0, (byte) 0, (byte) -127).putVec2(sprite.getMaxU(), sprite.getMaxV()); - buffer.putVec3((float) a3.x, (float) a3.y, (float) a3.z).putVec3((byte) 0, (byte) 0, (byte) -127).putVec2(sprite.getMinU(), sprite.getMaxV()); - buffer.putVec3((float) a4.x, (float) a4.y, (float) a4.z).putVec3((byte) 0, (byte) 0, (byte) -127).putVec2(sprite.getMinU(), sprite.getMinV()); - // outside quad - buffer.putVec3((float) b4.x, (float) b4.y, (float) b4.z).putVec3((byte) 0, (byte) 0, (byte) 127).putVec2(sprite.getMinU(), sprite.getMinV()); - buffer.putVec3((float) b3.x, (float) b3.y, (float) b3.z).putVec3((byte) 0, (byte) 0, (byte) 127).putVec2(sprite.getMinU(), sprite.getMaxV()); - buffer.putVec3((float) b2.x, (float) b2.y, (float) b2.z).putVec3((byte) 0, (byte) 0, (byte) 127).putVec2(sprite.getMaxU(), sprite.getMaxV()); - buffer.putVec3((float) b1.x, (float) b1.y, (float) b1.z).putVec3((byte) 0, (byte) 0, (byte) 127).putVec2(sprite.getMaxU(), sprite.getMinV()); + // pos normal uv + // inside quad + buffer.putVec3((float) a1.x, (float) a1.y, (float) a1.z).putVec3((byte) 0, (byte) 0, (byte) -127).putVec2(maxU, minV); + buffer.putVec3((float) a2.x, (float) a2.y, (float) a2.z).putVec3((byte) 0, (byte) 0, (byte) -127).putVec2(maxU, maxV); + buffer.putVec3((float) a3.x, (float) a3.y, (float) a3.z).putVec3((byte) 0, (byte) 0, (byte) -127).putVec2(minU, maxV); + buffer.putVec3((float) a4.x, (float) a4.y, (float) a4.z).putVec3((byte) 0, (byte) 0, (byte) -127).putVec2(minU, minV); + // outside quad + buffer.putVec3((float) b4.x, (float) b4.y, (float) b4.z).putVec3((byte) 0, (byte) 0, (byte) 127).putVec2(minU, minV); + buffer.putVec3((float) b3.x, (float) b3.y, (float) b3.z).putVec3((byte) 0, (byte) 0, (byte) 127).putVec2(minU, maxV); + buffer.putVec3((float) b2.x, (float) b2.y, (float) b2.z).putVec3((byte) 0, (byte) 0, (byte) 127).putVec2(maxU, maxV); + buffer.putVec3((float) b1.x, (float) b1.y, (float) b1.z).putVec3((byte) 0, (byte) 0, (byte) 127).putVec2(maxU, minV); + } - buffer.rewind(); + @Override + public int vertexCount() { + return 8; + } + @Override + public VertexFormat format() { + return Formats.UNLIT_MODEL; + } - return IndexedModel.fromSequentialQuads(Formats.UNLIT_MODEL, buffer.unwrap(), 8); + @Override + public ElementBuffer createEBO() { + return QuadConverter.getInstance() + .quads2Tris(2); + } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index 54ec8d2a3..c6e6ff037 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -30,6 +30,7 @@ import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; import net.minecraft.entity.EntitySize; import net.minecraft.entity.EntityType; +import net.minecraft.entity.MobEntity; import net.minecraft.entity.MoverType; import net.minecraft.entity.Pose; import net.minecraft.entity.effect.LightningBoltEntity; @@ -55,6 +56,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult.Type; import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.GameRules; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.api.distmarker.Dist; @@ -83,7 +85,7 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat } @Override - protected void registerData() {} + protected void defineSynchedData() {} public int getWidthPixels() { return 12; @@ -94,7 +96,7 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat } public void onBroken(@Nullable Entity breaker) { - playSound(SoundEvents.ENTITY_SLIME_SQUISH_SMALL, 1.0F, 1.0F); + playSound(SoundEvents.SLIME_SQUISH_SMALL, 1.0F, 1.0F); if (onValidSurface()) { AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), new GlueEffectPacket(getHangingPosition(), getFacingDirection().getOpposite(), false)); @@ -110,26 +112,26 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat Validate.notNull(getFacingDirection()); if (getFacingDirection().getAxis() .isHorizontal()) { - this.rotationPitch = 0.0F; - this.rotationYaw = getFacingDirection().getHorizontalIndex() * 90; + this.xRot = 0.0F; + this.yRot = getFacingDirection().get2DDataValue() * 90; } else { - this.rotationPitch = -90 * getFacingDirection().getAxisDirection() - .getOffset(); - this.rotationYaw = 0.0F; + this.xRot = -90 * getFacingDirection().getAxisDirection() + .getStep(); + this.yRot = 0.0F; } - this.prevRotationPitch = this.rotationPitch; - this.prevRotationYaw = this.rotationYaw; + this.xRotO = this.xRot; + this.yRotO = this.yRot; this.updateBoundingBox(); } protected void updateBoundingBox() { if (this.getFacingDirection() != null) { double offset = 0.5 - 1 / 256d; - double x = hangingPosition.getX() + 0.5 - facingDirection.getXOffset() * offset; - double y = hangingPosition.getY() + 0.5 - facingDirection.getYOffset() * offset; - double z = hangingPosition.getZ() + 0.5 - facingDirection.getZOffset() * offset; - this.setPos(x, y, z); + double x = hangingPosition.getX() + 0.5 - facingDirection.getStepX() * offset; + double y = hangingPosition.getY() + 0.5 - facingDirection.getStepY() * offset; + double z = hangingPosition.getZ() + 0.5 - facingDirection.getStepZ() * offset; + this.setPosRaw(x, y, z); double w = getWidthPixels(); double h = getHeightPixels(); double l = getWidthPixels(); @@ -157,7 +159,7 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat @Override public void tick() { - if (this.validationTimer++ == 10 && !this.world.isRemote) { + if (this.validationTimer++ == 10 && !this.level.isClientSide) { this.validationTimer = 0; if (isAlive() && !this.onValidSurface()) { remove(); @@ -170,29 +172,29 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat public boolean isVisible() { if (!isAlive()) return false; - if (world instanceof WrappedWorld) + if (level instanceof WrappedWorld) return true; BlockPos pos = hangingPosition; - BlockPos pos2 = pos.offset(getFacingDirection().getOpposite()); - return isValidFace(world, pos2, getFacingDirection()) != isValidFace(world, pos, + BlockPos pos2 = pos.relative(getFacingDirection().getOpposite()); + return isValidFace(level, pos2, getFacingDirection()) != isValidFace(level, pos, getFacingDirection().getOpposite()); } public boolean onValidSurface() { BlockPos pos = hangingPosition; - BlockPos pos2 = hangingPosition.offset(getFacingDirection().getOpposite()); + BlockPos pos2 = hangingPosition.relative(getFacingDirection().getOpposite()); if (pos2.getY() >= 256) return false; - if (!world.isAreaLoaded(pos, 0) || !world.isAreaLoaded(pos2, 0)) + if (!level.isAreaLoaded(pos, 0) || !level.isAreaLoaded(pos2, 0)) return true; - if (!isValidFace(world, pos2, getFacingDirection()) - && !isValidFace(world, pos, getFacingDirection().getOpposite())) + if (!isValidFace(level, pos2, getFacingDirection()) + && !isValidFace(level, pos, getFacingDirection().getOpposite())) return false; - if (isSideSticky(world, pos2, getFacingDirection()) - || isSideSticky(world, pos, getFacingDirection().getOpposite())) + if (isSideSticky(level, pos2, getFacingDirection()) + || isSideSticky(level, pos, getFacingDirection().getOpposite())) return false; - return world.getEntitiesInAABBexcluding(this, getBoundingBox(), e -> e instanceof SuperGlueEntity) + return level.getEntities(this, getBoundingBox(), e -> e instanceof SuperGlueEntity) .isEmpty(); } @@ -210,10 +212,10 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat public static boolean isSideSticky(World world, BlockPos pos, Direction direction) { BlockState state = world.getBlockState(pos); if (AllBlocks.STICKY_MECHANICAL_PISTON.has(state)) - return state.get(DirectionalKineticBlock.FACING) == direction; + return state.getValue(DirectionalKineticBlock.FACING) == direction; if (AllBlocks.STICKER.has(state)) - return state.get(DirectionalBlock.FACING) == direction; + return state.getValue(DirectionalBlock.FACING) == direction; if (state.getBlock() == Blocks.SLIME_BLOCK) return true; @@ -224,53 +226,59 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat return Direction.UP == direction; if (AllBlocks.GANTRY_CARRIAGE.has(state)) - return state.get(DirectionalKineticBlock.FACING) == direction; + return state.getValue(DirectionalKineticBlock.FACING) == direction; if (state.getBlock() instanceof BearingBlock) { - return state.get(DirectionalKineticBlock.FACING) == direction; + return state.getValue(DirectionalKineticBlock.FACING) == direction; } if (state.getBlock() instanceof AbstractChassisBlock) { BooleanProperty glueableSide = ((AbstractChassisBlock) state.getBlock()).getGlueableSide(state, direction); if (glueableSide == null) return false; - return state.get(glueableSide); + return state.getValue(glueableSide); } return false; } @Override - public boolean canBeCollidedWith() { + public boolean isPickable() { return true; } @Override - public boolean hitByEntity(Entity entity) { + public boolean skipAttackInteraction(Entity entity) { return entity instanceof PlayerEntity - ? attackEntityFrom(DamageSource.causePlayerDamage((PlayerEntity) entity), 0) + ? hurt(DamageSource.playerAttack((PlayerEntity) entity), 0) : false; } @Override - public Direction getHorizontalFacing() { + public Direction getDirection() { return this.getFacingDirection(); } @Override - public boolean attackEntityFrom(DamageSource source, float amount) { + public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) return false; - Entity immediateSource = source.getImmediateSource(); + + boolean mobGriefing = level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); + Entity trueSource = source.getEntity(); + if (!mobGriefing && trueSource instanceof MobEntity) + return false; + + Entity immediateSource = source.getDirectEntity(); if (!isVisible() && immediateSource instanceof PlayerEntity) { - if (!AllItems.SUPER_GLUE.isIn(((PlayerEntity) immediateSource).getHeldItemMainhand())) + if (!AllItems.SUPER_GLUE.isIn(((PlayerEntity) immediateSource).getMainHandItem())) return true; } - if (isAlive() && !world.isRemote) { + if (isAlive() && !level.isClientSide) { remove(); - markVelocityChanged(); - onBroken(source.getTrueSource()); + markHurt(); + onBroken(source.getEntity()); } return true; @@ -278,15 +286,15 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat @Override public void move(MoverType typeIn, Vector3d pos) { - if (!world.isRemote && isAlive() && pos.lengthSquared() > 0.0D) { + if (!level.isClientSide && isAlive() && pos.lengthSqr() > 0.0D) { remove(); onBroken(null); } } @Override - public void addVelocity(double x, double y, double z) { - if (!world.isRemote && isAlive() && x * x + y * y + z * z > 0.0D) { + public void push(double x, double y, double z) { + if (!level.isClientSide && isAlive() && x * x + y * y + z * z > 0.0D) { remove(); onBroken(null); } @@ -303,12 +311,12 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat } @Override - public void applyEntityCollision(Entity entityIn) { - super.applyEntityCollision(entityIn); + public void push(Entity entityIn) { + super.push(entityIn); } @Override - public ActionResultType processInitialInteract(PlayerEntity player, Hand hand) { + public ActionResultType interact(PlayerEntity player, Hand hand) { if (player instanceof FakePlayer) return ActionResultType.PASS; DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { @@ -321,43 +329,43 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat private void triggerPlaceBlock(PlayerEntity player, Hand hand) { if (!(player instanceof ClientPlayerEntity)) return; - if (!(player.world instanceof ClientWorld)) + if (!(player.level instanceof ClientWorld)) return; ClientPlayerEntity cPlayer = (ClientPlayerEntity) player; Minecraft mc = Minecraft.getInstance(); RayTraceResult ray = - cPlayer.pick(mc.playerController.getBlockReachDistance(), AnimationTickHolder.getPartialTicks(), false); + cPlayer.pick(mc.gameMode.getPickRange(), AnimationTickHolder.getPartialTicks(), false); if (!(ray instanceof BlockRayTraceResult)) return; if (ray.getType() == Type.MISS) return; BlockRayTraceResult blockRay = (BlockRayTraceResult) ray; - BlockFace rayFace = new BlockFace(blockRay.getPos(), blockRay.getFace()); + BlockFace rayFace = new BlockFace(blockRay.getBlockPos(), blockRay.getDirection()); BlockFace hangingFace = new BlockFace(getHangingPosition(), getFacingDirection().getOpposite()); if (!rayFace.isEquivalent(hangingFace)) return; for (Hand handIn : Hand.values()) { - ItemStack itemstack = cPlayer.getHeldItem(handIn); + ItemStack itemstack = cPlayer.getItemInHand(handIn); int countBefore = itemstack.getCount(); ActionResultType actionResultType = - mc.playerController.func_217292_a(cPlayer, (ClientWorld) cPlayer.world, handIn, blockRay); + mc.gameMode.useItemOn(cPlayer, (ClientWorld) cPlayer.level, handIn, blockRay); if (actionResultType != ActionResultType.SUCCESS) return; - cPlayer.swingArm(handIn); - if (!itemstack.isEmpty() && (itemstack.getCount() != countBefore || mc.playerController.isInCreativeMode())) - mc.gameRenderer.itemRenderer.resetEquippedProgress(handIn); + cPlayer.swing(handIn); + if (!itemstack.isEmpty() && (itemstack.getCount() != countBefore || mc.gameMode.hasInfiniteItems())) + mc.gameRenderer.itemInHandRenderer.itemUsed(handIn); return; } } @Override - public void writeAdditional(CompoundNBT compound) { + public void addAdditionalSaveData(CompoundNBT compound) { compound.putByte("Facing", (byte) this.getFacingDirection() - .getIndex()); + .get3DDataValue()); BlockPos blockpos = this.getHangingPosition(); compound.putInt("TileX", blockpos.getX()); compound.putInt("TileY", blockpos.getY()); @@ -365,40 +373,40 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat } @Override - public void readAdditional(CompoundNBT compound) { + public void readAdditionalSaveData(CompoundNBT compound) { this.hangingPosition = new BlockPos(compound.getInt("TileX"), compound.getInt("TileY"), compound.getInt("TileZ")); - this.facingDirection = Direction.byIndex(compound.getByte("Facing")); + this.facingDirection = Direction.from3DDataValue(compound.getByte("Facing")); updateFacingWithBoundingBox(); } @Override - public ItemEntity entityDropItem(ItemStack stack, float yOffset) { + public ItemEntity spawnAtLocation(ItemStack stack, float yOffset) { float xOffset = (float) this.getFacingDirection() - .getXOffset() * 0.15F; + .getStepX() * 0.15F; float zOffset = (float) this.getFacingDirection() - .getZOffset() * 0.15F; + .getStepZ() * 0.15F; ItemEntity itementity = - new ItemEntity(this.world, this.getX() + xOffset, this.getY() + yOffset, this.getZ() + zOffset, stack); - itementity.setDefaultPickupDelay(); - this.world.addEntity(itementity); + new ItemEntity(this.level, this.getX() + xOffset, this.getY() + yOffset, this.getZ() + zOffset, stack); + itementity.setDefaultPickUpDelay(); + this.level.addFreshEntity(itementity); return itementity; } @Override - protected boolean shouldSetPosAfterLoading() { + protected boolean repositionEntityAfterLoad() { return false; } @Override - public void setPosition(double x, double y, double z) { + public void setPos(double x, double y, double z) { hangingPosition = new BlockPos(x, y, z); updateBoundingBox(); - isAirBorne = true; + hasImpulse = true; } @Override - public float getRotatedYaw(Rotation transformRotation) { + public float rotate(Rotation transformRotation) { if (this.getFacingDirection() .getAxis() != Direction.Axis.Y) { switch (transformRotation) { @@ -406,16 +414,16 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat facingDirection = facingDirection.getOpposite(); break; case COUNTERCLOCKWISE_90: - facingDirection = facingDirection.rotateYCCW(); + facingDirection = facingDirection.getCounterClockWise(); break; case CLOCKWISE_90: - facingDirection = facingDirection.rotateY(); + facingDirection = facingDirection.getClockWise(); default: break; } } - float f = MathHelper.wrapDegrees(this.rotationYaw); + float f = MathHelper.wrapDegrees(this.yRot); switch (transformRotation) { case CLOCKWISE_180: return f + 180.0F; @@ -433,8 +441,8 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat } @Override - public float getMirroredYaw(Mirror transformMirror) { - return this.getRotatedYaw(transformMirror.toRotation(this.getFacingDirection())); + public float mirror(Mirror transformMirror) { + return this.rotate(transformMirror.getRotation(this.getFacingDirection())); } public Direction getAttachedDirection(BlockPos pos) { @@ -442,10 +450,10 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat } @Override - public void onStruckByLightning(ServerWorld world, LightningBoltEntity lightningBolt) {} + public void thunderHit(ServerWorld world, LightningBoltEntity lightningBolt) {} @Override - public void recalculateSize() {} + public void refreshDimensions() {} public static EntityType.Builder build(EntityType.Builder builder) { @SuppressWarnings("unchecked") @@ -454,20 +462,20 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat } @Override - public IPacket createSpawnPacket() { + public IPacket getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } @Override public void writeSpawnData(PacketBuffer buffer) { CompoundNBT compound = new CompoundNBT(); - writeAdditional(compound); - buffer.writeCompoundTag(compound); + addAdditionalSaveData(compound); + buffer.writeNbt(compound); } @Override public void readSpawnData(PacketBuffer additionalData) { - readAdditional(additionalData.readCompoundTag()); + readAdditionalSaveData(additionalData.readNbt()); } public Direction getFacingDirection() { @@ -480,12 +488,12 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat } @Override - public boolean doesEntityNotTriggerPressurePlate() { + public boolean isIgnoringBlockTriggers() { return true; } @Override public World getWorld() { - return world; + return level; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java index 89830765c..f1778657f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java @@ -35,7 +35,7 @@ import net.minecraftforge.fml.network.PacketDistributor; public class SuperGlueHandler { public static Map gatherGlue(IWorld world, BlockPos pos) { - List entities = world.getEntitiesWithinAABB(SuperGlueEntity.class, new AxisAlignedBB(pos)); + List entities = world.getEntitiesOfClass(SuperGlueEntity.class, new AxisAlignedBB(pos)); Map map = new HashMap<>(); for (SuperGlueEntity entity : entities) map.put(entity.getAttachedDirection(pos), entity); @@ -50,7 +50,7 @@ public class SuperGlueHandler { if (entity == null || world == null || pos == null) return; - if (world.isRemote()) + if (world.isClientSide()) return; Map gatheredGlue = gatherGlue(world, pos); @@ -63,50 +63,50 @@ public class SuperGlueHandler { } public static void glueInOffHandAppliesOnBlockPlace(EntityPlaceEvent event, BlockPos pos, PlayerEntity placer) { - ItemStack itemstack = placer.getHeldItemOffhand(); + ItemStack itemstack = placer.getOffhandItem(); ModifiableAttributeInstance reachAttribute = placer.getAttribute(ForgeMod.REACH_DISTANCE.get()); if (!AllItems.SUPER_GLUE.isIn(itemstack) || reachAttribute == null) return; - if (AllItems.WRENCH.isIn(placer.getHeldItemMainhand())) + if (AllItems.WRENCH.isIn(placer.getMainHandItem())) return; if (event.getPlacedAgainst() == IPlacementHelper.ID) return; double distance = reachAttribute.getValue(); Vector3d start = placer.getEyePosition(1); - Vector3d look = placer.getLook(1); + Vector3d look = placer.getViewVector(1); Vector3d end = start.add(look.x * distance, look.y * distance, look.z * distance); - World world = placer.world; + World world = placer.level; RayTraceWorld rayTraceWorld = - new RayTraceWorld(world, (p, state) -> p.equals(pos) ? Blocks.AIR.getDefaultState() : state); - BlockRayTraceResult ray = rayTraceWorld.rayTraceBlocks( + new RayTraceWorld(world, (p, state) -> p.equals(pos) ? Blocks.AIR.defaultBlockState() : state); + BlockRayTraceResult ray = rayTraceWorld.clip( new RayTraceContext(start, end, RayTraceContext.BlockMode.OUTLINE, RayTraceContext.FluidMode.NONE, placer)); - Direction face = ray.getFace(); + Direction face = ray.getDirection(); if (face == null || ray.getType() == Type.MISS) return; - if (!ray.getPos() - .offset(face) + if (!ray.getBlockPos() + .relative(face) .equals(pos)) { event.setCanceled(true); return; } - SuperGlueEntity entity = new SuperGlueEntity(world, ray.getPos(), face.getOpposite()); + SuperGlueEntity entity = new SuperGlueEntity(world, ray.getBlockPos(), face.getOpposite()); CompoundNBT compoundnbt = itemstack.getTag(); if (compoundnbt != null) - EntityType.applyItemNBT(world, placer, entity, compoundnbt); + EntityType.updateCustomEntityTag(world, placer, entity, compoundnbt); if (entity.onValidSurface()) { - if (!world.isRemote) { + if (!world.isClientSide) { entity.playPlaceSound(); - world.addEntity(entity); + world.addFreshEntity(entity); AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> entity), - new GlueEffectPacket(ray.getPos(), face, true)); + new GlueEffectPacket(ray.getBlockPos(), face, true)); } - itemstack.damageItem(1, placer, SuperGlueItem::onBroken); + itemstack.hurtAndBreak(1, placer, SuperGlueItem::onBroken); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java index 98863bfaa..99811ca53 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java @@ -27,7 +27,7 @@ public class SuperGlueItem extends Item { } @Override - public boolean isDamageable() { + public boolean canBeDepleted() { return true; } @@ -42,30 +42,30 @@ public class SuperGlueItem extends Item { } @Override - public ActionResultType onItemUse(ItemUseContext context) { - BlockPos blockpos = context.getPos(); - Direction direction = context.getFace(); - BlockPos blockpos1 = blockpos.offset(direction); + public ActionResultType useOn(ItemUseContext context) { + BlockPos blockpos = context.getClickedPos(); + Direction direction = context.getClickedFace(); + BlockPos blockpos1 = blockpos.relative(direction); PlayerEntity playerentity = context.getPlayer(); - ItemStack itemstack = context.getItem(); + ItemStack itemstack = context.getItemInHand(); if (playerentity == null || !this.canPlace(playerentity, direction, itemstack, blockpos1)) return ActionResultType.FAIL; - World world = context.getWorld(); + World world = context.getLevel(); SuperGlueEntity entity = new SuperGlueEntity(world, blockpos1, direction); CompoundNBT compoundnbt = itemstack.getTag(); if (compoundnbt != null) - EntityType.applyItemNBT(world, playerentity, entity, compoundnbt); + EntityType.updateCustomEntityTag(world, playerentity, entity, compoundnbt); if (!entity.onValidSurface()) return ActionResultType.FAIL; - if (!world.isRemote) { + if (!world.isClientSide) { entity.playPlaceSound(); - world.addEntity(entity); + world.addFreshEntity(entity); } - itemstack.damageItem(1, playerentity, SuperGlueItem::onBroken); + itemstack.hurtAndBreak(1, playerentity, SuperGlueItem::onBroken); return ActionResultType.SUCCESS; } @@ -75,22 +75,22 @@ public class SuperGlueItem extends Item { } protected boolean canPlace(PlayerEntity entity, Direction facing, ItemStack stack, BlockPos pos) { - return !World.isOutsideBuildHeight(pos) && entity.canPlayerEdit(pos, facing, stack); + return !World.isOutsideBuildHeight(pos) && entity.mayUseItemAt(pos, facing, stack); } @OnlyIn(Dist.CLIENT) public static void spawnParticles(World world, BlockPos pos, Direction direction, boolean fullBlock) { - Vector3d vec = Vector3d.of(direction.getDirectionVec()); + Vector3d vec = Vector3d.atLowerCornerOf(direction.getNormal()); Vector3d plane = VecHelper.axisAlingedPlaneOf(vec); Vector3d facePos = VecHelper.getCenterOf(pos) .add(vec.scale(.5f)); - float distance = fullBlock ? 1f : .25f + .25f * (world.rand.nextFloat() - .5f); + float distance = fullBlock ? 1f : .25f + .25f * (world.random.nextFloat() - .5f); plane = plane.scale(distance); ItemStack stack = new ItemStack(Items.SLIME_BALL); for (int i = fullBlock ? 40 : 15; i > 0; i--) { - Vector3d offset = VecHelper.rotate(plane, 360 * world.rand.nextFloat(), direction.getAxis()); + Vector3d offset = VecHelper.rotate(plane, 360 * world.random.nextFloat(), direction.getAxis()); Vector3d motion = offset.normalize() .scale(1 / 16f); if (fullBlock) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueRenderer.java index 34bfa5f3b..10b91afec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueRenderer.java @@ -1,12 +1,12 @@ package com.simibubi.create.content.contraptions.components.structureMovement.glue; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack.Entry; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; @@ -41,7 +41,7 @@ public class SuperGlueRenderer extends EntityRenderer { } @Override - public ResourceLocation getEntityTexture(SuperGlueEntity entity) { + public ResourceLocation getTextureLocation(SuperGlueEntity entity) { return regular; } @@ -50,8 +50,8 @@ public class SuperGlueRenderer extends EntityRenderer { if (super.shouldRender(entity, frustum, x, y, z)) { PlayerEntity player = Minecraft.getInstance().player; boolean visible = entity.isVisible(); - boolean holdingGlue = AllItems.SUPER_GLUE.isIn(player.getHeldItemMainhand()) - || AllItems.SUPER_GLUE.isIn(player.getHeldItemOffhand()); + boolean holdingGlue = AllItems.SUPER_GLUE.isIn(player.getMainHandItem()) + || AllItems.SUPER_GLUE.isIn(player.getOffhandItem()); if (visible || holdingGlue) return true; @@ -64,29 +64,29 @@ public class SuperGlueRenderer extends EntityRenderer { IRenderTypeBuffer buffer, int light) { super.render(entity, yaw, partialTicks, ms, buffer, light); - IVertexBuilder builder = buffer.getBuffer(RenderType.getEntityCutout(getEntityTexture(entity))); + IVertexBuilder builder = buffer.getBuffer(RenderType.entityCutout(getTextureLocation(entity))); light = getBrightnessForRender(entity); Direction face = entity.getFacingDirection(); - ms.push(); - MatrixStacker.of(ms) + ms.pushPose(); + MatrixTransformStack.of(ms) .rotateY(AngleHelper.horizontalAngleNew(face)) .rotateX(AngleHelper.verticalAngle(face)); - Entry peek = ms.peek(); + Entry peek = ms.last(); renderQuad(builder, peek, insideQuad, light, -1); renderQuad(builder, peek, outsideQuad, light, 1); - ms.pop(); + ms.popPose(); } private void initQuads() { - Vector3d diff = Vector3d.of(Direction.SOUTH.getDirectionVec()); + Vector3d diff = Vector3d.atLowerCornerOf(Direction.SOUTH.getNormal()); Vector3d extension = diff.normalize() .scale(1 / 32f - 1 / 128f); Vector3d plane = VecHelper.axisAlingedPlaneOf(diff); - Axis axis = Direction.getFacingFromVector(diff.x, diff.y, diff.z) + Axis axis = Direction.getNearest(diff.x, diff.y, diff.z) .getAxis(); Vector3d start = Vector3d.ZERO.subtract(extension); @@ -121,24 +121,24 @@ public class SuperGlueRenderer extends EntityRenderer { private int getBrightnessForRender(SuperGlueEntity entity) { BlockPos blockpos = entity.getHangingPosition(); - BlockPos blockpos2 = blockpos.offset(entity.getFacingDirection() + BlockPos blockpos2 = blockpos.relative(entity.getFacingDirection() .getOpposite()); - World world = entity.getEntityWorld(); - int light = world.isBlockPresent(blockpos) ? WorldRenderer.getLightmapCoordinates(world, blockpos) : 15; - int light2 = world.isBlockPresent(blockpos2) ? WorldRenderer.getLightmapCoordinates(world, blockpos2) : 15; + World world = entity.getCommandSenderWorld(); + int light = world.isLoaded(blockpos) ? WorldRenderer.getLightColor(world, blockpos) : 15; + int light2 = world.isLoaded(blockpos2) ? WorldRenderer.getLightColor(world, blockpos2) : 15; return Math.max(light, light2); } // Vertex format: pos x, pos y, pos z, u, v private void renderQuad(IVertexBuilder builder, Entry matrix, float[] data, int light, float normalZ) { for (int i = 0; i < 4; i++) { - builder.vertex(matrix.getModel(), data[5 * i], data[5 * i + 1], data[5 * i + 2]) + builder.vertex(matrix.pose(), data[5 * i], data[5 * i + 1], data[5 * i + 2]) .color(255, 255, 255, 255) - .texture(data[5 * i + 3], data[5 * i + 4]) - .overlay(OverlayTexture.DEFAULT_UV) - .light(light) - .normal(matrix.getNormal(), 0.0f, 0.0f, normalZ) + .uv(data[5 * i + 3], data[5 * i + 4]) + .overlayCoords(OverlayTexture.NO_OVERLAY) + .uv2(light) + .normal(matrix.normal(), 0.0f, 0.0f, normalZ) .endVertex(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java index 555d2ef1d..20dd43e65 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java @@ -48,7 +48,7 @@ public enum CartAssembleRailType implements IStringSerializable { } @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java index 73c1d93a2..230c858a2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java @@ -69,36 +69,36 @@ public class CartAssemblerBlock extends AbstractRailBlock public CartAssemblerBlock(Properties properties) { super(true, properties); - setDefaultState(getDefaultState().with(POWERED, false) - .with(BACKWARDS, false) - .with(RAIL_TYPE, CartAssembleRailType.POWERED_RAIL)); + registerDefaultState(defaultBlockState().setValue(POWERED, false) + .setValue(BACKWARDS, false) + .setValue(RAIL_TYPE, CartAssembleRailType.POWERED_RAIL)); } public static BlockState createAnchor(BlockState state) { - Axis axis = state.get(RAIL_SHAPE) == RailShape.NORTH_SOUTH ? Axis.Z : Axis.X; + Axis axis = state.getValue(RAIL_SHAPE) == RailShape.NORTH_SOUTH ? Axis.Z : Axis.X; return AllBlocks.MINECART_ANCHOR.getDefaultState() - .with(BlockStateProperties.HORIZONTAL_AXIS, axis); + .setValue(BlockStateProperties.HORIZONTAL_AXIS, axis); } private static Item getRailItem(BlockState state) { - return state.get(RAIL_TYPE) + return state.getValue(RAIL_TYPE) .getItem(); } public static BlockState getRailBlock(BlockState state) { - AbstractRailBlock railBlock = (AbstractRailBlock) state.get(RAIL_TYPE) + AbstractRailBlock railBlock = (AbstractRailBlock) state.getValue(RAIL_TYPE) .getBlock(); - BlockState railState = railBlock.getDefaultState() - .with(railBlock.getShapeProperty(), state.get(RAIL_SHAPE)); - if (railState.contains(ControllerRailBlock.BACKWARDS)) - railState = railState.with(ControllerRailBlock.BACKWARDS, state.get(BACKWARDS)); + BlockState railState = railBlock.defaultBlockState() + .setValue(railBlock.getShapeProperty(), state.getValue(RAIL_SHAPE)); + if (railState.hasProperty(ControllerRailBlock.BACKWARDS)) + railState = railState.setValue(ControllerRailBlock.BACKWARDS, state.getValue(BACKWARDS)); return railState; } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(RAIL_SHAPE, POWERED, RAIL_TYPE, BACKWARDS); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override @@ -121,7 +121,7 @@ public class CartAssemblerBlock extends AbstractRailBlock AbstractMinecartEntity cart) { if (!canAssembleTo(cart)) return; - if (world.isRemote) + if (world.isClientSide) return; withTileEntityDo(world, pos, te -> te.assembleNextTick(cart)); @@ -140,8 +140,8 @@ public class CartAssemblerBlock extends AbstractRailBlock } public static CartAssemblerAction getActionForCart(BlockState state, AbstractMinecartEntity cart) { - CartAssembleRailType type = state.get(RAIL_TYPE); - boolean powered = state.get(POWERED); + CartAssembleRailType type = state.getValue(RAIL_TYPE); + boolean powered = state.getValue(POWERED); switch (type) { case ACTIVATOR_RAIL: return powered ? CartAssemblerAction.DISASSEMBLE : CartAssemblerAction.PASS; @@ -166,10 +166,10 @@ public class CartAssemblerBlock extends AbstractRailBlock @Override @Nonnull - public ActionResultType onUse(@Nonnull BlockState state, @Nonnull World world, @Nonnull BlockPos pos, + public ActionResultType use(@Nonnull BlockState state, @Nonnull World world, @Nonnull BlockPos pos, PlayerEntity player, @Nonnull Hand hand, @Nonnull BlockRayTraceResult blockRayTraceResult) { - ItemStack itemStack = player.getHeldItem(hand); + ItemStack itemStack = player.getItemInHand(hand); Item previousItem = getRailItem(state); Item heldItem = itemStack.getItem(); if (heldItem != previousItem) { @@ -180,8 +180,8 @@ public class CartAssemblerBlock extends AbstractRailBlock newType = type; if (newType == null) return ActionResultType.PASS; - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, 1, 1); - world.setBlockState(pos, state.with(RAIL_TYPE, newType)); + world.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundCategory.PLAYERS, 1, 1); + world.setBlockAndUpdate(pos, state.setValue(RAIL_TYPE, newType)); if (!player.isCreative()) { itemStack.shrink(1); @@ -196,11 +196,11 @@ public class CartAssemblerBlock extends AbstractRailBlock @Override public void neighborChanged(@Nonnull BlockState state, @Nonnull World worldIn, @Nonnull BlockPos pos, @Nonnull Block blockIn, @Nonnull BlockPos fromPos, boolean isMoving) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; - boolean previouslyPowered = state.get(POWERED); - if (previouslyPowered != worldIn.isBlockPowered(pos)) - worldIn.setBlockState(pos, state.cycle(POWERED), 2); + boolean previouslyPowered = state.getValue(POWERED); + if (previouslyPowered != worldIn.hasNeighborSignal(pos)) + worldIn.setBlock(pos, state.cycle(POWERED), 2); super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving); } @@ -218,7 +218,7 @@ public class CartAssemblerBlock extends AbstractRailBlock } protected Axis getRailAxis(BlockState state) { - return state.get(RAIL_SHAPE) == RailShape.NORTH_SOUTH ? Direction.Axis.Z : Direction.Axis.X; + return state.getValue(RAIL_SHAPE) == RailShape.NORTH_SOUTH ? Direction.Axis.Z : Direction.Axis.X; } @Override @@ -230,12 +230,12 @@ public class CartAssemblerBlock extends AbstractRailBlock return VoxelShapes.empty(); if (entity instanceof PlayerEntity) return AllShapes.CART_ASSEMBLER_PLAYER_COLLISION.get(getRailAxis(state)); - return VoxelShapes.fullCube(); + return VoxelShapes.block(); } @Override @Nonnull - public PushReaction getPushReaction(@Nonnull BlockState state) { + public PushReaction getPistonPushReaction(@Nonnull BlockState state) { return PushReaction.BLOCK; } @@ -245,7 +245,7 @@ public class CartAssemblerBlock extends AbstractRailBlock } @Override - public boolean isValidPosition(@Nonnull BlockState state, @Nonnull IWorldReader world, @Nonnull BlockPos pos) { + public boolean canSurvive(@Nonnull BlockState state, @Nonnull IWorldReader world, @Nonnull BlockPos pos) { return false; } @@ -270,26 +270,26 @@ public class CartAssemblerBlock extends AbstractRailBlock @SuppressWarnings("deprecation") public List getDropsNoRail(BlockState state, ServerWorld world, BlockPos pos, @Nullable TileEntity p_220077_3_, @Nullable Entity p_220077_4_, ItemStack p_220077_5_) { - return super.getDrops(state, (new LootContext.Builder(world)).withRandom(world.rand) - .withParameter(LootParameters.ORIGIN, Vector3d.of(pos)) + return super.getDrops(state, (new LootContext.Builder(world)).withRandom(world.random) + .withParameter(LootParameters.ORIGIN, Vector3d.atLowerCornerOf(pos)) .withParameter(LootParameters.TOOL, p_220077_5_) - .withNullableParameter(LootParameters.THIS_ENTITY, p_220077_4_) - .withNullableParameter(LootParameters.BLOCK_ENTITY, p_220077_3_)); + .withOptionalParameter(LootParameters.THIS_ENTITY, p_220077_4_) + .withOptionalParameter(LootParameters.BLOCK_ENTITY, p_220077_3_)); } @Override public ActionResultType onSneakWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - BlockPos pos = context.getPos(); + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); PlayerEntity player = context.getPlayer(); - if (world.isRemote) + if (world.isClientSide) return ActionResultType.SUCCESS; if (player != null && !player.isCreative()) - getDropsNoRail(state, (ServerWorld) world, pos, world.getTileEntity(pos), player, context.getItem()) + getDropsNoRail(state, (ServerWorld) world, pos, world.getBlockEntity(pos), player, context.getItemInHand()) .forEach(itemStack -> player.inventory.placeItemBackInInventory(world, itemStack)); if (world instanceof ServerWorld) - state.spawnAdditionalDrops((ServerWorld) world, pos, ItemStack.EMPTY); - world.setBlockState(pos, getRailBlock(state)); + state.spawnAfterBreak((ServerWorld) world, pos, ItemStack.EMPTY); + world.setBlockAndUpdate(pos, getRailBlock(state)); return ActionResultType.SUCCESS; } @@ -300,9 +300,9 @@ public class CartAssemblerBlock extends AbstractRailBlock } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(BlockStateProperties.HORIZONTAL_AXIS); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override @@ -314,18 +314,18 @@ public class CartAssemblerBlock extends AbstractRailBlock } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - if (world.isRemote) + World world = context.getLevel(); + if (world.isClientSide) return ActionResultType.SUCCESS; - BlockPos pos = context.getPos(); - world.setBlockState(pos, rotate(state, Rotation.CLOCKWISE_90), 3); - world.notifyNeighborsOfStateChange(pos.down(), this); + BlockPos pos = context.getClickedPos(); + world.setBlock(pos, rotate(state, Rotation.CLOCKWISE_90), 3); + world.updateNeighborsAt(pos.below(), this); return ActionResultType.SUCCESS; } @@ -334,11 +334,11 @@ public class CartAssemblerBlock extends AbstractRailBlock if (rotation == Rotation.NONE) return state; BlockState base = AllBlocks.CONTROLLER_RAIL.getDefaultState() - .with(ControllerRailBlock.SHAPE, state.get(RAIL_SHAPE)) - .with(ControllerRailBlock.BACKWARDS, state.get(BACKWARDS)) + .setValue(ControllerRailBlock.SHAPE, state.getValue(RAIL_SHAPE)) + .setValue(ControllerRailBlock.BACKWARDS, state.getValue(BACKWARDS)) .rotate(rotation); - return state.with(RAIL_SHAPE, base.get(ControllerRailBlock.SHAPE)) - .with(BACKWARDS, base.get(ControllerRailBlock.BACKWARDS)); + return state.setValue(RAIL_SHAPE, base.getValue(ControllerRailBlock.SHAPE)) + .setValue(BACKWARDS, base.getValue(ControllerRailBlock.BACKWARDS)); } @Override @@ -346,21 +346,21 @@ public class CartAssemblerBlock extends AbstractRailBlock if (mirror == Mirror.NONE) return state; BlockState base = AllBlocks.CONTROLLER_RAIL.getDefaultState() - .with(ControllerRailBlock.SHAPE, state.get(RAIL_SHAPE)) - .with(ControllerRailBlock.BACKWARDS, state.get(BACKWARDS)) + .setValue(ControllerRailBlock.SHAPE, state.getValue(RAIL_SHAPE)) + .setValue(ControllerRailBlock.BACKWARDS, state.getValue(BACKWARDS)) .mirror(mirror); - return state.with(BACKWARDS, base.get(ControllerRailBlock.BACKWARDS)); + return state.setValue(BACKWARDS, base.getValue(ControllerRailBlock.BACKWARDS)); } public static Direction getHorizontalDirection(BlockState blockState) { if (!(blockState.getBlock() instanceof CartAssemblerBlock)) return Direction.SOUTH; Direction pointingTo = getPointingTowards(blockState); - return blockState.get(BACKWARDS) ? pointingTo.getOpposite() : pointingTo; + return blockState.getValue(BACKWARDS) ? pointingTo.getOpposite() : pointingTo; } private static Direction getPointingTowards(BlockState state) { - switch (state.get(RAIL_SHAPE)) { + switch (state.getValue(RAIL_SHAPE)) { case EAST_WEST: return Direction.WEST; default: diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java index b09d2a59c..e8678801f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java @@ -29,18 +29,18 @@ public class CartAssemblerBlockItem extends BlockItem { @Override @Nonnull - public ActionResultType onItemUse(ItemUseContext context) { + public ActionResultType useOn(ItemUseContext context) { if (tryPlaceAssembler(context)) { - context.getWorld() - .playSound(null, context.getPos(), SoundEvents.BLOCK_STONE_PLACE, SoundCategory.BLOCKS, 1, 1); + context.getLevel() + .playSound(null, context.getClickedPos(), SoundEvents.STONE_PLACE, SoundCategory.BLOCKS, 1, 1); return ActionResultType.SUCCESS; } - return super.onItemUse(context); + return super.useOn(context); } public boolean tryPlaceAssembler(ItemUseContext context) { - BlockPos pos = context.getPos(); - World world = context.getWorld(); + BlockPos pos = context.getClickedPos(); + World world = context.getLevel(); BlockState state = world.getBlockState(pos); Block block = state.getBlock(); PlayerEntity player = context.getPlayer(); @@ -52,33 +52,33 @@ public class CartAssemblerBlockItem extends BlockItem { return false; } - RailShape shape = state.get(((AbstractRailBlock) block).getShapeProperty()); + RailShape shape = state.getValue(((AbstractRailBlock) block).getShapeProperty()); if (shape != RailShape.EAST_WEST && shape != RailShape.NORTH_SOUTH) return false; BlockState newState = AllBlocks.CART_ASSEMBLER.getDefaultState() - .with(CartAssemblerBlock.RAIL_SHAPE, shape); + .setValue(CartAssemblerBlock.RAIL_SHAPE, shape); CartAssembleRailType newType = null; for (CartAssembleRailType type : CartAssembleRailType.values()) if (type.matches(state)) newType = type; if (newType == null) return false; - if (world.isRemote) + if (world.isClientSide) return true; - newState = newState.with(CartAssemblerBlock.RAIL_TYPE, newType); - if (state.contains(ControllerRailBlock.BACKWARDS)) - newState = newState.with(CartAssemblerBlock.BACKWARDS, state.get(ControllerRailBlock.BACKWARDS)); + newState = newState.setValue(CartAssemblerBlock.RAIL_TYPE, newType); + if (state.hasProperty(ControllerRailBlock.BACKWARDS)) + newState = newState.setValue(CartAssemblerBlock.BACKWARDS, state.getValue(ControllerRailBlock.BACKWARDS)); else { - Direction direction = player.getAdjustedHorizontalFacing(); + Direction direction = player.getMotionDirection(); newState = - newState.with(CartAssemblerBlock.BACKWARDS, direction.getAxisDirection() == AxisDirection.POSITIVE); + newState.setValue(CartAssemblerBlock.BACKWARDS, direction.getAxisDirection() == AxisDirection.POSITIVE); } - world.setBlockState(pos, newState); + world.setBlockAndUpdate(pos, newState); if (!player.isCreative()) - context.getItem() + context.getItemInHand() .shrink(1); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java index ea52e21b3..80393ed1e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java @@ -73,43 +73,43 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay return; resetTicksSinceMinecartUpdate(); - BlockState state = world.getBlockState(pos); + BlockState state = level.getBlockState(worldPosition); if (!AllBlocks.CART_ASSEMBLER.has(state)) return; CartAssemblerBlock block = (CartAssemblerBlock) state.getBlock(); CartAssemblerBlock.CartAssemblerAction action = CartAssemblerBlock.getActionForCart(state, cart); if (action.shouldAssemble()) - assemble(world, pos, cart); + assemble(level, worldPosition, cart); if (action.shouldDisassemble()) - disassemble(world, pos, cart); + disassemble(level, worldPosition, cart); if (action == CartAssemblerBlock.CartAssemblerAction.ASSEMBLE_ACCELERATE) { - if (cart.getMotion() + if (cart.getDeltaMovement() .length() > 1 / 128f) { - Direction facing = cart.getAdjustedHorizontalFacing(); - RailShape railShape = state.get(CartAssemblerBlock.RAIL_SHAPE); + Direction facing = cart.getMotionDirection(); + RailShape railShape = state.getValue(CartAssemblerBlock.RAIL_SHAPE); for (Direction d : Iterate.directionsInAxis(railShape == RailShape.EAST_WEST ? Axis.X : Axis.Z)) - if (world.getBlockState(pos.offset(d)) - .isNormalCube(world, pos.offset(d))) + if (level.getBlockState(worldPosition.relative(d)) + .isRedstoneConductor(level, worldPosition.relative(d))) facing = d.getOpposite(); - float speed = block.getRailMaxSpeed(state, world, pos, cart); - cart.setMotion(facing.getXOffset() * speed, facing.getYOffset() * speed, facing.getZOffset() * speed); + float speed = block.getRailMaxSpeed(state, level, worldPosition, cart); + cart.setDeltaMovement(facing.getStepX() * speed, facing.getStepY() * speed, facing.getStepZ() * speed); } } if (action == CartAssemblerBlock.CartAssemblerAction.ASSEMBLE_ACCELERATE_DIRECTIONAL) { Vector3i accelerationVector = ControllerRailBlock.getAccelerationVector(AllBlocks.CONTROLLER_RAIL.getDefaultState() - .with(ControllerRailBlock.SHAPE, state.get(CartAssemblerBlock.RAIL_SHAPE)) - .with(ControllerRailBlock.BACKWARDS, state.get(CartAssemblerBlock.BACKWARDS))); - float speed = block.getRailMaxSpeed(state, world, pos, cart); - cart.setMotion(Vector3d.of(accelerationVector) + .setValue(ControllerRailBlock.SHAPE, state.getValue(CartAssemblerBlock.RAIL_SHAPE)) + .setValue(ControllerRailBlock.BACKWARDS, state.getValue(CartAssemblerBlock.BACKWARDS))); + float speed = block.getRailMaxSpeed(state, level, worldPosition, cart); + cart.setDeltaMovement(Vector3d.atLowerCornerOf(accelerationVector) .scale(speed)); } if (action == CartAssemblerBlock.CartAssemblerAction.DISASSEMBLE_BRAKE) { - Vector3d diff = VecHelper.getCenterOf(pos) - .subtract(cart.getPositionVec()); - cart.setMotion(diff.x / 16f, 0, diff.z / 16f); + Vector3d diff = VecHelper.getCenterOf(worldPosition) + .subtract(cart.position()); + cart.setDeltaMovement(diff.x / 16f, 0, diff.z / 16f); } } @@ -143,9 +143,9 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay Direction initialOrientation = CartAssemblerBlock.getHorizontalDirection(getBlockState()); if (couplingFound) { - cart.setPosition(pos.getX() + .5f, pos.getY(), pos.getZ() + .5f); - if (!CouplingHandler.tryToCoupleCarts(null, world, cart.getEntityId(), - contraption.connectedCart.getEntityId())) + cart.setPos(pos.getX() + .5f, pos.getY(), pos.getZ() + .5f); + if (!CouplingHandler.tryToCoupleCarts(null, world, cart.getId(), + contraption.connectedCart.getId())) return; } @@ -154,16 +154,16 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay contraption.expandBoundsAroundAxis(Axis.Y); if (couplingFound) { - Vector3d diff = contraption.connectedCart.getPositionVec() - .subtract(cart.getPositionVec()); - initialOrientation = Direction.fromAngle(MathHelper.atan2(diff.z, diff.x) * 180 / Math.PI); + Vector3d diff = contraption.connectedCart.position() + .subtract(cart.position()); + initialOrientation = Direction.fromYRot(MathHelper.atan2(diff.z, diff.x) * 180 / Math.PI); } OrientedContraptionEntity entity = OrientedContraptionEntity.create(world, contraption, initialOrientation); if (couplingFound) - entity.setCouplingId(cart.getUniqueID()); - entity.setPosition(pos.getX(), pos.getY(), pos.getZ()); - world.addEntity(entity); + entity.setCouplingId(cart.getUUID()); + entity.setPos(pos.getX(), pos.getY(), pos.getZ()); + world.addFreshEntity(entity); entity.startRiding(cart); if (cart instanceof FurnaceMinecartEntity) { @@ -187,7 +187,7 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay if (couplingId == null) { contraption.yaw = CartAssemblerBlock.getHorizontalDirection(getBlockState()) - .getHorizontalAngle(); + .toYRot(); disassembleCart(cart); return; } @@ -202,7 +202,7 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay if (minecartController.cart() == cart) continue; BlockPos otherPos = minecartController.cart() - .getBlockPos(); + .blockPosition(); BlockState blockState = world.getBlockState(otherPos); if (!AllBlocks.CART_ASSEMBLER.has(blockState)) return; @@ -218,11 +218,11 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay } protected void disassembleCart(AbstractMinecartEntity cart) { - cart.removePassengers(); + cart.ejectPassengers(); if (cart instanceof FurnaceMinecartEntity) { CompoundNBT nbt = cart.serializeNBT(); - nbt.putDouble("PushZ", cart.getMotion().x); - nbt.putDouble("PushX", cart.getMotion().z); + nbt.putDouble("PushZ", cart.getDeltaMovement().x); + nbt.putDouble("PushX", cart.getDeltaMovement().z); cart.deserializeNBT(nbt); } } @@ -263,9 +263,9 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay if (d.getAxis() .isVertical()) return false; - if (!state.contains(CartAssemblerBlock.RAIL_SHAPE)) + if (!state.hasProperty(CartAssemblerBlock.RAIL_SHAPE)) return false; - RailShape railShape = state.get(CartAssemblerBlock.RAIL_SHAPE); + RailShape railShape = state.getValue(CartAssemblerBlock.RAIL_SHAPE); return (d.getAxis() == Axis.X) == (railShape == RailShape.NORTH_SOUTH); }); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/ItemHandlerModifiableFromIInventory.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/ItemHandlerModifiableFromIInventory.java index 3dd313411..669bff17e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/ItemHandlerModifiableFromIInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/ItemHandlerModifiableFromIInventory.java @@ -21,17 +21,17 @@ public class ItemHandlerModifiableFromIInventory implements IItemHandlerModifiab @Override public void setStackInSlot(int slot, ItemStack stack) { - inventory.setInventorySlotContents(slot, stack); + inventory.setItem(slot, stack); } @Override public int getSlots() { - return inventory.getSizeInventory(); + return inventory.getContainerSize(); } @Override public ItemStack getStackInSlot(int slot) { - return inventory.getStackInSlot(slot); + return inventory.getItem(slot); } @Override @@ -119,12 +119,12 @@ public class ItemHandlerModifiableFromIInventory implements IItemHandlerModifiab @Override public int getSlotLimit(int slot) { - return inventory.getInventoryStackLimit(); + return inventory.getMaxStackSize(); } @Override public boolean isItemValid(int slot, ItemStack stack) { - return inventory.isItemValidForSlot(slot, stack); + return inventory.canPlaceItem(slot, stack); } private void validateSlotIndex(int slot) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java index 3bd9f4fe4..1f40b822f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java @@ -66,7 +66,7 @@ public class MinecartContraptionItem extends Item { private MinecartContraptionItem(Type minecartTypeIn, Properties builder) { super(builder); this.minecartType = minecartTypeIn; - DispenserBlock.registerDispenseBehavior(this, DISPENSER_BEHAVIOR); + DispenserBlock.registerBehavior(this, DISPENSER_BEHAVIOR); } // Taken and adjusted from MinecartItem @@ -74,35 +74,35 @@ public class MinecartContraptionItem extends Item { private final DefaultDispenseItemBehavior behaviourDefaultDispenseItem = new DefaultDispenseItemBehavior(); @Override - public ItemStack dispenseStack(IBlockSource source, ItemStack stack) { + public ItemStack execute(IBlockSource source, ItemStack stack) { Direction direction = source.getBlockState() - .get(DispenserBlock.FACING); - World world = source.getWorld(); - double d0 = source.getX() + (double) direction.getXOffset() * 1.125D; - double d1 = Math.floor(source.getY()) + (double) direction.getYOffset(); - double d2 = source.getZ() + (double) direction.getZOffset() * 1.125D; - BlockPos blockpos = source.getBlockPos() - .offset(direction); + .getValue(DispenserBlock.FACING); + World world = source.getLevel(); + double d0 = source.x() + (double) direction.getStepX() * 1.125D; + double d1 = Math.floor(source.y()) + (double) direction.getStepY(); + double d2 = source.z() + (double) direction.getStepZ() * 1.125D; + BlockPos blockpos = source.getPos() + .relative(direction); BlockState blockstate = world.getBlockState(blockpos); RailShape railshape = blockstate.getBlock() instanceof AbstractRailBlock ? ((AbstractRailBlock) blockstate.getBlock()).getRailDirection(blockstate, world, blockpos, null) : RailShape.NORTH_SOUTH; double d3; - if (blockstate.isIn(BlockTags.RAILS)) { + if (blockstate.is(BlockTags.RAILS)) { if (railshape.isAscending()) { d3 = 0.6D; } else { d3 = 0.1D; } } else { - if (blockstate.getMaterial() != Material.AIR || !world.getBlockState(blockpos.down()) - .isIn(BlockTags.RAILS)) { + if (blockstate.getMaterial() != Material.AIR || !world.getBlockState(blockpos.below()) + .is(BlockTags.RAILS)) { return this.behaviourDefaultDispenseItem.dispense(source, stack); } - BlockState blockstate1 = world.getBlockState(blockpos.down()); + BlockState blockstate1 = world.getBlockState(blockpos.below()); RailShape railshape1 = blockstate1.getBlock() instanceof AbstractRailBlock - ? ((AbstractRailBlock) blockstate1.getBlock()).getRailDirection(blockstate1, world, blockpos.down(), + ? ((AbstractRailBlock) blockstate1.getBlock()).getRailDirection(blockstate1, world, blockpos.below(), null) : RailShape.NORTH_SOUTH; if (direction != Direction.DOWN && railshape1.isAscending()) { @@ -112,11 +112,11 @@ public class MinecartContraptionItem extends Item { } } - AbstractMinecartEntity abstractminecartentity = AbstractMinecartEntity.create(world, d0, d1 + d3, d2, + AbstractMinecartEntity abstractminecartentity = AbstractMinecartEntity.createMinecart(world, d0, d1 + d3, d2, ((MinecartContraptionItem) stack.getItem()).minecartType); - if (stack.hasDisplayName()) - abstractminecartentity.setCustomName(stack.getDisplayName()); - world.addEntity(abstractminecartentity); + if (stack.hasCustomHoverName()) + abstractminecartentity.setCustomName(stack.getHoverName()); + world.addFreshEntity(abstractminecartentity); addContraptionToMinecart(world, stack, abstractminecartentity, direction); stack.shrink(1); @@ -124,23 +124,23 @@ public class MinecartContraptionItem extends Item { } @Override - protected void playDispenseSound(IBlockSource source) { - source.getWorld() - .playEvent(1000, source.getBlockPos(), 0); + protected void playSound(IBlockSource source) { + source.getLevel() + .levelEvent(1000, source.getPos(), 0); } }; // Taken and adjusted from MinecartItem @Override - public ActionResultType onItemUse(ItemUseContext context) { - World world = context.getWorld(); - BlockPos blockpos = context.getPos(); + public ActionResultType useOn(ItemUseContext context) { + World world = context.getLevel(); + BlockPos blockpos = context.getClickedPos(); BlockState blockstate = world.getBlockState(blockpos); - if (!blockstate.isIn(BlockTags.RAILS)) { + if (!blockstate.is(BlockTags.RAILS)) { return ActionResultType.FAIL; } else { - ItemStack itemstack = context.getItem(); - if (!world.isRemote) { + ItemStack itemstack = context.getItemInHand(); + if (!world.isClientSide) { RailShape railshape = blockstate.getBlock() instanceof AbstractRailBlock ? ((AbstractRailBlock) blockstate.getBlock()).getRailDirection(blockstate, world, blockpos, null) : RailShape.NORTH_SOUTH; @@ -150,14 +150,14 @@ public class MinecartContraptionItem extends Item { } AbstractMinecartEntity abstractminecartentity = - AbstractMinecartEntity.create(world, (double) blockpos.getX() + 0.5D, + AbstractMinecartEntity.createMinecart(world, (double) blockpos.getX() + 0.5D, (double) blockpos.getY() + 0.0625D + d0, (double) blockpos.getZ() + 0.5D, this.minecartType); - if (itemstack.hasDisplayName()) - abstractminecartentity.setCustomName(itemstack.getDisplayName()); + if (itemstack.hasCustomHoverName()) + abstractminecartentity.setCustomName(itemstack.getHoverName()); PlayerEntity player = context.getPlayer(); - world.addEntity(abstractminecartentity); + world.addFreshEntity(abstractminecartentity); addContraptionToMinecart(world, itemstack, abstractminecartentity, - player == null ? null : player.getHorizontalFacing()); + player == null ? null : player.getDirection()); } itemstack.shrink(1); @@ -177,21 +177,21 @@ public class MinecartContraptionItem extends Item { OrientedContraptionEntity contraptionEntity = newFacing == null ? OrientedContraptionEntity.create(world, mountedContraption, intialOrientation) : OrientedContraptionEntity.createAtYaw(world, mountedContraption, intialOrientation, - newFacing.getHorizontalAngle()); + newFacing.toYRot()); contraptionEntity.startRiding(cart); - contraptionEntity.setPosition(cart.getX(), cart.getY(), cart.getZ()); - world.addEntity(contraptionEntity); + contraptionEntity.setPos(cart.getX(), cart.getY(), cart.getZ()); + world.addFreshEntity(contraptionEntity); } } @Override - public String getTranslationKey(ItemStack stack) { + public String getDescriptionId(ItemStack stack) { return "item.create.minecart_contraption"; } @Override - public void fillItemGroup(ItemGroup group, NonNullList items) {} + public void fillItemCategory(ItemGroup group, NonNullList items) {} @SubscribeEvent public static void wrenchCanBeUsedToPickUpMinecartContraptions(PlayerInteractEvent.EntityInteract event) { @@ -200,11 +200,11 @@ public class MinecartContraptionItem extends Item { if (player == null || entity == null) return; - ItemStack wrench = player.getHeldItem(event.getHand()); + ItemStack wrench = player.getItemInHand(event.getHand()); if (!AllItems.WRENCH.isIn(wrench)) return; if (entity instanceof AbstractContraptionEntity) - entity = entity.getRidingEntity(); + entity = entity.getVehicle(); if (!(entity instanceof AbstractMinecartEntity)) return; if (!entity.isAlive()) @@ -222,27 +222,27 @@ public class MinecartContraptionItem extends Item { Contraption blocks = contraption.getContraption(); if (blocks != null && blocks.getBlocks().values().stream() .anyMatch(i -> i.state.getBlock() instanceof SpawnerBlock)) { - player.sendStatusMessage(Lang.translate("contraption.minecart_contraption_illegal_pickup") - .formatted(TextFormatting.RED), true); + player.displayClientMessage(Lang.translate("contraption.minecart_contraption_illegal_pickup") + .withStyle(TextFormatting.RED), true); return; } } - if (event.getWorld().isRemote) { + if (event.getWorld().isClientSide) { event.setCancellationResult(ActionResultType.SUCCESS); event.setCanceled(true); return; } - ItemStack generatedStack = create(type, contraption).setDisplayName(entity.getCustomName()); + ItemStack generatedStack = create(type, contraption).setHoverName(entity.getCustomName()); try { ByteArrayDataOutput dataOutput = ByteStreams.newDataOutput(); CompressedStreamTools.write(generatedStack.serializeNBT(), dataOutput); int estimatedPacketSize = dataOutput.toByteArray().length; if (estimatedPacketSize > 2_000_000) { - player.sendStatusMessage(Lang.translate("contraption.minecart_contraption_too_big") - .formatted(TextFormatting.RED), true); + player.displayClientMessage(Lang.translate("contraption.minecart_contraption_too_big") + .withStyle(TextFormatting.RED), true); return; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java index 9f4149f81..faec44b37 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java @@ -56,14 +56,14 @@ public class MountedContraption extends Contraption { @Override public boolean assemble(World world, BlockPos pos) throws AssemblyException { BlockState state = world.getBlockState(pos); - if (!state.contains(RAIL_SHAPE)) + if (!state.hasProperty(RAIL_SHAPE)) return false; if (!searchMovedStructure(world, pos, null)) return false; - Axis axis = state.get(RAIL_SHAPE) == RailShape.EAST_WEST ? Axis.X : Axis.Z; + Axis axis = state.getValue(RAIL_SHAPE) == RailShape.EAST_WEST ? Axis.X : Axis.Z; addBlock(pos, Pair.of(new BlockInfo(pos, AllBlocks.MINECART_ANCHOR.getDefaultState() - .with(BlockStateProperties.HORIZONTAL_AXIS, axis), null), null)); + .setValue(BlockStateProperties.HORIZONTAL_AXIS, axis), null), null)); if (blocks.size() == 1) return false; @@ -74,7 +74,7 @@ public class MountedContraption extends Contraption { @Override protected boolean addToInitialFrontier(World world, BlockPos pos, Direction direction, Queue frontier) { frontier.clear(); - frontier.add(pos.up()); + frontier.add(pos.above()); return true; } @@ -94,11 +94,11 @@ public class MountedContraption extends Contraption { if (axis.isVertical() || !VecHelper.onSameAxis(anchor, pos, axis)) continue; for (AbstractMinecartEntity abstractMinecartEntity : world - .getEntitiesWithinAABB(AbstractMinecartEntity.class, new AxisAlignedBB(pos))) { + .getEntitiesOfClass(AbstractMinecartEntity.class, new AxisAlignedBB(pos))) { if (!CartAssemblerBlock.canAssembleTo(abstractMinecartEntity)) break; connectedCart = abstractMinecartEntity; - connectedCart.setPosition(pos.getX() + .5, pos.getY(), pos.getZ() + .5f); + connectedCart.setPos(pos.getX() + .5, pos.getY(), pos.getZ() + .5f); } } @@ -117,7 +117,7 @@ public class MountedContraption extends Contraption { if (axis.isVertical() || !VecHelper.onSameAxis(anchor, pos, axis)) continue; for (AbstractMinecartEntity abstractMinecartEntity : world - .getEntitiesWithinAABB(AbstractMinecartEntity.class, new AxisAlignedBB(pos))) { + .getEntitiesOfClass(AbstractMinecartEntity.class, new AxisAlignedBB(pos))) { if (!CartAssemblerBlock.canAssembleTo(abstractMinecartEntity)) break; return true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java index 35dfac048..a4f3b1671 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java @@ -61,11 +61,11 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity movedContraption = null; } - if (world.isRemote) + if (level.isClientSide) clientOffsetDiff *= .75f; if (waitingForSpeedChange && movedContraption != null) { - if (world.isRemote) { + if (level.isClientSide) { float syncSpeed = clientOffsetDiff / 2f; offset += syncSpeed; movedContraption.setContraptionMotion(toMotionVector(syncSpeed)); @@ -75,7 +75,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity return; } - if (!world.isRemote && assembleNextTick) { + if (!level.isClientSide && assembleNextTick) { assembleNextTick = false; if (running) { if (getSpeed() == 0) @@ -114,7 +114,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity int extensionRange = getExtensionRange(); if (offset <= 0 || offset >= extensionRange) { offset = offset <= 0 ? 0 : extensionRange; - if (!world.isRemote) { + if (!level.isClientSide) { applyContraptionMotion(); applyContraptionPosition(); tryDisassemble(); @@ -130,7 +130,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity @Override public void lazyTick() { super.lazyTick(); - if (movedContraption != null && !world.isRemote) + if (movedContraption != null && !level.isClientSide) sendData(); } @@ -152,16 +152,16 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity if (movedContraption != null && Math.signum(prevSpeed) != Math.signum(getSpeed()) && prevSpeed != 0) { movedContraption.getContraption() - .stop(world); + .stop(level); } } @Override - public void remove() { - this.removed = true; - if (!world.isRemote) + public void setRemoved() { + this.remove = true; + if (!level.isClientSide) disassemble(); - super.remove(); + super.setRemoved(); } @Override @@ -223,7 +223,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity protected void visitNewPosition() {} protected void tryDisassemble() { - if (removed) { + if (remove) { disassemble(); return; } @@ -241,7 +241,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity @Override public void collided() { - if (world.isRemote) { + if (level.isClientSide) { waitingForSpeedChange = true; return; } @@ -264,14 +264,14 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity if (movedContraption == null) return; Vector3d vec = toPosition(offset); - movedContraption.setPosition(vec.x, vec.y, vec.z); + movedContraption.setPos(vec.x, vec.y, vec.z); if (getSpeed() == 0 || waitingForSpeedChange) movedContraption.setContraptionMotion(Vector3d.ZERO); } public float getMovementSpeed() { float movementSpeed = MathHelper.clamp(convertToLinear(getSpeed()), -.49f, .49f) + clientOffsetDiff / 2f; - if (world.isRemote) + if (level.isClientSide) movementSpeed *= ServerSpeedProvider.get(); return movementSpeed; } @@ -282,7 +282,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity @Override public void onStall() { - if (!world.isRemote) { + if (!level.isClientSide) { forceMove = true; sendData(); } @@ -301,7 +301,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity @Override public void attach(ControlledContraptionEntity contraption) { this.movedContraption = contraption; - if (!world.isRemote) { + if (!level.isClientSide) { this.running = true; sendData(); } @@ -314,6 +314,6 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity @Override public BlockPos getBlockPosition() { - return pos; + return worldPosition; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java index 98efed20f..b936f8814 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java @@ -50,75 +50,75 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement protected MechanicalPistonBlock(Properties properties, boolean sticky) { super(properties); - setDefaultState(getDefaultState().with(FACING, Direction.NORTH) - .with(STATE, PistonState.RETRACTED)); + registerDefaultState(defaultBlockState().setValue(FACING, Direction.NORTH) + .setValue(STATE, PistonState.RETRACTED)); isSticky = sticky; } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(STATE); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - if (!player.isAllowEdit()) + if (!player.mayBuild()) return ActionResultType.PASS; - if (player.isSneaking()) + if (player.isShiftKeyDown()) return ActionResultType.PASS; - if (!player.getHeldItem(handIn) + if (!player.getItemInHand(handIn) .getItem() - .isIn(Tags.Items.SLIMEBALLS)) { - if (player.getHeldItem(handIn) + .is(Tags.Items.SLIMEBALLS)) { + if (player.getItemInHand(handIn) .isEmpty()) { withTileEntityDo(worldIn, pos, te -> te.assembleNextTick = true); return ActionResultType.SUCCESS; } return ActionResultType.PASS; } - if (state.get(STATE) != PistonState.RETRACTED) + if (state.getValue(STATE) != PistonState.RETRACTED) return ActionResultType.PASS; - Direction direction = state.get(FACING); - if (hit.getFace() != direction) + Direction direction = state.getValue(FACING); + if (hit.getDirection() != direction) return ActionResultType.PASS; if (((MechanicalPistonBlock) state.getBlock()).isSticky) return ActionResultType.PASS; - if (worldIn.isRemote) { - Vector3d vec = hit.getHitVec(); + if (worldIn.isClientSide) { + Vector3d vec = hit.getLocation(); worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0); return ActionResultType.SUCCESS; } AllSoundEvents.SLIME_ADDED.playOnServer(worldIn, pos, .5f, 1); if (!player.isCreative()) - player.getHeldItem(handIn) + player.getItemInHand(handIn) .shrink(1); - worldIn.setBlockState(pos, AllBlocks.STICKY_MECHANICAL_PISTON.getDefaultState() - .with(FACING, direction) - .with(AXIS_ALONG_FIRST_COORDINATE, state.get(AXIS_ALONG_FIRST_COORDINATE))); + worldIn.setBlockAndUpdate(pos, AllBlocks.STICKY_MECHANICAL_PISTON.getDefaultState() + .setValue(FACING, direction) + .setValue(AXIS_ALONG_FIRST_COORDINATE, state.getValue(AXIS_ALONG_FIRST_COORDINATE))); return ActionResultType.SUCCESS; } @Override public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos fromPos, boolean p_220069_6_) { - Direction direction = state.get(FACING); - if (!fromPos.equals(pos.offset(direction.getOpposite()))) + Direction direction = state.getValue(FACING); + if (!fromPos.equals(pos.relative(direction.getOpposite()))) return; - if (!world.isRemote && !world.getPendingBlockTicks() - .isTickPending(pos, this)) - world.getPendingBlockTicks() + if (!world.isClientSide && !world.getBlockTicks() + .willTickThisTick(pos, this)) + world.getBlockTicks() .scheduleTick(pos, this, 0); } @Override - public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { - Direction direction = state.get(FACING); - BlockState pole = worldIn.getBlockState(pos.offset(direction.getOpposite())); + public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { + Direction direction = state.getValue(FACING); + BlockState pole = worldIn.getBlockState(pos.relative(direction.getOpposite())); if (!AllBlocks.PISTON_EXTENSION_POLE.has(pole)) return; - if (pole.get(PistonExtensionPoleBlock.FACING) + if (pole.getValue(PistonExtensionPoleBlock.FACING) .getAxis() != direction.getAxis()) return; withTileEntityDo(worldIn, pos, te -> { @@ -136,7 +136,7 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - if (state.get(STATE) != PistonState.RETRACTED) + if (state.getValue(STATE) != PistonState.RETRACTED) return ActionResultType.PASS; return super.onWrenched(state, context); } @@ -145,28 +145,28 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement RETRACTED, MOVING, EXTENDED; @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } } @Override - public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { - Direction direction = state.get(FACING); + public void playerWillDestroy(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { + Direction direction = state.getValue(FACING); BlockPos pistonHead = null; BlockPos pistonBase = pos; boolean dropBlocks = player == null || !player.isCreative(); Integer maxPoles = maxAllowedPistonPoles(); for (int offset = 1; offset < maxPoles; offset++) { - BlockPos currentPos = pos.offset(direction, offset); + BlockPos currentPos = pos.relative(direction, offset); BlockState block = worldIn.getBlockState(currentPos); - if (isExtensionPole(block) && direction.getAxis() == block.get(BlockStateProperties.FACING) + if (isExtensionPole(block) && direction.getAxis() == block.getValue(BlockStateProperties.FACING) .getAxis()) continue; - if (isPistonHead(block) && block.get(BlockStateProperties.FACING) == direction) { + if (isPistonHead(block) && block.getValue(BlockStateProperties.FACING) == direction) { pistonHead = currentPos; } @@ -174,16 +174,16 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement } if (pistonHead != null && pistonBase != null) { - BlockPos.getAllInBox(pistonBase, pistonHead) + BlockPos.betweenClosedStream(pistonBase, pistonHead) .filter(p -> !p.equals(pos)) .forEach(p -> worldIn.destroyBlock(p, dropBlocks)); } for (int offset = 1; offset < maxPoles; offset++) { - BlockPos currentPos = pos.offset(direction.getOpposite(), offset); + BlockPos currentPos = pos.relative(direction.getOpposite(), offset); BlockState block = worldIn.getBlockState(currentPos); - if (isExtensionPole(block) && direction.getAxis() == block.get(BlockStateProperties.FACING) + if (isExtensionPole(block) && direction.getAxis() == block.getValue(BlockStateProperties.FACING) .getAxis()) { worldIn.destroyBlock(currentPos, dropBlocks); continue; @@ -192,7 +192,7 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement break; } - super.onBlockHarvested(worldIn, pos, state, player); + super.playerWillDestroy(worldIn, pos, state, player); } public static int maxAllowedPistonPoles() { @@ -202,13 +202,13 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - if (state.get(STATE) == PistonState.EXTENDED) - return AllShapes.MECHANICAL_PISTON_EXTENDED.get(state.get(FACING)); + if (state.getValue(STATE) == PistonState.EXTENDED) + return AllShapes.MECHANICAL_PISTON_EXTENDED.get(state.getValue(FACING)); - if (state.get(STATE) == PistonState.MOVING) - return AllShapes.MECHANICAL_PISTON.get(state.get(FACING)); + if (state.getValue(STATE) == PistonState.MOVING) + return AllShapes.MECHANICAL_PISTON.get(state.getValue(FACING)); - return VoxelShapes.fullCube(); + return VoxelShapes.block(); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonGenerator.java index 34e30c52c..4b3363bcf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonGenerator.java @@ -23,14 +23,14 @@ public class MechanicalPistonGenerator extends SpecialBlockStateGen { @Override protected int getXRotation(BlockState state) { - Direction facing = state.get(MechanicalPistonBlock.FACING); + Direction facing = state.getValue(MechanicalPistonBlock.FACING); return facing.getAxis() .isVertical() ? facing == Direction.DOWN ? 180 : 0 : 90; } @Override protected int getYRotation(BlockState state) { - Direction facing = state.get(MechanicalPistonBlock.FACING); + Direction facing = state.getValue(MechanicalPistonBlock.FACING); return facing.getAxis() .isVertical() ? 0 : horizontalAngle(facing) + 180; } @@ -38,12 +38,12 @@ public class MechanicalPistonGenerator extends SpecialBlockStateGen { @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - Direction facing = state.get(PistonBlock.FACING); - boolean axisAlongFirst = state.get(MechanicalPistonBlock.AXIS_ALONG_FIRST_COORDINATE); - PistonState pistonState = state.get(MechanicalPistonBlock.STATE); + Direction facing = state.getValue(PistonBlock.FACING); + boolean axisAlongFirst = state.getValue(MechanicalPistonBlock.AXIS_ALONG_FIRST_COORDINATE); + PistonState pistonState = state.getValue(MechanicalPistonBlock.STATE); String path = "block/mechanical_piston"; - String folder = pistonState == PistonState.RETRACTED ? type.getString() : pistonState.getString(); + String folder = pistonState == PistonState.RETRACTED ? type.getSerializedName() : pistonState.getSerializedName(); String partial = facing.getAxis() == Axis.X ^ axisAlongFirst ? "block_rotated" : "block"; return prov.models() diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java index fe9c50d8a..ac665c58f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java @@ -36,17 +36,17 @@ public class MechanicalPistonHeadBlock extends ProperDirectionalBlock implements public MechanicalPistonHeadBlock(Properties p_i48415_1_) { super(p_i48415_1_); - setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); + registerDefaultState(super.defaultBlockState().setValue(BlockStateProperties.WATERLOGGED, false)); } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(TYPE, BlockStateProperties.WATERLOGGED); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override - public PushReaction getPushReaction(BlockState state) { + public PushReaction getPistonPushReaction(BlockState state) { return PushReaction.NORMAL; } @@ -57,20 +57,20 @@ public class MechanicalPistonHeadBlock extends ProperDirectionalBlock implements } @Override - public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { - Direction direction = state.get(FACING); + public void playerWillDestroy(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { + Direction direction = state.getValue(FACING); BlockPos pistonHead = pos; BlockPos pistonBase = null; for (int offset = 1; offset < MechanicalPistonBlock.maxAllowedPistonPoles(); offset++) { - BlockPos currentPos = pos.offset(direction.getOpposite(), offset); + BlockPos currentPos = pos.relative(direction.getOpposite(), offset); BlockState block = worldIn.getBlockState(currentPos); - if (isExtensionPole(block) && direction.getAxis() == block.get(BlockStateProperties.FACING) + if (isExtensionPole(block) && direction.getAxis() == block.getValue(BlockStateProperties.FACING) .getAxis()) continue; - if (MechanicalPistonBlock.isPiston(block) && block.get(BlockStateProperties.FACING) == direction) + if (MechanicalPistonBlock.isPiston(block) && block.getValue(BlockStateProperties.FACING) == direction) pistonBase = currentPos; break; @@ -78,43 +78,43 @@ public class MechanicalPistonHeadBlock extends ProperDirectionalBlock implements if (pistonHead != null && pistonBase != null) { final BlockPos basePos = pistonBase; - BlockPos.getAllInBox(pistonBase, pistonHead) + BlockPos.betweenClosedStream(pistonBase, pistonHead) .filter(p -> !p.equals(pos) && !p.equals(basePos)) .forEach(p -> worldIn.destroyBlock(p, !player.isCreative())); - worldIn.setBlockState(basePos, worldIn.getBlockState(basePos) - .with(MechanicalPistonBlock.STATE, PistonState.RETRACTED)); + worldIn.setBlockAndUpdate(basePos, worldIn.getBlockState(basePos) + .setValue(MechanicalPistonBlock.STATE, PistonState.RETRACTED)); } - super.onBlockHarvested(worldIn, pos, state, player); + super.playerWillDestroy(worldIn, pos, state, player); } @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.MECHANICAL_PISTON_HEAD.get(state.get(FACING)); + return AllShapes.MECHANICAL_PISTON_HEAD.get(state.getValue(FACING)); } @Override public FluidState getFluidState(BlockState state) { - return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState(); + return state.getValue(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, IWorld world, BlockPos pos, BlockPos neighbourPos) { - if (state.get(BlockStateProperties.WATERLOGGED)) { - world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + if (state.getValue(BlockStateProperties.WATERLOGGED)) { + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return state; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - FluidState FluidState = context.getWorld().getFluidState(context.getPos()); - return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(FluidState.getFluid() == Fluids.WATER)); + FluidState FluidState = context.getLevel().getFluidState(context.getClickedPos()); + return super.getStateForPlacement(context).setValue(BlockStateProperties.WATERLOGGED, Boolean.valueOf(FluidState.getType() == Fluids.WATER)); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java index 8297c9b20..5ca97b096 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java @@ -45,23 +45,23 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { @Override public void assemble() throws AssemblyException { - if (!(world.getBlockState(pos) + if (!(level.getBlockState(worldPosition) .getBlock() instanceof MechanicalPistonBlock)) return; - Direction direction = getBlockState().get(BlockStateProperties.FACING); + Direction direction = getBlockState().getValue(BlockStateProperties.FACING); // Collect Construct PistonContraption contraption = new PistonContraption(direction, getMovementSpeed() < 0); - if (!contraption.assemble(world, pos)) + if (!contraption.assemble(level, worldPosition)) return; - Direction positive = Direction.getFacingFromAxis(AxisDirection.POSITIVE, direction.getAxis()); + Direction positive = Direction.get(AxisDirection.POSITIVE, direction.getAxis()); Direction movementDirection = getSpeed() > 0 ^ direction.getAxis() != Axis.Z ? positive : positive.getOpposite(); - BlockPos anchor = contraption.anchor.offset(direction, contraption.initialExtensionProgress); - if (ContraptionCollider.isCollidingWithWorld(world, contraption, anchor.offset(movementDirection), + BlockPos anchor = contraption.anchor.relative(direction, contraption.initialExtensionProgress); + if (ContraptionCollider.isCollidingWithWorld(level, contraption, anchor.relative(movementDirection), movementDirection)) return; @@ -78,35 +78,35 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { sendData(); clientOffsetDiff = 0; - BlockPos startPos = BlockPos.ZERO.offset(direction, contraption.initialExtensionProgress); - contraption.removeBlocksFromWorld(world, startPos); - movedContraption = ControlledContraptionEntity.create(getWorld(), this, contraption); + BlockPos startPos = BlockPos.ZERO.relative(direction, contraption.initialExtensionProgress); + contraption.removeBlocksFromWorld(level, startPos); + movedContraption = ControlledContraptionEntity.create(getLevel(), this, contraption); applyContraptionPosition(); forceMove = true; - world.addEntity(movedContraption); + level.addFreshEntity(movedContraption); - AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(world, pos); + AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(level, worldPosition); } @Override public void disassemble() { if (!running && movedContraption == null) return; - if (!removed) - getWorld().setBlockState(pos, getBlockState().with(MechanicalPistonBlock.STATE, PistonState.EXTENDED), + if (!remove) + getLevel().setBlock(worldPosition, getBlockState().setValue(MechanicalPistonBlock.STATE, PistonState.EXTENDED), 3 | 16); if (movedContraption != null) { applyContraptionPosition(); movedContraption.disassemble(); - AllSoundEvents.CONTRAPTION_DISASSEMBLE.playOnServer(world, pos); + AllSoundEvents.CONTRAPTION_DISASSEMBLE.playOnServer(level, worldPosition); } running = false; movedContraption = null; sendData(); - if (removed) + if (remove) AllBlocks.MECHANICAL_PISTON.get() - .onBlockHarvested(world, pos, getBlockState(), null); + .playerWillDestroy(level, worldPosition, getBlockState(), null); } @Override @@ -119,11 +119,11 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { @Override public float getMovementSpeed() { float movementSpeed = MathHelper.clamp(convertToLinear(getSpeed()), -.49f, .49f); - if (world.isRemote) + if (level.isClientSide) movementSpeed *= ServerSpeedProvider.get(); - Direction pistonDirection = getBlockState().get(BlockStateProperties.FACING); + Direction pistonDirection = getBlockState().getValue(BlockStateProperties.FACING); int movementModifier = pistonDirection.getAxisDirection() - .getOffset() * (pistonDirection.getAxis() == Axis.Z ? -1 : 1); + .getStep() * (pistonDirection.getAxis() == Axis.Z ? -1 : 1); movementSpeed = movementSpeed * -movementModifier + clientOffsetDiff / 2f; int extensionRange = getExtensionRange(); @@ -141,24 +141,24 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { @Override protected Vector3d toMotionVector(float speed) { - Direction pistonDirection = getBlockState().get(BlockStateProperties.FACING); - return Vector3d.of(pistonDirection.getDirectionVec()) + Direction pistonDirection = getBlockState().getValue(BlockStateProperties.FACING); + return Vector3d.atLowerCornerOf(pistonDirection.getNormal()) .scale(speed); } @Override protected Vector3d toPosition(float offset) { - Vector3d position = Vector3d.of(getBlockState().get(BlockStateProperties.FACING) - .getDirectionVec()) + Vector3d position = Vector3d.atLowerCornerOf(getBlockState().getValue(BlockStateProperties.FACING) + .getNormal()) .scale(offset); - return position.add(Vector3d.of(movedContraption.getContraption().anchor)); + return position.add(Vector3d.atLowerCornerOf(movedContraption.getContraption().anchor)); } @Override protected ValueBoxTransform getMovementModeSlot() { return new DirectionalExtenderScrollOptionSlot((state, d) -> { Axis axis = d.getAxis(); - Axis extensionAxis = state.get(MechanicalPistonBlock.FACING) + Axis extensionAxis = state.getValue(MechanicalPistonBlock.FACING) .getAxis(); Axis shaftAxis = ((IRotate) state.getBlock()).getRotationAxis(state); return extensionAxis != axis && shaftAxis != axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java index b8c33f45b..5c79bd6fb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java @@ -70,7 +70,7 @@ public class PistonContraption extends TranslatingContraption { if (blocks.size() == count) { // no new blocks added bounds = pistonExtensionCollisionBox; } else { - bounds = bounds.union(pistonExtensionCollisionBox); + bounds = bounds.minmax(pistonExtensionCollisionBox); } startMoving(world); return true; @@ -79,7 +79,7 @@ public class PistonContraption extends TranslatingContraption { private boolean collectExtensions(World world, BlockPos pos, Direction direction) throws AssemblyException { List poles = new ArrayList<>(); BlockPos actualStart = pos; - BlockState nextBlock = world.getBlockState(actualStart.offset(direction)); + BlockState nextBlock = world.getBlockState(actualStart.relative(direction)); int extensionsInFront = 0; BlockState blockState = world.getBlockState(pos); boolean sticky = isStickyPiston(blockState); @@ -87,17 +87,17 @@ public class PistonContraption extends TranslatingContraption { if (!isPiston(blockState)) return false; - if (blockState.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) { - while (PistonExtensionPoleBlock.PlacementHelper.get().matchesAxis(nextBlock, direction.getAxis()) || isPistonHead(nextBlock) && nextBlock.get(FACING) == direction) { + if (blockState.getValue(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) { + while (PistonExtensionPoleBlock.PlacementHelper.get().matchesAxis(nextBlock, direction.getAxis()) || isPistonHead(nextBlock) && nextBlock.getValue(FACING) == direction) { - actualStart = actualStart.offset(direction); - poles.add(new BlockInfo(actualStart, nextBlock.with(FACING, direction), null)); + actualStart = actualStart.relative(direction); + poles.add(new BlockInfo(actualStart, nextBlock.setValue(FACING, direction), null)); extensionsInFront++; if (isPistonHead(nextBlock)) break; - nextBlock = world.getBlockState(actualStart.offset(direction)); + nextBlock = world.getBlockState(actualStart.relative(direction)); if (extensionsInFront > MechanicalPistonBlock.maxAllowedPistonPoles()) throw AssemblyException.tooManyPistonPoles(); } @@ -105,32 +105,32 @@ public class PistonContraption extends TranslatingContraption { if (extensionsInFront == 0) poles.add(new BlockInfo(pos, MECHANICAL_PISTON_HEAD.getDefaultState() - .with(FACING, direction) - .with(BlockStateProperties.PISTON_TYPE, sticky ? PistonType.STICKY : PistonType.DEFAULT), null)); + .setValue(FACING, direction) + .setValue(BlockStateProperties.PISTON_TYPE, sticky ? PistonType.STICKY : PistonType.DEFAULT), null)); else poles.add(new BlockInfo(pos, PISTON_EXTENSION_POLE.getDefaultState() - .with(FACING, direction), null)); + .setValue(FACING, direction), null)); BlockPos end = pos; - nextBlock = world.getBlockState(end.offset(direction.getOpposite())); + nextBlock = world.getBlockState(end.relative(direction.getOpposite())); int extensionsInBack = 0; while (PistonExtensionPoleBlock.PlacementHelper.get().matchesAxis(nextBlock, direction.getAxis())) { - end = end.offset(direction.getOpposite()); - poles.add(new BlockInfo(end, nextBlock.with(FACING, direction), null)); + end = end.relative(direction.getOpposite()); + poles.add(new BlockInfo(end, nextBlock.setValue(FACING, direction), null)); extensionsInBack++; - nextBlock = world.getBlockState(end.offset(direction.getOpposite())); + nextBlock = world.getBlockState(end.relative(direction.getOpposite())); if (extensionsInFront + extensionsInBack > MechanicalPistonBlock.maxAllowedPistonPoles()) throw AssemblyException.tooManyPistonPoles(); } - anchor = pos.offset(direction, initialExtensionProgress + 1); + anchor = pos.relative(direction, initialExtensionProgress + 1); extensionLength = extensionsInBack + extensionsInFront; initialExtensionProgress = extensionsInFront; pistonExtensionCollisionBox = new AxisAlignedBB( - BlockPos.ZERO.offset(direction, -1), - BlockPos.ZERO.offset(direction, -extensionLength - 1)).expand(1, + BlockPos.ZERO.relative(direction, -1), + BlockPos.ZERO.relative(direction, -extensionLength - 1)).expandTowards(1, 1, 1); if (extensionLength == 0) @@ -139,7 +139,7 @@ public class PistonContraption extends TranslatingContraption { bounds = new AxisAlignedBB(0, 0, 0, 0, 0, 0); for (BlockInfo pole : poles) { - BlockPos relPos = pole.pos.offset(direction, -extensionsInFront); + BlockPos relPos = pole.pos.relative(direction, -extensionsInFront); BlockPos localPos = relPos.subtract(anchor); getBlocks().put(localPos, new BlockInfo(localPos, pole.state, null)); //pistonExtensionCollisionBox = pistonExtensionCollisionBox.union(new AxisAlignedBB(localPos)); @@ -156,31 +156,31 @@ public class PistonContraption extends TranslatingContraption { @Override protected boolean addToInitialFrontier(World world, BlockPos pos, Direction direction, Queue frontier) throws AssemblyException { frontier.clear(); - boolean sticky = isStickyPiston(world.getBlockState(pos.offset(orientation, -1))); + boolean sticky = isStickyPiston(world.getBlockState(pos.relative(orientation, -1))); boolean retracting = direction != orientation; if (retracting && !sticky) return true; for (int offset = 0; offset <= AllConfigs.SERVER.kinetics.maxChassisRange.get(); offset++) { if (offset == 1 && retracting) return true; - BlockPos currentPos = pos.offset(orientation, offset + initialExtensionProgress); + BlockPos currentPos = pos.relative(orientation, offset + initialExtensionProgress); if (retracting && World.isOutsideBuildHeight(currentPos)) return true; - if (!world.isBlockPresent(currentPos)) + if (!world.isLoaded(currentPos)) throw AssemblyException.unloadedChunk(currentPos); BlockState state = world.getBlockState(currentPos); if (!BlockMovementChecks.isMovementNecessary(state, world, currentPos)) return true; if (BlockMovementChecks.isBrittle(state) && !(state.getBlock() instanceof CarpetBlock)) return true; - if (isPistonHead(state) && state.get(FACING) == direction.getOpposite()) + if (isPistonHead(state) && state.getValue(FACING) == direction.getOpposite()) return true; if (!BlockMovementChecks.isMovementAllowed(state, world, currentPos)) if (retracting) return true; else throw AssemblyException.unmovableBlock(currentPos, state); - if (retracting && state.getPushReaction() == PushReaction.PUSH_ONLY) + if (retracting && state.getPistonPushReaction() == PushReaction.PUSH_ONLY) return true; frontier.add(currentPos); if (BlockMovementChecks.isNotSupportive(state, orientation)) @@ -191,25 +191,25 @@ public class PistonContraption extends TranslatingContraption { @Override public void addBlock(BlockPos pos, Pair capture) { - super.addBlock(pos.offset(orientation, -initialExtensionProgress), capture); + super.addBlock(pos.relative(orientation, -initialExtensionProgress), capture); } @Override public BlockPos toLocalPos(BlockPos globalPos) { return globalPos.subtract(anchor) - .offset(orientation, -initialExtensionProgress); + .relative(orientation, -initialExtensionProgress); } @Override protected boolean customBlockPlacement(IWorld world, BlockPos pos, BlockState state) { - BlockPos pistonPos = anchor.offset(orientation, -1); + BlockPos pistonPos = anchor.relative(orientation, -1); BlockState pistonState = world.getBlockState(pistonPos); - TileEntity te = world.getTileEntity(pistonPos); + TileEntity te = world.getBlockEntity(pistonPos); if (pos.equals(pistonPos)) { if (te == null || te.isRemoved()) return true; if (!isExtensionPole(state) && isPiston(pistonState)) - world.setBlockState(pistonPos, pistonState.with(MechanicalPistonBlock.STATE, PistonState.RETRACTED), + world.setBlock(pistonPos, pistonState.setValue(MechanicalPistonBlock.STATE, PistonState.RETRACTED), 3 | 16); return true; } @@ -218,10 +218,10 @@ public class PistonContraption extends TranslatingContraption { @Override protected boolean customBlockRemoval(IWorld world, BlockPos pos, BlockState state) { - BlockPos pistonPos = anchor.offset(orientation, -1); + BlockPos pistonPos = anchor.relative(orientation, -1); BlockState blockState = world.getBlockState(pos); if (pos.equals(pistonPos) && isPiston(blockState)) { - world.setBlockState(pos, blockState.with(MechanicalPistonBlock.STATE, PistonState.MOVING), 66 | 16); + world.setBlock(pos, blockState.setValue(MechanicalPistonBlock.STATE, PistonState.MOVING), 66 | 16); return true; } return false; @@ -232,7 +232,7 @@ public class PistonContraption extends TranslatingContraption { super.readNBT(world, nbt, spawnData); initialExtensionProgress = nbt.getInt("InitialLength"); extensionLength = nbt.getInt("ExtensionLength"); - orientation = Direction.byIndex(nbt.getInt("Orientation")); + orientation = Direction.from3DDataValue(nbt.getInt("Orientation")); } @Override @@ -240,7 +240,7 @@ public class PistonContraption extends TranslatingContraption { CompoundNBT tag = super.writeNBT(spawnPacket); tag.putInt("InitialLength", initialExtensionProgress); tag.putInt("ExtensionLength", extensionLength); - tag.putInt("Orientation", orientation.getIndex()); + tag.putInt("Orientation", orientation.get3DDataValue()); return tag; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java index 38191de92..79f82e7f4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java @@ -50,7 +50,7 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements public PistonExtensionPoleBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(FACING, Direction.UP).with(BlockStateProperties.WATERLOGGED, false)); + registerDefaultState(defaultBlockState().setValue(FACING, Direction.UP).setValue(BlockStateProperties.WATERLOGGED, false)); } @Override @@ -60,7 +60,7 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements @Override public boolean canHarvestBlock(BlockState state, IBlockReader world, BlockPos pos, PlayerEntity player) { - for (ToolType toolType : player.getHeldItemMainhand() + for (ToolType toolType : player.getMainHandItem() .getToolTypes()) { if (isToolEffective(state, toolType)) return true; @@ -74,33 +74,33 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements } @Override - public PushReaction getPushReaction(BlockState state) { + public PushReaction getPistonPushReaction(BlockState state) { return PushReaction.NORMAL; } @Override - public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { - Axis axis = state.get(FACING) + public void playerWillDestroy(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { + Axis axis = state.getValue(FACING) .getAxis(); - Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); + Direction direction = Direction.get(AxisDirection.POSITIVE, axis); BlockPos pistonHead = null; BlockPos pistonBase = null; for (int modifier : new int[] { 1, -1 }) { for (int offset = modifier; modifier * offset < MechanicalPistonBlock.maxAllowedPistonPoles(); offset += modifier) { - BlockPos currentPos = pos.offset(direction, offset); + BlockPos currentPos = pos.relative(direction, offset); BlockState block = worldIn.getBlockState(currentPos); - if (isExtensionPole(block) && axis == block.get(FACING) + if (isExtensionPole(block) && axis == block.getValue(FACING) .getAxis()) continue; - if (isPiston(block) && block.get(BlockStateProperties.FACING) + if (isPiston(block) && block.getValue(BlockStateProperties.FACING) .getAxis() == axis) pistonBase = currentPos; - if (isPistonHead(block) && block.get(BlockStateProperties.FACING) + if (isPistonHead(block) && block.getValue(BlockStateProperties.FACING) .getAxis() == axis) pistonHead = currentPos; @@ -109,17 +109,17 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements } if (pistonHead != null && pistonBase != null && worldIn.getBlockState(pistonHead) - .get(BlockStateProperties.FACING) == worldIn.getBlockState(pistonBase) - .get(BlockStateProperties.FACING)) { + .getValue(BlockStateProperties.FACING) == worldIn.getBlockState(pistonBase) + .getValue(BlockStateProperties.FACING)) { final BlockPos basePos = pistonBase; - BlockPos.getAllInBox(pistonBase, pistonHead) + BlockPos.betweenClosedStream(pistonBase, pistonHead) .filter(p -> !p.equals(pos) && !p.equals(basePos)) .forEach(p -> worldIn.destroyBlock(p, !player.isCreative())); - worldIn.setBlockState(basePos, worldIn.getBlockState(basePos) - .with(MechanicalPistonBlock.STATE, PistonState.RETRACTED)); + worldIn.setBlockAndUpdate(basePos, worldIn.getBlockState(basePos) + .setValue(MechanicalPistonBlock.STATE, PistonState.RETRACTED)); - TileEntity te = worldIn.getTileEntity(basePos); + TileEntity te = worldIn.getBlockEntity(basePos); if (te instanceof MechanicalPistonTileEntity) { MechanicalPistonTileEntity baseTE = (MechanicalPistonTileEntity) te; baseTE.offset = 0; @@ -127,31 +127,31 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements } } - super.onBlockHarvested(worldIn, pos, state, player); + super.playerWillDestroy(worldIn, pos, state, player); } @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.FOUR_VOXEL_POLE.get(state.get(FACING) + return AllShapes.FOUR_VOXEL_POLE.get(state.getValue(FACING) .getAxis()); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - FluidState FluidState = context.getWorld() - .getFluidState(context.getPos()); - return getDefaultState().with(FACING, context.getFace() + FluidState FluidState = context.getLevel() + .getFluidState(context.getClickedPos()); + return defaultBlockState().setValue(FACING, context.getClickedFace() .getOpposite()) - .with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(FluidState.getFluid() == Fluids.WATER)); + .setValue(BlockStateProperties.WATERLOGGED, Boolean.valueOf(FluidState.getType() == Fluids.WATER)); } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId); - if (placementHelper.matchesItem(heldItem) && !player.isSneaking()) + if (placementHelper.matchesItem(heldItem) && !player.isShiftKeyDown()) return placementHelper.getOffset(player, world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); return ActionResultType.PASS; @@ -159,26 +159,26 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements @Override public FluidState getFluidState(BlockState state) { - return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) - : Fluids.EMPTY.getDefaultState(); + return state.getValue(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getSource(false) + : Fluids.EMPTY.defaultFluidState(); } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(BlockStateProperties.WATERLOGGED); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, IWorld world, BlockPos pos, BlockPos neighbourPos) { - if (state.get(BlockStateProperties.WATERLOGGED)) { - world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, IWorld world, BlockPos pos, BlockPos neighbourPos) { + if (state.getValue(BlockStateProperties.WATERLOGGED)) { + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return state; } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } @@ -194,7 +194,7 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements private PlacementHelper(){ super( AllBlocks.PISTON_EXTENSION_POLE::has, - state -> state.get(FACING).getAxis(), + state -> state.getValue(FACING).getAxis(), FACING ); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java index 84fa87b31..1c05d8b77 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java @@ -16,7 +16,7 @@ public class PistonLighter extends ContraptionLighter { bounds.translate(contraption.anchor); int length = contraption.extensionLength; - Vector3i direction = contraption.orientation.getDirectionVec(); + Vector3i direction = contraption.orientation.getNormal(); int shift = length / 2; int shiftX = direction.getX() * shift; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyInstance.java index b77adc308..fae4a7b18 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyInstance.java @@ -4,7 +4,7 @@ import java.util.Arrays; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.core.instancing.ConditionalInstance; import com.jozufozu.flywheel.core.instancing.GroupInstance; import com.jozufozu.flywheel.core.instancing.SelectInstance; @@ -40,8 +40,8 @@ public abstract class AbstractPulleyInstance extends ShaftInstance implements ID public AbstractPulleyInstance(MaterialManager dispatcher, KineticTileEntity tile) { super(dispatcher, tile); - rotatingAbout = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis); - rotationAxis = rotatingAbout.getUnitVector(); + rotatingAbout = Direction.get(Direction.AxisDirection.POSITIVE, axis); + rotationAxis = rotatingAbout.step(); coil = getCoilModel() .createInstance() @@ -66,7 +66,7 @@ public abstract class AbstractPulleyInstance extends ShaftInstance implements ID private void transformModels() { resizeRope(); - coil.setRotation(rotationAxis.getDegreesQuaternion(offset * 180)); + coil.setRotation(rotationAxis.rotationDegrees(offset * 180)); magnet.update().get().ifPresent(data -> { int index = Math.max(0, MathHelper.floor(offset)); @@ -137,7 +137,7 @@ public abstract class AbstractPulleyInstance extends ShaftInstance implements ID int length = MathHelper.ceil(offset); if (volume == null || bLight.length < length + 1) { - volume = GridAlignedBB.from(pos.down(length), pos); + volume = GridAlignedBB.from(pos.below(length), pos); volume.fixMinMax(); bLight = Arrays.copyOf(bLight, length + 1); @@ -188,9 +188,9 @@ public abstract class AbstractPulleyInstance extends ShaftInstance implements ID int top = this.pos.getY(); BlockPos.Mutable pos = new BlockPos.Mutable(); changed.forEachContained((x, y, z) -> { - pos.setPos(x, y, z); - byte block = (byte) world.getLightLevel(LightType.BLOCK, pos); - byte sky = (byte) world.getLightLevel(LightType.SKY, pos); + pos.set(x, y, z); + byte block = (byte) world.getBrightness(LightType.BLOCK, pos); + byte sky = (byte) world.getBrightness(LightType.SKY, pos); int i = top - y; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java index f8994d9e7..5599b93a4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java @@ -36,7 +36,7 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { } @Override - public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) { + public boolean shouldRenderOffScreen(KineticTileEntity p_188185_1_) { return true; } @@ -44,7 +44,7 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; super.renderSafe(te, partialTicks, ms, buffer, light, overlay); float offset = getOffset(te, partialTicks); @@ -53,18 +53,18 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { Axis rotationAxis = ((IRotate) te.getBlockState() .getBlock()).getRotationAxis(te.getBlockState()); kineticRotationTransform(getRotatedCoil(te), te, rotationAxis, AngleHelper.rad(offset * 180), light) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + .renderInto(ms, buffer.getBuffer(RenderType.solid())); - World world = te.getWorld(); + World world = te.getLevel(); BlockState blockState = te.getBlockState(); - BlockPos pos = te.getPos(); + BlockPos pos = te.getBlockPos(); SuperByteBuffer halfMagnet = PartialBufferer.get(this.halfMagnet, blockState); SuperByteBuffer halfRope = PartialBufferer.get(this.halfRope, blockState); SuperByteBuffer magnet = renderMagnet(te); SuperByteBuffer rope = renderRope(te); - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + IVertexBuilder vb = buffer.getBuffer(RenderType.solid()); if (running || offset == 0) renderAt(world, offset > .25f ? magnet : halfMagnet, offset, pos, ms, vb); @@ -81,8 +81,8 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { private void renderAt(IWorld world, SuperByteBuffer partial, float offset, BlockPos pulleyPos, MatrixStack ms, IVertexBuilder buffer) { - BlockPos actualPos = pulleyPos.down((int) offset); - int light = WorldRenderer.getLightmapCoordinates(world, world.getBlockState(actualPos), actualPos); + BlockPos actualPos = pulleyPos.below((int) offset); + int light = WorldRenderer.getLightColor(world, world.getBlockState(actualPos), actualPos); partial.translate(0, -offset, 0) .light(light) .renderInto(ms, buffer); @@ -107,7 +107,7 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { protected SuperByteBuffer getRotatedCoil(KineticTileEntity te) { BlockState blockState = te.getBlockState(); - return PartialBufferer.getFacing(getCoil(), blockState, Direction.getFacingFromAxis(AxisDirection.POSITIVE, getShaftAxis(te))); + return PartialBufferer.getFacing(getCoil(), blockState, Direction.get(AxisDirection.POSITIVE, getShaftAxis(te))); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java index b6fb4679c..c748a0568 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java @@ -1,7 +1,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pulley; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.OrientedData; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyTileEntity; @@ -20,11 +21,15 @@ public class HosePulleyInstance extends AbstractPulleyInstance { } protected Instancer getMagnetModel() { - return getOrientedMaterial().getModel(AllBlockPartials.HOSE_MAGNET, blockState); + return materialManager.defaultCutout() + .material(Materials.ORIENTED) + .getModel(AllBlockPartials.HOSE_MAGNET, blockState); } protected Instancer getHalfMagnetModel() { - return getOrientedMaterial().getModel(AllBlockPartials.HOSE_HALF_MAGNET, blockState); + return materialManager.defaultCutout() + .material(Materials.ORIENTED) + .getModel(AllBlockPartials.HOSE_HALF_MAGNET, blockState); } protected Instancer getCoilModel() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java index adcaca95f..c482ac605 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java @@ -42,7 +42,7 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE te.assembleNextTick = true); return ActionResultType.SUCCESS; @@ -84,7 +84,7 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(BlockStateProperties.WATERLOGGED); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, IWorld world, BlockPos pos, BlockPos neighbourPos) { - if (state.get(BlockStateProperties.WATERLOGGED)) { - world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + if (state.getValue(BlockStateProperties.WATERLOGGED)) { + world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return state; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - FluidState FluidState = context.getWorld().getFluidState(context.getPos()); - return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(FluidState.getFluid() == Fluids.WATER)); + FluidState FluidState = context.getLevel().getFluidState(context.getClickedPos()); + return super.getStateForPlacement(context).setValue(BlockStateProperties.WATERLOGGED, Boolean.valueOf(FluidState.getType() == Fluids.WATER)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java index 27d75fa07..e148c3837 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java @@ -17,9 +17,9 @@ public class PulleyLighter extends ContraptionLighter { GridAlignedBB bounds = GridAlignedBB.from(contraption.bounds); - World world = contraption.entity.world; + World world = contraption.entity.level; - BlockPos.Mutable pos = contraption.anchor.mutableCopy(); + BlockPos.Mutable pos = contraption.anchor.mutable(); while (!AllBlocks.ROPE_PULLEY.has(world.getBlockState(pos)) && pos.getY() < 256) { pos.move(0, 1, 0); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java index c1813dc06..233dbe8d5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java @@ -21,7 +21,7 @@ public class PulleyRenderer extends AbstractPulleyRenderer { @Override protected Axis getShaftAxis(KineticTileEntity te) { return te.getBlockState() - .get(PulleyBlock.HORIZONTAL_AXIS); + .getValue(PulleyBlock.HORIZONTAL_AXIS); } @Override @@ -57,7 +57,7 @@ public class PulleyRenderer extends AbstractPulleyRenderer { if (tile.movedContraption != null) { AbstractContraptionEntity e = tile.movedContraption; PulleyContraption c = (PulleyContraption) tile.movedContraption.getContraption(); - double entityPos = MathHelper.lerp(partialTicks, e.lastTickPosY, e.getY()); + double entityPos = MathHelper.lerp(partialTicks, e.yOld, e.getY()); offset = (float) -(entityPos - c.anchor.getY() - c.initialOffset); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java index f892445c5..5af548f7c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java @@ -35,12 +35,12 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { @Override public AxisAlignedBB makeRenderBoundingBox() { - return super.makeRenderBoundingBox().expand(0, -offset, 0); + return super.makeRenderBoundingBox().expandTowards(0, -offset, 0); } @Override - public double getMaxRenderDistanceSquared() { - return super.getMaxRenderDistanceSquared() + offset * offset; + public double getViewDistance() { + return super.getViewDistance() + offset * offset; } @Override @@ -52,7 +52,7 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { @Override protected void assemble() throws AssemblyException { - if (!(world.getBlockState(pos) + if (!(level.getBlockState(worldPosition) .getBlock() instanceof PulleyBlock)) return; if (speed == 0) @@ -60,8 +60,8 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { int maxLength = AllConfigs.SERVER.kinetics.maxRopeLength.get(); int i = 1; while (i <= maxLength) { - BlockPos ropePos = pos.down(i); - BlockState ropeState = world.getBlockState(ropePos); + BlockPos ropePos = worldPosition.below(i); + BlockState ropeState = level.getBlockState(ropePos); if (!AllBlocks.ROPE.has(ropeState) && !AllBlocks.PULLEY_MAGNET.has(ropeState)) { break; } @@ -74,15 +74,15 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { return; // Collect Construct - if (!world.isRemote) { - BlockPos anchor = pos.down(MathHelper.floor(offset + 1)); + if (!level.isClientSide) { + BlockPos anchor = worldPosition.below(MathHelper.floor(offset + 1)); initialOffset = MathHelper.floor(offset); PulleyContraption contraption = new PulleyContraption(initialOffset); - boolean canAssembleStructure = contraption.assemble(world, anchor); + boolean canAssembleStructure = contraption.assemble(level, anchor); if (canAssembleStructure) { Direction movementDirection = getSpeed() > 0 ? Direction.DOWN : Direction.UP; - if (ContraptionCollider.isCollidingWithWorld(world, contraption, anchor.offset(movementDirection), + if (ContraptionCollider.isCollidingWithWorld(level, contraption, anchor.relative(movementDirection), movementDirection)) canAssembleStructure = false; } @@ -91,21 +91,21 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { return; for (i = ((int) offset); i > 0; i--) { - BlockPos offset = pos.down(i); - BlockState oldState = world.getBlockState(offset); - if (oldState.getBlock() instanceof IWaterLoggable && oldState.contains(BlockStateProperties.WATERLOGGED) - && oldState.get(BlockStateProperties.WATERLOGGED)) { - world.setBlockState(offset, Blocks.WATER.getDefaultState(), 66); + BlockPos offset = worldPosition.below(i); + BlockState oldState = level.getBlockState(offset); + if (oldState.getBlock() instanceof IWaterLoggable && oldState.hasProperty(BlockStateProperties.WATERLOGGED) + && oldState.getValue(BlockStateProperties.WATERLOGGED)) { + level.setBlock(offset, Blocks.WATER.defaultBlockState(), 66); continue; } - world.setBlockState(offset, Blocks.AIR.getDefaultState(), 66); + level.setBlock(offset, Blocks.AIR.defaultBlockState(), 66); } if (!contraption.getBlocks().isEmpty()) { - contraption.removeBlocksFromWorld(world, BlockPos.ZERO); - movedContraption = ControlledContraptionEntity.create(world, this, contraption); - movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); - world.addEntity(movedContraption); + contraption.removeBlocksFromWorld(level, BlockPos.ZERO); + movedContraption = ControlledContraptionEntity.create(level, this, contraption); + movedContraption.setPos(anchor.getX(), anchor.getY(), anchor.getZ()); + level.addFreshEntity(movedContraption); forceMove = true; } } @@ -123,33 +123,33 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { if (movedContraption != null) applyContraptionPosition(); - if (!world.isRemote) { - if (!removed) { + if (!level.isClientSide) { + if (!remove) { if (offset > 0) { - BlockPos magnetPos = pos.down((int) offset); - FluidState ifluidstate = world.getFluidState(magnetPos); - world.destroyBlock(magnetPos, world.getBlockState(magnetPos) - .getCollisionShape(world, magnetPos) + BlockPos magnetPos = worldPosition.below((int) offset); + FluidState ifluidstate = level.getFluidState(magnetPos); + level.destroyBlock(magnetPos, level.getBlockState(magnetPos) + .getCollisionShape(level, magnetPos) .isEmpty()); - world.setBlockState(magnetPos, AllBlocks.PULLEY_MAGNET.getDefaultState() - .with(BlockStateProperties.WATERLOGGED, - Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)), + level.setBlock(magnetPos, AllBlocks.PULLEY_MAGNET.getDefaultState() + .setValue(BlockStateProperties.WATERLOGGED, + Boolean.valueOf(ifluidstate.getType() == Fluids.WATER)), 66); } boolean[] waterlog = new boolean[(int) offset]; for (int i = 1; i <= ((int) offset) - 1; i++) { - BlockPos ropePos = pos.down(i); - FluidState ifluidstate = world.getFluidState(ropePos); - waterlog[i] = ifluidstate.getFluid() == Fluids.WATER; - world.destroyBlock(ropePos, world.getBlockState(ropePos) - .getCollisionShape(world, ropePos) + BlockPos ropePos = worldPosition.below(i); + FluidState ifluidstate = level.getFluidState(ropePos); + waterlog[i] = ifluidstate.getType() == Fluids.WATER; + level.destroyBlock(ropePos, level.getBlockState(ropePos) + .getCollisionShape(level, ropePos) .isEmpty()); } for (int i = 1; i <= ((int) offset) - 1; i++) - world.setBlockState(pos.down(i), AllBlocks.ROPE.getDefaultState() - .with(BlockStateProperties.WATERLOGGED, waterlog[i]), 66); + level.setBlock(worldPosition.below(i), AllBlocks.ROPE.getDefaultState() + .setValue(BlockStateProperties.WATERLOGGED, waterlog[i]), 66); } if (movedContraption != null) @@ -168,7 +168,7 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { protected Vector3d toPosition(float offset) { if (movedContraption.getContraption() instanceof PulleyContraption) { PulleyContraption contraption = (PulleyContraption) movedContraption.getContraption(); - return Vector3d.of(contraption.anchor).add(0, contraption.initialOffset - offset, 0); + return Vector3d.atLowerCornerOf(contraption.anchor).add(0, contraption.initialOffset - offset, 0); } return Vector3d.ZERO; @@ -177,16 +177,16 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { @Override protected void visitNewPosition() { super.visitNewPosition(); - if (world.isRemote) + if (level.isClientSide) return; if (movedContraption != null) return; if (getSpeed() <= 0) return; - BlockPos posBelow = pos.down((int) (offset + getMovementSpeed()) + 1); - BlockState state = world.getBlockState(posBelow); - if (!BlockMovementChecks.isMovementNecessary(state, world, posBelow)) + BlockPos posBelow = worldPosition.below((int) (offset + getMovementSpeed()) + 1); + BlockState state = level.getBlockState(posBelow); + if (!BlockMovementChecks.isMovementNecessary(state, level, posBelow)) return; if (BlockMovementChecks.isBrittle(state)) return; @@ -209,7 +209,7 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { @Override protected int getExtensionRange() { - return Math.max(0, Math.min(AllConfigs.SERVER.kinetics.maxRopeLength.get(), pos.getY() - 1)); + return Math.max(0, Math.min(AllConfigs.SERVER.kinetics.maxRopeLength.get(), worldPosition.getY() - 1)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java index 1fc46cab0..a832532d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pu import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.core.materials.OrientedData; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java index 4c02741d1..ab49754c5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; @@ -22,6 +22,6 @@ public abstract class ActorInstance { public void beginFrame() { } protected int localBlockLight() { - return simulationWorld.getLightLevel(LightType.BLOCK, context.localPos); + return simulationWorld.getBrightness(LightType.BLOCK, context.localPos); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionGroup.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionGroup.java new file mode 100644 index 000000000..582694840 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionGroup.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.render; + +import com.jozufozu.flywheel.backend.material.MaterialGroup; +import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.state.IRenderState; + +public class ContraptionGroup

extends MaterialGroup

{ + + private final RenderedContraption contraption; + + public ContraptionGroup(RenderedContraption contraption, MaterialManager

owner, IRenderState state) { + super(owner, state); + + this.contraption = contraption; + } + + @Override + public void setup(P program) { + contraption.setup(program); + } + + public static

MaterialManager.GroupFactory

forContraption(RenderedContraption c) { + return (materialManager, state) -> new ContraptionGroup<>(c, materialManager, state); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionInstanceManager.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionInstanceManager.java index 1cf73852d..47cd9258a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionInstanceManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionInstanceManager.java @@ -7,7 +7,7 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.tuple.Pair; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMaterialManager.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMaterialManager.java deleted file mode 100644 index fc66294b9..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMaterialManager.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.simibubi.create.content.contraptions.components.structureMovement.render; - -import com.jozufozu.flywheel.backend.instancing.MaterialManager; -import com.jozufozu.flywheel.backend.instancing.MaterialRenderer; -import com.jozufozu.flywheel.core.WorldContext; -import com.jozufozu.flywheel.core.shader.IProgramCallback; - -import net.minecraft.client.renderer.RenderType; -import net.minecraft.util.math.vector.Matrix4f; - -public class ContraptionMaterialManager extends MaterialManager { - public ContraptionMaterialManager(WorldContext context) { - super(context); - } - - @Override - public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ, IProgramCallback callback) { - for (MaterialRenderer material : atlasRenderers) { - material.render(layer, viewProjection, camX, camY, camZ, callback); - } - } -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMatrices.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMatrices.java index d6e82d17d..199d07e48 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMatrices.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMatrices.java @@ -30,36 +30,36 @@ public class ContraptionMatrices { } public Matrix4f getFinalModel() { - Matrix4f finalModel = entityStack.peek().getModel().copy(); - finalModel.multiply(contraptionStack.peek().getModel()); + Matrix4f finalModel = entityStack.last().pose().copy(); + finalModel.multiply(contraptionStack.last().pose()); return finalModel; } public Matrix3f getFinalNormal() { - Matrix3f finalNormal = entityStack.peek().getNormal().copy(); - finalNormal.multiply(contraptionStack.peek().getNormal()); + Matrix3f finalNormal = entityStack.last().normal().copy(); + finalNormal.mul(contraptionStack.last().normal()); return finalNormal; } public Matrix4f getFinalLight() { Matrix4f lightTransform = entityMatrix.copy(); - lightTransform.multiply(contraptionStack.peek().getModel()); + lightTransform.multiply(contraptionStack.last().pose()); return lightTransform; } public static Matrix4f translateTo(Entity entity, float partialTicks) { - double x = MathHelper.lerp(partialTicks, entity.lastTickPosX, entity.getX()); - double y = MathHelper.lerp(partialTicks, entity.lastTickPosY, entity.getY()); - double z = MathHelper.lerp(partialTicks, entity.lastTickPosZ, entity.getZ()); - return Matrix4f.translate((float) x, (float) y, (float) z); + double x = MathHelper.lerp(partialTicks, entity.xOld, entity.getX()); + double y = MathHelper.lerp(partialTicks, entity.yOld, entity.getY()); + double z = MathHelper.lerp(partialTicks, entity.zOld, entity.getZ()); + return Matrix4f.createTranslateMatrix((float) x, (float) y, (float) z); } public static void transform(MatrixStack ms, MatrixStack transform) { - ms.peek().getModel() - .multiply(transform.peek() - .getModel()); - ms.peek().getNormal() - .multiply(transform.peek() - .getNormal()); + ms.last().pose() + .multiply(transform.last() + .pose()); + ms.last().normal() + .mul(transform.last() + .normal()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index cd6f7973b..ebd61a4a4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -5,9 +5,6 @@ import static org.lwjgl.opengl.GL11.glBindTexture; import static org.lwjgl.opengl.GL11.glDisable; import static org.lwjgl.opengl.GL11.glEnable; import static org.lwjgl.opengl.GL12.GL_TEXTURE_3D; -import static org.lwjgl.opengl.GL13.GL_TEXTURE0; -import static org.lwjgl.opengl.GL13.GL_TEXTURE4; -import static org.lwjgl.opengl.GL13.glActiveTexture; import static org.lwjgl.opengl.GL20.glUseProgram; import java.util.List; @@ -16,24 +13,28 @@ import java.util.Random; import org.apache.commons.lang3.tuple.Pair; import com.jozufozu.flywheel.backend.Backend; +import com.jozufozu.flywheel.backend.gl.GlTextureUnit; +import com.jozufozu.flywheel.backend.state.RenderLayer; import com.jozufozu.flywheel.event.BeginFrameEvent; import com.jozufozu.flywheel.event.GatherContextEvent; import com.jozufozu.flywheel.event.ReloadRenderersEvent; import com.jozufozu.flywheel.event.RenderLayerEvent; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.render.AllProgramSpecs; import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.CreateContexts; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.TileEntityRenderHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -68,7 +69,7 @@ import net.minecraftforge.fml.common.Mod; @Mod.EventBusSubscriber(Dist.CLIENT) public class ContraptionRenderDispatcher { private static final Lazy MODEL_RENDERER = Lazy.of(() -> new BlockModelRenderer(Minecraft.getInstance().getBlockColors())); - private static final Lazy BLOCK_MODELS = Lazy.of(() -> Minecraft.getInstance().getModelManager().getBlockModelShapes()); + private static final Lazy BLOCK_MODELS = Lazy.of(() -> Minecraft.getInstance().getModelManager().getBlockModelShaper()); private static int worldHolderRefreshCounter; public static final Int2ObjectMap RENDERERS = new Int2ObjectOpenHashMap<>(); @@ -76,10 +77,12 @@ public class ContraptionRenderDispatcher { public static final Compartment> CONTRAPTION = new Compartment<>(); public static void tick() { - if (Minecraft.getInstance().isGamePaused()) return; + if (Minecraft.getInstance().isPaused()) return; for (RenderedContraption contraption : RENDERERS.values()) { - contraption.getLighter().tick(contraption); + ContraptionLighter lighter = contraption.getLighter(); + if (lighter.getBounds().volume() < AllConfigs.CLIENT.maxContraptionLightVolume.get()) + lighter.tick(contraption); contraption.kinetics.tick(); } @@ -94,9 +97,9 @@ public class ContraptionRenderDispatcher { @SubscribeEvent public static void beginFrame(BeginFrameEvent event) { ActiveRenderInfo info = event.getInfo(); - double camX = info.getProjectedView().x; - double camY = info.getProjectedView().y; - double camZ = info.getProjectedView().z; + double camX = info.getPosition().x; + double camY = info.getPosition().y; + double camZ = info.getPosition().z; for (RenderedContraption renderer : RENDERERS.values()) { renderer.beginFrame(info, camX, camY, camZ); } @@ -109,9 +112,9 @@ public class ContraptionRenderDispatcher { if (RENDERERS.isEmpty()) return; RenderType layer = event.getType(); - layer.startDrawing(); + layer.setupRenderState(); glEnable(GL_TEXTURE_3D); - glActiveTexture(GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 + GlTextureUnit.T4.makeActive(); // the shaders expect light volumes to be in texture 4 if (Backend.getInstance().canUseVBOs()) { ContraptionProgram structureShader = CreateContexts.STRUCTURE.getProgram(AllProgramSpecs.STRUCTURE); @@ -126,15 +129,18 @@ public class ContraptionRenderDispatcher { } if (Backend.getInstance().canUseInstancing()) { - for (RenderedContraption renderer : RENDERERS.values()) { - renderer.materialManager.render(layer, event.viewProjection, event.camX, event.camY, event.camZ, renderer::setup); + RenderLayer renderLayer = RenderLayer.fromRenderType(layer); + if (renderLayer != null) { + for (RenderedContraption renderer : RENDERERS.values()) { + renderer.materialManager.render(renderLayer, event.viewProjection, event.camX, event.camY, event.camZ); + } } } glBindTexture(GL_TEXTURE_3D, 0); - layer.endDrawing(); + layer.clearRenderState(); glDisable(GL_TEXTURE_3D); - glActiveTexture(GL_TEXTURE0); + GlTextureUnit.T0.makeActive(); glUseProgram(0); } @@ -149,7 +155,7 @@ public class ContraptionRenderDispatcher { public static void render(AbstractContraptionEntity entity, Contraption contraption, ContraptionMatrices matrices, IRenderTypeBuffer buffers) { - World world = entity.world; + World world = entity.level; if (Backend.getInstance().canUseVBOs() && Backend.isFlywheelWorld(world)) { RenderedContraption renderer = getRenderer(world, contraption); PlacementSimulationWorld renderWorld = renderer.renderWorld; @@ -165,7 +171,7 @@ public class ContraptionRenderDispatcher { } private static RenderedContraption getRenderer(World world, Contraption c) { - int entityId = c.entity.getEntityId(); + int entityId = c.entity.getId(); RenderedContraption contraption = RENDERERS.get(entityId); if (contraption == null) { @@ -178,7 +184,7 @@ public class ContraptionRenderDispatcher { } private static ContraptionWorldHolder getWorldHolder(World world, Contraption c) { - int entityId = c.entity.getEntityId(); + int entityId = c.entity.getId(); ContraptionWorldHolder holder = WORLD_HOLDERS.get(entityId); if (holder == null) { @@ -198,10 +204,10 @@ public class ContraptionRenderDispatcher { for (Template.BlockInfo info : c.getBlocks() .values()) // Skip individual lighting updates to prevent lag with large contraptions - renderWorld.setBlockState(info.pos, info.state, 128); + renderWorld.setBlock(info.pos, info.state, 128); renderWorld.updateLightSources(); - renderWorld.lighter.tick(Integer.MAX_VALUE, false, false); + renderWorld.lighter.runUpdates(Integer.MAX_VALUE, false, false); return renderWorld; } @@ -210,7 +216,7 @@ public class ContraptionRenderDispatcher { ContraptionMatrices matrices, IRenderTypeBuffer buffer) { renderTileEntities(world, renderWorld, c, matrices, buffer); if (buffer instanceof IRenderTypeBuffer.Impl) - ((IRenderTypeBuffer.Impl) buffer).draw(); + ((IRenderTypeBuffer.Impl) buffer).endBatch(); renderActors(world, renderWorld, c, matrices, buffer); } @@ -231,24 +237,24 @@ public class ContraptionRenderDispatcher { Template.BlockInfo blockInfo = actor.getLeft(); MatrixStack m = matrices.contraptionStack; - m.push(); - MatrixStacker.of(m) + m.pushPose(); + MatrixTransformStack.of(m) .translate(blockInfo.pos); MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); if (movementBehaviour != null) movementBehaviour.renderInContraption(context, renderWorld, matrices, buffer); - m.pop(); + m.popPose(); } } public static void renderStructure(World world, PlacementSimulationWorld renderWorld, Contraption c, ContraptionMatrices matrices, IRenderTypeBuffer buffer) { SuperByteBufferCache bufferCache = CreateClient.BUFFER_CACHE; - List blockLayers = RenderType.getBlockLayers(); + List blockLayers = RenderType.chunkBufferLayers(); - buffer.getBuffer(RenderType.getSolid()); + buffer.getBuffer(RenderType.solid()); for (int i = 0; i < blockLayers.size(); i++) { RenderType layer = blockLayers.get(i); Pair key = Pair.of(c, i); @@ -275,28 +281,28 @@ public class ContraptionRenderDispatcher { builder.begin(GL_QUADS, DefaultVertexFormats.BLOCK); ForgeHooksClient.setRenderLayer(layer); - BlockModelRenderer.enableCache(); + BlockModelRenderer.enableCaching(); for (Template.BlockInfo info : c.getBlocks() .values()) { BlockState state = info.state; - if (state.getRenderType() != BlockRenderType.MODEL) + if (state.getRenderShape() != BlockRenderType.MODEL) continue; if (!RenderTypeLookup.canRenderInLayer(state, layer)) continue; BlockPos pos = info.pos; - ms.push(); + ms.pushPose(); ms.translate(pos.getX(), pos.getY(), pos.getZ()); - MODEL_RENDERER.get().renderModel(renderWorld, BLOCK_MODELS.get().getModel(state), state, pos, ms, builder, true, - random, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); - ms.pop(); + MODEL_RENDERER.get().renderModel(renderWorld, BLOCK_MODELS.get().getBlockModel(state), state, pos, ms, builder, true, + random, 42, OverlayTexture.NO_OVERLAY, EmptyModelData.INSTANCE); + ms.popPose(); } - BlockModelRenderer.disableCache(); + BlockModelRenderer.clearCache(); ForgeHooksClient.setRenderLayer(null); - builder.finishDrawing(); + builder.end(); return builder; } @@ -308,16 +314,16 @@ public class ContraptionRenderDispatcher { for (float zOffset = offset; zOffset >= -offset; zOffset -= 2 * offset) for (float yOffset = offset; yOffset >= -offset; yOffset -= 2 * offset) for (float xOffset = offset; xOffset >= -offset; xOffset -= 2 * offset) { - pos.setPos(lx + xOffset, ly + yOffset, lz + zOffset); - block += world.getLightLevel(LightType.BLOCK, pos) / 8f; - sky += world.getLightLevel(LightType.SKY, pos) / 8f; + pos.set(lx + xOffset, ly + yOffset, lz + zOffset); + block += world.getBrightness(LightType.BLOCK, pos) / 8f; + sky += world.getBrightness(LightType.SKY, pos) / 8f; } return LightTexture.pack((int) block, (int) sky); } public static int getContraptionWorldLight(MovementContext context, PlacementSimulationWorld renderWorld) { - return WorldRenderer.getLightmapCoordinates(renderWorld, context.localPos); + return WorldRenderer.getLightColor(renderWorld, context.localPos); } public static void invalidateAll() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionWorldHolder.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionWorldHolder.java index 4ae414016..0f3cc5ab7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionWorldHolder.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionWorldHolder.java @@ -13,7 +13,7 @@ public class ContraptionWorldHolder { } public int getEntityId() { - return contraption.entity.getEntityId(); + return contraption.entity.getId(); } public boolean isDead() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index 84ce22b80..d195c3066 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -13,7 +13,8 @@ import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.attrib.CommonAttributes; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.instancing.IInstanceRendered; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialGroup; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.backend.model.ArrayModelRenderer; import com.jozufozu.flywheel.backend.model.BufferedModel; import com.jozufozu.flywheel.backend.model.IndexedModel; @@ -60,7 +61,10 @@ public class RenderedContraption extends ContraptionWorldHolder { public RenderedContraption(Contraption contraption, PlacementSimulationWorld renderWorld) { super(contraption, renderWorld); this.lighter = contraption.makeLighter(); - this.materialManager = new ContraptionMaterialManager(CreateContexts.CWORLD); + this.materialManager = MaterialManager.builder(CreateContexts.CWORLD) + .setGroupFactory(ContraptionGroup.forContraption(this)) + .setIgnoreOriginCoordinate(true) + .build(); this.kinetics = new ContraptionInstanceManager(this, materialManager); buildLayers(); @@ -90,18 +94,18 @@ public class RenderedContraption extends ContraptionWorldHolder { MatrixStack stack = new MatrixStack(); - double x = MathHelper.lerp(pt, entity.lastTickPosX, entity.getX()) - camX; - double y = MathHelper.lerp(pt, entity.lastTickPosY, entity.getY()) - camY; - double z = MathHelper.lerp(pt, entity.lastTickPosZ, entity.getZ()) - camZ; + double x = MathHelper.lerp(pt, entity.xOld, entity.getX()) - camX; + double y = MathHelper.lerp(pt, entity.yOld, entity.getY()) - camY; + double z = MathHelper.lerp(pt, entity.zOld, entity.getZ()) - camZ; stack.translate(x, y, z); entity.doLocalTransforms(pt, new MatrixStack[] { stack }); - model = stack.peek().getModel(); + model = stack.last().pose(); AxisAlignedBB lightBox = GridAlignedBB.toAABB(lighter.lightVolume.getTextureVolume()); - this.lightBox = lightBox.offset(-camX, -camY, -camZ); + this.lightBox = lightBox.move(-camX, -camY, -camZ); } void setup(ContraptionProgram shader) { @@ -129,7 +133,7 @@ public class RenderedContraption extends ContraptionWorldHolder { renderLayers.clear(); - List blockLayers = RenderType.getBlockLayers(); + List blockLayers = RenderType.chunkBufferLayers(); for (RenderType layer : blockLayers) { BufferedModel layerModel = buildStructureModel(renderWorld, contraption, layer); @@ -148,11 +152,11 @@ public class RenderedContraption extends ContraptionWorldHolder { if (!tileEntities.isEmpty()) { for (TileEntity te : tileEntities) { if (te instanceof IInstanceRendered) { - World world = te.getWorld(); - BlockPos pos = te.getPos(); - te.setLocation(renderWorld, pos); + World world = te.getLevel(); + BlockPos pos = te.getBlockPos(); + te.setLevelAndPosition(renderWorld, pos); kinetics.add(te); - te.setLocation(world, pos); + te.setLevelAndPosition(world, pos); } } } @@ -193,8 +197,8 @@ public class RenderedContraption extends ContraptionWorldHolder { int light = reader.getLight(i); - byte block = (byte) (LightTexture.getBlockLightCoordinates(light) << 4); - byte sky = (byte) (LightTexture.getSkyLightCoordinates(light) << 4); + byte block = (byte) (LightTexture.block(light) << 4); + byte sky = (byte) (LightTexture.sky(light) << 4); vertices.put(block); vertices.put(sky); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ClientMotionPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ClientMotionPacket.java index 1a4c7307c..9e2487763 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ClientMotionPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ClientMotionPacket.java @@ -46,15 +46,15 @@ public class ClientMotionPacket extends SimplePacketBase { .getSender(); if (sender == null) return; - sender.setMotion(motion); + sender.setDeltaMovement(motion); sender.setOnGround(onGround); if (onGround) { - sender.handleFallDamage(sender.fallDistance, 1); + sender.causeFallDamage(sender.fallDistance, 1); sender.fallDistance = 0; - sender.connection.floatingTickCount = 0; + sender.connection.aboveGroundTickCount = 0; } AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> sender), - new LimbSwingUpdatePacket(sender.getEntityId(), sender.getPositionVec(), limbSwing)); + new LimbSwingUpdatePacket(sender.getId(), sender.position(), limbSwing)); }); context.get() .setPacketHandled(true); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionFluidPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionFluidPacket.java index bc0d308bd..fd648bb5d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionFluidPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionFluidPacket.java @@ -41,7 +41,7 @@ public class ContraptionFluidPacket extends SimplePacketBase { public void handle(Supplier context) { context.get() .enqueueWork(() -> { - Entity entityByID = Minecraft.getInstance().world.getEntityByID(entityId); + Entity entityByID = Minecraft.getInstance().level.getEntity(entityId); if (!(entityByID instanceof AbstractContraptionEntity)) return; AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java index 1120719d6..9d731d735 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java @@ -24,7 +24,7 @@ public class ContraptionInteractionPacket extends SimplePacketBase { public ContraptionInteractionPacket(AbstractContraptionEntity target, Hand hand, BlockPos localPos, Direction side) { this.interactionHand = hand; this.localPos = localPos; - this.target = target.getEntityId(); + this.target = target.getId(); this.face = side; } @@ -33,7 +33,7 @@ public class ContraptionInteractionPacket extends SimplePacketBase { int handId = buffer.readInt(); interactionHand = handId == -1 ? null : Hand.values()[handId]; localPos = buffer.readBlockPos(); - face = Direction.byIndex(buffer.readShort()); + face = Direction.from3DDataValue(buffer.readShort()); } @Override @@ -41,7 +41,7 @@ public class ContraptionInteractionPacket extends SimplePacketBase { buffer.writeInt(target); buffer.writeInt(interactionHand == null ? -1 : interactionHand.ordinal()); buffer.writeBlockPos(localPos); - buffer.writeShort(face.getIndex()); + buffer.writeShort(face.get3DDataValue()); } @Override @@ -50,20 +50,20 @@ public class ContraptionInteractionPacket extends SimplePacketBase { ServerPlayerEntity sender = context.get().getSender(); if (sender == null) return; - Entity entityByID = sender.getServerWorld().getEntityByID(target); + Entity entityByID = sender.getLevel().getEntity(target); if (!(entityByID instanceof AbstractContraptionEntity)) return; AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID; double d = sender.getAttribute(ForgeMod.REACH_DISTANCE.get()).getValue() + 10; - if (!sender.canEntityBeSeen(entityByID)) + if (!sender.canSee(entityByID)) d -= 3; d *= d; - if (sender.getDistanceSq(entityByID) > d) { + if (sender.distanceToSqr(entityByID) > d) { // TODO log? return; } if (contraptionEntity.handlePlayerInteraction(sender, localPos, face, interactionHand)) - sender.swingHand(interactionHand, true); + sender.swing(interactionHand, true); }); context.get().setPacketHandled(true); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionSeatMappingPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionSeatMappingPacket.java index 6d6ce8d8f..b05df0f01 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionSeatMappingPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionSeatMappingPacket.java @@ -28,7 +28,7 @@ public class ContraptionSeatMappingPacket extends SimplePacketBase { mapping = new HashMap<>(); short size = buffer.readShort(); for (int i = 0; i < size; i++) - mapping.put(buffer.readUniqueId(), (int) buffer.readShort()); + mapping.put(buffer.readUUID(), (int) buffer.readShort()); } @Override @@ -36,7 +36,7 @@ public class ContraptionSeatMappingPacket extends SimplePacketBase { buffer.writeInt(entityID); buffer.writeShort(mapping.size()); mapping.forEach((k, v) -> { - buffer.writeUniqueId(k); + buffer.writeUUID(k); buffer.writeShort(v); }); } @@ -45,7 +45,7 @@ public class ContraptionSeatMappingPacket extends SimplePacketBase { public void handle(Supplier context) { context.get() .enqueueWork(() -> { - Entity entityByID = Minecraft.getInstance().world.getEntityByID(entityID); + Entity entityByID = Minecraft.getInstance().level.getEntity(entityID); if (!(entityByID instanceof AbstractContraptionEntity)) return; AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/LimbSwingUpdatePacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/LimbSwingUpdatePacket.java index c4f1f70a8..454ef81d4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/LimbSwingUpdatePacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/LimbSwingUpdatePacket.java @@ -43,17 +43,17 @@ public class LimbSwingUpdatePacket extends SimplePacketBase { public void handle(Supplier context) { context.get() .enqueueWork(() -> { - ClientWorld world = Minecraft.getInstance().world; + ClientWorld world = Minecraft.getInstance().level; if (world == null) return; - Entity entity = world.getEntityByID(entityId); + Entity entity = world.getEntity(entityId); if (entity == null) return; CompoundNBT data = entity.getPersistentData(); data.putInt("LastOverrideLimbSwingUpdate", 0); data.putFloat("OverrideLimbSwing", limbSwing); - entity.setPositionAndRotationDirect(position.x, position.y, position.z, entity.rotationYaw, - entity.rotationPitch, 2, false); + entity.lerpTo(position.x, position.y, position.z, entity.yRot, + entity.xRot, 2, false); }); context.get() .setPacketHandled(true); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingCreationPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingCreationPacket.java index 795a3e89e..c042219d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingCreationPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingCreationPacket.java @@ -14,8 +14,8 @@ public class CouplingCreationPacket extends SimplePacketBase { int id1, id2; public CouplingCreationPacket(AbstractMinecartEntity cart1, AbstractMinecartEntity cart2) { - id1 = cart1.getEntityId(); - id2 = cart2.getEntityId(); + id1 = cart1.getId(); + id2 = cart2.getId(); } public CouplingCreationPacket(PacketBuffer buffer) { @@ -36,7 +36,7 @@ public class CouplingCreationPacket extends SimplePacketBase { ServerPlayerEntity sender = context.get() .getSender(); if (sender != null) - CouplingHandler.tryToCoupleCarts(sender, sender.world, id1, id2); + CouplingHandler.tryToCoupleCarts(sender, sender.level, id1, id2); }); context.get() .setPacketHandled(true); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java index e16e87de6..924bd4d11 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java @@ -67,8 +67,8 @@ public class CouplingHandler { } public static boolean tryToCoupleCarts(@Nullable PlayerEntity player, World world, int cartId1, int cartId2) { - Entity entity1 = world.getEntityByID(cartId1); - Entity entity2 = world.getEntityByID(cartId2); + Entity entity1 = world.getEntity(cartId1); + Entity entity2 = world.getEntity(cartId2); if (!(entity1 instanceof AbstractMinecartEntity)) return false; @@ -80,8 +80,8 @@ public class CouplingHandler { String noLoops = "no_loops"; String tooFar = "too_far"; - int distanceTo = (int) entity1.getPositionVec() - .distanceTo(entity2.getPositionVec()); + int distanceTo = (int) entity1.position() + .distanceTo(entity2.position()); boolean contraptionCoupling = player == null; if (distanceTo < 2) { @@ -97,8 +97,8 @@ public class CouplingHandler { AbstractMinecartEntity cart1 = (AbstractMinecartEntity) entity1; AbstractMinecartEntity cart2 = (AbstractMinecartEntity) entity2; - UUID mainID = cart1.getUniqueID(); - UUID connectedID = cart2.getUniqueID(); + UUID mainID = cart1.getUUID(); + UUID connectedID = cart2.getUUID(); MinecartController mainController = CapabilityMinecartController.getIfPresent(world, mainID); MinecartController connectedController = CapabilityMinecartController.getIfPresent(world, connectedID); @@ -146,7 +146,7 @@ public class CouplingHandler { for (Hand hand : Hand.values()) { if (player.isCreative()) break; - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); if (!AllItems.MINECART_COUPLING.isIn(heldItem)) continue; heldItem.shrink(1); @@ -177,7 +177,7 @@ public class CouplingHandler { public static void status(PlayerEntity player, String key) { if (player == null) return; - player.sendStatusMessage(Lang.translate("minecart_coupling." + key), true); + player.displayClientMessage(Lang.translate("minecart_coupling." + key), true); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java index 00fda4789..d4b34b7c0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java @@ -28,8 +28,8 @@ public class CouplingHandlerClient { return; spawnSelectionParticles(selectedCart.getBoundingBox(), false); ClientPlayerEntity player = Minecraft.getInstance().player; - ItemStack heldItemMainhand = player.getHeldItemMainhand(); - ItemStack heldItemOffhand = player.getHeldItemOffhand(); + ItemStack heldItemMainhand = player.getMainHandItem(); + ItemStack heldItemOffhand = player.getOffhandItem(); if (AllItems.MINECART_COUPLING.isIn(heldItemMainhand) || AllItems.MINECART_COUPLING.isIn(heldItemOffhand)) return; selectedCart = null; @@ -53,14 +53,14 @@ public class CouplingHandlerClient { } private static void spawnSelectionParticles(AxisAlignedBB axisAlignedBB, boolean highlight) { - ClientWorld world = Minecraft.getInstance().world; + ClientWorld world = Minecraft.getInstance().level; Vector3d center = axisAlignedBB.getCenter(); int amount = highlight ? 100 : 2; IParticleData particleData = highlight ? ParticleTypes.END_ROD : new RedstoneParticleData(1, 1, 1, 1); for (int i = 0; i < amount; i++) { Vector3d v = VecHelper.offsetRandomly(Vector3d.ZERO, r, 1); double yOffset = v.y; - v = v.mul(1, 0, 1) + v = v.multiply(1, 0, 1) .normalize() .add(0, yOffset / 8f, 0) .add(center); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java index e16ea5263..24c97dc04 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java @@ -28,7 +28,7 @@ public class CouplingPhysics { float couplingLength = c.getFirst() .getCouplingLength(true); softCollisionStep(world, carts, couplingLength); - if (world.isRemote) + if (world.isClientSide) return; hardCollisionStep(world, carts, couplingLength); } @@ -44,15 +44,15 @@ public class CouplingPhysics { AbstractMinecartEntity cart = carts.get(current); AbstractMinecartEntity otherCart = carts.get(!current); - float stress = (float) (couplingLength - cart.getPositionVec() - .distanceTo(otherCart.getPositionVec())); + float stress = (float) (couplingLength - cart.position() + .distanceTo(otherCart.position())); if (Math.abs(stress) < 1 / 8f) continue; RailShape shape = null; BlockPos railPosition = cart.getCurrentRailPosition(); - BlockState railState = world.getBlockState(railPosition.up()); + BlockState railState = world.getBlockState(railPosition.above()); if (railState.getBlock() instanceof AbstractRailBlock) { AbstractRailBlock block = (AbstractRailBlock) railState.getBlock(); @@ -60,8 +60,8 @@ public class CouplingPhysics { } Vector3d correction = Vector3d.ZERO; - Vector3d pos = cart.getPositionVec(); - Vector3d link = otherCart.getPositionVec() + Vector3d pos = cart.position(); + Vector3d link = otherCart.position() .subtract(pos); float correctionMagnitude = firstLoop ? -stress / 2f : -stress; @@ -83,7 +83,7 @@ public class CouplingPhysics { MinecartSim2020.moveCartAlongTrack(cart, correction, railPosition, railState); else { cart.move(MoverType.SELF, correction); - cart.setMotion(cart.getMotion() + cart.setDeltaMovement(cart.getDeltaMovement() .scale(0.95f)); } firstLoop = false; @@ -95,20 +95,20 @@ public class CouplingPhysics { Couple canAddmotion = carts.map(MinecartSim2020::canAddMotion); // Assuming Minecarts will never move faster than 1 block/tick - Couple motions = carts.map(Entity::getMotion); + Couple motions = carts.map(Entity::getDeltaMovement); motions.replaceWithParams(VecHelper::clamp, Couple.create(1f, 1f)); Couple nextPositions = carts.map(MinecartSim2020::predictNextPositionOf); Couple shapes = carts.mapWithContext((cart, current) -> { AbstractMinecartEntity minecart = cart.getMinecart(); Vector3d vec = nextPositions.get(current); - int x = MathHelper.floor(vec.getX()); - int y = MathHelper.floor(vec.getY()); - int z = MathHelper.floor(vec.getZ()); + int x = MathHelper.floor(vec.x()); + int y = MathHelper.floor(vec.y()); + int z = MathHelper.floor(vec.z()); BlockPos pos = new BlockPos(x, y - 1, z); - if (minecart.world.getBlockState(pos).isIn(BlockTags.RAILS)) pos = pos.down(); + if (minecart.level.getBlockState(pos).is(BlockTags.RAILS)) pos = pos.below(); BlockPos railPosition = pos; - BlockState railState = world.getBlockState(railPosition.up()); + BlockState railState = world.getBlockState(railPosition.above()); if (!(railState.getBlock() instanceof AbstractRailBlock)) return null; AbstractRailBlock block = (AbstractRailBlock) railState.getBlock(); @@ -117,7 +117,7 @@ public class CouplingPhysics { float futureStress = (float) (couplingLength - nextPositions.getFirst() .distanceTo(nextPositions.getSecond())); - if (MathHelper.epsilonEquals(futureStress, 0D)) + if (MathHelper.equal(futureStress, 0D)) return; for (boolean current : Iterate.trueAndFalse) { @@ -147,11 +147,11 @@ public class CouplingPhysics { } motions.replaceWithParams(VecHelper::clamp, maxSpeed); - carts.forEachWithParams(Entity::setMotion, motions); + carts.forEachWithParams(Entity::setDeltaMovement, motions); } public static Vector3d followLinkOnRail(Vector3d link, Vector3d cart, float diffToReduce, Vector3d railAxis) { - double dotProduct = railAxis.dotProduct(link); + double dotProduct = railAxis.dot(link); if (Double.isNaN(dotProduct) || dotProduct == 0 || diffToReduce == 0) return cart; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java index 7e987e371..5183b2959 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.tr import static net.minecraft.util.math.MathHelper.lerp; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; @@ -13,7 +14,6 @@ import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -33,7 +33,7 @@ import net.minecraft.util.math.vector.Vector3f; public class CouplingRenderer { public static void renderAll(MatrixStack ms, IRenderTypeBuffer buffer) { - CouplingHandler.forEachLoadedCoupling(Minecraft.getInstance().world, + CouplingHandler.forEachLoadedCoupling(Minecraft.getInstance().level, c -> { if (c.getFirst().hasContraptionCoupling(true)) return; @@ -43,29 +43,29 @@ public class CouplingRenderer { public static void tickDebugModeRenders() { if (KineticDebugger.isActive()) - CouplingHandler.forEachLoadedCoupling(Minecraft.getInstance().world, CouplingRenderer::doDebugRender); + CouplingHandler.forEachLoadedCoupling(Minecraft.getInstance().level, CouplingRenderer::doDebugRender); } public static void renderCoupling(MatrixStack ms, IRenderTypeBuffer buffer, Couple carts) { - ClientWorld world = Minecraft.getInstance().world; + ClientWorld world = Minecraft.getInstance().level; if (carts.getFirst() == null || carts.getSecond() == null) return; Couple lightValues = - carts.map(c -> WorldRenderer.getLightmapCoordinates(world, new BlockPos(c.getBoundingBox() + carts.map(c -> WorldRenderer.getLightColor(world, new BlockPos(c.getBoundingBox() .getCenter()))); Vector3d center = carts.getFirst() - .getPositionVec() + .position() .add(carts.getSecond() - .getPositionVec()) + .position()) .scale(.5f); Couple transforms = carts.map(c -> getSuitableCartEndpoint(c, center)); - BlockState renderState = Blocks.AIR.getDefaultState(); - IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); + BlockState renderState = Blocks.AIR.defaultBlockState(); + IVertexBuilder builder = buffer.getBuffer(RenderType.solid()); SuperByteBuffer attachment = PartialBufferer.get(AllBlockPartials.COUPLING_ATTACHMENT, renderState); SuperByteBuffer ring = PartialBufferer.get(AllBlockPartials.COUPLING_RING, renderState); SuperByteBuffer connector = PartialBufferer.get(AllBlockPartials.COUPLING_CONNECTOR, renderState); @@ -77,21 +77,21 @@ public class CouplingRenderer { .apply(zero); Vector3d endPointDiff = secondEndpoint.subtract(firstEndpoint); double connectorYaw = -Math.atan2(endPointDiff.z, endPointDiff.x) * 180.0D / Math.PI; - double connectorPitch = Math.atan2(endPointDiff.y, endPointDiff.mul(1, 0, 1) + double connectorPitch = Math.atan2(endPointDiff.y, endPointDiff.multiply(1, 0, 1) .length()) * 180 / Math.PI; - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); carts.forEachWithContext((cart, isFirst) -> { CartEndpoint cartTransform = transforms.get(isFirst); - ms.push(); + ms.pushPose(); cartTransform.apply(ms); attachment.light(lightValues.get(isFirst)) .renderInto(ms, builder); msr.rotateY(connectorYaw - cartTransform.yaw); ring.light(lightValues.get(isFirst)) .renderInto(ms, builder); - ms.pop(); + ms.popPose(); }); int l1 = lightValues.getFirst(); @@ -99,7 +99,7 @@ public class CouplingRenderer { int meanBlockLight = (((l1 >> 4) & 0xf) + ((l2 >> 4) & 0xf)) / 2; int meanSkyLight = (((l1 >> 20) & 0xf) + ((l2 >> 20) & 0xf)) / 2; - ms.push(); + ms.pushPose(); msr.translate(firstEndpoint) .rotateY(connectorYaw) .rotateZ(connectorPitch); @@ -107,11 +107,11 @@ public class CouplingRenderer { connector.light(meanSkyLight << 20 | meanBlockLight << 4) .renderInto(ms, builder); - ms.pop(); + ms.popPose(); } private static CartEndpoint getSuitableCartEndpoint(AbstractMinecartEntity cart, Vector3d centerOfCoupling) { - long i = cart.getEntityId() * 493286711L; + long i = cart.getId() * 493286711L; i = i * i * 4392167121L + i * 98761L; float x = (((float) (i >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; float y = (((float) (i >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F + 0.375F; @@ -119,18 +119,18 @@ public class CouplingRenderer { float pt = AnimationTickHolder.getPartialTicks(); - double xIn = lerp(pt, cart.lastTickPosX, cart.getX()); - double yIn = lerp(pt, cart.lastTickPosY, cart.getY()); - double zIn = lerp(pt, cart.lastTickPosZ, cart.getZ()); + double xIn = lerp(pt, cart.xOld, cart.getX()); + double yIn = lerp(pt, cart.yOld, cart.getY()); + double zIn = lerp(pt, cart.zOld, cart.getZ()); - float yaw = lerp(pt, cart.prevRotationYaw, cart.rotationYaw); - float pitch = lerp(pt, cart.prevRotationPitch, cart.rotationPitch); - float roll = cart.getRollingAmplitude() - pt; + float yaw = lerp(pt, cart.yRotO, cart.yRot); + float pitch = lerp(pt, cart.xRotO, cart.xRot); + float roll = cart.getHurtTime() - pt; float rollAmplifier = cart.getDamage() - pt; if (rollAmplifier < 0.0F) rollAmplifier = 0.0F; - roll = roll > 0 ? MathHelper.sin(roll) * roll * rollAmplifier / 10.0F * cart.getRollingDirection() : 0; + roll = roll > 0 ? MathHelper.sin(roll) * roll * rollAmplifier / 10.0F * cart.getHurtDir() : 0; Vector3d positionVec = new Vector3d(xIn, yIn, zIn); Vector3d frontVec = positionVec.add(VecHelper.rotate(new Vector3d(.5, 0, 0), 180 - yaw, Axis.Y)); @@ -140,8 +140,8 @@ public class CouplingRenderer { boolean flip = false; if (railVecOfPos != null) { - frontVec = cart.getPosOffset(xIn, yIn, zIn, (double) 0.3F); - backVec = cart.getPosOffset(xIn, yIn, zIn, (double) -0.3F); + frontVec = cart.getPosOffs(xIn, yIn, zIn, (double) 0.3F); + backVec = cart.getPosOffs(xIn, yIn, zIn, (double) -0.3F); if (frontVec == null) frontVec = railVecOfPos; if (backVec == null) @@ -165,7 +165,7 @@ public class CouplingRenderer { final float offsetMagnitude = 13 / 16f; boolean isBackFaceCloser = - frontVec.squareDistanceTo(centerOfCoupling) > backVec.squareDistanceTo(centerOfCoupling); + frontVec.distanceToSqr(centerOfCoupling) > backVec.distanceToSqr(centerOfCoupling); flip = isBackFaceCloser; float offset = isBackFaceCloser ? -offsetMagnitude : offsetMagnitude; @@ -204,12 +204,12 @@ public class CouplingRenderer { public void apply(MatrixStack ms) { ms.translate(x, y, z); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(yaw)); - ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(pitch)); - ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(roll)); + ms.mulPose(Vector3f.YP.rotationDegrees(yaw)); + ms.mulPose(Vector3f.ZP.rotationDegrees(pitch)); + ms.mulPose(Vector3f.XP.rotationDegrees(roll)); ms.translate(offset, 0, 0); if (flip) - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(180)); + ms.mulPose(Vector3f.YP.rotationDegrees(180)); } } @@ -218,23 +218,23 @@ public class CouplingRenderer { int yOffset = 1; MinecartController first = c.getFirst(); AbstractMinecartEntity mainCart = first.cart(); - Vector3d mainCenter = mainCart.getPositionVec() + Vector3d mainCenter = mainCart.position() .add(0, yOffset, 0); Vector3d connectedCenter = c.getSecond() .cart() - .getPositionVec() + .position() .add(0, yOffset, 0); int color = ColorHelper.mixColors(0xabf0e9, 0xee8572, (float) MathHelper .clamp(Math.abs(first.getCouplingLength(true) - connectedCenter.distanceTo(mainCenter)) * 8, 0, 1)); - CreateClient.OUTLINER.showLine(mainCart.getEntityId() + "", mainCenter, connectedCenter) + CreateClient.OUTLINER.showLine(mainCart.getId() + "", mainCenter, connectedCenter) .colored(color) .lineWidth(1 / 8f); - Vector3d point = mainCart.getPositionVec() + Vector3d point = mainCart.position() .add(0, yOffset, 0); - CreateClient.OUTLINER.showLine(mainCart.getEntityId() + "_dot", point, point.add(0, 1 / 128f, 0)) + CreateClient.OUTLINER.showLine(mainCart.getId() + "_dot", point, point.add(0, 1 / 128f, 0)) .colored(0xffffff) .lineWidth(1 / 4f); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java index 268ba703a..737f4a828 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java @@ -44,7 +44,7 @@ public class MinecartCouplingItem extends Item { return; MinecartController controller = capability.orElse(null); - ItemStack heldItem = player.getHeldItem(event.getHand()); + ItemStack heldItem = player.getItemInHand(event.getHand()); if (AllItems.MINECART_COUPLING.isIn(heldItem)) { if (!onCouplingInteractOnMinecart(event, minecart, player, controller)) return; @@ -62,11 +62,11 @@ public class MinecartCouplingItem extends Item { AbstractMinecartEntity minecart, PlayerEntity player, MinecartController controller) { World world = event.getWorld(); if (controller.isFullyCoupled()) { - if (!world.isRemote) + if (!world.isClientSide) CouplingHandler.status(player, "two_couplings_max"); return true; } - if (world != null && world.isRemote) + if (world != null && world.isClientSide) DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> cartClicked(player, minecart)); return true; } @@ -76,7 +76,7 @@ public class MinecartCouplingItem extends Item { int couplings = (controller.isConnectedToCoupling() ? 1 : 0) + (controller.isLeadingCoupling() ? 1 : 0); if (couplings == 0) return false; - if (event.getWorld().isRemote) + if (event.getWorld().isClientSide) return true; for (boolean forward : Iterate.trueAndFalse) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java index 0a8f00f41..0c0f3689b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.train; -import static net.minecraft.entity.Entity.horizontalMag; +import static net.minecraft.entity.Entity.getHorizontalDistanceSqr; import java.util.Map; @@ -30,32 +30,32 @@ import net.minecraftforge.common.util.LazyOptional; public class MinecartSim2020 { private static final Map> MATRIX = Util.make(Maps.newEnumMap(RailShape.class), (map) -> { - Vector3i west = Direction.WEST.getDirectionVec(); - Vector3i east = Direction.EAST.getDirectionVec(); - Vector3i north = Direction.NORTH.getDirectionVec(); - Vector3i south = Direction.SOUTH.getDirectionVec(); + Vector3i west = Direction.WEST.getNormal(); + Vector3i east = Direction.EAST.getNormal(); + Vector3i north = Direction.NORTH.getNormal(); + Vector3i south = Direction.SOUTH.getNormal(); map.put(RailShape.NORTH_SOUTH, Pair.of(north, south)); map.put(RailShape.EAST_WEST, Pair.of(west, east)); - map.put(RailShape.ASCENDING_EAST, Pair.of(west.down(), east)); - map.put(RailShape.ASCENDING_WEST, Pair.of(west, east.down())); - map.put(RailShape.ASCENDING_NORTH, Pair.of(north, south.down())); - map.put(RailShape.ASCENDING_SOUTH, Pair.of(north.down(), south)); + map.put(RailShape.ASCENDING_EAST, Pair.of(west.below(), east)); + map.put(RailShape.ASCENDING_WEST, Pair.of(west, east.below())); + map.put(RailShape.ASCENDING_NORTH, Pair.of(north, south.below())); + map.put(RailShape.ASCENDING_SOUTH, Pair.of(north.below(), south)); map.put(RailShape.SOUTH_EAST, Pair.of(south, east)); map.put(RailShape.SOUTH_WEST, Pair.of(south, west)); map.put(RailShape.NORTH_WEST, Pair.of(north, west)); map.put(RailShape.NORTH_EAST, Pair.of(north, east)); }); - + public static Vector3d predictNextPositionOf(AbstractMinecartEntity cart) { - Vector3d position = cart.getPositionVec(); - Vector3d motion = VecHelper.clamp(cart.getMotion(), 1f); + Vector3d position = cart.position(); + Vector3d motion = VecHelper.clamp(cart.getDeltaMovement(), 1f); return position.add(motion); } public static boolean canAddMotion(AbstractMinecartEntity c) { if (c instanceof FurnaceMinecartEntity) - return MathHelper.epsilonEquals(((FurnaceMinecartEntity) c).pushX, 0) - && MathHelper.epsilonEquals(((FurnaceMinecartEntity) c).pushZ, 0); + return MathHelper.equal(((FurnaceMinecartEntity) c).xPush, 0) + && MathHelper.equal(((FurnaceMinecartEntity) c).zPush, 0); LazyOptional capability = c.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY); if (capability.isPresent() && capability.orElse(null) @@ -70,7 +70,7 @@ public class MinecartSim2020 { if (forcedMovement.equals(Vector3d.ZERO)) return; - Vector3d previousMotion = cart.getMotion(); + Vector3d previousMotion = cart.getDeltaMovement(); cart.fallDistance = 0.0F; double x = cart.getX(); @@ -85,7 +85,7 @@ public class MinecartSim2020 { actualY = cartPos.getY() + 1; AbstractRailBlock abstractrailblock = (AbstractRailBlock) trackState.getBlock(); - RailShape railshape = abstractrailblock.getRailDirection(trackState, cart.world, cartPos, cart); + RailShape railshape = abstractrailblock.getRailDirection(trackState, cart.level, cartPos, cart); switch (railshape) { case ASCENDING_EAST: forcedMovement = forcedMovement.add(-1 * cart.getSlopeAdjustment(), 0.0D, 0.0D); @@ -138,8 +138,8 @@ public class MinecartSim2020 { actualX = d23 + d4 * d14; actualZ = d10 + d5 * d14; - cart.setPosition(actualX, actualY, actualZ); - cart.setMotion(forcedMovement); + cart.setPos(actualX, actualY, actualZ); + cart.setDeltaMovement(forcedMovement); cart.moveMinecartOnRail(cartPos); x = cart.getX(); @@ -148,10 +148,10 @@ public class MinecartSim2020 { if (Vector3i.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == Vector3i.getX() && MathHelper.floor(z) - cartPos.getZ() == Vector3i.getZ()) { - cart.setPosition(x, y + (double) Vector3i.getY(), z); + cart.setPos(x, y + (double) Vector3i.getY(), z); } else if (Vector3i1.getY() != 0 && MathHelper.floor(x) - cartPos.getX() == Vector3i1.getX() && MathHelper.floor(z) - cartPos.getZ() == Vector3i1.getZ()) { - cart.setPosition(x, y + (double) Vector3i1.getY(), z); + cart.setPos(x, y + (double) Vector3i1.getY(), z); } x = cart.getX(); @@ -161,13 +161,13 @@ public class MinecartSim2020 { Vector3d Vector3d3 = cart.getPos(x, y, z); if (Vector3d3 != null && actualVec != null) { double d17 = (actualVec.y - Vector3d3.y) * 0.05D; - Vector3d Vector3d4 = cart.getMotion(); - double d18 = Math.sqrt(horizontalMag(Vector3d4)); + Vector3d Vector3d4 = cart.getDeltaMovement(); + double d18 = Math.sqrt(getHorizontalDistanceSqr(Vector3d4)); if (d18 > 0.0D) { - cart.setMotion(Vector3d4.mul((d18 + d17) / d18, 1.0D, (d18 + d17) / d18)); + cart.setDeltaMovement(Vector3d4.multiply((d18 + d17) / d18, 1.0D, (d18 + d17) / d18)); } - cart.setPosition(x, Vector3d3.y, z); + cart.setPos(x, Vector3d3.y, z); } x = cart.getX(); @@ -177,12 +177,12 @@ public class MinecartSim2020 { int j = MathHelper.floor(x); int i = MathHelper.floor(z); if (j != cartPos.getX() || i != cartPos.getZ()) { - Vector3d Vector3d5 = cart.getMotion(); - double d26 = Math.sqrt(horizontalMag(Vector3d5)); - cart.setMotion(d26 * (double) (j - cartPos.getX()), Vector3d5.y, d26 * (double) (i - cartPos.getZ())); + Vector3d Vector3d5 = cart.getDeltaMovement(); + double d26 = Math.sqrt(getHorizontalDistanceSqr(Vector3d5)); + cart.setDeltaMovement(d26 * (double) (j - cartPos.getX()), Vector3d5.y, d26 * (double) (i - cartPos.getZ())); } - cart.setMotion(previousMotion); + cart.setDeltaMovement(previousMotion); } public static Vector3d getRailVec(RailShape shape) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java index fa21259c0..7dcb896ba 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java @@ -80,10 +80,10 @@ public class CapabilityMinecartController implements ICapabilitySerializable(HashMap::new); - loadedMinecartsWithCoupling = new WorldAttached<>(HashSet::new); - queuedAdditions = new WorldAttached<>(() -> ObjectLists.synchronize(new ObjectArrayList<>())); - queuedUnloads = new WorldAttached<>(() -> ObjectLists.synchronize(new ObjectArrayList<>())); + loadedMinecartsByUUID = new WorldAttached<>($ -> new HashMap<>()); + loadedMinecartsWithCoupling = new WorldAttached<>($ -> new HashSet<>()); + queuedAdditions = new WorldAttached<>($ -> ObjectLists.synchronize(new ObjectArrayList<>())); + queuedUnloads = new WorldAttached<>($ -> ObjectLists.synchronize(new ObjectArrayList<>())); } public static void tick(World world) { @@ -98,17 +98,17 @@ public class CapabilityMinecartController implements ICapabilitySerializable capability = cart.getCapability(MINECART_CONTROLLER_CAPABILITY); @@ -120,7 +120,7 @@ public class CapabilityMinecartController implements ICapabilitySerializable carts = loadedMinecartsByUUID.get(world); List unloads = queuedUnloads.get(world); - UUID uniqueID = entity.getUniqueID(); + UUID uniqueID = entity.getUUID(); if (!carts.containsKey(uniqueID) || unloads.contains(uniqueID)) return; - if (world.isRemote) + if (world.isClientSide) return; - handleKilledMinecart(world, carts.get(uniqueID), entity.getPositionVec()); + handleKilledMinecart(world, carts.get(uniqueID), entity.position()); } protected static void handleKilledMinecart(World world, MinecartController controller, Vector3d removedPos) { @@ -184,13 +184,13 @@ public class CapabilityMinecartController implements ICapabilitySerializable { internalStall.booleanValue() || otherCart == null || !otherCart.isPresent() || otherCart.isStalled(false)); })); - if (!world.isRemote) { + if (!world.isClientSide) { setStalled(internalStall.booleanValue(), true); disassemble(cart); } @@ -99,29 +99,29 @@ public class MinecartController implements INBTSerializable { if (passengers.isEmpty() || !(passengers.get(0) instanceof AbstractContraptionEntity)) { return; } - World world = cart.world; + World world = cart.level; int i = MathHelper.floor(cart.getX()); int j = MathHelper.floor(cart.getY()); int k = MathHelper.floor(cart.getZ()); if (world.getBlockState(new BlockPos(i, j - 1, k)) - .isIn(BlockTags.RAILS)) { + .is(BlockTags.RAILS)) { --j; } BlockPos blockpos = new BlockPos(i, j, k); BlockState blockstate = world.getBlockState(blockpos); - if (cart.canUseRail() && blockstate.isIn(BlockTags.RAILS) + if (cart.canUseRail() && blockstate.is(BlockTags.RAILS) && blockstate.getBlock() instanceof PoweredRailBlock && ((PoweredRailBlock) blockstate.getBlock()) .isActivatorRail()) { - if (cart.isBeingRidden()) { - cart.removePassengers(); + if (cart.isVehicle()) { + cart.ejectPassengers(); } - if (cart.getRollingAmplitude() == 0) { - cart.setRollingDirection(-cart.getRollingDirection()); - cart.setRollingAmplitude(10); + if (cart.getHurtTime() == 0) { + cart.setHurtDir(-cart.getHurtDir()); + cart.setHurtTime(10); cart.setDamage(50.0F); - cart.velocityChanged = true; + cart.hurtMarked = true; } } } @@ -172,7 +172,7 @@ public class MinecartController implements INBTSerializable { } public void removeConnection(boolean main) { - if (hasContraptionCoupling(main) && !getWorld().isRemote) { + if (hasContraptionCoupling(main) && !getWorld().isClientSide) { List passengers = cart().getPassengers(); if (!passengers.isEmpty()) { Entity entity = passengers.get(0); @@ -240,8 +240,8 @@ public class MinecartController implements INBTSerializable { } public void coupleWith(boolean isLeading, UUID coupled, float length, boolean contraption) { - UUID mainID = isLeading ? cart().getUniqueID() : coupled; - UUID connectedID = isLeading ? coupled : cart().getUniqueID(); + UUID mainID = isLeading ? cart().getUUID() : coupled; + UUID connectedID = isLeading ? coupled : cart().getUUID(); couplings.set(isLeading, Optional.of(new CouplingData(mainID, connectedID, length, contraption))); needsEntryRefresh |= isLeading; sendData(); @@ -290,7 +290,7 @@ public class MinecartController implements INBTSerializable { } public void sendData() { - if (getWorld().isRemote) + if (getWorld().isClientSide) return; AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(this::cart), new MinecartControllerUpdatePacket(this)); @@ -342,7 +342,7 @@ public class MinecartController implements INBTSerializable { } private World getWorld() { - return cart().getEntityWorld(); + return cart().getCommandSenderWorld(); } private static class CouplingData { @@ -367,16 +367,16 @@ public class MinecartController implements INBTSerializable { CompoundNBT serialize() { CompoundNBT nbt = new CompoundNBT(); - nbt.put("Main", NBTUtil.fromUuid(mainCartID)); - nbt.put("Connected", NBTUtil.fromUuid(connectedCartID)); + nbt.put("Main", NBTUtil.createUUID(mainCartID)); + nbt.put("Connected", NBTUtil.createUUID(connectedCartID)); nbt.putFloat("Length", length); nbt.putBoolean("Contraption", contraption); return nbt; } static CouplingData read(CompoundNBT nbt) { - UUID mainCartID = NBTUtil.readUniqueId(NBTHelper.getINBT(nbt, "Main")); - UUID connectedCartID = NBTUtil.readUniqueId(NBTHelper.getINBT(nbt, "Connected")); + UUID mainCartID = NBTUtil.loadUUID(NBTHelper.getINBT(nbt, "Main")); + UUID connectedCartID = NBTUtil.loadUUID(NBTHelper.getINBT(nbt, "Connected")); float length = nbt.getFloat("Length"); boolean contraption = nbt.getBoolean("Contraption"); return new CouplingData(mainCartID, connectedCartID, length, contraption); @@ -396,22 +396,22 @@ public class MinecartController implements INBTSerializable { private StallData() {} StallData(AbstractMinecartEntity entity) { - position = entity.getPositionVec(); - motion = entity.getMotion(); - yaw = entity.rotationYaw; - pitch = entity.rotationPitch; + position = entity.position(); + motion = entity.getDeltaMovement(); + yaw = entity.yRot; + pitch = entity.xRot; tick(entity); } void tick(AbstractMinecartEntity entity) { - entity.setPosition(position.x, position.y, position.z); - entity.setMotion(Vector3d.ZERO); - entity.rotationYaw = yaw; - entity.rotationPitch = pitch; + entity.setPos(position.x, position.y, position.z); + entity.setDeltaMovement(Vector3d.ZERO); + entity.yRot = yaw; + entity.xRot = pitch; } void release(AbstractMinecartEntity entity) { - entity.setMotion(motion); + entity.setDeltaMovement(motion); } CompoundNBT serialize() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartControllerUpdatePacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartControllerUpdatePacket.java index 58008e2c8..2f52fb897 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartControllerUpdatePacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartControllerUpdatePacket.java @@ -21,19 +21,19 @@ public class MinecartControllerUpdatePacket extends SimplePacketBase { public MinecartControllerUpdatePacket(MinecartController controller) { entityID = controller.cart() - .getEntityId(); + .getId(); nbt = controller.serializeNBT(); } public MinecartControllerUpdatePacket(PacketBuffer buffer) { entityID = buffer.readInt(); - nbt = buffer.readCompoundTag(); + nbt = buffer.readNbt(); } @Override public void write(PacketBuffer buffer) { buffer.writeInt(entityID); - buffer.writeCompoundTag(nbt); + buffer.writeNbt(nbt); } @Override @@ -46,10 +46,10 @@ public class MinecartControllerUpdatePacket extends SimplePacketBase { @OnlyIn(Dist.CLIENT) private void handleCL() { - ClientWorld world = Minecraft.getInstance().world; + ClientWorld world = Minecraft.getInstance().level; if (world == null) return; - Entity entityByID = world.getEntityByID(entityID); + Entity entityByID = world.getEntity(entityID); if (entityByID == null) return; entityByID.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailBlock.java index 4c803185f..2b744df9c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailBlock.java @@ -45,23 +45,23 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl public static final EnumProperty SHAPE = BlockStateProperties.RAIL_SHAPE_STRAIGHT; public static final BooleanProperty BACKWARDS = BooleanProperty.create("backwards"); - public static final IntegerProperty POWER = BlockStateProperties.POWER_0_15; + public static final IntegerProperty POWER = BlockStateProperties.POWER; public ControllerRailBlock(Properties properties) { super(true, properties); - this.setDefaultState(this.stateContainer.getBaseState() - .with(POWER, 0) - .with(BACKWARDS, false) - .with(SHAPE, NORTH_SOUTH)); + this.registerDefaultState(this.stateDefinition.any() + .setValue(POWER, 0) + .setValue(BACKWARDS, false) + .setValue(SHAPE, NORTH_SOUTH)); } public static Vector3i getAccelerationVector(BlockState state) { Direction pointingTo = getPointingTowards(state); - return (isStateBackwards(state) ? pointingTo.getOpposite() : pointingTo).getDirectionVec(); + return (isStateBackwards(state) ? pointingTo.getOpposite() : pointingTo).getNormal(); } private static Direction getPointingTowards(BlockState state) { - switch (state.get(SHAPE)) { + switch (state.getValue(SHAPE)) { case ASCENDING_WEST: case EAST_WEST: return Direction.WEST; @@ -75,9 +75,9 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl } @Override - protected BlockState getUpdatedState(World world, BlockPos pos, BlockState state, boolean p_208489_4_) { - BlockState updatedState = super.getUpdatedState(world, pos, state, p_208489_4_); - if (updatedState.get(SHAPE) == state.get(SHAPE)) + protected BlockState updateDir(World world, BlockPos pos, BlockState state, boolean p_208489_4_) { + BlockState updatedState = super.updateDir(world, pos, state, p_208489_4_); + if (updatedState.getValue(SHAPE) == state.getValue(SHAPE)) return updatedState; BlockState reversedUpdatedState = updatedState; @@ -87,13 +87,13 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl Direction offset = getPointingTowards(updatedState); if (opposite) offset = offset.getOpposite(); - for (BlockPos adjPos : Iterate.hereBelowAndAbove(pos.offset(offset))) { + for (BlockPos adjPos : Iterate.hereBelowAndAbove(pos.relative(offset))) { BlockState adjState = world.getBlockState(adjPos); if (!AllBlocks.CONTROLLER_RAIL.has(adjState)) continue; if (getPointingTowards(adjState).getAxis() != offset.getAxis()) continue; - if (adjState.get(BACKWARDS) != reversedUpdatedState.get(BACKWARDS)) + if (adjState.getValue(BACKWARDS) != reversedUpdatedState.getValue(BACKWARDS)) reversedUpdatedState = reversedUpdatedState.cycle(BACKWARDS); } } @@ -101,31 +101,31 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl // Replace if changed if (reversedUpdatedState != updatedState) - world.setBlockState(pos, reversedUpdatedState); + world.setBlockAndUpdate(pos, reversedUpdatedState); return reversedUpdatedState; } private static void decelerateCart(BlockPos pos, AbstractMinecartEntity cart) { Vector3d diff = VecHelper.getCenterOf(pos) - .subtract(cart.getPositionVec()); - cart.setMotion(diff.x / 16f, 0, diff.z / 16f); + .subtract(cart.position()); + cart.setDeltaMovement(diff.x / 16f, 0, diff.z / 16f); if (cart instanceof FurnaceMinecartEntity) { FurnaceMinecartEntity fme = (FurnaceMinecartEntity) cart; - fme.pushX = fme.pushZ = 0; + fme.xPush = fme.zPush = 0; } } private static boolean isStableWith(BlockState testState, IBlockReader world, BlockPos pos) { - return hasSolidSideOnTop(world, pos.down()) && (!testState.get(SHAPE) - .isAscending() || hasSolidSideOnTop(world, pos.offset(getPointingTowards(testState)))); + return canSupportRigidBlock(world, pos.below()) && (!testState.getValue(SHAPE) + .isAscending() || canSupportRigidBlock(world, pos.relative(getPointingTowards(testState)))); } @Override public BlockState getStateForPlacement(BlockItemUseContext p_196258_1_) { - Direction direction = p_196258_1_.getPlacementHorizontalFacing(); + Direction direction = p_196258_1_.getHorizontalDirection(); BlockState base = super.getStateForPlacement(p_196258_1_); - return (base == null ? getDefaultState() : base).with(BACKWARDS, + return (base == null ? defaultBlockState() : base).setValue(BACKWARDS, direction.getAxisDirection() == AxisDirection.POSITIVE); } @@ -135,26 +135,26 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl } @Override - protected void fillStateContainer(StateContainer.Builder p_206840_1_) { + protected void createBlockStateDefinition(StateContainer.Builder p_206840_1_) { p_206840_1_.add(SHAPE, POWER, BACKWARDS); } @Override public void onMinecartPass(BlockState state, World world, BlockPos pos, AbstractMinecartEntity cart) { - if (world.isRemote) + if (world.isClientSide) return; - Vector3d accelerationVec = Vector3d.of(getAccelerationVector(state)); - double targetSpeed = cart.getMaxSpeedWithRail() * state.get(POWER) / 15f; + Vector3d accelerationVec = Vector3d.atLowerCornerOf(getAccelerationVector(state)); + double targetSpeed = cart.getMaxSpeedWithRail() * state.getValue(POWER) / 15f; if (cart instanceof FurnaceMinecartEntity) { FurnaceMinecartEntity fme = (FurnaceMinecartEntity) cart; - fme.pushX = accelerationVec.x; - fme.pushZ = accelerationVec.z; + fme.xPush = accelerationVec.x; + fme.zPush = accelerationVec.z; } - Vector3d motion = cart.getMotion(); - if ((motion.dotProduct(accelerationVec) >= 0 || motion.lengthSquared() < 0.0001) && targetSpeed > 0) - cart.setMotion(accelerationVec.scale(targetSpeed)); + Vector3d motion = cart.getDeltaMovement(); + if ((motion.dot(accelerationVec) >= 0 || motion.lengthSqr() < 0.0001) && targetSpeed > 0) + cart.setDeltaMovement(accelerationVec.scale(targetSpeed)); else decelerateCart(pos, cart); } @@ -162,12 +162,12 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl @Override protected void updateState(BlockState state, World world, BlockPos pos, Block block) { int newPower = calculatePower(world, pos); - if (state.get(POWER) != newPower) - placeAndNotify(state.with(POWER, newPower), pos, world); + if (state.getValue(POWER) != newPower) + placeAndNotify(state.setValue(POWER, newPower), pos, world); } private int calculatePower(World world, BlockPos pos) { - int newPower = world.getRedstonePowerFromNeighbors(pos); + int newPower = world.getBestNeighborSignal(pos); if (newPower != 0) return newPower; @@ -184,7 +184,7 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl break; forwardDistance++; lastForwardRail = testPos; - forwardPower = world.getRedstonePowerFromNeighbors(testPos); + forwardPower = world.getBestNeighborSignal(testPos); if (forwardPower != 0) break; } @@ -194,7 +194,7 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl break; backwardsDistance++; lastBackwardsRail = testPos; - backwardsPower = world.getRedstonePowerFromNeighbors(testPos); + backwardsPower = world.getBestNeighborSignal(testPos); if (backwardsPower != 0) break; } @@ -213,10 +213,10 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - if (world.isRemote) + World world = context.getLevel(); + if (world.isClientSide) return ActionResultType.SUCCESS; - BlockPos pos = context.getPos(); + BlockPos pos = context.getClickedPos(); for (Rotation testRotation : new Rotation[] { Rotation.CLOCKWISE_90, Rotation.CLOCKWISE_180, Rotation.COUNTERCLOCKWISE_90 }) { BlockState testState = rotate(state, testRotation); @@ -225,18 +225,18 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl return ActionResultType.SUCCESS; } } - BlockState testState = state.with(BACKWARDS, !state.get(BACKWARDS)); + BlockState testState = state.setValue(BACKWARDS, !state.getValue(BACKWARDS)); if (isStableWith(testState, world, pos)) placeAndNotify(testState, pos, world); return ActionResultType.SUCCESS; } private void placeAndNotify(BlockState state, BlockPos pos, World world) { - world.setBlockState(pos, state, 3); - world.notifyNeighborsOfStateChange(pos.down(), this); - if (state.get(SHAPE) + world.setBlock(pos, state, 3); + world.updateNeighborsAt(pos.below(), this); + if (state.getValue(SHAPE) .isAscending()) - world.notifyNeighborsOfStateChange(pos.up(), this); + world.updateNeighborsAt(pos.above(), this); } @Nullable @@ -245,9 +245,9 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl if (!(current.getBlock() instanceof ControllerRailBlock)) return null; Vector3i accelerationVec = getAccelerationVector(current); - BlockPos baseTestPos = reversed ? from.subtract(accelerationVec) : from.add(accelerationVec); + BlockPos baseTestPos = reversed ? from.subtract(accelerationVec) : from.offset(accelerationVec); for (BlockPos testPos : Iterate.hereBelowAndAbove(baseTestPos)) { - if (testPos.getY() > from.getY() && !current.get(SHAPE) + if (testPos.getY() > from.getY() && !current.getValue(SHAPE) .isAscending()) continue; BlockState testState = world.getBlockState(testPos); @@ -259,13 +259,13 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl } @Override - public boolean hasComparatorInputOverride(BlockState state) { + public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override - public int getComparatorInputOverride(BlockState state, World world, BlockPos pos) { - return state.get(POWER); + public int getAnalogOutputSignal(BlockState state, World world, BlockPos pos) { + return state.getValue(POWER); } @Override @@ -273,11 +273,11 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl if (rotation == Rotation.NONE) return state; - RailShape railshape = Blocks.POWERED_RAIL.getDefaultState() - .with(SHAPE, state.get(SHAPE)) + RailShape railshape = Blocks.POWERED_RAIL.defaultBlockState() + .setValue(SHAPE, state.getValue(SHAPE)) .rotate(rotation) - .get(SHAPE); - state = state.with(SHAPE, railshape); + .getValue(SHAPE); + state = state.setValue(SHAPE, railshape); if (rotation == Rotation.CLOCKWISE_180 || (getPointingTowards(state).getAxis() == Axis.Z) == (rotation == Rotation.COUNTERCLOCKWISE_90)) @@ -291,11 +291,11 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl if (mirror == Mirror.NONE) return state; - RailShape railshape = Blocks.POWERED_RAIL.getDefaultState() - .with(SHAPE, state.get(SHAPE)) + RailShape railshape = Blocks.POWERED_RAIL.defaultBlockState() + .setValue(SHAPE, state.getValue(SHAPE)) .mirror(mirror) - .get(SHAPE); - state = state.with(SHAPE, railshape); + .getValue(SHAPE); + state = state.setValue(SHAPE, railshape); if ((getPointingTowards(state).getAxis() == Axis.Z) == (mirror == Mirror.LEFT_RIGHT)) return state.cycle(BACKWARDS); @@ -304,10 +304,10 @@ public class ControllerRailBlock extends AbstractRailBlock implements IWrenchabl } public static boolean isStateBackwards(BlockState state) { - return state.get(BACKWARDS) ^ isReversedSlope(state); + return state.getValue(BACKWARDS) ^ isReversedSlope(state); } public static boolean isReversedSlope(BlockState state) { - return state.get(SHAPE) == RailShape.ASCENDING_SOUTH || state.get(SHAPE) == RailShape.ASCENDING_EAST; + return state.getValue(SHAPE) == RailShape.ASCENDING_SOUTH || state.getValue(SHAPE) == RailShape.ASCENDING_EAST; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailGenerator.java index cc961ac13..0cdda2aa0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailGenerator.java @@ -25,7 +25,7 @@ public class ControllerRailGenerator extends SpecialBlockStateGen { @Override protected int getYRotation(BlockState state) { - RailShape shape = state.get(ControllerRailBlock.SHAPE); + RailShape shape = state.getValue(ControllerRailBlock.SHAPE); boolean backwards = ControllerRailBlock.isStateBackwards(state); int rotation = backwards ? 180 : 0; @@ -45,7 +45,7 @@ public class ControllerRailGenerator extends SpecialBlockStateGen { @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - RailShape shape = state.get(ControllerRailBlock.SHAPE); + RailShape shape = state.getValue(ControllerRailBlock.SHAPE); boolean backwards = ControllerRailBlock.isStateBackwards(state); String model = shape.isAscending() ? backwards ? "ascending_south" : "ascending_north" : "north_south"; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ReinforcedRailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ReinforcedRailBlock.java index cb092ceff..22eb42a2d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ReinforcedRailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ReinforcedRailBlock.java @@ -38,7 +38,7 @@ public class ReinforcedRailBlock extends AbstractRailBlock { } @Override - public void fillItemGroup(ItemGroup p_149666_1_, NonNullList p_149666_2_) { + public void fillItemCategory(ItemGroup p_149666_1_, NonNullList p_149666_2_) { // TODO re-add when finished } @@ -49,15 +49,15 @@ public class ReinforcedRailBlock extends AbstractRailBlock { } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(RAIL_SHAPE, CONNECTS_N, CONNECTS_S); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - boolean alongX = context.getPlacementHorizontalFacing().getAxis() == Axis.X; - return super.getStateForPlacement(context).with(RAIL_SHAPE, alongX ? RailShape.EAST_WEST : RailShape.NORTH_SOUTH).with(CONNECTS_N, false).with(CONNECTS_S, false); + boolean alongX = context.getHorizontalDirection().getAxis() == Axis.X; + return super.getStateForPlacement(context).setValue(RAIL_SHAPE, alongX ? RailShape.EAST_WEST : RailShape.NORTH_SOUTH).setValue(CONNECTS_N, false).setValue(CONNECTS_S, false); } @Override @@ -68,22 +68,22 @@ public class ReinforcedRailBlock extends AbstractRailBlock { @Override protected void updateState(@Nonnull BlockState state, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Block block) { super.updateState(state, world, pos, block); - world.setBlockState(pos, getUpdatedState(world, pos, state, true)); + world.setBlockAndUpdate(pos, updateDir(world, pos, state, true)); } @Override @Nonnull - protected BlockState getUpdatedState(@Nonnull World world, BlockPos pos, BlockState state, + protected BlockState updateDir(@Nonnull World world, BlockPos pos, BlockState state, boolean p_208489_4_) { - boolean alongX = state.get(RAIL_SHAPE) == RailShape.EAST_WEST; - BlockPos sPos = pos.add(alongX ? -1 : 0, 0, alongX ? 0 : 1); - BlockPos nPos = pos.add(alongX ? 1 : 0, 0, alongX ? 0 : -1); + boolean alongX = state.getValue(RAIL_SHAPE) == RailShape.EAST_WEST; + BlockPos sPos = pos.offset(alongX ? -1 : 0, 0, alongX ? 0 : 1); + BlockPos nPos = pos.offset(alongX ? 1 : 0, 0, alongX ? 0 : -1); - return super.getUpdatedState(world, pos, state, p_208489_4_).with(CONNECTS_S, world.getBlockState(sPos).getBlock() instanceof ReinforcedRailBlock && - (world.getBlockState(sPos).get(RAIL_SHAPE) == state.get(RAIL_SHAPE))) - .with(CONNECTS_N, world.getBlockState(nPos).getBlock() instanceof ReinforcedRailBlock && - (world.getBlockState(nPos).get(RAIL_SHAPE) == state.get(RAIL_SHAPE))); + return super.updateDir(world, pos, state, p_208489_4_).setValue(CONNECTS_S, world.getBlockState(sPos).getBlock() instanceof ReinforcedRailBlock && + (world.getBlockState(sPos).getValue(RAIL_SHAPE) == state.getValue(RAIL_SHAPE))) + .setValue(CONNECTS_N, world.getBlockState(nPos).getBlock() instanceof ReinforcedRailBlock && + (world.getBlockState(nPos).getValue(RAIL_SHAPE) == state.getValue(RAIL_SHAPE))); } @Override @@ -98,13 +98,13 @@ public class ReinforcedRailBlock extends AbstractRailBlock { @Override @Nonnull public VoxelShape getShape(BlockState state, @Nonnull IBlockReader reader, @Nonnull BlockPos pos, ISelectionContext context) { - boolean alongX = state.get(RAIL_SHAPE) == RailShape.EAST_WEST; - return VoxelShapes.or(makeCuboidShape(0, -2, 0, 16, 2, 16), VoxelShapes.or(makeCuboidShape(0, -2, 0, alongX ? 16 : -1, 12, alongX ? -1 : 16), makeCuboidShape(alongX ? 0 : 17, -2, alongX ? 17 : 0, 16, 12, 16))); + boolean alongX = state.getValue(RAIL_SHAPE) == RailShape.EAST_WEST; + return VoxelShapes.or(box(0, -2, 0, 16, 2, 16), VoxelShapes.or(box(0, -2, 0, alongX ? 16 : -1, 12, alongX ? -1 : 16), box(alongX ? 0 : 17, -2, alongX ? 17 : 0, 16, 12, 16))); } @Override @Nonnull - public PushReaction getPushReaction(BlockState state) { + public PushReaction getPistonPushReaction(BlockState state) { return PushReaction.BLOCK; } @@ -115,16 +115,16 @@ public class ReinforcedRailBlock extends AbstractRailBlock { }*/ @Override - public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { - return !(world.getBlockState(pos.down()).getBlock() instanceof AbstractRailBlock || world.getBlockState(pos.up()).getBlock() instanceof AbstractRailBlock); + public boolean canSurvive(BlockState state, IWorldReader world, BlockPos pos) { + return !(world.getBlockState(pos.below()).getBlock() instanceof AbstractRailBlock || world.getBlockState(pos.above()).getBlock() instanceof AbstractRailBlock); } @Override public void neighborChanged(@Nonnull BlockState state, World world, @Nonnull BlockPos pos, @Nonnull Block block, @Nonnull BlockPos pos2, boolean p_220069_6_) { - if (!world.isRemote) { - if ((world.getBlockState(pos.down()).getBlock() instanceof AbstractRailBlock)) { + if (!world.isClientSide) { + if ((world.getBlockState(pos.below()).getBlock() instanceof AbstractRailBlock)) { if (!p_220069_6_) { - spawnDrops(state, world, pos); + dropResources(state, world, pos); } world.removeBlock(pos, false); } else { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableBlock.java index c9763ef7f..f4cbc379f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableBlock.java @@ -37,7 +37,7 @@ public class TurntableBlock extends KineticBlock implements ITE 0) + if (e.getDeltaMovement().y > 0) return; if (e.getY() < pos.getY() + .5f) return; @@ -60,36 +60,36 @@ public class TurntableBlock extends KineticBlock implements ITE 1/4f) speed *= MathHelper.clamp((1/2f - offset.length()) * 2, 0, 1); - mc.player.rotationYaw = mc.player.prevRotationYaw - speed * AnimationTickHolder.getPartialTicks(); - mc.player.renderYawOffset = mc.player.rotationYaw; + mc.player.yRot = mc.player.yRotO - speed * AnimationTickHolder.getPartialTicks(); + mc.player.yBodyRot = mc.player.yRot; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java index de25c380c..8d62bc67c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java @@ -5,7 +5,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllFluids; import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; +import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.config.AllConfigs; @@ -18,6 +18,7 @@ import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.BubbleColumnBlock; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.FluidState; import net.minecraft.item.BlockItemUseContext; import net.minecraft.tileentity.TileEntity; @@ -33,7 +34,7 @@ import net.minecraft.world.World; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class WaterWheelBlock extends HorizontalKineticBlock implements ITE { +public class WaterWheelBlock extends DirectionalKineticBlock implements ITE { public WaterWheelBlock(Properties properties) { super(properties); @@ -45,21 +46,21 @@ public class WaterWheelBlock extends HorizontalKineticBlock implements ITE 0 ^ !clockwise ? -flow.y * clockwiseMultiplier : -flow.y; } - if (te.getSpeed() == 0 && flowStrength != 0 && !world.isRemote()) { + if (wf.getAxis() == Axis.Y) { + if (side.getAxis() == Axis.Z) + flowStrength = flow.x < 0 ^ !clockwise ? flow.x * clockwiseMultiplier : flow.x; + if (side.getAxis() == Axis.X) + flowStrength = flow.z > 0 ^ !clockwise ? -flow.z * clockwiseMultiplier : -flow.z; + } + + if (te.getSpeed() == 0 && flowStrength != 0 && !world.isClientSide()) { AllTriggers.triggerForNearbyPlayers(AllTriggers.WATER_WHEEL, world, pos, 5); - if (FluidHelper.isLava(fluid.getFluid())) + if (FluidHelper.isLava(fluid.getType())) AllTriggers.triggerForNearbyPlayers(AllTriggers.LAVA_WHEEL, world, pos, 5); - if (fluid.getFluid().isEquivalentTo(AllFluids.CHOCOLATE.get())) + if (fluid.getType() + .isSame(AllFluids.CHOCOLATE.get())) AllTriggers.triggerForNearbyPlayers(AllTriggers.CHOCOLATE_WHEEL, world, pos, 5); } @@ -147,28 +156,48 @@ public class WaterWheelBlock extends HorizontalKineticBlock implements ITE tolerance) + facing = Direction.DOWN; + else if (Vector3d.atLowerCornerOf(Direction.UP.getNormal()) + .dot(lookVec.normalize()) > tolerance) + facing = Direction.UP; + else + facing = horizontalFacing; + + } + + return defaultBlockState().setValue(FACING, sneaking ? facing.getOpposite() : facing); } @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return state.get(HORIZONTAL_FACING) + return state.getValue(FACING) .getAxis() == face.getAxis(); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(HORIZONTAL_FACING) + return state.getValue(FACING) .getAxis(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java index 7f89e5c47..6b8b9e9d7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java @@ -32,20 +32,20 @@ public class WaterWheelTileEntity extends GeneratingKineticTileEntity { if (compound.contains("Flows")) { for (Direction d : Iterate.directions) setFlow(d, compound.getCompound("Flows") - .getFloat(d.getString())); + .getFloat(d.getSerializedName())); } } @Override public AxisAlignedBB makeRenderBoundingBox() { - return new AxisAlignedBB(pos).grow(1); + return new AxisAlignedBB(worldPosition).inflate(1); } @Override public void write(CompoundNBT compound, boolean clientPacket) { CompoundNBT flows = new CompoundNBT(); for (Direction d : Iterate.directions) - flows.putFloat(d.getString(), this.flows.get(d)); + flows.putFloat(d.getSerializedName(), this.flows.get(d)); compound.put("Flows", flows); super.write(compound, clientPacket); @@ -53,7 +53,7 @@ public class WaterWheelTileEntity extends GeneratingKineticTileEntity { public void setFlow(Direction direction, float speed) { flows.put(direction, speed); - markDirty(); + setChanged(); } @Override @@ -70,7 +70,7 @@ public class WaterWheelTileEntity extends GeneratingKineticTileEntity { public void lazyTick() { super.lazyTick(); AllBlocks.WATER_WHEEL.get() - .updateAllSides(getBlockState(), world, pos); + .updateAllSides(getBlockState(), level, worldPosition); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FlowSource.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FlowSource.java index e2beb3a37..4df90ba50 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FlowSource.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FlowSource.java @@ -70,7 +70,7 @@ public abstract class FlowSource { public void manageSource(World world) { if (fluidHandler.isPresent()) return; - TileEntity tileEntity = world.getTileEntity(location.getConnectedPos()); + TileEntity tileEntity = world.getBlockEntity(location.getConnectedPos()); if (tileEntity != null) fluidHandler = tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, location.getOppositeFace()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidBottleItemHook.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidBottleItemHook.java index 9a2d9f047..211e5964a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidBottleItemHook.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidBottleItemHook.java @@ -35,15 +35,15 @@ public class FluidBottleItemHook extends Item { World world = event.getWorld(); PlayerEntity player = event.getPlayer(); - RayTraceResult raytraceresult = rayTrace(world, player, RayTraceContext.FluidMode.SOURCE_ONLY); + RayTraceResult raytraceresult = getPlayerPOVHitResult(world, player, RayTraceContext.FluidMode.SOURCE_ONLY); if (raytraceresult.getType() != RayTraceResult.Type.BLOCK) return; - BlockPos blockpos = ((BlockRayTraceResult) raytraceresult).getPos(); - if (!world.isBlockModifiable(player, blockpos)) + BlockPos blockpos = ((BlockRayTraceResult) raytraceresult).getBlockPos(); + if (!world.mayInteract(player, blockpos)) return; FluidState fluidState = world.getFluidState(blockpos); - if (fluidState.isTagged(FluidTags.WATER) && fluidState.getFluid() + if (fluidState.is(FluidTags.WATER) && fluidState.getType() .getRegistryName() .getNamespace() .equals(Create.ID)) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java index bd22b97d1..8fb4b209f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java @@ -29,12 +29,12 @@ public class FluidFX { if (fluid == Fluids.EMPTY) return; - FluidState defaultState = fluid.getDefaultState(); + FluidState defaultState = fluid.defaultFluidState(); if (defaultState == null || defaultState.isEmpty()) { return; } - BlockParticleData blockParticleData = new BlockParticleData(ParticleTypes.BLOCK, defaultState.getBlockState()); + BlockParticleData blockParticleData = new BlockParticleData(ParticleTypes.BLOCK, defaultState.createLegacyBlock()); Vector3d center = VecHelper.getCenterOf(pos); for (int i = 0; i < 20; i++) { @@ -61,17 +61,17 @@ public class FluidFX { public static void spawnRimParticles(World world, BlockPos pos, Direction side, int amount, IParticleData particle, float rimRadius) { - Vector3d directionVec = Vector3d.of(side.getDirectionVec()); + Vector3d directionVec = Vector3d.atLowerCornerOf(side.getNormal()); for (int i = 0; i < amount; i++) { Vector3d vec = VecHelper.offsetRandomly(Vector3d.ZERO, r, 1) .normalize(); vec = VecHelper.clampComponentWise(vec, rimRadius) - .mul(VecHelper.axisAlingedPlaneOf(directionVec)) + .multiply(VecHelper.axisAlingedPlaneOf(directionVec)) .add(directionVec.scale(.45 + r.nextFloat() / 16f)); Vector3d m = vec.scale(.05f); vec = vec.add(VecHelper.getCenterOf(pos)); - world.addOptionalParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); + world.addAlwaysVisibleParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); } } @@ -79,7 +79,7 @@ public class FluidFX { float rimRadius, Vector3d directionVec, boolean inbound) { for (int i = 0; i < amount; i++) { Vector3d vec = VecHelper.offsetRandomly(Vector3d.ZERO, r, rimRadius * .75f); - vec = vec.mul(VecHelper.axisAlingedPlaneOf(directionVec)) + vec = vec.multiply(VecHelper.axisAlingedPlaneOf(directionVec)) .add(directionVec.scale(.5 + r.nextFloat() / 4f)); Vector3d m = vec.scale(1 / 4f); Vector3d centerOf = VecHelper.getCenterOf(pos); @@ -90,7 +90,7 @@ public class FluidFX { .subtract(vec) .scale(1 / 16f); } - world.addOptionalParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); + world.addAlwaysVisibleParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); } } @@ -99,7 +99,7 @@ public class FluidFX { } private static World world() { - return Minecraft.getInstance().world; + return Minecraft.getInstance().level; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java index 6e49b3c2e..9fe68887f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java @@ -54,14 +54,14 @@ public class FluidPropagator { pipe.wipePressure(); for (Direction direction : getPipeConnections(currentState, pipe)) { - BlockPos target = currentPos.offset(direction); + BlockPos target = currentPos.relative(direction); if (!world.isAreaLoaded(target, 0)) continue; - TileEntity tileEntity = world.getTileEntity(target); + TileEntity tileEntity = world.getBlockEntity(target); BlockState targetState = world.getBlockState(target); if (tileEntity instanceof PumpTileEntity) { - if (!AllBlocks.MECHANICAL_PUMP.has(targetState) || targetState.get(PumpBlock.FACING) + if (!AllBlocks.MECHANICAL_PUMP.has(targetState) || targetState.getValue(PumpBlock.FACING) .getAxis() != direction.getAxis()) continue; discoveredPumps.add(Pair.of((PumpTileEntity) tileEntity, direction.getOpposite())); @@ -101,7 +101,7 @@ public class FluidPropagator { for (Direction d : Iterate.directions) { if (pos.equals(start) && d != side) continue; - BlockPos target = pos.offset(d); + BlockPos target = pos.relative(d); if (visited.contains(target)) continue; @@ -123,7 +123,7 @@ public class FluidPropagator { public static Direction validateNeighbourChange(BlockState state, World world, BlockPos pos, Block otherBlock, BlockPos neighborPos, boolean isMoving) { - if (world.isRemote) + if (world.isClientSide) return null; if (otherBlock instanceof FluidPipeBlock) return null; @@ -136,7 +136,7 @@ public class FluidPropagator { if (getStraightPipeAxis(state) == null) return null; for (Direction d : Iterate.directions) { - if (!pos.offset(d) + if (!pos.relative(d) .equals(neighborPos)) continue; return d; @@ -149,21 +149,21 @@ public class FluidPropagator { } public static boolean isOpenEnd(IBlockReader reader, BlockPos pos, Direction side) { - BlockPos connectedPos = pos.offset(side); + BlockPos connectedPos = pos.relative(side); BlockState connectedState = reader.getBlockState(connectedPos); FluidTransportBehaviour pipe = FluidPropagator.getPipe(reader, connectedPos); if (pipe != null && pipe.canHaveFlowToward(connectedState, side.getOpposite())) return false; - if (PumpBlock.isPump(connectedState) && connectedState.get(PumpBlock.FACING) + if (PumpBlock.isPump(connectedState) && connectedState.getValue(PumpBlock.FACING) .getAxis() == side.getAxis()) return false; - if (connectedState.contains(BlockStateProperties.HONEY_LEVEL)) + if (connectedState.hasProperty(BlockStateProperties.LEVEL_HONEY)) return true; if (BlockHelper.hasBlockSolidSide(connectedState, reader, connectedPos, side.getOpposite())) return false; if (!(connectedState.getMaterial() - .isReplaceable() && connectedState.getBlockHardness(reader, connectedPos) != -1) - && !connectedState.contains(BlockStateProperties.WATERLOGGED)) + .isReplaceable() && connectedState.getDestroySpeed(reader, connectedPos) != -1) + && !connectedState.hasProperty(BlockStateProperties.WATERLOGGED)) return false; return true; } @@ -202,7 +202,7 @@ public class FluidPropagator { // } public static boolean hasFluidCapability(IBlockReader world, BlockPos pos, Direction side) { - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); return tileEntity != null && tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side) .isPresent(); } @@ -210,17 +210,17 @@ public class FluidPropagator { @Nullable public static Axis getStraightPipeAxis(BlockState state) { if (state.getBlock() instanceof PumpBlock) - return state.get(PumpBlock.FACING) + return state.getValue(PumpBlock.FACING) .getAxis(); if (state.getBlock() instanceof AxisPipeBlock) - return state.get(AxisPipeBlock.AXIS); + return state.getValue(AxisPipeBlock.AXIS); if (!FluidPipeBlock.isPipe(state)) return null; Axis axisFound = null; int connections = 0; for (Axis axis : Iterate.axes) { - Direction d1 = Direction.getFacingFromAxis(AxisDirection.NEGATIVE, axis); - Direction d2 = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); + Direction d1 = Direction.get(AxisDirection.NEGATIVE, axis); + Direction d2 = Direction.get(AxisDirection.POSITIVE, axis); boolean openAt1 = FluidPipeBlock.isOpenAt(state, d1); boolean openAt2 = FluidPipeBlock.isOpenAt(state, d2); if (openAt1) diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidReactions.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidReactions.java index aa010ab7b..9c249f8fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidReactions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidReactions.java @@ -24,41 +24,41 @@ public class FluidReactions { AllTriggers.triggerForNearbyPlayers(AllTriggers.PIPE_COLLISION, world, pos, 5); if (f1 == Fluids.WATER && f2 == Fluids.LAVA || f2 == Fluids.WATER && f1 == Fluids.LAVA) - world.setBlockState(pos, Blocks.COBBLESTONE.getDefaultState()); + world.setBlockAndUpdate(pos, Blocks.COBBLESTONE.defaultBlockState()); else if (f1 == Fluids.LAVA && FluidHelper.hasBlockState(f2)) { BlockState lavaInteraction = AllFluids.getLavaInteraction(FluidHelper.convertToFlowing(f2) - .getDefaultState()); + .defaultFluidState()); if (lavaInteraction != null) - world.setBlockState(pos, lavaInteraction); + world.setBlockAndUpdate(pos, lavaInteraction); } else if (f2 == Fluids.LAVA && FluidHelper.hasBlockState(f1)) { BlockState lavaInteraction = AllFluids.getLavaInteraction(FluidHelper.convertToFlowing(f1) - .getDefaultState()); + .defaultFluidState()); if (lavaInteraction != null) - world.setBlockState(pos, lavaInteraction); + world.setBlockAndUpdate(pos, lavaInteraction); } } public static void handlePipeSpillCollision(World world, BlockPos pos, Fluid pipeFluid, FluidState worldFluid) { Fluid pf = FluidHelper.convertToStill(pipeFluid); - Fluid wf = worldFluid.getFluid(); - if (pf.isIn(FluidTags.WATER) && wf == Fluids.LAVA) - world.setBlockState(pos, Blocks.OBSIDIAN.getDefaultState()); + Fluid wf = worldFluid.getType(); + if (pf.is(FluidTags.WATER) && wf == Fluids.LAVA) + world.setBlockAndUpdate(pos, Blocks.OBSIDIAN.defaultBlockState()); else if (pf == Fluids.WATER && wf == Fluids.FLOWING_LAVA) - world.setBlockState(pos, Blocks.COBBLESTONE.getDefaultState()); + world.setBlockAndUpdate(pos, Blocks.COBBLESTONE.defaultBlockState()); else if (pf == Fluids.LAVA && wf == Fluids.WATER) - world.setBlockState(pos, Blocks.STONE.getDefaultState()); + world.setBlockAndUpdate(pos, Blocks.STONE.defaultBlockState()); else if (pf == Fluids.LAVA && wf == Fluids.FLOWING_WATER) - world.setBlockState(pos, Blocks.COBBLESTONE.getDefaultState()); + world.setBlockAndUpdate(pos, Blocks.COBBLESTONE.defaultBlockState()); if (pf == Fluids.LAVA) { BlockState lavaInteraction = AllFluids.getLavaInteraction(worldFluid); if (lavaInteraction != null) - world.setBlockState(pos, lavaInteraction); + world.setBlockAndUpdate(pos, lavaInteraction); } else if (wf == Fluids.FLOWING_LAVA && FluidHelper.hasBlockState(pf)) { BlockState lavaInteraction = AllFluids.getLavaInteraction(FluidHelper.convertToFlowing(pf) - .getDefaultState()); + .defaultFluidState()); if (lavaInteraction != null) - world.setBlockState(pos, lavaInteraction); + world.setBlockAndUpdate(pos, lavaInteraction); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java index 027db42d1..87d73c00c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java @@ -60,7 +60,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour { super.tick(); World world = getWorld(); BlockPos pos = getPos(); - boolean onServer = !world.isRemote || tileEntity.isVirtual(); + boolean onServer = !world.isClientSide || tileEntity.isVirtual(); if (interfaces == null) return; @@ -131,7 +131,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour { sendUpdate |= connection.manageFlows(world, pos, internalFluid, extractionPredicate); } - if (sendUpdate) + if (sendUpdate) tileEntity.notifyUpdate(); } @@ -145,7 +145,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour { if (interfaces == null) interfaces = new IdentityHashMap<>(); for (Direction face : Iterate.directions) - if (nbt.contains(face.getName2())) + if (nbt.contains(face.getName())) interfaces.computeIfAbsent(face, d -> new PipeConnection(d)); // Invalid data (missing/outdated). Defer init to runtime @@ -155,7 +155,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour { } interfaces.values() - .forEach(connection -> connection.deserializeNBT(nbt, tileEntity.getPos(), clientPacket)); + .forEach(connection -> connection.deserializeNBT(nbt, tileEntity.getBlockPos(), clientPacket)); } @Override @@ -238,15 +238,15 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour { if (!canHaveFlowToward(state, direction)) return AttachmentTypes.NONE; - BlockPos offsetPos = pos.offset(direction); + BlockPos offsetPos = pos.relative(direction); BlockState facingState = world.getBlockState(offsetPos); - if (facingState.getBlock() instanceof PumpBlock && facingState.get(PumpBlock.FACING) + if (facingState.getBlock() instanceof PumpBlock && facingState.getValue(PumpBlock.FACING) .getAxis() == direction.getAxis()) return AttachmentTypes.NONE; if (AllBlocks.ENCASED_FLUID_PIPE.has(facingState) - && facingState.get(EncasedPipeBlock.FACING_TO_PROPERTY_MAP.get(direction.getOpposite()))) + && facingState.getValue(EncasedPipeBlock.FACING_TO_PROPERTY_MAP.get(direction.getOpposite()))) return AttachmentTypes.NONE; if (FluidPropagator.hasFluidCapability(world, offsetPos, direction.getOpposite()) @@ -272,7 +272,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour { // for switching TEs, but retaining flows public static final WorldAttached>> interfaceTransfer = - new WorldAttached<>(HashMap::new); + new WorldAttached<>($ -> new HashMap<>()); public static void cacheFlows(IWorld world, BlockPos pos) { FluidTransportBehaviour pipe = TileEntityBehaviour.get(world, pos, FluidTransportBehaviour.TYPE); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java index 1aa0ecd7c..f0b119fa7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java @@ -1,8 +1,9 @@ package com.simibubi.create.content.contraptions.fluids; -import static net.minecraft.state.properties.BlockStateProperties.HONEY_LEVEL; +import static net.minecraft.state.properties.BlockStateProperties.LEVEL_HONEY; import static net.minecraft.state.properties.BlockStateProperties.WATERLOGGED; +import java.util.ArrayList; import java.util.List; import javax.annotation.Nullable; @@ -16,7 +17,6 @@ import com.simibubi.create.foundation.utility.BlockFace; import net.minecraft.block.BlockState; import net.minecraft.block.FlowingFluidBlock; import net.minecraft.entity.LivingEntity; -import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; import net.minecraft.item.ItemStack; @@ -40,9 +40,16 @@ import net.minecraftforge.fluids.capability.templates.FluidTank; public class OpenEndedPipe extends FlowSource { - World world; - BlockPos pos; - AxisAlignedBB aoe; + private static final List EFFECT_HANDLERS = new ArrayList<>(); + + static { + registerEffectHandler(new PotionEffectHandler()); + registerEffectHandler(new MilkEffectHandler()); + } + + private World world; + private BlockPos pos; + private AxisAlignedBB aoe; private OpenEndFluidHandler fluidHandler; private BlockPos outputPos; @@ -56,9 +63,29 @@ public class OpenEndedPipe extends FlowSource { fluidHandler = new OpenEndFluidHandler(); outputPos = face.getConnectedPos(); pos = face.getPos(); - aoe = new AxisAlignedBB(outputPos).expand(0, -1, 0); + aoe = new AxisAlignedBB(outputPos).expandTowards(0, -1, 0); if (face.getFace() == Direction.DOWN) - aoe = aoe.expand(0, -1, 0); + aoe = aoe.expandTowards(0, -1, 0); + } + + public static void registerEffectHandler(IEffectHandler handler) { + EFFECT_HANDLERS.add(handler); + } + + public World getWorld() { + return world; + } + + public BlockPos getPos() { + return pos; + } + + public BlockPos getOutputPos() { + return outputPos; + } + + public AxisAlignedBB getAOE() { + return aoe; } @Override @@ -66,163 +93,16 @@ public class OpenEndedPipe extends FlowSource { this.world = world; } - private FluidStack removeFluidFromSpace(boolean simulate) { - FluidStack empty = FluidStack.EMPTY; - if (world == null) - return empty; - if (!world.isAreaLoaded(outputPos, 0)) - return empty; - - BlockState state = world.getBlockState(outputPos); - FluidState fluidState = state.getFluidState(); - boolean waterlog = state.contains(WATERLOGGED); - - if (state.contains(HONEY_LEVEL) && state.get(HONEY_LEVEL) >= 5) { - if (!simulate) - world.setBlockState(outputPos, state.with(HONEY_LEVEL, 0), 3); - return new FluidStack(AllFluids.HONEY.get() - .getStillFluid(), 250); - } - - if (!waterlog && !state.getMaterial() - .isReplaceable()) - return empty; - if (fluidState.isEmpty() || !fluidState.isSource()) - return empty; - - FluidStack stack = new FluidStack(fluidState.getFluid(), 1000); - - if (simulate) - return stack; - - AllTriggers.triggerForNearbyPlayers(AllTriggers.PIPE_SPILL, world, pos, 5); - - if (waterlog) { - world.setBlockState(outputPos, state.with(WATERLOGGED, false), 3); - world.getPendingFluidTicks() - .scheduleTick(outputPos, Fluids.WATER, 1); - return stack; - } - world.setBlockState(outputPos, fluidState.getBlockState() - .with(FlowingFluidBlock.LEVEL, 14), 3); - return stack; - } - - private boolean provideFluidToSpace(FluidStack fluid, boolean simulate) { - if (world == null) - return false; - if (!world.isAreaLoaded(outputPos, 0)) - return false; - - BlockState state = world.getBlockState(outputPos); - FluidState fluidState = state.getFluidState(); - boolean waterlog = state.contains(WATERLOGGED); - - if (!waterlog && !state.getMaterial() - .isReplaceable()) - return false; - if (fluid.isEmpty()) - return false; - if (!FluidHelper.hasBlockState(fluid.getFluid())) { - if (!simulate) - applyEffects(world, fluid); - return true; - } - - if (!fluidState.isEmpty() && fluidState.getFluid() != fluid.getFluid()) { - FluidReactions.handlePipeSpillCollision(world, outputPos, fluid.getFluid(), fluidState); - return false; - } - - if (fluidState.isSource()) - return false; - if (waterlog && fluid.getFluid() != Fluids.WATER) - return false; - if (simulate) - return true; - - if (world.getDimension() - .isUltrawarm() - && fluid.getFluid() - .isIn(FluidTags.WATER)) { - int i = outputPos.getX(); - int j = outputPos.getY(); - int k = outputPos.getZ(); - world.playSound(null, i, j, k, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, - 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); - return true; - } - - AllTriggers.triggerForNearbyPlayers(AllTriggers.PIPE_SPILL, world, pos, 5); - - if (waterlog) { - world.setBlockState(outputPos, state.with(WATERLOGGED, true), 3); - world.getPendingFluidTicks() - .scheduleTick(outputPos, Fluids.WATER, 1); - return true; - } - world.setBlockState(outputPos, fluid.getFluid() - .getDefaultState() - .getBlockState(), 3); - return true; - } - - private boolean canApplyEffects(World world, FluidStack fluid) { - Fluid fluidType = fluid.getFluid(); - if (fluidType.isEquivalentTo(AllFluids.POTION.get())) - return true; - if (Tags.Fluids.MILK.contains(fluidType)) - return true; - return false; - } - - private void applyEffects(World world, FluidStack fluid) { - Fluid fluidType = fluid.getFluid(); - - if (fluidType.isEquivalentTo(AllFluids.POTION.get())) - applyPotionEffects(world, fluid); - - if (Tags.Fluids.MILK.contains(fluidType)) { - if (world.getGameTime() % 5 != 0) - return; - List list = - world.getEntitiesWithinAABB(LivingEntity.class, aoe, LivingEntity::canBeHitWithPotion); - ItemStack curativeItem = new ItemStack(Items.MILK_BUCKET); - for (LivingEntity livingentity : list) - livingentity.curePotionEffects(curativeItem); - } - } - - private void applyPotionEffects(World world, FluidStack fluid) { - if (cachedFluid == null || cachedEffects == null || !fluid.isFluidEqual(cachedFluid)) { - FluidStack copy = fluid.copy(); - copy.setAmount(250); - ItemStack bottle = PotionFluidHandler.fillBottle(new ItemStack(Items.GLASS_BOTTLE), fluid); - cachedEffects = PotionUtils.getEffectsFromStack(bottle); - } - - if (cachedEffects.isEmpty()) - return; - - List list = - world.getEntitiesWithinAABB(LivingEntity.class, aoe, LivingEntity::canBeHitWithPotion); - for (LivingEntity livingentity : list) { - for (EffectInstance effectinstance : cachedEffects) { - Effect effect = effectinstance.getPotion(); - if (effect.isInstant()) { - effect.affectEntity(null, null, livingentity, effectinstance.getAmplifier(), 0.5D); - continue; - } - livingentity.addPotionEffect(new EffectInstance(effectinstance)); - } - } - } - @Override public LazyOptional provideHandler() { return LazyOptional.of(() -> fluidHandler); } + @Override + public boolean isEndpoint() { + return true; + } + public CompoundNBT serializeNBT() { CompoundNBT compound = new CompoundNBT(); fluidHandler.writeToNBT(compound); @@ -239,6 +119,124 @@ public class OpenEndedPipe extends FlowSource { return oep; } + private FluidStack removeFluidFromSpace(boolean simulate) { + FluidStack empty = FluidStack.EMPTY; + if (world == null) + return empty; + if (!world.isAreaLoaded(outputPos, 0)) + return empty; + + BlockState state = world.getBlockState(outputPos); + FluidState fluidState = state.getFluidState(); + boolean waterlog = state.hasProperty(WATERLOGGED); + + if (state.hasProperty(LEVEL_HONEY) && state.getValue(LEVEL_HONEY) >= 5) { + if (!simulate) + world.setBlock(outputPos, state.setValue(LEVEL_HONEY, 0), 3); + return new FluidStack(AllFluids.HONEY.get() + .getSource(), 250); + } + + if (!waterlog && !state.getMaterial() + .isReplaceable()) + return empty; + if (fluidState.isEmpty() || !fluidState.isSource()) + return empty; + + FluidStack stack = new FluidStack(fluidState.getType(), 1000); + + if (simulate) + return stack; + + AllTriggers.triggerForNearbyPlayers(AllTriggers.PIPE_SPILL, world, pos, 5); + + if (waterlog) { + world.setBlock(outputPos, state.setValue(WATERLOGGED, false), 3); + world.getLiquidTicks() + .scheduleTick(outputPos, Fluids.WATER, 1); + return stack; + } + world.setBlock(outputPos, fluidState.createLegacyBlock() + .setValue(FlowingFluidBlock.LEVEL, 14), 3); + return stack; + } + + private boolean provideFluidToSpace(FluidStack fluid, boolean simulate) { + if (world == null) + return false; + if (!world.isAreaLoaded(outputPos, 0)) + return false; + + BlockState state = world.getBlockState(outputPos); + FluidState fluidState = state.getFluidState(); + boolean waterlog = state.hasProperty(WATERLOGGED); + + if (!waterlog && !state.getMaterial() + .isReplaceable()) + return false; + if (fluid.isEmpty()) + return false; + if (!FluidHelper.hasBlockState(fluid.getFluid())) { + if (!simulate) + applyEffects(fluid); + return true; + } + + if (!fluidState.isEmpty() && fluidState.getType() != fluid.getFluid()) { + FluidReactions.handlePipeSpillCollision(world, outputPos, fluid.getFluid(), fluidState); + return false; + } + + if (fluidState.isSource()) + return false; + if (waterlog && fluid.getFluid() != Fluids.WATER) + return false; + if (simulate) + return true; + + if (world.dimensionType() + .ultraWarm() + && fluid.getFluid() + .is(FluidTags.WATER)) { + int i = outputPos.getX(); + int j = outputPos.getY(); + int k = outputPos.getZ(); + world.playSound(null, i, j, k, SoundEvents.FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, + 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); + return true; + } + + AllTriggers.triggerForNearbyPlayers(AllTriggers.PIPE_SPILL, world, pos, 5); + + if (waterlog) { + world.setBlock(outputPos, state.setValue(WATERLOGGED, true), 3); + world.getLiquidTicks() + .scheduleTick(outputPos, Fluids.WATER, 1); + return true; + } + world.setBlock(outputPos, fluid.getFluid() + .defaultFluidState() + .createLegacyBlock(), 3); + return true; + } + + private boolean canApplyEffects(FluidStack fluid) { + for (IEffectHandler handler : EFFECT_HANDLERS) { + if (handler.canApplyEffects(this, fluid)) { + return true; + } + } + return false; + } + + private void applyEffects(FluidStack fluid) { + for (IEffectHandler handler : EFFECT_HANDLERS) { + if (handler.canApplyEffects(this, fluid)) { + handler.applyEffects(this, fluid); + } + } + } + private class OpenEndFluidHandler extends FluidTank { public OpenEndFluidHandler() { @@ -262,7 +260,7 @@ public class OpenEndedPipe extends FlowSource { setFluid(FluidStack.EMPTY); if (wasPulling) wasPulling = false; - if (canApplyEffects(world, resource)) + if (canApplyEffects(resource)) resource = FluidHelper.copyStackWithAmount(resource, 1); int fill = super.fill(resource, action); @@ -326,9 +324,62 @@ public class OpenEndedPipe extends FlowSource { } - @Override - public boolean isEndpoint() { - return true; + public interface IEffectHandler { + boolean canApplyEffects(OpenEndedPipe pipe, FluidStack fluid); + + void applyEffects(OpenEndedPipe pipe, FluidStack fluid); + } + + public static class PotionEffectHandler implements IEffectHandler { + @Override + public boolean canApplyEffects(OpenEndedPipe pipe, FluidStack fluid) { + return fluid.getFluid().isSame(AllFluids.POTION.get()); + } + + @Override + public void applyEffects(OpenEndedPipe pipe, FluidStack fluid) { + if (pipe.cachedFluid == null || pipe.cachedEffects == null || !fluid.isFluidEqual(pipe.cachedFluid)) { + FluidStack copy = fluid.copy(); + copy.setAmount(250); + ItemStack bottle = PotionFluidHandler.fillBottle(new ItemStack(Items.GLASS_BOTTLE), fluid); + pipe.cachedEffects = PotionUtils.getMobEffects(bottle); + } + + if (pipe.cachedEffects.isEmpty()) + return; + + List list = + pipe.getWorld().getEntitiesOfClass(LivingEntity.class, pipe.getAOE(), LivingEntity::isAffectedByPotions); + for (LivingEntity livingentity : list) { + for (EffectInstance effectinstance : pipe.cachedEffects) { + Effect effect = effectinstance.getEffect(); + if (effect.isInstantenous()) { + effect.applyInstantenousEffect(null, null, livingentity, effectinstance.getAmplifier(), 0.5D); + } else { + livingentity.addEffect(new EffectInstance(effectinstance)); + } + } + } + } + } + + public static class MilkEffectHandler implements IEffectHandler { + @Override + public boolean canApplyEffects(OpenEndedPipe pipe, FluidStack fluid) { + return Tags.Fluids.MILK.contains(fluid.getFluid()); + } + + @Override + public void applyEffects(OpenEndedPipe pipe, FluidStack fluid) { + World world = pipe.getWorld(); + if (world.getGameTime() % 5 != 0) + return; + List list = + world.getEntitiesOfClass(LivingEntity.class, pipe.getAOE(), LivingEntity::isAffectedByPotions); + ItemStack curativeItem = new ItemStack(Items.MILK_BUCKET); + for (LivingEntity livingentity : list) + livingentity.curePotionEffects(curativeItem); + } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java index cda095609..686d00915 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java @@ -90,8 +90,8 @@ public class PipeAttachmentModel extends BakedModelWrapperWithData { public void putBracket(BlockState state) { this.bracket = Minecraft.getInstance() - .getBlockRendererDispatcher() - .getModelForState(state); + .getBlockRenderer() + .getBlockModel(state); } public IBakedModel getBracket() { @@ -99,7 +99,7 @@ public class PipeAttachmentModel extends BakedModelWrapperWithData { } public void putRim(Direction face, AttachmentTypes rim) { - rims[face.getIndex()] = rim; + rims[face.get3DDataValue()] = rim; } public void setEncased(boolean encased) { @@ -107,11 +107,11 @@ public class PipeAttachmentModel extends BakedModelWrapperWithData { } public boolean hasRim(Direction face) { - return rims[face.getIndex()] != AttachmentTypes.NONE; + return rims[face.get3DDataValue()] != AttachmentTypes.NONE; } public AttachmentTypes getRim(Direction face) { - return rims[face.getIndex()]; + return rims[face.get3DDataValue()]; } public boolean isEncased() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java index 072abea8c..f766f18f4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java @@ -178,7 +178,7 @@ public class PipeConnection { } FluidTransportBehaviour behaviour = - TileEntityBehaviour.get(world, pos.offset(side), FluidTransportBehaviour.TYPE); + TileEntityBehaviour.get(world, pos.relative(side), FluidTransportBehaviour.TYPE); source = Optional.of(behaviour == null ? new FlowSource.Blocked(location) : new FlowSource.OtherPipe(location)); return true; } @@ -190,7 +190,7 @@ public class PipeConnection { if (flow.fluid.isEmpty()) return; - if (world.isRemote) { + if (world.isClientSide) { if (!source.isPresent()) determineSource(world, pos); @@ -211,12 +211,12 @@ public class PipeConnection { public void serializeNBT(CompoundNBT tag, boolean clientPacket) { CompoundNBT connectionData = new CompoundNBT(); - tag.put(side.getName2(), connectionData); + tag.put(side.getName(), connectionData); if (hasPressure()) { ListNBT pressureData = new ListNBT(); - pressureData.add(FloatNBT.of(getInboundPressure())); - pressureData.add(FloatNBT.of(getOutwardPressure())); + pressureData.add(FloatNBT.valueOf(getInboundPressure())); + pressureData.add(FloatNBT.valueOf(getOutwardPressure())); connectionData.put("Pressure", pressureData); } @@ -240,7 +240,7 @@ public class PipeConnection { } public void deserializeNBT(CompoundNBT tag, BlockPos tilePos, boolean clientPacket) { - CompoundNBT connectionData = tag.getCompound(side.getName2()); + CompoundNBT connectionData = tag.getCompound(side.getName()); if (connectionData.contains("Pressure")) { ListNBT pressureData = connectionData.getList("Pressure", NBT.TAG_FLOAT); @@ -367,7 +367,7 @@ public class PipeConnection { @OnlyIn(Dist.CLIENT) private void spawnParticlesInner(World world, BlockPos pos, FluidStack fluid) { - if (world == Minecraft.getInstance().world) + if (world == Minecraft.getInstance().level) if (!isRenderEntityWithinDistance(pos)) return; if (hasOpenEnd()) @@ -378,7 +378,7 @@ public class PipeConnection { @OnlyIn(Dist.CLIENT) private void spawnSplashOnRimInner(World world, BlockPos pos, FluidStack fluid) { - if (world == Minecraft.getInstance().world) + if (world == Minecraft.getInstance().level) if (!isRenderEntityWithinDistance(pos)) return; spawnRimParticles(world, pos, fluid, SPLASH_PARTICLE_AMOUNT); @@ -398,7 +398,7 @@ public class PipeConnection { @OnlyIn(Dist.CLIENT) private void spawnPouringLiquid(World world, BlockPos pos, FluidStack fluid, int amount) { IParticleData particle = FluidFX.getFluidParticle(fluid); - Vector3d directionVec = Vector3d.of(side.getDirectionVec()); + Vector3d directionVec = Vector3d.atLowerCornerOf(side.getNormal()); if (!hasFlow()) return; Flow flow = this.flow.get(); @@ -408,11 +408,11 @@ public class PipeConnection { @OnlyIn(Dist.CLIENT) public static boolean isRenderEntityWithinDistance(BlockPos pos) { Entity renderViewEntity = Minecraft.getInstance() - .getRenderViewEntity(); + .getCameraEntity(); if (renderViewEntity == null) return false; Vector3d center = VecHelper.getCenterOf(pos); - if (renderViewEntity.getPositionVec() + if (renderViewEntity.position() .distanceTo(center) > MAX_PARTICLE_RENDER_DISTANCE) return false; return true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java index 6dd88516a..d660caedc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java @@ -36,7 +36,7 @@ public class PumpBlock extends DirectionalKineticBlock implements IWaterLoggable public PumpBlock(Properties p_i48415_1_) { super(p_i48415_1_); - setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); + registerDefaultState(super.defaultBlockState().setValue(BlockStateProperties.WATERLOGGED, false)); } @Override @@ -51,18 +51,18 @@ public class PumpBlock extends DirectionalKineticBlock implements IWaterLoggable @Override public BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace) { - return originalState.with(FACING, originalState.get(FACING) + return originalState.setValue(FACING, originalState.getValue(FACING) .getOpposite()); } @Override public BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) { BlockState state = super.updateAfterWrenched(newState, context); - World world = context.getWorld(); - BlockPos pos = context.getPos(); - if (world.isRemote) + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); + if (world.isClientSide) return state; - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); if (!(tileEntity instanceof PumpTileEntity)) return state; PumpTileEntity pump = (PumpTileEntity) tileEntity; @@ -73,26 +73,26 @@ public class PumpBlock extends DirectionalKineticBlock implements IWaterLoggable @Override public Axis getRotationAxis(BlockState state) { - return state.get(FACING) + return state.getValue(FACING) .getAxis(); } @Override public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - return AllShapes.PUMP.get(state.get(FACING)); + return AllShapes.PUMP.get(state.getValue(FACING)); } @Override public void neighborChanged(BlockState state, World world, BlockPos pos, Block otherBlock, BlockPos neighborPos, boolean isMoving) { - DebugPacketSender.func_218806_a(world, pos); + DebugPacketSender.sendNeighborsUpdatePacket(world, pos); Direction d = FluidPropagator.validateNeighbourChange(state, world, pos, otherBlock, neighborPos, isMoving); if (d == null) return; if (!isOpenAt(state, d)) return; - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); // if (world.isRemote) // return; @@ -114,32 +114,32 @@ public class PumpBlock extends DirectionalKineticBlock implements IWaterLoggable @Override public FluidState getFluidState(BlockState state) { - return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) - : Fluids.EMPTY.getDefaultState(); + return state.getValue(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getSource(false) + : Fluids.EMPTY.defaultFluidState(); } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(BlockStateProperties.WATERLOGGED); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, IWorld world, BlockPos pos, BlockPos neighbourPos) { - if (state.get(BlockStateProperties.WATERLOGGED)) { - world.getPendingFluidTicks() - .scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + if (state.getValue(BlockStateProperties.WATERLOGGED)) { + world.getLiquidTicks() + .scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return state; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - FluidState FluidState = context.getWorld() - .getFluidState(context.getPos()); - return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, - Boolean.valueOf(FluidState.getFluid() == Fluids.WATER)); + FluidState FluidState = context.getLevel() + .getFluidState(context.getClickedPos()); + return super.getStateForPlacement(context).setValue(BlockStateProperties.WATERLOGGED, + Boolean.valueOf(FluidState.getType() == Fluids.WATER)); } public static boolean isPump(BlockState state) { @@ -147,35 +147,35 @@ public class PumpBlock extends DirectionalKineticBlock implements IWaterLoggable } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { - if (world.isRemote) + public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + if (world.isClientSide) return; if (state != oldState) - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } public static boolean isOpenAt(BlockState state, Direction d) { - return d.getAxis() == state.get(FACING) + return d.getAxis() == state.getValue(FACING) .getAxis(); } @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random r) { + public void tick(BlockState state, ServerWorld world, BlockPos pos, Random r) { FluidPropagator.propagateChangedPipe(world, pos, state); } @Override - public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { boolean blockTypeChanged = state.getBlock() != newState.getBlock(); - if (blockTypeChanged && !world.isRemote) + if (blockTypeChanged && !world.isClientSide) FluidPropagator.propagateChangedPipe(world, pos, state); if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) - world.removeTileEntity(pos); + world.removeBlockEntity(pos); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java index 119c8b141..5c6886304 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.fluids; import static net.minecraft.state.properties.BlockStateProperties.FACING; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatingData; @@ -21,7 +21,7 @@ public class PumpCogInstance extends SingleRotatingInstance { @Override protected Instancer getModel() { BlockState referenceState = tile.getBlockState(); - Direction facing = referenceState.get(FACING); + Direction facing = referenceState.getValue(FACING); return getRotatingMaterial().getModel(AllBlockPartials.MECHANICAL_PUMP_COG, referenceState, facing); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index 8ecc077a4..9c92d47d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.fluids; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -7,7 +8,6 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -34,10 +34,10 @@ public class PumpRenderer extends KineticTileEntityRenderer { BlockState blockState = te.getBlockState(); float angle = MathHelper.lerp(pump.arrowDirection.getValue(partialTicks), 0, 90) - 90; for (float yRot : new float[] { 0, 90 }) { - ms.push(); + ms.pushPose(); SuperByteBuffer arrow = PartialBufferer.get(AllBlockPartials.MECHANICAL_PUMP_ARROW, blockState); - Direction direction = blockState.get(PumpBlock.FACING); - MatrixStacker.of(ms) + Direction direction = blockState.getValue(PumpBlock.FACING); + MatrixTransformStack.of(ms) .centre() .rotateY(AngleHelper.horizontalAngle(direction) + 180) .rotateX(-AngleHelper.verticalAngle(direction) - 90) @@ -46,8 +46,8 @@ public class PumpRenderer extends KineticTileEntityRenderer { .rotateY(yRot) .rotateZ(angle) .translateBack(rotationOffset); - arrow.light(light).renderInto(ms, buffer.getBuffer(RenderType.getSolid())); - ms.pop(); + arrow.light(light).renderInto(ms, buffer.getBuffer(RenderType.solid())); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java index 3c05b3abf..ff46cfa22 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java @@ -65,7 +65,7 @@ public class PumpTileEntity extends KineticTileEntity { super.tick(); float speed = getSpeed(); - if (world.isRemote) { + if (level.isClientSide) { if (speed == 0) return; arrowDirection.chase(speed >= 0 ? 1 : -1, .5f, Chaser.EXP); @@ -97,13 +97,13 @@ public class PumpTileEntity extends KineticTileEntity { return; if (speed != 0) reversed = speed < 0; - if (world.isRemote && !isVirtual()) + if (level.isClientSide && !isVirtual()) return; - BlockPos frontPos = pos.offset(getFront()); - BlockPos backPos = pos.offset(getFront().getOpposite()); - FluidPropagator.propagateChangedPipe(world, frontPos, world.getBlockState(frontPos)); - FluidPropagator.propagateChangedPipe(world, backPos, world.getBlockState(backPos)); + BlockPos frontPos = worldPosition.relative(getFront()); + BlockPos backPos = worldPosition.relative(getFront().getOpposite()); + FluidPropagator.propagateChangedPipe(level, frontPos, level.getBlockState(frontPos)); + FluidPropagator.propagateChangedPipe(level, backPos, level.getBlockState(backPos)); FluidTransportBehaviour behaviour = getBehaviour(FluidTransportBehaviour.TYPE); if (behaviour != null) @@ -115,17 +115,17 @@ public class PumpTileEntity extends KineticTileEntity { if (getSpeed() == 0) return; - BlockFace start = new BlockFace(pos, side); + BlockFace start = new BlockFace(worldPosition, side); boolean pull = isPullingOnSide(isFront(side)); Set targets = new HashSet<>(); Map>> pipeGraph = new HashMap<>(); if (!pull) - FluidPropagator.resetAffectedFluidNetworks(world, pos, side.getOpposite()); + FluidPropagator.resetAffectedFluidNetworks(level, worldPosition, side.getOpposite()); - if (!hasReachedValidEndpoint(world, start, pull)) { + if (!hasReachedValidEndpoint(level, start, pull)) { - pipeGraph.computeIfAbsent(pos, $ -> Pair.of(0, new IdentityHashMap<>())) + pipeGraph.computeIfAbsent(worldPosition, $ -> Pair.of(0, new IdentityHashMap<>())) .getSecond() .put(side, pull); pipeGraph.computeIfAbsent(start.getConnectedPos(), $ -> Pair.of(1, new IdentityHashMap<>())) @@ -142,13 +142,13 @@ public class PumpTileEntity extends KineticTileEntity { int distance = entry.getFirst(); BlockPos currentPos = entry.getSecond(); - if (!world.isAreaLoaded(currentPos, 0)) + if (!level.isAreaLoaded(currentPos, 0)) continue; if (visited.contains(currentPos)) continue; visited.add(currentPos); - BlockState currentState = world.getBlockState(currentPos); - FluidTransportBehaviour pipe = FluidPropagator.getPipe(world, currentPos); + BlockState currentState = level.getBlockState(currentPos); + FluidTransportBehaviour pipe = FluidPropagator.getPipe(level, currentPos); if (pipe == null) continue; @@ -156,11 +156,11 @@ public class PumpTileEntity extends KineticTileEntity { BlockFace blockFace = new BlockFace(currentPos, face); BlockPos connectedPos = blockFace.getConnectedPos(); - if (!world.isAreaLoaded(connectedPos, 0)) + if (!level.isAreaLoaded(connectedPos, 0)) continue; if (blockFace.isEquivalent(start)) continue; - if (hasReachedValidEndpoint(world, blockFace, pull)) { + if (hasReachedValidEndpoint(level, blockFace, pull)) { pipeGraph.computeIfAbsent(currentPos, $ -> Pair.of(distance, new IdentityHashMap<>())) .getSecond() .put(face, pull); @@ -168,7 +168,7 @@ public class PumpTileEntity extends KineticTileEntity { continue; } - FluidTransportBehaviour pipeBehaviour = FluidPropagator.getPipe(world, connectedPos); + FluidTransportBehaviour pipeBehaviour = FluidPropagator.getPipe(level, connectedPos); if (pipeBehaviour == null) continue; if (pipeBehaviour instanceof PumpFluidTransferBehaviour) @@ -206,13 +206,13 @@ public class PumpTileEntity extends KineticTileEntity { BlockPos pipePos = face.getPos(); Direction pipeSide = face.getFace(); - if (pipePos.equals(pos)) + if (pipePos.equals(worldPosition)) continue; boolean inbound = pipeGraph.get(pipePos) .getSecond() .get(pipeSide); - FluidTransportBehaviour pipeBehaviour = FluidPropagator.getPipe(world, pipePos); + FluidTransportBehaviour pipeBehaviour = FluidPropagator.getPipe(level, pipePos); if (pipeBehaviour == null) continue; @@ -249,7 +249,7 @@ public class PumpTileEntity extends KineticTileEntity { if (map.get(nextFacing) != pull) continue; if (!searchForEndpointRecursively(pipeGraph, targets, validFaces, - new BlockFace(currentPos.offset(nextFacing), nextFacing.getOpposite()), pull)) + new BlockFace(currentPos.relative(nextFacing), nextFacing.getOpposite()), pull)) continue; validFaces.computeIfAbsent(distance, $ -> new HashSet<>()) @@ -267,11 +267,11 @@ public class PumpTileEntity extends KineticTileEntity { private boolean hasReachedValidEndpoint(IWorld world, BlockFace blockFace, boolean pull) { BlockPos connectedPos = blockFace.getConnectedPos(); BlockState connectedState = world.getBlockState(connectedPos); - TileEntity tileEntity = world.getTileEntity(connectedPos); + TileEntity tileEntity = world.getBlockEntity(connectedPos); Direction face = blockFace.getFace(); // facing a pump - if (PumpBlock.isPump(connectedState) && connectedState.get(PumpBlock.FACING) + if (PumpBlock.isPump(connectedState) && connectedState.getValue(PumpBlock.FACING) .getAxis() == face.getAxis() && tileEntity instanceof PumpTileEntity) { PumpTileEntity pumpTE = (PumpTileEntity) tileEntity; return pumpTE.isPullingOnSide(pumpTE.isFront(blockFace.getOppositeFace())) != pull; @@ -317,7 +317,7 @@ public class PumpTileEntity extends KineticTileEntity { BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof PumpBlock)) return false; - Direction front = blockState.get(PumpBlock.FACING); + Direction front = blockState.getValue(PumpBlock.FACING); boolean isFront = side == front; return isFront; } @@ -327,7 +327,7 @@ public class PumpTileEntity extends KineticTileEntity { BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof PumpBlock)) return null; - return blockState.get(PumpBlock.FACING); + return blockState.getValue(PumpBlock.FACING); } protected void updatePipeNetwork(boolean front) { @@ -339,7 +339,7 @@ public class PumpTileEntity extends KineticTileEntity { BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof PumpBlock)) return false; - return blockState.get(PumpBlock.FACING) + return blockState.getValue(PumpBlock.FACING) .getAxis() == side.getAxis(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/VirtualFluid.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/VirtualFluid.java index 9ab196582..c7b5c930c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/VirtualFluid.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/VirtualFluid.java @@ -15,23 +15,23 @@ public class VirtualFluid extends ForgeFlowingFluid { } @Override - public Fluid getStillFluid() { - return super.getStillFluid(); + public Fluid getSource() { + return super.getSource(); } @Override - public Fluid getFlowingFluid() { + public Fluid getFlowing() { return this; } @Override - public Item getFilledBucket() { + public Item getBucket() { return Items.AIR; } @Override - protected BlockState getBlockState(FluidState state) { - return Blocks.AIR.getDefaultState(); + protected BlockState createLegacyBlock(FluidState state) { + return Blocks.AIR.defaultBlockState(); } @Override @@ -40,7 +40,7 @@ public class VirtualFluid extends ForgeFlowingFluid { } @Override - public int getLevel(FluidState p_207192_1_) { + public int getAmount(FluidState p_207192_1_) { return 0; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java index a3036d007..314a02e88 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java @@ -19,7 +19,7 @@ public class FillingBySpout { static RecipeWrapper wrapper = new RecipeWrapper(new ItemStackHandler(1)); public static boolean canItemBeFilled(World world, ItemStack stack) { - wrapper.setInventorySlotContents(0, stack); + wrapper.setItem(0, stack); Optional assemblyRecipe = SequencedAssemblyRecipe.getRecipe(world, wrapper, AllRecipeTypes.FILLING.getType(), FillingRecipe.class); @@ -33,7 +33,7 @@ public class FillingBySpout { } public static int getRequiredAmountForItem(World world, ItemStack stack, FluidStack availableFluid) { - wrapper.setInventorySlotContents(0, stack); + wrapper.setItem(0, stack); Optional assemblyRecipe = SequencedAssemblyRecipe.getRecipe(world, wrapper, AllRecipeTypes.FILLING.getType(), FillingRecipe.class); @@ -45,7 +45,7 @@ public class FillingBySpout { } for (IRecipe recipe : world.getRecipeManager() - .getRecipes(AllRecipeTypes.FILLING.getType(), wrapper, world)) { + .getRecipesFor(AllRecipeTypes.FILLING.getType(), wrapper, world)) { FillingRecipe fillingRecipe = (FillingRecipe) recipe; FluidIngredient requiredFluid = fillingRecipe.getRequiredFluid(); if (requiredFluid.test(availableFluid)) @@ -58,7 +58,7 @@ public class FillingBySpout { FluidStack toFill = availableFluid.copy(); toFill.setAmount(requiredAmount); - wrapper.setInventorySlotContents(0, stack); + wrapper.setItem(0, stack); FillingRecipe fillingRecipe = SequencedAssemblyRecipe.getRecipe(world, wrapper, AllRecipeTypes.FILLING.getType(), FillingRecipe.class) @@ -66,7 +66,7 @@ public class FillingBySpout { .test(toFill)) .orElseGet(() -> { for (IRecipe recipe : world.getRecipeManager() - .getRecipes(AllRecipeTypes.FILLING.getType(), wrapper, world)) { + .getRecipesFor(AllRecipeTypes.FILLING.getType(), wrapper, world)) { FillingRecipe fr = (FillingRecipe) recipe; FluidIngredient requiredFluid = fr.getRequiredFluid(); if (requiredFluid.test(toFill)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java index 56dd45e26..21e3d3499 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java @@ -33,7 +33,7 @@ public class FillingRecipe extends ProcessingRecipe implements IA @Override public boolean matches(RecipeWrapper inv, World p_77569_2_) { return ingredients.get(0) - .test(inv.getStackInSlot(0)); + .test(inv.getItem(0)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java index b1bbcb128..73d864880 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java @@ -86,18 +86,18 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { BlockState emptied = blockState; Fluid fluid = Fluids.EMPTY; - if (blockState.contains(BlockStateProperties.WATERLOGGED) && blockState.get(BlockStateProperties.WATERLOGGED)) { - emptied = blockState.with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(false)); + if (blockState.hasProperty(BlockStateProperties.WATERLOGGED) && blockState.getValue(BlockStateProperties.WATERLOGGED)) { + emptied = blockState.setValue(BlockStateProperties.WATERLOGGED, Boolean.valueOf(false)); fluid = Fluids.WATER; } else if (blockState.getBlock() instanceof FlowingFluidBlock) { FlowingFluidBlock flowingFluid = (FlowingFluidBlock) blockState.getBlock(); - emptied = Blocks.AIR.getDefaultState(); - if (blockState.get(FlowingFluidBlock.LEVEL) == 0) + emptied = Blocks.AIR.defaultBlockState(); + if (blockState.getValue(FlowingFluidBlock.LEVEL) == 0) fluid = flowingFluid.getFluid(); else { - affectedArea.expandTo(new MutableBoundingBox(currentPos, currentPos)); + affectedArea.expand(new MutableBoundingBox(currentPos, currentPos)); if (!tileEntity.isVirtual()) - world.setBlockState(currentPos, emptied, 2 | 16); + world.setBlock(currentPos, emptied, 2 | 16); queue.dequeue(); if (queue.isEmpty()) { isValid = checkValid(world, rootPos); @@ -106,18 +106,18 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { continue; } } else if (blockState.getFluidState() - .getFluid() != Fluids.EMPTY - && blockState.getCollisionShape(world, currentPos, ISelectionContext.dummy()) + .getType() != Fluids.EMPTY + && blockState.getCollisionShape(world, currentPos, ISelectionContext.empty()) .isEmpty()) { fluid = blockState.getFluidState() - .getFluid(); - emptied = Blocks.AIR.getDefaultState(); + .getType(); + emptied = Blocks.AIR.defaultBlockState(); } if (this.fluid == null) this.fluid = fluid; - if (!this.fluid.isEquivalentTo(fluid)) { + if (!this.fluid.isSame(fluid)) { queue.dequeue(); if (queue.isEmpty()) { isValid = checkValid(world, rootPos); @@ -130,16 +130,16 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { return true; playEffect(world, currentPos, fluid, true); - AllTriggers.triggerForNearbyPlayers(AllTriggers.HOSE_PULLEY, world, tileEntity.getPos(), 8); + AllTriggers.triggerForNearbyPlayers(AllTriggers.HOSE_PULLEY, world, tileEntity.getBlockPos(), 8); if (infinite) { - AllTriggers.triggerForNearbyPlayers(AllTriggers.INFINITE_FLUID.constructTriggerFor(FluidHelper.convertToStill(fluid)), world, tileEntity.getPos(), 8); + AllTriggers.triggerForNearbyPlayers(AllTriggers.INFINITE_FLUID.constructTriggerFor(FluidHelper.convertToStill(fluid)), world, tileEntity.getBlockPos(), 8); return true; } if (!tileEntity.isVirtual()) - world.setBlockState(currentPos, emptied, 2 | 16); - affectedArea.expandTo(new MutableBoundingBox(currentPos, currentPos)); + world.setBlock(currentPos, emptied, 2 | 16); + affectedArea.expand(new MutableBoundingBox(currentPos, currentPos)); queue.dequeue(); if (queue.isEmpty()) { @@ -175,10 +175,10 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { protected boolean checkValid(World world, BlockPos root) { BlockPos currentPos = root; - for (int timeout = 1000; timeout > 0 && !root.equals(tileEntity.getPos()); timeout--) { + for (int timeout = 1000; timeout > 0 && !root.equals(tileEntity.getBlockPos()); timeout--) { FluidBlockType canPullFluidsFrom = canPullFluidsFrom(world.getBlockState(currentPos), currentPos); if (canPullFluidsFrom == FluidBlockType.FLOWING) { - currentPos = currentPos.up(); + currentPos = currentPos.above(); continue; } if (canPullFluidsFrom == FluidBlockType.SOURCE) @@ -200,12 +200,12 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { } protected FluidBlockType canPullFluidsFrom(BlockState blockState, BlockPos pos) { - if (blockState.contains(BlockStateProperties.WATERLOGGED) && blockState.get(BlockStateProperties.WATERLOGGED)) + if (blockState.hasProperty(BlockStateProperties.WATERLOGGED) && blockState.getValue(BlockStateProperties.WATERLOGGED)) return FluidBlockType.SOURCE; if (blockState.getBlock() instanceof FlowingFluidBlock) - return blockState.get(FlowingFluidBlock.LEVEL) == 0 ? FluidBlockType.SOURCE : FluidBlockType.FLOWING; + return blockState.getValue(FlowingFluidBlock.LEVEL) == 0 ? FluidBlockType.SOURCE : FluidBlockType.FLOWING; if (blockState.getFluidState() - .getFluid() != Fluids.EMPTY && blockState.getCollisionShape(getWorld(), pos, ISelectionContext.dummy()) + .getType() != Fluids.EMPTY && blockState.getCollisionShape(getWorld(), pos, ISelectionContext.empty()) .isEmpty()) return FluidBlockType.SOURCE; return FluidBlockType.NONE; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java index 0fbd08807..7ac14a5e9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java @@ -59,7 +59,7 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { super.tick(); if (!infinityCheckFrontier.isEmpty() && rootPos != null) { Fluid fluid = getWorld().getFluidState(rootPos) - .getFluid(); + .getType(); if (fluid != Fluids.EMPTY) continueValidation(fluid); } @@ -124,13 +124,13 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { int maxRange = maxRange(); int maxRangeSq = maxRange * maxRange; int maxBlocks = maxBlocks(); - boolean evaporate = world.getDimension() - .isUltrawarm() && fluid.isIn(FluidTags.WATER); + boolean evaporate = world.dimensionType() + .ultraWarm() && fluid.is(FluidTags.WATER); if (infinite || evaporate) { FluidState fluidState = world.getFluidState(rootPos); - boolean equivalentTo = fluidState.getFluid() - .isEquivalentTo(fluid); + boolean equivalentTo = fluidState.getType() + .isSame(fluid); if (!equivalentTo && !evaporate) return false; if (simulate) @@ -140,8 +140,8 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { int i = root.getX(); int j = root.getY(); int k = root.getZ(); - world.playSound(null, i, j, k, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, - 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + world.playSound(null, i, j, k, SoundEvents.FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, + 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); } return true; } @@ -175,36 +175,36 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { playEffect(world, currentPos, fluid, false); BlockState blockState = world.getBlockState(currentPos); - if (blockState.contains(BlockStateProperties.WATERLOGGED) && fluid.isEquivalentTo(Fluids.WATER)) { + if (blockState.hasProperty(BlockStateProperties.WATERLOGGED) && fluid.isSame(Fluids.WATER)) { if (!tileEntity.isVirtual()) - world.setBlockState(currentPos, - updatePostWaterlogging(blockState.with(BlockStateProperties.WATERLOGGED, true)), + world.setBlock(currentPos, + updatePostWaterlogging(blockState.setValue(BlockStateProperties.WATERLOGGED, true)), 2 | 16); } else { replaceBlock(world, currentPos, blockState); if (!tileEntity.isVirtual()) - world.setBlockState(currentPos, FluidHelper.convertToStill(fluid) - .getDefaultState() - .getBlockState(), 2 | 16); + world.setBlock(currentPos, FluidHelper.convertToStill(fluid) + .defaultFluidState() + .createLegacyBlock(), 2 | 16); } - ITickList pendingFluidTicks = world.getPendingFluidTicks(); + ITickList pendingFluidTicks = world.getLiquidTicks(); if (pendingFluidTicks instanceof ServerTickList) { ServerTickList serverTickList = (ServerTickList) pendingFluidTicks; NextTickListEntry removedEntry = null; - for (NextTickListEntry nextTickListEntry : serverTickList.pendingTickListEntriesHashSet) { - if (nextTickListEntry.position.equals(currentPos)) { + for (NextTickListEntry nextTickListEntry : serverTickList.tickNextTickSet) { + if (nextTickListEntry.pos.equals(currentPos)) { removedEntry = nextTickListEntry; break; } } if (removedEntry != null) { - serverTickList.pendingTickListEntriesHashSet.remove(removedEntry); - serverTickList.pendingTickListEntriesTreeSet.remove(removedEntry); + serverTickList.tickNextTickSet.remove(removedEntry); + serverTickList.tickNextTickList.remove(removedEntry); } } - affectedArea.expandTo(new MutableBoundingBox(currentPos, currentPos)); + affectedArea.expand(new MutableBoundingBox(currentPos, currentPos)); } } @@ -218,10 +218,10 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { if (side == Direction.UP) continue; - BlockPos offsetPos = currentPos.offset(side); + BlockPos offsetPos = currentPos.relative(side); if (visited.contains(offsetPos)) continue; - if (offsetPos.distanceSq(rootPos) > maxRangeSq) + if (offsetPos.distSqr(rootPos) > maxRangeSq) continue; SpaceType nextSpaceType = getAtPos(world, offsetPos, fluid); @@ -231,7 +231,7 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { } if (!simulate && success) - AllTriggers.triggerForNearbyPlayers(AllTriggers.HOSE_PULLEY, world, tileEntity.getPos(), 8); + AllTriggers.triggerForNearbyPlayers(AllTriggers.HOSE_PULLEY, world, tileEntity.getBlockPos(), 8); return success; } @@ -252,39 +252,39 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { BlockState blockState = world.getBlockState(pos); FluidState fluidState = blockState.getFluidState(); - if (blockState.contains(BlockStateProperties.WATERLOGGED)) - return toFill.isEquivalentTo(Fluids.WATER) - ? blockState.get(BlockStateProperties.WATERLOGGED) ? SpaceType.FILLED : SpaceType.FILLABLE + if (blockState.hasProperty(BlockStateProperties.WATERLOGGED)) + return toFill.isSame(Fluids.WATER) + ? blockState.getValue(BlockStateProperties.WATERLOGGED) ? SpaceType.FILLED : SpaceType.FILLABLE : SpaceType.BLOCKING; if (blockState.getBlock() instanceof FlowingFluidBlock) - return blockState.get(FlowingFluidBlock.LEVEL) == 0 - ? toFill.isEquivalentTo(fluidState.getFluid()) ? SpaceType.FILLED : SpaceType.BLOCKING + return blockState.getValue(FlowingFluidBlock.LEVEL) == 0 + ? toFill.isSame(fluidState.getType()) ? SpaceType.FILLED : SpaceType.BLOCKING : SpaceType.FILLABLE; - if (fluidState.getFluid() != Fluids.EMPTY - && blockState.getCollisionShape(getWorld(), pos, ISelectionContext.dummy()) + if (fluidState.getType() != Fluids.EMPTY + && blockState.getCollisionShape(getWorld(), pos, ISelectionContext.empty()) .isEmpty()) - return toFill.isEquivalentTo(fluidState.getFluid()) ? SpaceType.FILLED : SpaceType.BLOCKING; + return toFill.isSame(fluidState.getType()) ? SpaceType.FILLED : SpaceType.BLOCKING; return canBeReplacedByFluid(world, pos, blockState) ? SpaceType.FILLABLE : SpaceType.BLOCKING; } protected void replaceBlock(World world, BlockPos pos, BlockState state) { TileEntity tileentity = state.getBlock() - .hasTileEntity(state) ? world.getTileEntity(pos) : null; - Block.spawnDrops(state, world, pos, tileentity); + .hasTileEntity(state) ? world.getBlockEntity(pos) : null; + Block.dropResources(state, world, pos, tileentity); } // From FlowingFluidBlock#isBlocked protected boolean canBeReplacedByFluid(IBlockReader world, BlockPos pos, BlockState state) { Block block = state.getBlock(); - if (!(block instanceof DoorBlock) && !block.isIn(BlockTags.SIGNS) && block != Blocks.LADDER + if (!(block instanceof DoorBlock) && !block.is(BlockTags.SIGNS) && block != Blocks.LADDER && block != Blocks.SUGAR_CANE && block != Blocks.BUBBLE_COLUMN) { Material material = state.getMaterial(); - if (material != Material.PORTAL && material != Material.STRUCTURE_VOID && material != Material.OCEAN_PLANT - && material != Material.SEA_GRASS) { - return !material.blocksMovement(); + if (material != Material.PORTAL && material != Material.STRUCTURAL_AIR && material != Material.WATER_PLANT + && material != Material.REPLACEABLE_WATER_PLANT) { + return !material.blocksMotion(); } else { return false; } @@ -294,8 +294,8 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { } protected BlockState updatePostWaterlogging(BlockState state) { - if (state.contains(BlockStateProperties.LIT)) - state = state.with(BlockStateProperties.LIT, false); + if (state.hasProperty(BlockStateProperties.LIT)) + state = state.setValue(BlockStateProperties.LIT, false); return state; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java index a3c70ed09..d3ecf1394 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java @@ -108,13 +108,13 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour { protected void scheduleUpdatesInAffectedArea() { World world = getWorld(); - BlockPos.getAllInBox(new BlockPos(affectedArea.minX - 1, affectedArea.minY - 1, affectedArea.minZ - 1), new BlockPos(affectedArea.maxX + 1, affectedArea.maxY + 1, affectedArea.maxZ + 1)) + BlockPos.betweenClosedStream(new BlockPos(affectedArea.x0 - 1, affectedArea.y0 - 1, affectedArea.z0 - 1), new BlockPos(affectedArea.x1 + 1, affectedArea.y1 + 1, affectedArea.z1 + 1)) .forEach(pos -> { FluidState nextFluidState = world.getFluidState(pos); if (nextFluidState.isEmpty()) return; - world.getPendingFluidTicks() - .scheduleTick(pos, nextFluidState.getFluid(), world.getRandom() + world.getLiquidTicks() + .scheduleTick(pos, nextFluidState.getType(), world.getRandom() .nextInt(5)); }); } @@ -129,9 +129,9 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour { if (compareDistance != 0) return compareDistance; return Double.compare(VecHelper.getCenterOf(pos2) - .squareDistanceTo(centerOfRoot), + .distanceToSqr(centerOfRoot), VecHelper.getCenterOf(pos1) - .squareDistanceTo(centerOfRoot)); + .distanceToSqr(centerOfRoot)); } protected Fluid search(Fluid fluid, List frontier, Set visited, @@ -154,10 +154,10 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour { if (fluidState.isEmpty()) continue; - Fluid currentFluid = FluidHelper.convertToStill(fluidState.getFluid()); + Fluid currentFluid = FluidHelper.convertToStill(fluidState.getType()); if (fluid == null) fluid = currentFluid; - if (!currentFluid.isEquivalentTo(fluid)) + if (!currentFluid.isSame(fluid)) continue; add.accept(currentPos, entry.distance); @@ -166,16 +166,16 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour { if (!searchDownward && side == Direction.DOWN) continue; - BlockPos offsetPos = currentPos.offset(side); + BlockPos offsetPos = currentPos.relative(side); if (visited.contains(offsetPos)) continue; - if (offsetPos.distanceSq(rootPos) > maxRangeSq) + if (offsetPos.distSqr(rootPos) > maxRangeSq) continue; FluidState nextFluidState = world.getFluidState(offsetPos); if (nextFluidState.isEmpty()) continue; - Fluid nextFluid = nextFluidState.getFluid(); + Fluid nextFluid = nextFluidState.getType(); if (nextFluid == FluidHelper.convertToFlowing(nextFluid) && side == Direction.UP && !VecHelper.onSameAxis(rootPos, offsetPos, Axis.Y)) continue; @@ -188,16 +188,16 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour { } protected void playEffect(World world, BlockPos pos, Fluid fluid, boolean fillSound) { - BlockPos splooshPos = pos == null ? tileEntity.getPos() : pos; + BlockPos splooshPos = pos == null ? tileEntity.getBlockPos() : pos; SoundEvent soundevent = fillSound ? fluid.getAttributes() .getFillSound() : fluid.getAttributes() .getEmptySound(); if (soundevent == null) - soundevent = fluid.isIn(FluidTags.LAVA) - ? fillSound ? SoundEvents.ITEM_BUCKET_FILL_LAVA : SoundEvents.ITEM_BUCKET_EMPTY_LAVA - : fillSound ? SoundEvents.ITEM_BUCKET_FILL : SoundEvents.ITEM_BUCKET_EMPTY; + soundevent = fluid.is(FluidTags.LAVA) + ? fillSound ? SoundEvents.BUCKET_FILL_LAVA : SoundEvents.BUCKET_EMPTY_LAVA + : fillSound ? SoundEvents.BUCKET_FILL : SoundEvents.BUCKET_EMPTY; world.playSound(null, splooshPos, soundevent, SoundCategory.BLOCKS, 0.3F, 1.0F); if (world instanceof ServerWorld) @@ -214,9 +214,9 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour { nbt.put("LastPos", NBTUtil.writeBlockPos(rootPos)); if (affectedArea != null) { nbt.put("AffectedAreaFrom", - NBTUtil.writeBlockPos(new BlockPos(affectedArea.minX, affectedArea.minY, affectedArea.minZ))); + NBTUtil.writeBlockPos(new BlockPos(affectedArea.x0, affectedArea.y0, affectedArea.z0))); nbt.put("AffectedAreaTo", - NBTUtil.writeBlockPos(new BlockPos(affectedArea.maxX, affectedArea.maxY, affectedArea.maxZ))); + NBTUtil.writeBlockPos(new BlockPos(affectedArea.x1, affectedArea.y1, affectedArea.z1))); } super.write(nbt, clientPacket); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java index 0b523ffcc..8704f92a7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java @@ -37,7 +37,7 @@ public class FluidSplashPacket extends SimplePacketBase { public void handle(Supplier ctx) { ctx.get() .enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - if (Minecraft.getInstance().player.getPositionVec() + if (Minecraft.getInstance().player.position() .distanceTo(new Vector3d(pos.getX(), pos.getY(), pos.getZ())) > 100) return; FluidFX.splash(pos, fluid); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java index 81e462df4..dc27a1146 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java @@ -84,7 +84,7 @@ public class GenericItemFilling { return -1; if (tank instanceof FluidBucketWrapper) { Item filledBucket = availableFluid.getFluid() - .getFilledBucket(); + .getBucket(); if (filledBucket == null || filledBucket == Items.AIR) return -1; if (!((FluidBucketWrapper) tank).getFluid() @@ -99,14 +99,14 @@ public class GenericItemFilling { private static boolean canFillGlassBottleInternally(FluidStack availableFluid) { return availableFluid.getFluid() - .isEquivalentTo(Fluids.WATER) + .isSame(Fluids.WATER) || availableFluid.getFluid() - .isEquivalentTo(AllFluids.POTION.get()); + .isSame(AllFluids.POTION.get()); } private static boolean canFillBucketInternally(FluidStack availableFluid) { return availableFluid.getFluid() - .isEquivalentTo(ForgeMod.MILK.get()); + .isSame(ForgeMod.MILK.get()); } public static ItemStack fillItem(World world, int requiredAmount, ItemStack stack, FluidStack availableFluid) { @@ -117,7 +117,7 @@ public class GenericItemFilling { if (stack.getItem() == Items.GLASS_BOTTLE && canFillGlassBottleInternally(toFill)) { ItemStack fillBottle = ItemStack.EMPTY; if (FluidHelper.isWater(toFill.getFluid())) - fillBottle = PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.WATER); + fillBottle = PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER); else fillBottle = PotionFluidHandler.fillBottle(stack, toFill); stack.shrink(1); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java index 7ec814a63..b79cfc316 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java @@ -28,30 +28,30 @@ public class HosePulleyBlock extends HorizontalKineticBlock implements ITE pos.down((int) Math.ceil(offset.getValue())), () -> !this.isMoving); + () -> worldPosition.below((int) Math.ceil(offset.getValue())), () -> !this.isMoving); capability = LazyOptional.of(() -> handler); } @@ -83,7 +83,7 @@ public class HosePulleyTileEntity extends KineticTileEntity { float newOffset = offset.getValue() + getMovementSpeed(); if (newOffset < 0) isMoving = false; - if (!world.getBlockState(pos.down((int) Math.ceil(newOffset))) + if (!level.getBlockState(worldPosition.below((int) Math.ceil(newOffset))) .getMaterial() .isReplaceable()) { isMoving = false; @@ -100,13 +100,13 @@ public class HosePulleyTileEntity extends KineticTileEntity { @Override @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox().expand(0, -offset.getValue(), 0); + return super.getRenderBoundingBox().expandTowards(0, -offset.getValue(), 0); } @Override @OnlyIn(Dist.CLIENT) - public double getMaxRenderDistanceSquared() { - return super.getMaxRenderDistanceSquared() + offset.getValue() * offset.getValue(); + public double getViewDistance() { + return super.getViewDistance() + offset.getValue() * offset.getValue(); } @Override @@ -117,7 +117,7 @@ public class HosePulleyTileEntity extends KineticTileEntity { newOffset = 0; isMoving = false; } - if (!world.getBlockState(pos.down((int) Math.ceil(newOffset))) + if (!level.getBlockState(worldPosition.below((int) Math.ceil(newOffset))) .getMaterial() .isReplaceable()) { newOffset = (int) newOffset; @@ -132,13 +132,13 @@ public class HosePulleyTileEntity extends KineticTileEntity { @Override public void lazyTick() { super.lazyTick(); - if (world.isRemote) + if (level.isClientSide) return; if (isMoving) return; int ceil = (int) Math.ceil(offset.getValue() + getMovementSpeed()); - if (getMovementSpeed() > 0 && world.getBlockState(pos.down(ceil)) + if (getMovementSpeed() > 0 && level.getBlockState(worldPosition.below(ceil)) .getMaterial() .isReplaceable()) { isMoving = true; @@ -169,14 +169,14 @@ public class HosePulleyTileEntity extends KineticTileEntity { } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); capability.invalidate(); } public float getMovementSpeed() { float movementSpeed = convertToLinear(getSpeed()); - if (world.isRemote) + if (level.isClientSide) movementSpeed *= ServerSpeedProvider.get(); return movementSpeed; } @@ -188,7 +188,7 @@ public class HosePulleyTileEntity extends KineticTileEntity { @Override public LazyOptional getCapability(Capability cap, Direction side) { if (isFluidHandlerCap(cap) - && (side == null || HosePulleyBlock.hasPipeTowards(world, pos, getBlockState(), side))) + && (side == null || HosePulleyBlock.hasPipeTowards(level, worldPosition, getBlockState(), side))) return this.capability.cast(); return super.getCapability(cap, side); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java index 5b9e93781..b8ce936c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java @@ -32,21 +32,21 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE { if (!heldItem.isEmpty()) { te.internalTank.allowInsertion(); ActionResultType tryExchange = tryExchange(worldIn, player, handIn, heldItem, te); te.internalTank.forbidInsertion(); - if (tryExchange.isAccepted()) + if (tryExchange.consumesAction()) return tryExchange; } ItemStack heldItemStack = te.getHeldItemStack(); - if (!worldIn.isRemote && !heldItemStack.isEmpty()) { + if (!worldIn.isClientSide && !heldItemStack.isEmpty()) { player.inventory.placeItemBackInInventory(worldIn, heldItemStack); te.heldItem = null; te.notifyUpdate(); @@ -71,15 +71,15 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE { ItemStack heldItemStack = te.getHeldItemStack(); if (!heldItemStack.isEmpty()) - InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), heldItemStack); + InventoryHelper.dropItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), heldItemStack); }); - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } @Override @@ -98,17 +98,17 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE 1 && EmptyingByBasin.canItemBeEmptied(te.getWorld(), stack)) { + if (stack.getCount() > 1 && EmptyingByBasin.canItemBeEmptied(te.getLevel(), stack)) { returned = ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1); stack = ItemHandlerHelper.copyStackWithSize(stack, 1); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java index 8b7ac12f4..83953bdc1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.fluids.actors; import java.util.Random; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; @@ -10,7 +11,6 @@ import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; @@ -48,25 +48,25 @@ public class ItemDrainRenderer extends SmartTileEntityRenderer 1 && EmptyingByBasin.canItemBeEmptied(world, inserted)) { + if (inserted.getCount() > 1 && EmptyingByBasin.canItemBeEmptied(level, inserted)) { returned = ItemHandlerHelper.copyStackWithSize(inserted, inserted.getCount() - 1); inserted = ItemHandlerHelper.copyStackWithSize(inserted, 1); } @@ -81,7 +81,7 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI transportedStack.prevSideOffset = transportedStack.sideOffset; transportedStack.prevBeltPosition = transportedStack.beltPosition; setHeldItem(transportedStack, side); - markDirty(); + setChanged(); sendData(); return returned; @@ -100,7 +100,7 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI return; } - boolean onClient = world.isRemote && !isVirtual(); + boolean onClient = level.isClientSide && !isVirtual(); if (processingTicks > 0) { heldItem.prevBeltPosition = .5f; @@ -144,26 +144,26 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI return; } - BlockPos nextPosition = pos.offset(side); + BlockPos nextPosition = worldPosition.relative(side); DirectBeltInputBehaviour directBeltInputBehaviour = - TileEntityBehaviour.get(world, nextPosition, DirectBeltInputBehaviour.TYPE); + TileEntityBehaviour.get(level, nextPosition, DirectBeltInputBehaviour.TYPE); if (directBeltInputBehaviour == null) { - if (!BlockHelper.hasBlockSolidSide(world.getBlockState(nextPosition), world, nextPosition, + if (!BlockHelper.hasBlockSolidSide(level.getBlockState(nextPosition), level, nextPosition, side.getOpposite())) { ItemStack ejected = heldItem.stack; - Vector3d outPos = VecHelper.getCenterOf(pos) - .add(Vector3d.of(side.getDirectionVec()) + Vector3d outPos = VecHelper.getCenterOf(worldPosition) + .add(Vector3d.atLowerCornerOf(side.getNormal()) .scale(.75)); float movementSpeed = itemMovementPerTick(); - Vector3d outMotion = Vector3d.of(side.getDirectionVec()) + Vector3d outMotion = Vector3d.atLowerCornerOf(side.getNormal()) .scale(movementSpeed) .add(0, 1 / 8f, 0); outPos.add(outMotion.normalize()); - ItemEntity entity = new ItemEntity(world, outPos.x, outPos.y + 6 / 16f, outPos.z, ejected); - entity.setMotion(outMotion); - entity.setDefaultPickupDelay(); - entity.velocityChanged = true; - world.addEntity(entity); + ItemEntity entity = new ItemEntity(level, outPos.x, outPos.y + 6 / 16f, outPos.z, ejected); + entity.setDeltaMovement(outMotion); + entity.setDefaultPickUpDelay(); + entity.hurtMarked = true; + level.addFreshEntity(entity); heldItem = null; notifyUpdate(); @@ -177,8 +177,8 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI ItemStack returned = directBeltInputBehaviour.handleInsertion(heldItem.copy(), side, false); if (returned.isEmpty()) { - if (world.getTileEntity(nextPosition) instanceof ItemDrainTileEntity) - AllTriggers.triggerForNearbyPlayers(AllTriggers.CHAINED_ITEM_DRAIN, world, pos, 5); + if (level.getBlockEntity(nextPosition) instanceof ItemDrainTileEntity) + AllTriggers.triggerForNearbyPlayers(AllTriggers.CHAINED_ITEM_DRAIN, level, worldPosition, 5); heldItem = null; notifyUpdate(); return; @@ -194,7 +194,7 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI } if (heldItem.prevBeltPosition < .5f && heldItem.beltPosition >= .5f) { - if (!EmptyingByBasin.canItemBeEmptied(world, heldItem.stack)) + if (!EmptyingByBasin.canItemBeEmptied(level, heldItem.stack)) return; heldItem.beltPosition = .5f; if (onClient) @@ -206,14 +206,14 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI } protected boolean continueProcessing() { - if (world.isRemote && !isVirtual()) + if (level.isClientSide && !isVirtual()) return true; if (processingTicks < 5) return true; - if (!EmptyingByBasin.canItemBeEmptied(world, heldItem.stack)) + if (!EmptyingByBasin.canItemBeEmptied(level, heldItem.stack)) return false; - Pair emptyItem = EmptyingByBasin.emptyItem(world, heldItem.stack, true); + Pair emptyItem = EmptyingByBasin.emptyItem(level, heldItem.stack, true); FluidStack fluidFromItem = emptyItem.getFirst(); if (processingTicks > 5) { @@ -228,8 +228,8 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI return true; } - emptyItem = EmptyingByBasin.emptyItem(world, heldItem.stack.copy(), false); - AllTriggers.triggerForNearbyPlayers(AllTriggers.ITEM_DRAIN, world, pos, 5); + emptyItem = EmptyingByBasin.emptyItem(level, heldItem.stack.copy(), false); + AllTriggers.triggerForNearbyPlayers(AllTriggers.ITEM_DRAIN, level, worldPosition, 5); // Process finished ItemStack out = emptyItem.getSecond(); @@ -250,8 +250,8 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); for (LazyOptional lazyOptional : itemHandlers.values()) lazyOptional.invalidate(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java index be3a9dcd2..30ea3345e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java @@ -38,17 +38,17 @@ public class SpoutBlock extends Block implements IWrenchable { } @Override - public boolean hasComparatorInputOverride(BlockState state) { + public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override - public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { + public int getAnalogOutputSignal(BlockState blockState, World worldIn, BlockPos pos) { return ComparatorUtil.levelOfSmartFluidTank(worldIn, pos); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java index 56e8a77d6..5594f5ef7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java @@ -42,11 +42,11 @@ public class SpoutRenderer extends SafeTileEntityRenderer { float min = 2.5f / 16f; float max = min + (11 / 16f); float yOffset = (11 / 16f) * level; - ms.push(); + ms.pushPose(); ms.translate(0, yOffset, 0); FluidRenderer.renderTiledFluidBB(fluidStack, min, min - yOffset, min, max, min, max, buffer, ms, light, false); - ms.pop(); + ms.popPose(); } int processingTicks = te.getCorrectedProcessingTicks(); @@ -57,7 +57,7 @@ public class SpoutRenderer extends SafeTileEntityRenderer { if (processingTicks != -1) { radius = (float) (Math.pow(((2 * processingProgress) - 1), 2) - 1); - AxisAlignedBB bb = new AxisAlignedBB(0.5, .5, 0.5, 0.5, -1.2, 0.5).grow(radius / 32f); + AxisAlignedBB bb = new AxisAlignedBB(0.5, .5, 0.5, 0.5, -1.2, 0.5).inflate(radius / 32f); FluidRenderer.renderTiledFluidBB(fluidStack, (float) bb.minX, (float) bb.minY, (float) bb.minZ, (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ, buffer, ms, light, true); } @@ -70,14 +70,14 @@ public class SpoutRenderer extends SafeTileEntityRenderer { else if (processingPT < 10) squeeze = -1; - ms.push(); + ms.pushPose(); for (PartialModel bit : BITS) { PartialBufferer.get(bit, te.getBlockState()) .light(light) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + .renderInto(ms, buffer.getBuffer(RenderType.solid())); ms.translate(0, -3 * squeeze / 32f, 0); } - ms.pop(); + ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index df7db0317..371e73e47 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -76,7 +76,7 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { if (cachedBoundingBox == null) - cachedBoundingBox = super.getRenderBoundingBox().expand(0, -2, 0); + cachedBoundingBox = super.getRenderBoundingBox().expandTowards(0, -2, 0); return cachedBoundingBox; } @@ -93,11 +93,11 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor protected ProcessingResult onItemReceived(TransportedItemStack transported, TransportedItemStackHandlerBehaviour handler) { - if (!FillingBySpout.canItemBeFilled(world, transported.stack)) + if (!FillingBySpout.canItemBeFilled(level, transported.stack)) return PASS; if (tank.isEmpty()) return HOLD; - if (FillingBySpout.getRequiredAmountForItem(world, transported.stack, getCurrentFluidInTank()) == -1) + if (FillingBySpout.getRequiredAmountForItem(level, transported.stack, getCurrentFluidInTank()) == -1) return PASS; return HOLD; } @@ -107,12 +107,12 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor shouldAnimate = true; if (processingTicks != -1 && processingTicks != 5) return HOLD; - if (!FillingBySpout.canItemBeFilled(world, transported.stack)) + if (!FillingBySpout.canItemBeFilled(level, transported.stack)) return PASS; if (tank.isEmpty()) return HOLD; FluidStack fluid = getCurrentFluidInTank(); - int requiredAmountForItem = FillingBySpout.getRequiredAmountForItem(world, transported.stack, fluid.copy()); + int requiredAmountForItem = FillingBySpout.getRequiredAmountForItem(level, transported.stack, fluid.copy()); if (requiredAmountForItem == -1) return PASS; if (requiredAmountForItem > fluid.getAmount()) @@ -125,7 +125,7 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor } // Process finished - ItemStack out = FillingBySpout.fillItem(world, requiredAmountForItem, transported.stack, fluid); + ItemStack out = FillingBySpout.fillItem(level, requiredAmountForItem, transported.stack, fluid); if (!out.isEmpty()) { List outList = new ArrayList<>(); TransportedItemStack held = null; @@ -137,10 +137,10 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor handler.handleProcessingOnItem(transported, TransportedResult.convertToAndLeaveHeld(outList, held)); } - AllTriggers.triggerForNearbyPlayers(AllTriggers.SPOUT, world, pos, 5); - if (out.getItem() instanceof PotionItem && !PotionUtils.getEffectsFromStack(out) + AllTriggers.triggerForNearbyPlayers(AllTriggers.SPOUT, level, worldPosition, 5); + if (out.getItem() instanceof PotionItem && !PotionUtils.getMobEffects(out) .isEmpty()) - AllTriggers.triggerForNearbyPlayers(AllTriggers.SPOUT_POTION, world, pos, 5); + AllTriggers.triggerForNearbyPlayers(AllTriggers.SPOUT_POTION, level, worldPosition, 5); tank.getPrimaryHandler() .setFluid(fluid); @@ -152,7 +152,7 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor private void processTicCastBlock() { if (!IS_TIC_LOADED || CASTING_FLUID_HANDLER_CLASS == null) return; - if (world == null) + if (level == null) return; IFluidHandler localTank = this.tank.getCapability() .orElse(null); @@ -161,10 +161,10 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor FluidStack fluid = getCurrentFluidInTank(); if (fluid.getAmount() == 0) return; - TileEntity te = world.getTileEntity(pos.down(2)); + TileEntity te = level.getBlockEntity(worldPosition.below(2)); if (te == null) return; - IFluidHandler handler = getFluidHandler(pos.down(2), Direction.UP); + IFluidHandler handler = getFluidHandler(worldPosition.below(2), Direction.UP); if (!CASTING_FLUID_HANDLER_CLASS.isInstance(handler)) return; if (handler.getTanks() != 1) @@ -242,7 +242,7 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor processTicCastBlock(); if (processingTicks >= 0) processingTicks--; - if (processingTicks >= 8 && world.isRemote && shouldAnimate) + if (processingTicks >= 8 && level.isClientSide && shouldAnimate) spawnProcessingParticles(tank.getPrimaryTank() .getRenderedFluid()); } @@ -250,10 +250,10 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor protected void spawnProcessingParticles(FluidStack fluid) { if (isVirtual()) return; - Vector3d vec = VecHelper.getCenterOf(pos); + Vector3d vec = VecHelper.getCenterOf(worldPosition); vec = vec.subtract(0, 8 / 16f, 0); IParticleData particle = FluidFX.getFluidParticle(fluid); - world.addOptionalParticle(particle, vec.x, vec.y, vec.z, 0, -.1f, 0); + level.addAlwaysVisibleParticle(particle, vec.x, vec.y, vec.z, 0, -.1f, 0); } protected static int SPLASH_PARTICLE_COUNT = 20; @@ -261,22 +261,22 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor protected void spawnSplash(FluidStack fluid) { if (isVirtual()) return; - Vector3d vec = VecHelper.getCenterOf(pos); + Vector3d vec = VecHelper.getCenterOf(worldPosition); vec = vec.subtract(0, 2 - 5 / 16f, 0); IParticleData particle = FluidFX.getFluidParticle(fluid); for (int i = 0; i < SPLASH_PARTICLE_COUNT; i++) { - Vector3d m = VecHelper.offsetRandomly(Vector3d.ZERO, world.rand, 0.125f); + Vector3d m = VecHelper.offsetRandomly(Vector3d.ZERO, level.random, 0.125f); m = new Vector3d(m.x, Math.abs(m.y), m.z); - world.addOptionalParticle(particle, vec.x, vec.y, vec.z, m.x, m.y, m.z); + level.addAlwaysVisibleParticle(particle, vec.x, vec.y, vec.z, m.x, m.y, m.z); } } @Nullable private IFluidHandler getFluidHandler(BlockPos pos, Direction direction) { - if (this.world == null) { + if (this.level == null) { return null; } else { - TileEntity te = this.world.getTileEntity(pos); + TileEntity te = this.level.getBlockEntity(pos); return te != null ? te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, direction) .orElse(null) : null; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java index 64f392743..05fa110d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java @@ -24,72 +24,72 @@ public class BasinFluidParticle extends FluidStackParticle { public BasinFluidParticle(ClientWorld world, FluidStack fluid, double x, double y, double z, double vx, double vy, double vz) { super(world, fluid, x, y, z, vx, vy, vz); - particleGravity = 0; - motionX = 0; - motionY = 0; - motionZ = 0; - yOffset = world.rand.nextFloat() * 1 / 32f; - posY += yOffset; - particleScale = 0; - maxAge = 60; - Vector3d currentPos = new Vector3d(posX, posY, posZ); + gravity = 0; + xd = 0; + yd = 0; + zd = 0; + yOffset = world.random.nextFloat() * 1 / 32f; + y += yOffset; + quadSize = 0; + lifetime = 60; + Vector3d currentPos = new Vector3d(x, y, z); basinPos = new BlockPos(currentPos); centerOfBasin = VecHelper.getCenterOf(basinPos); if (vx != 0) { - maxAge = 20; + lifetime = 20; Vector3d centerOf = VecHelper.getCenterOf(basinPos); Vector3d diff = currentPos.subtract(centerOf) - .mul(1, 0, 1) + .multiply(1, 0, 1) .normalize() .scale(.375); targetPos = centerOf.add(diff); - prevPosX = posX = centerOfBasin.x; - prevPosZ = posZ = centerOfBasin.z; + xo = x = centerOfBasin.x; + zo = z = centerOfBasin.z; } } @Override public void tick() { super.tick(); - particleScale = targetPos != null ? Math.max(1 / 32f, ((1f * age) / maxAge) / 8) - : 1 / 8f * (1 - ((Math.abs(age - (maxAge / 2)) / (1f * maxAge)))); + quadSize = targetPos != null ? Math.max(1 / 32f, ((1f * age) / lifetime) / 8) + : 1 / 8f * (1 - ((Math.abs(age - (lifetime / 2)) / (1f * lifetime)))); if (age % 2 == 0) { - if (!AllBlocks.BASIN.has(world.getBlockState(basinPos))) { - setExpired(); + if (!AllBlocks.BASIN.has(level.getBlockState(basinPos))) { + remove(); return; } - TileEntity tileEntity = world.getTileEntity(basinPos); + TileEntity tileEntity = level.getBlockEntity(basinPos); if (tileEntity instanceof BasinTileEntity) { float totalUnits = ((BasinTileEntity) tileEntity).getTotalFluidUnits(0); if (totalUnits < 1) totalUnits = 0; float fluidLevel = MathHelper.clamp(totalUnits / 2000, 0, 1); - posY = 2 / 16f + basinPos.getY() + 12 / 16f * fluidLevel + yOffset; + y = 2 / 16f + basinPos.getY() + 12 / 16f * fluidLevel + yOffset; } } if (targetPos != null) { - float progess = (1f * age) / maxAge; + float progess = (1f * age) / lifetime; Vector3d currentPos = centerOfBasin.add(targetPos.subtract(centerOfBasin) .scale(progess)); - posX = currentPos.x; - posZ = currentPos.z; + x = currentPos.x; + z = currentPos.z; } } @Override - public void buildGeometry(IVertexBuilder vb, ActiveRenderInfo info, float pt) { - Quaternion rotation = info.getRotation(); + public void render(IVertexBuilder vb, ActiveRenderInfo info, float pt) { + Quaternion rotation = info.rotation(); Quaternion prevRotation = new Quaternion(rotation); rotation.set(1, 0, 0, 1); rotation.normalize(); - super.buildGeometry(vb, info, pt); + super.render(vb, info, pt); rotation.set(0, 0, 0, 1); - rotation.multiply(prevRotation); + rotation.mul(prevRotation); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java index 14c324e72..b1ee8f926 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java @@ -47,12 +47,12 @@ public class FluidParticleData implements IParticleData, ICustomParticleData() { // TODO Fluid particles on command - public FluidParticleData deserialize(ParticleType particleTypeIn, StringReader reader) + public FluidParticleData fromCommand(ParticleType particleTypeIn, StringReader reader) throws CommandSyntaxException { return new FluidParticleData(particleTypeIn, new FluidStack(Fluids.WATER, 1)); } - public FluidParticleData read(ParticleType particleTypeIn, PacketBuffer buffer) { + public FluidParticleData fromNetwork(ParticleType particleTypeIn, PacketBuffer buffer) { return new FluidParticleData(particleTypeIn, buffer.readFluidStack()); } }; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java index 1119601b4..12a2eaacb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java @@ -15,8 +15,8 @@ import net.minecraft.util.math.vector.Vector3d; import net.minecraftforge.fluids.FluidStack; public class FluidStackParticle extends SpriteTexturedParticle { - private final float field_217587_G; - private final float field_217588_H; + private final float uo; + private final float vo; private FluidStack fluid; public static FluidStackParticle create(ParticleType type, ClientWorld world, FluidStack fluid, double x, @@ -31,31 +31,31 @@ public class FluidStackParticle extends SpriteTexturedParticle { super(world, x, y, z, vx, vy, vz); this.fluid = fluid; this.setSprite(Minecraft.getInstance() - .getSpriteAtlas(PlayerContainer.BLOCK_ATLAS_TEXTURE) + .getTextureAtlas(PlayerContainer.BLOCK_ATLAS) .apply(fluid.getFluid() .getAttributes() .getStillTexture())); - this.particleGravity = 1.0F; - this.particleRed = 0.8F; - this.particleGreen = 0.8F; - this.particleBlue = 0.8F; + this.gravity = 1.0F; + this.rCol = 0.8F; + this.gCol = 0.8F; + this.bCol = 0.8F; this.multiplyColor(fluid.getFluid() .getAttributes() .getColor(fluid)); - this.motionX = vx; - this.motionY = vy; - this.motionZ = vz; + this.xd = vx; + this.yd = vy; + this.zd = vz; - this.particleScale /= 2.0F; - this.field_217587_G = this.rand.nextFloat() * 3.0F; - this.field_217588_H = this.rand.nextFloat() * 3.0F; + this.quadSize /= 2.0F; + this.uo = this.random.nextFloat() * 3.0F; + this.vo = this.random.nextFloat() * 3.0F; } @Override - protected int getBrightnessForRender(float p_189214_1_) { - int brightnessForRender = super.getBrightnessForRender(p_189214_1_); + protected int getLightColor(float p_189214_1_) { + int brightnessForRender = super.getLightColor(p_189214_1_); int skyLight = brightnessForRender >> 20; int blockLight = (brightnessForRender >> 4) & 0xf; blockLight = Math.max(blockLight, fluid.getFluid() @@ -65,25 +65,25 @@ public class FluidStackParticle extends SpriteTexturedParticle { } protected void multiplyColor(int color) { - this.particleRed *= (float) (color >> 16 & 255) / 255.0F; - this.particleGreen *= (float) (color >> 8 & 255) / 255.0F; - this.particleBlue *= (float) (color & 255) / 255.0F; + this.rCol *= (float) (color >> 16 & 255) / 255.0F; + this.gCol *= (float) (color >> 8 & 255) / 255.0F; + this.bCol *= (float) (color & 255) / 255.0F; } - protected float getMinU() { - return this.sprite.getInterpolatedU((double) ((this.field_217587_G + 1.0F) / 4.0F * 16.0F)); + protected float getU0() { + return this.sprite.getU((double) ((this.uo + 1.0F) / 4.0F * 16.0F)); } - protected float getMaxU() { - return this.sprite.getInterpolatedU((double) (this.field_217587_G / 4.0F * 16.0F)); + protected float getU1() { + return this.sprite.getU((double) (this.uo / 4.0F * 16.0F)); } - protected float getMinV() { - return this.sprite.getInterpolatedV((double) (this.field_217588_H / 4.0F * 16.0F)); + protected float getV0() { + return this.sprite.getV((double) (this.vo / 4.0F * 16.0F)); } - protected float getMaxV() { - return this.sprite.getInterpolatedV((double) ((this.field_217588_H + 1.0F) / 4.0F * 16.0F)); + protected float getV1() { + return this.sprite.getV((double) ((this.vo + 1.0F) / 4.0F * 16.0F)); } @Override @@ -92,16 +92,16 @@ public class FluidStackParticle extends SpriteTexturedParticle { if (!canEvaporate()) return; if (onGround) - setExpired(); - if (!isExpired) + remove(); + if (!removed) return; - if (!onGround && world.rand.nextFloat() < 1 / 8f) + if (!onGround && level.random.nextFloat() < 1 / 8f) return; Vector3d rgb = ColorHelper.getRGB(fluid.getFluid() .getAttributes() .getColor(fluid)); - world.addParticle(ParticleTypes.ENTITY_EFFECT, posX, posY, posZ, rgb.x, rgb.y, rgb.z); + level.addParticle(ParticleTypes.ENTITY_EFFECT, x, y, z, rgb.x, rgb.y, rgb.z); } protected boolean canEvaporate() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java index d9410ff54..76ec1811d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java @@ -45,27 +45,27 @@ public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchableWith } @Override - public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { boolean blockTypeChanged = state.getBlock() != newState.getBlock(); - if (blockTypeChanged && !world.isRemote) + if (blockTypeChanged && !world.isClientSide) FluidPropagator.propagateChangedPipe(world, pos, state); if (state != newState && !isMoving) - removeBracket(world, pos, true).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); + removeBracket(world, pos, true).ifPresent(stack -> Block.popResource(world, pos, stack)); if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) - world.removeTileEntity(pos); + world.removeBlockEntity(pos); } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult hit) { - if (!AllBlocks.COPPER_CASING.isIn(player.getHeldItem(hand))) + if (!AllBlocks.COPPER_CASING.isIn(player.getItemInHand(hand))) return ActionResultType.PASS; - if (!world.isRemote) { + if (!world.isClientSide) { BlockState newState = AllBlocks.ENCASED_FLUID_PIPE.getDefaultState(); for (Direction d : Iterate.directionsInAxis(getAxis(state))) - newState = newState.with(EncasedPipeBlock.FACING_TO_PROPERTY_MAP.get(d), true); + newState = newState.setValue(EncasedPipeBlock.FACING_TO_PROPERTY_MAP.get(d), true); FluidTransportBehaviour.cacheFlows(world, pos); - world.setBlockState(pos, newState); + world.setBlockAndUpdate(pos, newState); FluidTransportBehaviour.loadFlows(world, pos); } AllTriggers.triggerFor(AllTriggers.CASING_PIPE, player); @@ -73,11 +73,11 @@ public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchableWith } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { - if (world.isRemote) + public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + if (world.isClientSide) return; if (state != oldState) - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } @@ -90,43 +90,43 @@ public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchableWith @Override public void neighborChanged(BlockState state, World world, BlockPos pos, Block otherBlock, BlockPos neighborPos, boolean isMoving) { - DebugPacketSender.func_218806_a(world, pos); + DebugPacketSender.sendNeighborsUpdatePacket(world, pos); Direction d = FluidPropagator.validateNeighbourChange(state, world, pos, otherBlock, neighborPos, isMoving); if (d == null) return; if (!isOpenAt(state, d)) return; - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } public static boolean isOpenAt(BlockState state, Direction d) { - return d.getAxis() == state.get(AXIS); + return d.getAxis() == state.getValue(AXIS); } @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random r) { + public void tick(BlockState state, ServerWorld world, BlockPos pos, Random r) { FluidPropagator.propagateChangedPipe(world, pos, state); } @Override public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - return AllShapes.EIGHT_VOXEL_POLE.get(state.get(AXIS)); + return AllShapes.EIGHT_VOXEL_POLE.get(state.getValue(AXIS)); } public BlockState toRegularPipe(IWorld world, BlockPos pos, BlockState state) { - Direction side = Direction.getFacingFromAxis(AxisDirection.POSITIVE, state.get(AXIS)); - Map facingToPropertyMap = FluidPipeBlock.FACING_TO_PROPERTY_MAP; + Direction side = Direction.get(AxisDirection.POSITIVE, state.getValue(AXIS)); + Map facingToPropertyMap = FluidPipeBlock.PROPERTY_BY_DIRECTION; return AllBlocks.FLUID_PIPE.get() .updateBlockState(AllBlocks.FLUID_PIPE.getDefaultState() - .with(facingToPropertyMap.get(side), true) - .with(facingToPropertyMap.get(side.getOpposite()), true), side, null, world, pos); + .setValue(facingToPropertyMap.get(side), true) + .setValue(facingToPropertyMap.get(side.getOpposite()), true), side, null, world, pos); } @Override public Axis getAxis(BlockState state) { - return state.get(AXIS); + return state.getValue(AXIS); } @Override @@ -136,7 +136,7 @@ public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchableWith return Optional.empty(); BlockState bracket = behaviour.getBracket(); behaviour.removeBracket(inOnReplacedContext); - if (bracket == Blocks.AIR.getDefaultState()) + if (bracket == Blocks.AIR.defaultBlockState()) return Optional.empty(); return Optional.of(new ItemStack(bracket.getBlock())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java index 6932c02fb..9a096c2f9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java @@ -29,15 +29,15 @@ public class BracketBlock extends ProperDirectionalBlock { PIPE, COG, SHAFT; @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(AXIS_ALONG_FIRST_COORDINATE) + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(AXIS_ALONG_FIRST_COORDINATE) .add(TYPE)); } @@ -47,7 +47,7 @@ public class BracketBlock extends ProperDirectionalBlock { public Optional getSuitableBracket(BlockState blockState, Direction direction) { if (blockState.getBlock() instanceof AbstractShaftBlock) - return getSuitableBracket(blockState.get(RotatedPillarKineticBlock.AXIS), direction, + return getSuitableBracket(blockState.getValue(RotatedPillarKineticBlock.AXIS), direction, blockState.getBlock() instanceof CogWheelBlock ? BracketType.COG : BracketType.SHAFT); return getSuitableBracket(FluidPropagator.getStraightPipeAxis(blockState), direction, BracketType.PIPE); } @@ -58,9 +58,9 @@ public class BracketBlock extends ProperDirectionalBlock { return Optional.empty(); boolean alongFirst = axis != Axis.Z ? targetBlockAxis == Axis.Z : targetBlockAxis == Axis.Y; - return Optional.of(getDefaultState().with(TYPE, type) - .with(FACING, direction) - .with(AXIS_ALONG_FIRST_COORDINATE, !alongFirst)); + return Optional.of(defaultBlockState().setValue(TYPE, type) + .setValue(FACING, direction) + .setValue(AXIS_ALONG_FIRST_COORDINATE, !alongFirst)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlockItem.java index d7aaf70b8..b636ce1f6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlockItem.java @@ -24,9 +24,9 @@ public class BracketBlockItem extends BlockItem { } @Override - public ActionResultType onItemUse(ItemUseContext context) { - World world = context.getWorld(); - BlockPos pos = context.getPos(); + public ActionResultType useOn(ItemUseContext context) { + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); BlockState state = world.getBlockState(pos); BracketBlock bracketBlock = getBracketBlock(); PlayerEntity player = context.getPlayer(); @@ -37,29 +37,29 @@ public class BracketBlockItem extends BlockItem { return ActionResultType.FAIL; if (!behaviour.canHaveBracket()) return ActionResultType.FAIL; - if (world.isRemote) + if (world.isClientSide) return ActionResultType.SUCCESS; - Optional suitableBracket = bracketBlock.getSuitableBracket(state, context.getFace()); + Optional suitableBracket = bracketBlock.getSuitableBracket(state, context.getClickedFace()); if (!suitableBracket.isPresent() && player != null) suitableBracket = - bracketBlock.getSuitableBracket(state, Direction.getFacingDirections(player)[0].getOpposite()); + bracketBlock.getSuitableBracket(state, Direction.orderedByNearest(player)[0].getOpposite()); if (!suitableBracket.isPresent()) return ActionResultType.SUCCESS; BlockState bracket = behaviour.getBracket(); behaviour.applyBracket(suitableBracket.get()); - if (!world.isRemote && player != null) + if (!world.isClientSide && player != null) behaviour.triggerAdvancements(world, player, state); if (player == null || !player.isCreative()) { - context.getItem() + context.getItemInHand() .shrink(1); - if (bracket != Blocks.AIR.getDefaultState()) { + if (bracket != Blocks.AIR.defaultBlockState()) { ItemStack returnedStack = new ItemStack(bracket.getBlock()); if (player == null) - Block.spawnAsEntity(world, pos, returnedStack); + Block.popResource(world, pos, returnedStack); else player.inventory.placeItemBackInInventory(world, returnedStack); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketGenerator.java index 456ee4766..e31ac7a86 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketGenerator.java @@ -28,9 +28,9 @@ public class BracketGenerator extends DirectionalAxisBlockStateGen { @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - String type = state.get(BracketBlock.TYPE) - .getString(); - boolean vertical = state.get(BracketBlock.FACING) + String type = state.getValue(BracketBlock.TYPE) + .getSerializedName(); + boolean vertical = state.getValue(BracketBlock.FACING) .getAxis() .isVertical(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java index 6c59b77a7..e668ab22c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java @@ -40,22 +40,22 @@ import net.minecraft.world.server.ServerWorld; public class EncasedPipeBlock extends Block implements IWrenchable, ISpecialBlockItemRequirement { - public static final Map FACING_TO_PROPERTY_MAP = SixWayBlock.FACING_TO_PROPERTY_MAP; + public static final Map FACING_TO_PROPERTY_MAP = SixWayBlock.PROPERTY_BY_DIRECTION; public EncasedPipeBlock(Properties p_i48339_1_) { super(p_i48339_1_); - setDefaultState(getDefaultState().with(NORTH, false) - .with(SOUTH, false) - .with(DOWN, false) - .with(UP, false) - .with(WEST, false) - .with(EAST, false)); + registerDefaultState(defaultBlockState().setValue(NORTH, false) + .setValue(SOUTH, false) + .setValue(DOWN, false) + .setValue(UP, false) + .setValue(WEST, false) + .setValue(EAST, false)); } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override @@ -64,18 +64,18 @@ public class EncasedPipeBlock extends Block implements IWrenchable, ISpecialBloc } @Override - public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { boolean blockTypeChanged = state.getBlock() != newState.getBlock(); - if (blockTypeChanged && !world.isRemote) + if (blockTypeChanged && !world.isClientSide) FluidPropagator.propagateChangedPipe(world, pos, state); if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) - world.removeTileEntity(pos); + world.removeBlockEntity(pos); } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { - if (!world.isRemote && state != oldState) - world.getPendingBlockTicks() + public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + if (!world.isClientSide && state != oldState) + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } @@ -88,18 +88,18 @@ public class EncasedPipeBlock extends Block implements IWrenchable, ISpecialBloc @Override public void neighborChanged(BlockState state, World world, BlockPos pos, Block otherBlock, BlockPos neighborPos, boolean isMoving) { - DebugPacketSender.func_218806_a(world, pos); + DebugPacketSender.sendNeighborsUpdatePacket(world, pos); Direction d = FluidPropagator.validateNeighbourChange(state, world, pos, otherBlock, neighborPos, isMoving); if (d == null) return; - if (!state.get(FACING_TO_PROPERTY_MAP.get(d))) + if (!state.getValue(FACING_TO_PROPERTY_MAP.get(d))) return; - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random r) { + public void tick(BlockState state, ServerWorld world, BlockPos pos, Random r) { FluidPropagator.propagateChangedPipe(world, pos, state); } @@ -110,25 +110,25 @@ public class EncasedPipeBlock extends Block implements IWrenchable, ISpecialBloc @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - BlockPos pos = context.getPos(); + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); - if (world.isRemote) + if (world.isClientSide) return ActionResultType.SUCCESS; - context.getWorld() - .playEvent(2001, context.getPos(), Block.getStateId(state)); + context.getLevel() + .levelEvent(2001, context.getClickedPos(), Block.getId(state)); BlockState equivalentPipe = transferSixWayProperties(state, AllBlocks.FLUID_PIPE.getDefaultState()); Direction firstFound = Direction.UP; for (Direction d : Iterate.directions) - if (state.get(FACING_TO_PROPERTY_MAP.get(d))) { + if (state.getValue(FACING_TO_PROPERTY_MAP.get(d))) { firstFound = d; break; } FluidTransportBehaviour.cacheFlows(world, pos); - world.setBlockState(pos, AllBlocks.FLUID_PIPE.get() + world.setBlockAndUpdate(pos, AllBlocks.FLUID_PIPE.get() .updateBlockState(equivalentPipe, firstFound, null, world, pos)); FluidTransportBehaviour.loadFlows(world, pos); return ActionResultType.SUCCESS; @@ -137,7 +137,7 @@ public class EncasedPipeBlock extends Block implements IWrenchable, ISpecialBloc public static BlockState transferSixWayProperties(BlockState from, BlockState to) { for (Direction d : Iterate.directions) { BooleanProperty property = FACING_TO_PROPERTY_MAP.get(d); - to = to.with(property, from.get(property)); + to = to.setValue(property, from.getValue(property)); } return to; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java index 2f6d15103..8f4c9b6b7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java @@ -50,7 +50,7 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren public FluidPipeBlock(Properties properties) { super(4 / 16f, properties); - this.setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); + this.registerDefaultState(super.defaultBlockState().setValue(BlockStateProperties.WATERLOGGED, false)); } @Override @@ -58,33 +58,33 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren if (tryRemoveBracket(context)) return ActionResultType.SUCCESS; - World world = context.getWorld(); - BlockPos pos = context.getPos(); + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); Axis axis = getAxis(world, pos, state); if (axis == null) return ActionResultType.PASS; - if (context.getFace() + if (context.getClickedFace() .getAxis() == axis) return ActionResultType.PASS; - if (!world.isRemote) { + if (!world.isClientSide) { FluidTransportBehaviour.cacheFlows(world, pos); - world.setBlockState(pos, AllBlocks.GLASS_FLUID_PIPE.getDefaultState() - .with(GlassFluidPipeBlock.AXIS, axis) - .with(BlockStateProperties.WATERLOGGED, state.get(BlockStateProperties.WATERLOGGED))); + world.setBlockAndUpdate(pos, AllBlocks.GLASS_FLUID_PIPE.getDefaultState() + .setValue(GlassFluidPipeBlock.AXIS, axis) + .setValue(BlockStateProperties.WATERLOGGED, state.getValue(BlockStateProperties.WATERLOGGED))); FluidTransportBehaviour.loadFlows(world, pos); } return ActionResultType.SUCCESS; } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult hit) { - if (!AllBlocks.COPPER_CASING.isIn(player.getHeldItem(hand))) + if (!AllBlocks.COPPER_CASING.isIn(player.getItemInHand(hand))) return ActionResultType.PASS; AllTriggers.triggerFor(AllTriggers.CASING_PIPE, player); - if (!world.isRemote) { + if (!world.isClientSide) { FluidTransportBehaviour.cacheFlows(world, pos); - world.setBlockState(pos, + world.setBlockAndUpdate(pos, EncasedPipeBlock.transferSixWayProperties(state, AllBlocks.ENCASED_FLUID_PIPE.getDefaultState())); FluidTransportBehaviour.loadFlows(world, pos); } @@ -92,9 +92,9 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren } public BlockState getAxisState(Axis axis) { - BlockState defaultState = getDefaultState(); + BlockState defaultState = defaultBlockState(); for (Direction d : Iterate.directions) - defaultState = defaultState.with(FACING_TO_PROPERTY_MAP.get(d), d.getAxis() == axis); + defaultState = defaultState.setValue(PROPERTY_BY_DIRECTION.get(d), d.getAxis() == axis); return defaultState; } @@ -114,40 +114,40 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren } @Override - public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { boolean blockTypeChanged = state.getBlock() != newState.getBlock(); - if (blockTypeChanged && !world.isRemote) + if (blockTypeChanged && !world.isClientSide) FluidPropagator.propagateChangedPipe(world, pos, state); if (state != newState && !isMoving) - removeBracket(world, pos, true).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); + removeBracket(world, pos, true).ifPresent(stack -> Block.popResource(world, pos, stack)); if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) - world.removeTileEntity(pos); + world.removeBlockEntity(pos); } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { - if (world.isRemote) + public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + if (world.isClientSide) return; if (state != oldState) - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } @Override public void neighborChanged(BlockState state, World world, BlockPos pos, Block otherBlock, BlockPos neighborPos, boolean isMoving) { - DebugPacketSender.func_218806_a(world, pos); + DebugPacketSender.sendNeighborsUpdatePacket(world, pos); Direction d = FluidPropagator.validateNeighbourChange(state, world, pos, otherBlock, neighborPos, isMoving); if (d == null) return; if (!isOpenAt(state, d)) return; - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random r) { + public void tick(BlockState state, ServerWorld world, BlockPos pos, Random r) { FluidPropagator.propagateChangedPipe(world, pos, state); } @@ -158,7 +158,7 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren public static boolean canConnectTo(IBlockDisplayReader world, BlockPos neighbourPos, BlockState neighbour, Direction direction) { if (FluidPropagator.hasFluidCapability(world, neighbourPos, direction.getOpposite())) return true; - if (neighbour.contains(BlockStateProperties.HONEY_LEVEL)) + if (neighbour.hasProperty(BlockStateProperties.LEVEL_HONEY)) return true; FluidTransportBehaviour transport = TileEntityBehaviour.get(world, neighbourPos, FluidTransportBehaviour.TYPE); BracketedTileEntityBehaviour bracket = TileEntityBehaviour.get(world, neighbourPos, BracketedTileEntityBehaviour.TYPE); @@ -172,7 +172,7 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren public static boolean shouldDrawRim(IBlockDisplayReader world, BlockPos pos, BlockState state, Direction direction) { - BlockPos offsetPos = pos.offset(direction); + BlockPos offsetPos = pos.relative(direction); BlockState facingState = world.getBlockState(offsetPos); if (!isPipe(facingState)) return true; @@ -190,7 +190,7 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren } public static boolean isOpenAt(BlockState state, Direction direction) { - return state.get(FACING_TO_PROPERTY_MAP.get(direction)); + return state.getValue(PROPERTY_BY_DIRECTION.get(direction)); } public static boolean isCornerOrEndPipe(IBlockDisplayReader world, BlockPos pos, BlockState state) { @@ -213,28 +213,28 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN, BlockStateProperties.WATERLOGGED); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - FluidState FluidState = context.getWorld() - .getFluidState(context.getPos()); - return updateBlockState(getDefaultState(), context.getNearestLookingDirection(), null, context.getWorld(), - context.getPos()).with(BlockStateProperties.WATERLOGGED, - Boolean.valueOf(FluidState.getFluid() == Fluids.WATER)); + FluidState FluidState = context.getLevel() + .getFluidState(context.getClickedPos()); + return updateBlockState(defaultBlockState(), context.getNearestLookingDirection(), null, context.getLevel(), + context.getClickedPos()).setValue(BlockStateProperties.WATERLOGGED, + Boolean.valueOf(FluidState.getType() == Fluids.WATER)); } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, IWorld world, BlockPos pos, BlockPos neighbourPos) { - if (state.get(BlockStateProperties.WATERLOGGED)) - world.getPendingFluidTicks() - .scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); - if (isOpenAt(state, direction) && neighbourState.contains(BlockStateProperties.WATERLOGGED)) - world.getPendingBlockTicks() + if (state.getValue(BlockStateProperties.WATERLOGGED)) + world.getLiquidTicks() + .scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + if (isOpenAt(state, direction) && neighbourState.hasProperty(BlockStateProperties.WATERLOGGED)) + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); return updateBlockState(state, direction, direction.getOpposite(), world, pos); } @@ -248,15 +248,15 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren BlockState prevState = state; int prevStateSides = (int) Arrays.stream(Iterate.directions) - .map(FACING_TO_PROPERTY_MAP::get) - .filter(prevState::get) + .map(PROPERTY_BY_DIRECTION::get) + .filter(prevState::getValue) .count(); // Update sides that are not ignored for (Direction d : Iterate.directions) if (d != ignore) { - boolean shouldConnect = canConnectTo(world, pos.offset(d), world.getBlockState(pos.offset(d)), d); - state = state.with(FACING_TO_PROPERTY_MAP.get(d), shouldConnect); + boolean shouldConnect = canConnectTo(world, pos.relative(d), world.getBlockState(pos.relative(d)), d); + state = state.setValue(PROPERTY_BY_DIRECTION.get(d), shouldConnect); } // See if it has enough connections @@ -271,21 +271,21 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren // Add opposite end if only one connection if (connectedDirection != null) - return state.with(FACING_TO_PROPERTY_MAP.get(connectedDirection.getOpposite()), true); + return state.setValue(PROPERTY_BY_DIRECTION.get(connectedDirection.getOpposite()), true); // If we can't connect to anything and weren't connected before, do nothing if (prevStateSides == 2) return prevState; // Use preferred - return state.with(FACING_TO_PROPERTY_MAP.get(preferredDirection), true) - .with(FACING_TO_PROPERTY_MAP.get(preferredDirection.getOpposite()), true); + return state.setValue(PROPERTY_BY_DIRECTION.get(preferredDirection), true) + .setValue(PROPERTY_BY_DIRECTION.get(preferredDirection.getOpposite()), true); } @Override public FluidState getFluidState(BlockState state) { - return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) - : Fluids.EMPTY.getDefaultState(); + return state.getValue(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getSource(false) + : Fluids.EMPTY.defaultFluidState(); } @Override @@ -296,13 +296,13 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren return Optional.empty(); BlockState bracket = behaviour.getBracket(); behaviour.removeBracket(inOnReplacedContext); - if (bracket == Blocks.AIR.getDefaultState()) + if (bracket == Blocks.AIR.defaultBlockState()) return Optional.empty(); return Optional.of(new ItemStack(bracket.getBlock())); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeTileEntity.java index dbcbb66f1..0b34ef02e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeTileEntity.java @@ -41,7 +41,7 @@ public class FluidPipeTileEntity extends SmartTileEntity { @Override public boolean canHaveFlowToward(BlockState state, Direction direction) { return (FluidPipeBlock.isPipe(state) || state.getBlock() instanceof EncasedPipeBlock) - && state.get(FluidPipeBlock.FACING_TO_PROPERTY_MAP.get(direction)); + && state.getValue(FluidPipeBlock.PROPERTY_BY_DIRECTION.get(direction)); } @Override @@ -52,7 +52,7 @@ public class FluidPipeTileEntity extends SmartTileEntity { if (attachment == AttachmentTypes.RIM && AllBlocks.ENCASED_FLUID_PIPE.has(state)) return AttachmentTypes.RIM; - BlockPos offsetPos = pos.offset(direction); + BlockPos offsetPos = pos.relative(direction); if (!FluidPipeBlock.isPipe(world.getBlockState(offsetPos))) { FluidTransportBehaviour pipeBehaviour = TileEntityBehaviour.get(world, offsetPos, FluidTransportBehaviour.TYPE); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java index 051093f80..d2395c2c6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java @@ -34,7 +34,7 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi public FluidValveBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(ENABLED, false)); + registerDefaultState(defaultBlockState().setValue(ENABLED, false)); } @Override @@ -44,14 +44,14 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(ENABLED)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(ENABLED)); } @Override protected boolean prefersConnectionTo(IWorldReader reader, BlockPos pos, Direction facing, boolean shaftAxis) { if (!shaftAxis) { - BlockPos offset = pos.offset(facing); + BlockPos offset = pos.relative(facing); BlockState blockState = reader.getBlockState(offset); return FluidPipeBlock.canConnectTo(reader, offset, blockState, facing); } @@ -67,8 +67,8 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi public static Axis getPipeAxis(BlockState state) { if (!(state.getBlock() instanceof FluidValveBlock)) throw new IllegalStateException("Provided BlockState is for a different block."); - Direction facing = state.get(FACING); - boolean alongFirst = !state.get(AXIS_ALONG_FIRST_COORDINATE); + Direction facing = state.getValue(FACING); + boolean alongFirst = !state.getValue(AXIS_ALONG_FIRST_COORDINATE); for (Axis axis : Iterate.axes) { if (axis == facing.getAxis()) continue; @@ -87,38 +87,38 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi } @Override - public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { boolean blockTypeChanged = state.getBlock() != newState.getBlock(); - if (blockTypeChanged && !world.isRemote) + if (blockTypeChanged && !world.isClientSide) FluidPropagator.propagateChangedPipe(world, pos, state); if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) - world.removeTileEntity(pos); + world.removeBlockEntity(pos); } @Override - public boolean isValidPosition(BlockState p_196260_1_, IWorldReader p_196260_2_, BlockPos p_196260_3_) { + public boolean canSurvive(BlockState p_196260_1_, IWorldReader p_196260_2_, BlockPos p_196260_3_) { return true; } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { - if (world.isRemote) + public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + if (world.isClientSide) return; if (state != oldState) - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } @Override public void neighborChanged(BlockState state, World world, BlockPos pos, Block otherBlock, BlockPos neighborPos, boolean isMoving) { - DebugPacketSender.func_218806_a(world, pos); + DebugPacketSender.sendNeighborsUpdatePacket(world, pos); Direction d = FluidPropagator.validateNeighbourChange(state, world, pos, otherBlock, neighborPos, isMoving); if (d == null) return; if (!isOpenAt(state, d)) return; - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } @@ -127,12 +127,12 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi } @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random r) { + public void tick(BlockState state, ServerWorld world, BlockPos pos, Random r) { FluidPropagator.propagateChangedPipe(world, pos, state); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java index 33632b40b..82ed9782e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java @@ -1,8 +1,10 @@ package com.simibubi.create.content.contraptions.fluids.pipes; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.ModelData; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -10,7 +12,6 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.util.Direction; import net.minecraft.util.math.MathHelper; @@ -26,7 +27,7 @@ public class FluidValveInstance extends ShaftInstance implements IDynamicInstanc public FluidValveInstance(MaterialManager dispatcher, KineticTileEntity tile) { super(dispatcher, tile); - Direction facing = blockState.get(FluidValveBlock.FACING); + Direction facing = blockState.getValue(FluidValveBlock.FACING); yRot = AngleHelper.horizontalAngle(facing); xRot = facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90; @@ -37,7 +38,9 @@ public class FluidValveInstance extends ShaftInstance implements IDynamicInstanc boolean twist = pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical(); pointerRotationOffset = twist ? 90 : 0; - pointer = materialManager.getTransformMaterial().getModel(AllBlockPartials.FLUID_VALVE_POINTER, blockState).createInstance(); + pointer = materialManager.defaultSolid() + .material(Materials.TRANSFORMED) + .getModel(AllBlockPartials.FLUID_VALVE_POINTER, blockState).createInstance(); transformPointer((FluidValveTileEntity) tile); } @@ -56,7 +59,7 @@ public class FluidValveInstance extends ShaftInstance implements IDynamicInstanc float pointerRotation = MathHelper.lerp(valve.pointer.getValue(AnimationTickHolder.getPartialTicks()), 0, -90); MatrixStack ms = new MatrixStack(); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .translate(getInstancePosition()) .centre() .rotateY(yRot) diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java index f2f6306cd..495c13858 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.fluids.pipes; import com.jozufozu.flywheel.backend.Backend; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -8,7 +9,6 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -28,12 +28,12 @@ public class FluidValveRenderer extends KineticTileEntityRenderer { protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; super.renderSafe(te, partialTicks, ms, buffer, light, overlay); BlockState blockState = te.getBlockState(); SuperByteBuffer pointer = PartialBufferer.get(AllBlockPartials.FLUID_VALVE_POINTER, blockState); - Direction facing = blockState.get(FluidValveBlock.FACING); + Direction facing = blockState.getValue(FluidValveBlock.FACING); if (!(te instanceof FluidValveTileEntity)) return; @@ -46,7 +46,7 @@ public class FluidValveRenderer extends KineticTileEntityRenderer { if (pipeAxis.isHorizontal() && shaftAxis == Axis.Z || pipeAxis.isVertical()) pointerRotationOffset = 90; - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .centre() .rotateY(AngleHelper.horizontalAngle(facing)) .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) @@ -54,7 +54,7 @@ public class FluidValveRenderer extends KineticTileEntityRenderer { .unCentre(); pointer.light(light) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + .renderInto(ms, buffer.getBuffer(RenderType.solid())); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java index 8125ea16f..524a02405 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java @@ -40,20 +40,20 @@ public class FluidValveTileEntity extends KineticTileEntity { super.tick(); pointer.tickChaser(); - if (world.isRemote) + if (level.isClientSide) return; BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof FluidValveBlock)) return; - boolean stateOpen = blockState.get(FluidValveBlock.ENABLED); + boolean stateOpen = blockState.getValue(FluidValveBlock.ENABLED); if (stateOpen && pointer.getValue() == 0) { - switchToBlockState(world, pos, blockState.with(FluidValveBlock.ENABLED, false)); + switchToBlockState(level, worldPosition, blockState.setValue(FluidValveBlock.ENABLED, false)); return; } if (!stateOpen && pointer.getValue() == 1) { - switchToBlockState(world, pos, blockState.with(FluidValveBlock.ENABLED, true)); + switchToBlockState(level, worldPosition, blockState.setValue(FluidValveBlock.ENABLED, true)); return; } } @@ -97,7 +97,7 @@ public class FluidValveTileEntity extends KineticTileEntity { @Override public boolean canPullFluidFrom(FluidStack fluid, BlockState state, Direction direction) { - if (state.contains(FluidValveBlock.ENABLED) && state.get(FluidValveBlock.ENABLED)) + if (state.hasProperty(FluidValveBlock.ENABLED) && state.getValue(FluidValveBlock.ENABLED)) return super.canPullFluidFrom(fluid, state, direction); return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java index d85e25e8f..b1a4729f2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java @@ -26,7 +26,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; - @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public class GlassFluidPipeBlock extends AxisPipeBlock implements IWaterLoggable, ISpecialBlockItemRequirement { @@ -35,12 +34,12 @@ public class GlassFluidPipeBlock extends AxisPipeBlock implements IWaterLoggable public GlassFluidPipeBlock(Properties p_i48339_1_) { super(p_i48339_1_); - setDefaultState(getDefaultState().with(ALT, false).with(BlockStateProperties.WATERLOGGED, false)); + registerDefaultState(defaultBlockState().setValue(ALT, false).setValue(BlockStateProperties.WATERLOGGED, false)); } @Override - protected void fillStateContainer(Builder p_206840_1_) { - super.fillStateContainer(p_206840_1_.add(ALT, BlockStateProperties.WATERLOGGED)); + protected void createBlockStateDefinition(Builder p_206840_1_) { + super.createBlockStateDefinition(p_206840_1_.add(ALT, BlockStateProperties.WATERLOGGED)); } @Override @@ -58,28 +57,28 @@ public class GlassFluidPipeBlock extends AxisPipeBlock implements IWaterLoggable if (tryRemoveBracket(context)) return ActionResultType.SUCCESS; BlockState newState; - World world = context.getWorld(); - BlockPos pos = context.getPos(); + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); FluidTransportBehaviour.cacheFlows(world, pos); - newState = toRegularPipe(world, pos, state).with(BlockStateProperties.WATERLOGGED, state.get(BlockStateProperties.WATERLOGGED)); - world.setBlockState(pos, newState, 3); + newState = toRegularPipe(world, pos, state).setValue(BlockStateProperties.WATERLOGGED, state.getValue(BlockStateProperties.WATERLOGGED)); + world.setBlock(pos, newState, 3); FluidTransportBehaviour.loadFlows(world, pos); return ActionResultType.SUCCESS; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - FluidState ifluidstate = context.getWorld() - .getFluidState(context.getPos()); + FluidState ifluidstate = context.getLevel() + .getFluidState(context.getClickedPos()); BlockState state = super.getStateForPlacement(context); - return state == null ? null : state.with(BlockStateProperties.WATERLOGGED, - ifluidstate.getFluid() == Fluids.WATER); + return state == null ? null : state.setValue(BlockStateProperties.WATERLOGGED, + ifluidstate.getType() == Fluids.WATER); } @Override public FluidState getFluidState(BlockState state) { - return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) - : Fluids.EMPTY.getDefaultState(); + return state.getValue(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getSource(false) + : Fluids.EMPTY.defaultFluidState(); } @Override @@ -88,7 +87,7 @@ public class GlassFluidPipeBlock extends AxisPipeBlock implements IWaterLoggable } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java index 2fcd7aa9a..86b64da1c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java @@ -35,17 +35,17 @@ public class SmartFluidPipeBlock extends HorizontalFaceBlock implements IAxisPip } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(FACE) - .add(HORIZONTAL_FACING); + .add(FACING); } @Override public BlockState getStateForPlacement(BlockItemUseContext ctx) { BlockState stateForPlacement = super.getStateForPlacement(ctx); Axis prefferedAxis = null; - BlockPos pos = ctx.getPos(); - World world = ctx.getWorld(); + BlockPos pos = ctx.getClickedPos(); + World world = ctx.getLevel(); for (Direction side : Iterate.directions) { if (!prefersConnectionTo(world, pos, side)) continue; @@ -57,16 +57,16 @@ public class SmartFluidPipeBlock extends HorizontalFaceBlock implements IAxisPip } if (prefferedAxis == Axis.Y) - stateForPlacement = stateForPlacement.with(FACE, AttachFace.WALL) - .with(HORIZONTAL_FACING, stateForPlacement.get(HORIZONTAL_FACING) + stateForPlacement = stateForPlacement.setValue(FACE, AttachFace.WALL) + .setValue(FACING, stateForPlacement.getValue(FACING) .getOpposite()); else if (prefferedAxis != null) { - if (stateForPlacement.get(FACE) == AttachFace.WALL) - stateForPlacement = stateForPlacement.with(FACE, AttachFace.FLOOR); + if (stateForPlacement.getValue(FACE) == AttachFace.WALL) + stateForPlacement = stateForPlacement.setValue(FACE, AttachFace.FLOOR); for (Direction direction : ctx.getNearestLookingDirections()) { if (direction.getAxis() != prefferedAxis) continue; - stateForPlacement = stateForPlacement.with(HORIZONTAL_FACING, direction.getOpposite()); + stateForPlacement = stateForPlacement.setValue(FACING, direction.getOpposite()); } } @@ -74,44 +74,44 @@ public class SmartFluidPipeBlock extends HorizontalFaceBlock implements IAxisPip } protected boolean prefersConnectionTo(IWorldReader reader, BlockPos pos, Direction facing) { - BlockPos offset = pos.offset(facing); + BlockPos offset = pos.relative(facing); BlockState blockState = reader.getBlockState(offset); return FluidPipeBlock.canConnectTo(reader, offset, blockState, facing); } @Override - public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { boolean blockTypeChanged = state.getBlock() != newState.getBlock(); - if (blockTypeChanged && !world.isRemote) + if (blockTypeChanged && !world.isClientSide) FluidPropagator.propagateChangedPipe(world, pos, state); if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) - world.removeTileEntity(pos); + world.removeBlockEntity(pos); } @Override - public boolean isValidPosition(BlockState p_196260_1_, IWorldReader p_196260_2_, BlockPos p_196260_3_) { + public boolean canSurvive(BlockState p_196260_1_, IWorldReader p_196260_2_, BlockPos p_196260_3_) { return true; } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { - if (world.isRemote) + public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + if (world.isClientSide) return; if (state != oldState) - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } @Override public void neighborChanged(BlockState state, World world, BlockPos pos, Block otherBlock, BlockPos neighborPos, boolean isMoving) { - DebugPacketSender.func_218806_a(world, pos); + DebugPacketSender.sendNeighborsUpdatePacket(world, pos); Direction d = FluidPropagator.validateNeighbourChange(state, world, pos, otherBlock, neighborPos, isMoving); if (d == null) return; if (!isOpenAt(state, d)) return; - world.getPendingBlockTicks() + world.getBlockTicks() .scheduleTick(pos, this, 1, TickPriority.HIGH); } @@ -120,13 +120,13 @@ public class SmartFluidPipeBlock extends HorizontalFaceBlock implements IAxisPip } @Override - public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random r) { + public void tick(BlockState state, ServerWorld world, BlockPos pos, Random r) { FluidPropagator.propagateChangedPipe(world, pos, state); } protected static Axis getPipeAxis(BlockState state) { - return state.get(FACE) == AttachFace.WALL ? Axis.Y - : state.get(HORIZONTAL_FACING) + return state.getValue(FACE) == AttachFace.WALL ? Axis.Y + : state.getValue(FACING) .getAxis(); } @@ -143,10 +143,10 @@ public class SmartFluidPipeBlock extends HorizontalFaceBlock implements IAxisPip @Override public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - AttachFace face = state.get(FACE); + AttachFace face = state.getValue(FACE); VoxelShaper shape = face == AttachFace.FLOOR ? AllShapes.SMART_FLUID_PIPE_FLOOR : face == AttachFace.CEILING ? AllShapes.SMART_FLUID_PIPE_CEILING : AllShapes.SMART_FLUID_PIPE_WALL; - return shape.get(state.get(HORIZONTAL_FACING)); + return shape.get(state.getValue(FACING)); } @Override @@ -155,7 +155,7 @@ public class SmartFluidPipeBlock extends HorizontalFaceBlock implements IAxisPip } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeGenerator.java index 0b2467ab0..aff0ac8f5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeGenerator.java @@ -14,14 +14,14 @@ public class SmartFluidPipeGenerator extends SpecialBlockStateGen { @Override protected int getXRotation(BlockState state) { - AttachFace attachFace = state.get(SmartFluidPipeBlock.FACE); + AttachFace attachFace = state.getValue(SmartFluidPipeBlock.FACE); return attachFace == AttachFace.CEILING ? 180 : attachFace == AttachFace.FLOOR ? 0 : 270; } @Override protected int getYRotation(BlockState state) { - AttachFace attachFace = state.get(SmartFluidPipeBlock.FACE); - int angle = horizontalAngle(state.get(SmartFluidPipeBlock.HORIZONTAL_FACING)); + AttachFace attachFace = state.getValue(SmartFluidPipeBlock.FACE); + int angle = horizontalAngle(state.getValue(SmartFluidPipeBlock.FACING)); return angle + (attachFace == AttachFace.CEILING ? 180 : 0); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java index 8b9544464..31c88e29f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.fluids.pipes; import java.util.List; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.fluids.FluidPropagator; import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity.StraightPipeFluidTransportBehaviour; @@ -10,7 +11,6 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -38,9 +38,9 @@ public class SmartFluidPipeTileEntity extends SmartTileEntity { } private void onFilterChanged(ItemStack newFilter) { - if (world.isRemote) + if (level.isClientSide) return; - FluidPropagator.propagateChangedPipe(world, pos, getBlockState()); + FluidPropagator.propagateChangedPipe(level, worldPosition, getBlockState()); } class SmartPipeBehaviour extends StraightPipeFluidTransportBehaviour { @@ -68,7 +68,7 @@ public class SmartFluidPipeTileEntity extends SmartTileEntity { @Override protected Vector3d getLocalOffset(BlockState state) { - AttachFace face = state.get(SmartFluidPipeBlock.FACE); + AttachFace face = state.getValue(SmartFluidPipeBlock.FACE); float y = face == AttachFace.CEILING ? 0.3f : face == AttachFace.WALL ? 11.3f : 15.3f; float z = face == AttachFace.CEILING ? 4.6f : face == AttachFace.WALL ? 0.6f : 4.6f; return VecHelper.rotateCentered(VecHelper.voxelSpace(8, y, z), angleY(state), Axis.Y); @@ -76,15 +76,15 @@ public class SmartFluidPipeTileEntity extends SmartTileEntity { @Override protected void rotate(BlockState state, MatrixStack ms) { - AttachFace face = state.get(SmartFluidPipeBlock.FACE); - MatrixStacker.of(ms) + AttachFace face = state.getValue(SmartFluidPipeBlock.FACE); + MatrixTransformStack.of(ms) .rotateY(angleY(state)) .rotateX(face == AttachFace.CEILING ? -45 : 45); } protected float angleY(BlockState state) { - AttachFace face = state.get(SmartFluidPipeBlock.FACE); - float horizontalAngle = AngleHelper.horizontalAngle(state.get(SmartFluidPipeBlock.HORIZONTAL_FACING)); + AttachFace face = state.getValue(SmartFluidPipeBlock.FACE); + float horizontalAngle = AngleHelper.horizontalAngle(state.getValue(SmartFluidPipeBlock.FACING)); if (face == AttachFace.WALL) horizontalAngle += 180; return horizontalAngle; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java index 6b886ede3..c8d365642 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java @@ -35,14 +35,14 @@ public class StraightPipeTileEntity extends SmartTileEntity { @Override public boolean canHaveFlowToward(BlockState state, Direction direction) { - return state.contains(AxisPipeBlock.AXIS) && state.get(AxisPipeBlock.AXIS) == direction.getAxis(); + return state.hasProperty(AxisPipeBlock.AXIS) && state.getValue(AxisPipeBlock.AXIS) == direction.getAxis(); } @Override public AttachmentTypes getRenderedRimAttachment(IBlockDisplayReader world, BlockPos pos, BlockState state, Direction direction) { AttachmentTypes attachment = super.getRenderedRimAttachment(world, pos, state, direction); - BlockState otherState = world.getBlockState(pos.offset(direction)); + BlockState otherState = world.getBlockState(pos.relative(direction)); Axis axis = IAxisPipe.getAxisOf(state); Axis otherAxis = IAxisPipe.getAxisOf(otherState); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java index 5fc575317..2b65b410d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java @@ -47,8 +47,8 @@ public class TransparentStraightPipeRenderer extends SafeTileEntityRenderer customEffects) { FluidStack fluidStack = new FluidStack(AllFluids.POTION.get() - .getStillFluid(), amount); + .getSource(), amount); addPotionToFluidStack(fluidStack, potion); appendEffects(fluidStack, customEffects); return fluidStack; @@ -47,7 +47,7 @@ public class PotionFluid extends VirtualFluid { @Override public int getColor(FluidStack stack) { CompoundNBT tag = stack.getOrCreateTag(); - int color = PotionUtils.getPotionColorFromEffectList(PotionUtils.getEffectsFromTag(tag)) | 0xff000000; + int color = PotionUtils.getColor(PotionUtils.getAllEffects(tag)) | 0xff000000; return color; } @@ -56,9 +56,9 @@ public class PotionFluid extends VirtualFluid { CompoundNBT tag = stack.getOrCreateTag(); IItemProvider itemFromBottleType = PotionFluidHandler.itemFromBottleType(NBTHelper.readEnum(tag, "Bottle", BottleType.class)); - return PotionUtils.getPotionTypeFromNBT(tag) - .getNamePrefixed(itemFromBottleType.asItem() - .getTranslationKey() + ".effect."); + return PotionUtils.getPotion(tag) + .getName(itemFromBottleType.asItem() + .getDescriptionId() + ".effect."); } } @@ -80,7 +80,7 @@ public class PotionFluid extends VirtualFluid { CompoundNBT compoundnbt = fs.getOrCreateTag(); ListNBT listnbt = compoundnbt.getList("CustomPotionEffects", 9); for (EffectInstance effectinstance : customEffects) - listnbt.add(effectinstance.write(new CompoundNBT())); + listnbt.add(effectinstance.save(new CompoundNBT())); compoundnbt.put("CustomPotionEffects", listnbt); return fs; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java index f577c249c..e53d83064 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java @@ -45,12 +45,12 @@ public class PotionFluidHandler { public static FluidIngredient potionIngredient(Potion potion, int amount) { return FluidIngredient.fromFluidStack(FluidHelper.copyStackWithAmount(PotionFluidHandler - .getFluidFromPotionItem(PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), potion)), amount)); + .getFluidFromPotionItem(PotionUtils.setPotion(new ItemStack(Items.POTION), potion)), amount)); } public static FluidStack getFluidFromPotionItem(ItemStack stack) { - Potion potion = PotionUtils.getPotionFromItem(stack); - List list = PotionUtils.getFullEffectsFromItem(stack); + Potion potion = PotionUtils.getPotion(stack); + List list = PotionUtils.getCustomEffects(stack); FluidStack fluid = PotionFluid.withEffects(250, potion, list); BottleType bottleTypeFromItem = bottleTypeFromItem(stack); if (potion == Potions.WATER && list.isEmpty() && bottleTypeFromItem == BottleType.REGULAR) @@ -87,31 +87,31 @@ public class PotionFluidHandler { public static ItemStack fillBottle(ItemStack stack, FluidStack availableFluid) { CompoundNBT tag = availableFluid.getOrCreateTag(); ItemStack potionStack = new ItemStack(itemFromBottleType(NBTHelper.readEnum(tag, "Bottle", BottleType.class))); - PotionUtils.addPotionToItemStack(potionStack, PotionUtils.getPotionTypeFromNBT(tag)); - PotionUtils.appendEffects(potionStack, PotionUtils.getFullEffectsFromTag(tag)); + PotionUtils.setPotion(potionStack, PotionUtils.getPotion(tag)); + PotionUtils.setCustomEffects(potionStack, PotionUtils.getCustomEffects(tag)); return potionStack; } // Modified version of PotionUtils#addPotionTooltip @OnlyIn(Dist.CLIENT) public static void addPotionTooltip(FluidStack fs, List tooltip, float p_185182_2_) { - List list = PotionUtils.getEffectsFromTag(fs.getOrCreateTag()); + List list = PotionUtils.getAllEffects(fs.getOrCreateTag()); List> list1 = Lists.newArrayList(); if (list.isEmpty()) { - tooltip.add((new TranslationTextComponent("effect.none")).formatted(TextFormatting.GRAY)); + tooltip.add((new TranslationTextComponent("effect.none")).withStyle(TextFormatting.GRAY)); } else { for (EffectInstance effectinstance : list) { - TranslationTextComponent textcomponent = new TranslationTextComponent(effectinstance.getEffectName()); - Effect effect = effectinstance.getPotion(); - Map map = effect.getAttributeModifierMap(); + TranslationTextComponent textcomponent = new TranslationTextComponent(effectinstance.getDescriptionId()); + Effect effect = effectinstance.getEffect(); + Map map = effect.getAttributeModifiers(); if (!map.isEmpty()) { for (Entry entry : map.entrySet()) { AttributeModifier attributemodifier = entry.getValue(); AttributeModifier attributemodifier1 = new AttributeModifier(attributemodifier.getName(), - effect.getAttributeModifierAmount(effectinstance.getAmplifier(), attributemodifier), + effect.getAttributeModifierValue(effectinstance.getAmplifier(), attributemodifier), attributemodifier.getOperation()); list1.add(new Tuple<>( - entry.getKey().getTranslationKey(), + entry.getKey().getDescriptionId(), attributemodifier1)); } } @@ -123,18 +123,18 @@ public class PotionFluidHandler { if (effectinstance.getDuration() > 20) { textcomponent.append(" (") - .append(EffectUtils.getPotionDurationString(effectinstance, p_185182_2_)) + .append(EffectUtils.formatDuration(effectinstance, p_185182_2_)) .append(")"); } - tooltip.add(textcomponent.formatted(effect.getEffectType() - .getColor())); + tooltip.add(textcomponent.withStyle(effect.getCategory() + .getTooltipFormatting())); } } if (!list1.isEmpty()) { tooltip.add(new StringTextComponent("")); - tooltip.add((new TranslationTextComponent("potion.whenDrank")).formatted(TextFormatting.DARK_PURPLE)); + tooltip.add((new TranslationTextComponent("potion.whenDrank")).withStyle(TextFormatting.DARK_PURPLE)); for (Tuple tuple : list1) { AttributeModifier attributemodifier2 = tuple.getB(); @@ -150,18 +150,18 @@ public class PotionFluidHandler { if (d0 > 0.0D) { tooltip.add((new TranslationTextComponent( "attribute.modifier.plus." + attributemodifier2.getOperation() - .getId(), - ItemStack.DECIMALFORMAT.format(d1), + .toValue(), + ItemStack.ATTRIBUTE_MODIFIER_FORMAT.format(d1), new TranslationTextComponent(tuple.getA()))) - .formatted(TextFormatting.BLUE)); + .withStyle(TextFormatting.BLUE)); } else if (d0 < 0.0D) { d1 = d1 * -1.0D; tooltip.add((new TranslationTextComponent( "attribute.modifier.take." + attributemodifier2.getOperation() - .getId(), - ItemStack.DECIMALFORMAT.format(d1), + .toValue(), + ItemStack.ATTRIBUTE_MODIFIER_FORMAT.format(d1), new TranslationTextComponent(tuple.getA()))) - .formatted(TextFormatting.RED)); + .withStyle(TextFormatting.RED)); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java index 1219f058a..52e356dd0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java @@ -43,8 +43,8 @@ public class PotionMixingRecipeManager { continue; List bottles = new ArrayList<>(); - PotionBrewing.POTION_ITEMS.forEach(i -> { - for (ItemStack itemStack : i.getMatchingStacks()) + PotionBrewing.ALLOWED_CONTAINERS.forEach(i -> { + for (ItemStack itemStack : i.getItems()) bottles.add(itemStack); }); @@ -55,7 +55,7 @@ public class PotionMixingRecipeManager { if (potion == Potions.EMPTY) continue; for (ItemStack stack : bottles) - basicPotions.add(PotionUtils.addPotionToItemStack(stack.copy(), potion)); + basicPotions.add(PotionUtils.setPotion(stack.copy(), potion)); } Set uniqueKeys = new HashSet<>(); @@ -69,7 +69,7 @@ public class PotionMixingRecipeManager { newPotions.clear(); for (ItemStack inputPotionStack : potionFrontier) { - Potion inputPotion = PotionUtils.getPotionFromItem(inputPotionStack); + Potion inputPotion = PotionUtils.getPotion(inputPotionStack); for (ItemStack potionReagent : reagents) { ItemStack outputPotionStack = iBrewingRecipe.getOutput(inputPotionStack.copy(), potionReagent); @@ -89,7 +89,7 @@ public class PotionMixingRecipeManager { continue; if (inputPotionStack.getItem() == outputPotionStack.getItem()) { - Potion outputPotion = PotionUtils.getPotionFromItem(outputPotionStack); + Potion outputPotion = PotionUtils.getPotion(outputPotionStack); if (outputPotion == Potions.WATER) continue; } @@ -100,7 +100,7 @@ public class PotionMixingRecipeManager { fluidFromPotionItem2.setAmount(1000); MixingRecipe mixingRecipe = new ProcessingRecipeBuilder<>(MixingRecipe::new, - Create.asResource("potion_" + recipeIndex++)).require(Ingredient.fromStacks(potionReagent)) + Create.asResource("potion_" + recipeIndex++)).require(Ingredient.of(potionReagent)) .require(FluidIngredient.fromFluidStack(fluidFromPotionItem)) .output(fluidFromPotionItem2) .requiresHeat(HeatCondition.HEATED) @@ -135,7 +135,7 @@ public class PotionMixingRecipeManager { ALL.clear(); getAllBrewingRecipes().forEach(recipe -> { for (Ingredient ingredient : recipe.getIngredients()) { - for (ItemStack itemStack : ingredient.getMatchingStacks()) { + for (ItemStack itemStack : ingredient.getItems()) { ALL.computeIfAbsent(itemStack.getItem(), t -> new ArrayList<>()) .add(recipe); return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java index 3907fd89f..0ad417194 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java @@ -66,9 +66,9 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE p_206840_1_) { + protected void createBlockStateDefinition(Builder p_206840_1_) { p_206840_1_.add(TOP, BOTTOM, SHAPE); } @@ -102,15 +102,15 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE ComparatorUtil.fractionToRedstoneLevel(te.getFillState())) .orElse(0); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankConnectivityHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankConnectivityHandler.java index 39b694816..02f1d3116 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankConnectivityHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankConnectivityHandler.java @@ -39,7 +39,7 @@ public class FluidTankConnectivityHandler { TankSearchCache cache = new TankSearchCache(); List frontier = new ArrayList<>(); frontier.add(te); - formTanks(te.getType(), te.getWorld(), cache, frontier); + formTanks(te.getType(), te.getLevel(), cache, frontier); } private static void formTanks(TileEntityType type, IBlockReader world, TankSearchCache cache, @@ -50,7 +50,7 @@ public class FluidTankConnectivityHandler { int minX = Integer.MAX_VALUE; int minZ = Integer.MAX_VALUE; for (FluidTankTileEntity fluidTankTileEntity : frontier) { - BlockPos pos = fluidTankTileEntity.getPos(); + BlockPos pos = fluidTankTileEntity.getBlockPos(); minX = Math.min(pos.getX(), minX); minZ = Math.min(pos.getZ(), minZ); } @@ -59,7 +59,7 @@ public class FluidTankConnectivityHandler { while (!frontier.isEmpty()) { FluidTankTileEntity tank = frontier.remove(0); - BlockPos tankPos = tank.getPos(); + BlockPos tankPos = tank.getBlockPos(); if (visited.contains(tankPos)) continue; @@ -70,8 +70,8 @@ public class FluidTankConnectivityHandler { creationQueue.add(Pair.of(amount, tank)); for (Axis axis : Iterate.axes) { - Direction d = Direction.getFacingFromAxis(AxisDirection.NEGATIVE, axis); - BlockPos next = tankPos.offset(d); + Direction d = Direction.get(AxisDirection.NEGATIVE, axis); + BlockPos next = tankPos.relative(d); if (next.getX() <= minX || next.getZ() <= minZ) continue; @@ -91,9 +91,9 @@ public class FluidTankConnectivityHandler { while (!creationQueue.isEmpty()) { Pair next = creationQueue.poll(); FluidTankTileEntity toCreate = next.getValue(); - if (visited.contains(toCreate.getPos())) + if (visited.contains(toCreate.getBlockPos())) continue; - visited.add(toCreate.getPos()); + visited.add(toCreate.getBlockPos()); tryToFormNewTank(toCreate, cache, false); } @@ -131,15 +131,15 @@ public class FluidTankConnectivityHandler { BlockState state = te.getBlockState(); if (FluidTankBlock.isTank(state)) { - state = state.with(FluidTankBlock.BOTTOM, true); - state = state.with(FluidTankBlock.TOP, te.height == 1); - te.getWorld() - .setBlockState(te.getPos(), state, 22); + state = state.setValue(FluidTankBlock.BOTTOM, true); + state = state.setValue(FluidTankBlock.TOP, te.height == 1); + te.getLevel() + .setBlock(te.getBlockPos(), state, 22); } te.setWindows(te.window); te.onFluidStackChanged(te.tankInventory.getFluid()); - te.markDirty(); + te.setChanged(); } return bestAmount; @@ -150,8 +150,8 @@ public class FluidTankConnectivityHandler { int amount = 0; int height = 0; TileEntityType type = te.getType(); - World world = te.getWorld(); - BlockPos origin = te.getPos(); + World world = te.getLevel(); + BlockPos origin = te.getBlockPos(); LazyOptional capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); FluidTank teTank = (FluidTank) capability.orElse(null); FluidStack fluid = capability.map(ifh -> ifh.getFluidInTank(0)) @@ -163,7 +163,7 @@ public class FluidTankConnectivityHandler { for (int xOffset = 0; xOffset < width; xOffset++) { for (int zOffset = 0; zOffset < width; zOffset++) { - BlockPos pos = origin.add(xOffset, yOffset, zOffset); + BlockPos pos = origin.offset(xOffset, yOffset, zOffset); Optional tank = cache.getOrCache(type, world, pos); if (!tank.isPresent()) break Search; @@ -173,7 +173,7 @@ public class FluidTankConnectivityHandler { if (otherWidth > width) break Search; - BlockPos controllerPos = controller.getPos(); + BlockPos controllerPos = controller.getBlockPos(); if (!controllerPos.equals(origin)) { if (controllerPos.getX() < origin.getX()) break Search; @@ -205,7 +205,7 @@ public class FluidTankConnectivityHandler { for (int yOffset = 0; yOffset < height; yOffset++) { for (int xOffset = 0; xOffset < width; xOffset++) { for (int zOffset = 0; zOffset < width; zOffset++) { - BlockPos pos = origin.add(xOffset, yOffset, zOffset); + BlockPos pos = origin.offset(xOffset, yOffset, zOffset); FluidTankTileEntity tank = tankAt(type, world, pos); if (tank == te) continue; @@ -228,9 +228,9 @@ public class FluidTankConnectivityHandler { BlockState state = world.getBlockState(pos); if (!FluidTankBlock.isTank(state)) continue; - state = state.with(FluidTankBlock.BOTTOM, yOffset == 0); - state = state.with(FluidTankBlock.TOP, yOffset == height - 1); - world.setBlockState(pos, state, 22); + state = state.setValue(FluidTankBlock.BOTTOM, yOffset == 0); + state = state.setValue(FluidTankBlock.TOP, yOffset == height - 1); + world.setBlock(pos, state, 22); } } } @@ -253,8 +253,8 @@ public class FluidTankConnectivityHandler { if (width == 1 && height == 1) return; - World world = te.getWorld(); - BlockPos origin = te.getPos(); + World world = te.getLevel(); + BlockPos origin = te.getBlockPos(); List frontier = new ArrayList<>(); FluidStack toDistribute = te.tankInventory.getFluid() .copy(); @@ -267,7 +267,7 @@ public class FluidTankConnectivityHandler { for (int xOffset = 0; xOffset < width; xOffset++) { for (int zOffset = 0; zOffset < width; zOffset++) { - BlockPos pos = origin.add(xOffset, yOffset, zOffset); + BlockPos pos = origin.offset(xOffset, yOffset, zOffset); FluidTankTileEntity tankAt = tankAt(te.getType(), world, pos); if (tankAt == null) continue; @@ -317,7 +317,7 @@ public class FluidTankConnectivityHandler { @Nullable public static FluidTankTileEntity tankAt(TileEntityType type, IBlockReader world, BlockPos pos) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (te instanceof FluidTankTileEntity && te.getType() == type) return (FluidTankTileEntity) te; return null; @@ -325,7 +325,7 @@ public class FluidTankConnectivityHandler { @Nullable public static FluidTankTileEntity anyTankAt(IBlockReader world, BlockPos pos) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (te instanceof FluidTankTileEntity) return (FluidTankTileEntity) te; return null; @@ -370,8 +370,8 @@ public class FluidTankConnectivityHandler { } public static boolean isConnected(IBlockReader world, BlockPos tankPos, BlockPos otherTankPos) { - TileEntity te1 = world.getTileEntity(tankPos); - TileEntity te2 = world.getTileEntity(otherTankPos); + TileEntity te1 = world.getBlockEntity(tankPos); + TileEntity te2 = world.getBlockEntity(otherTankPos); if (!(te1 instanceof FluidTankTileEntity) || !(te2 instanceof FluidTankTileEntity)) return false; return ((FluidTankTileEntity) te1).getController() diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankGenerator.java index 1a64dbeae..71fdd634b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankGenerator.java @@ -35,9 +35,9 @@ public class FluidTankGenerator extends SpecialBlockStateGen { @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - Boolean top = state.get(FluidTankBlock.TOP); - Boolean bottom = state.get(FluidTankBlock.BOTTOM); - Shape shape = state.get(FluidTankBlock.SHAPE); + Boolean top = state.getValue(FluidTankBlock.TOP); + Boolean bottom = state.getValue(FluidTankBlock.BOTTOM); + Shape shape = state.getValue(FluidTankBlock.SHAPE); String shapeName = "middle"; if (top && bottom) @@ -47,7 +47,7 @@ public class FluidTankGenerator extends SpecialBlockStateGen { else if (bottom) shapeName = "bottom"; - String modelName = shapeName + (shape == Shape.PLAIN ? "" : "_" + shape.getString()); + String modelName = shapeName + (shape == Shape.PLAIN ? "" : "_" + shape.getSerializedName()); if (!prefix.isEmpty()) return prov.models() diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankItem.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankItem.java index cec618615..348fbcb45 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankItem.java @@ -21,21 +21,21 @@ public class FluidTankItem extends BlockItem { } @Override - public ActionResultType tryPlace(BlockItemUseContext ctx) { - ActionResultType initialResult = super.tryPlace(ctx); - if (!initialResult.isAccepted()) + public ActionResultType place(BlockItemUseContext ctx) { + ActionResultType initialResult = super.place(ctx); + if (!initialResult.consumesAction()) return initialResult; tryMultiPlace(ctx); return initialResult; } @Override - protected boolean onBlockPlaced(BlockPos p_195943_1_, World p_195943_2_, PlayerEntity p_195943_3_, + protected boolean updateCustomBlockEntityTag(BlockPos p_195943_1_, World p_195943_2_, PlayerEntity p_195943_3_, ItemStack p_195943_4_, BlockState p_195943_5_) { MinecraftServer minecraftserver = p_195943_2_.getServer(); if (minecraftserver == null) return false; - CompoundNBT nbt = p_195943_4_.getChildTag("BlockEntityTag"); + CompoundNBT nbt = p_195943_4_.getTagElement("BlockEntityTag"); if (nbt != null) { nbt.remove("Luminosity"); nbt.remove("Size"); @@ -50,23 +50,23 @@ public class FluidTankItem extends BlockItem { } } } - return super.onBlockPlaced(p_195943_1_, p_195943_2_, p_195943_3_, p_195943_4_, p_195943_5_); + return super.updateCustomBlockEntityTag(p_195943_1_, p_195943_2_, p_195943_3_, p_195943_4_, p_195943_5_); } private void tryMultiPlace(BlockItemUseContext ctx) { PlayerEntity player = ctx.getPlayer(); if (player == null) return; - if (player.isSneaking()) + if (player.isShiftKeyDown()) return; - Direction face = ctx.getFace(); + Direction face = ctx.getClickedFace(); if (!face.getAxis() .isVertical()) return; - ItemStack stack = ctx.getItem(); - World world = ctx.getWorld(); - BlockPos pos = ctx.getPos(); - BlockPos placedOnPos = pos.offset(face.getOpposite()); + ItemStack stack = ctx.getItemInHand(); + World world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + BlockPos placedOnPos = pos.relative(face.getOpposite()); BlockState placedOnState = world.getBlockState(placedOnPos); if (!FluidTankBlock.isTank(placedOnState)) @@ -83,17 +83,17 @@ public class FluidTankItem extends BlockItem { return; int tanksToPlace = 0; - BlockPos startPos = face == Direction.DOWN ? controllerTE.getPos() - .down() - : controllerTE.getPos() - .up(controllerTE.height); + BlockPos startPos = face == Direction.DOWN ? controllerTE.getBlockPos() + .below() + : controllerTE.getBlockPos() + .above(controllerTE.height); if (startPos.getY() != pos.getY()) return; for (int xOffset = 0; xOffset < width; xOffset++) { for (int zOffset = 0; zOffset < width; zOffset++) { - BlockPos offsetPos = startPos.add(xOffset, 0, zOffset); + BlockPos offsetPos = startPos.offset(xOffset, 0, zOffset); BlockState blockState = world.getBlockState(offsetPos); if (FluidTankBlock.isTank(blockState)) continue; @@ -109,14 +109,14 @@ public class FluidTankItem extends BlockItem { for (int xOffset = 0; xOffset < width; xOffset++) { for (int zOffset = 0; zOffset < width; zOffset++) { - BlockPos offsetPos = startPos.add(xOffset, 0, zOffset); + BlockPos offsetPos = startPos.offset(xOffset, 0, zOffset); BlockState blockState = world.getBlockState(offsetPos); if (FluidTankBlock.isTank(blockState)) continue; - BlockItemUseContext context = BlockItemUseContext.func_221536_a(ctx, offsetPos, face); + BlockItemUseContext context = BlockItemUseContext.at(ctx, offsetPos, face); player.getPersistentData() .putBoolean("SilenceTankSound", true); - super.tryPlace(context); + super.place(context); player.getPersistentData() .remove("SilenceTankSound"); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java index b182b7be1..08019b105 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java @@ -41,7 +41,7 @@ public class FluidTankModel extends CTModel { protected Builder gatherModelData(Builder builder, IBlockDisplayReader world, BlockPos pos, BlockState state) { CullData cullData = new CullData(); for (Direction d : Iterate.horizontalDirections) - cullData.setCulled(d, FluidTankConnectivityHandler.isConnected(world, pos, pos.offset(d))); + cullData.setCulled(d, FluidTankConnectivityHandler.isConnected(world, pos, pos.relative(d))); return super.gatherModelData(builder, world, pos, state).withInitial(CULL_PROPERTY, cullData); } @@ -73,14 +73,14 @@ public class FluidTankModel extends CTModel { if (face.getAxis() .isVertical()) return; - culledFaces[face.getHorizontalIndex()] = cull; + culledFaces[face.get2DDataValue()] = cull; } boolean isCulled(Direction face) { if (face.getAxis() .isVertical()) return false; - return culledFaces[face.getHorizontalIndex()]; + return culledFaces[face.get2DDataValue()]; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java index c3d51df67..fc46d3386 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java @@ -62,14 +62,14 @@ public class FluidTankRenderer extends SafeTileEntityRenderer(); - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("gui.config.overlay1"))); - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("gui.config.overlay2") - .formatted(TextFormatting.GRAY))); + .withStyle(TextFormatting.GRAY))); tooltip.add(StringTextComponent.EMPTY); - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("gui.config.overlay3"))); - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("gui.config.overlay4"))); tooltip.add(StringTextComponent.EMPTY); - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("gui.config.overlay5") - .formatted(TextFormatting.GRAY))); - tooltip.add(componentSpacing.copy() + .withStyle(TextFormatting.GRAY))); + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("gui.config.overlay6") - .formatted(TextFormatting.GRAY))); + .withStyle(TextFormatting.GRAY))); tooltip.add(StringTextComponent.EMPTY); - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("gui.config.overlay7"))); - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("gui.config.overlay8"))); } @Override protected void init() { - this.width = client.getWindow() - .getScaledWidth(); - this.height = client.getWindow() - .getScaledHeight(); + this.width = minecraft.getWindow() + .getGuiScaledWidth(); + this.height = minecraft.getWindow() + .getGuiScaledHeight(); offsetX = AllConfigs.CLIENT.overlayOffsetX.get(); offsetY = AllConfigs.CLIENT.overlayOffsetY.get(); @@ -89,7 +89,7 @@ public class GoggleConfigScreen extends AbstractSimiScreen { int titleLinesCount = 1; int tooltipTextWidth = 0; for (ITextProperties textLine : tooltip) { - int textLineWidth = client.fontRenderer.getWidth(textLine); + int textLineWidth = minecraft.font.width(textLine); if (textLineWidth > tooltipTextWidth) tooltipTextWidth = textLineWidth; } @@ -108,7 +108,7 @@ public class GoggleConfigScreen extends AbstractSimiScreen { protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { int posX = this.width / 2 + offsetX; int posY = this.height / 2 + offsetY; - renderTooltip(ms, tooltip, posX, posY); + renderComponentTooltip(ms, tooltip, posX, posY); // UIRenderHelper.breadcrumbArrow(ms, 50, 50, 100, 50, 20, 10, 0x80aa9999, 0x10aa9999); // UIRenderHelper.breadcrumbArrow(ms, 100, 80, 0, -50, 20, -10, 0x80aa9999, 0x10aa9999); diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java index 2acd72a7a..fcc209268 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java @@ -41,7 +41,7 @@ public class GoggleOverlayRenderer { public static void renderOverlay(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, float partialTicks) { - RayTraceResult objectMouseOver = Minecraft.getInstance().objectMouseOver; + RayTraceResult objectMouseOver = Minecraft.getInstance().hitResult; if (!(objectMouseOver instanceof BlockRayTraceResult)) return; @@ -56,10 +56,10 @@ public class GoggleOverlayRenderer { BlockRayTraceResult result = (BlockRayTraceResult) objectMouseOver; Minecraft mc = Minecraft.getInstance(); - ClientWorld world = mc.world; - BlockPos pos = result.getPos(); - ItemStack headSlot = mc.player.getItemStackFromSlot(EquipmentSlotType.HEAD); - TileEntity te = world.getTileEntity(pos); + ClientWorld world = mc.level; + BlockPos pos = result.getBlockPos(); + ItemStack headSlot = mc.player.getItemBySlot(EquipmentSlotType.HEAD); + TileEntity te = world.getBlockEntity(pos); boolean wearingGoggles = AllItems.GOGGLES.isIn(headSlot); @@ -73,14 +73,14 @@ public class GoggleOverlayRenderer { if (hasGoggleInformation && wearingGoggles) { IHaveGoggleInformation gte = (IHaveGoggleInformation) te; - goggleAddedInformation = gte.addToGoggleTooltip(tooltip, mc.player.isSneaking()); + goggleAddedInformation = gte.addToGoggleTooltip(tooltip, mc.player.isShiftKeyDown()); } if (hasHoveringInformation) { if (!tooltip.isEmpty()) tooltip.add(StringTextComponent.EMPTY); IHaveHoveringInformation hte = (IHaveHoveringInformation) te; - hoverAddedInformation = hte.addToTooltip(tooltip, mc.player.isSneaking()); + hoverAddedInformation = hte.addToTooltip(tooltip, mc.player.isShiftKeyDown()); if (goggleAddedInformation && !hoverAddedInformation) tooltip.remove(tooltip.size() - 1); @@ -101,7 +101,7 @@ public class GoggleOverlayRenderer { // check for piston poles if goggles are worn BlockState state = world.getBlockState(pos); if (wearingGoggles && AllBlocks.PISTON_EXTENSION_POLE.has(state)) { - Direction[] directions = Iterate.directionsInAxis(state.get(PistonExtensionPoleBlock.FACING) + Direction[] directions = Iterate.directionsInAxis(state.getValue(PistonExtensionPoleBlock.FACING) .getAxis()); int poles = 1; boolean pistonFound = false; @@ -109,7 +109,7 @@ public class GoggleOverlayRenderer { int attachedPoles = PistonExtensionPoleBlock.PlacementHelper.get() .attachedPoles(world, pos, dir); poles += attachedPoles; - pistonFound |= world.getBlockState(pos.offset(dir, attachedPoles + 1)) + pistonFound |= world.getBlockState(pos.relative(dir, attachedPoles + 1)) .getBlock() instanceof MechanicalPistonBlock; } @@ -118,7 +118,7 @@ public class GoggleOverlayRenderer { if (!tooltip.isEmpty()) tooltip.add(StringTextComponent.EMPTY); - tooltip.add(IHaveGoggleInformation.componentSpacing.copy() + tooltip.add(IHaveGoggleInformation.componentSpacing.plainCopy() .append(Lang.translate("gui.goggles.pole_length")) .append(new StringTextComponent(" " + poles))); } @@ -126,17 +126,17 @@ public class GoggleOverlayRenderer { if (tooltip.isEmpty()) return; - ms.push(); + ms.pushPose(); Screen tooltipScreen = new TooltipScreen(null); tooltipScreen.init(mc, mc.getWindow() - .getScaledWidth(), + .getGuiScaledWidth(), mc.getWindow() - .getScaledHeight()); + .getGuiScaledHeight()); int titleLinesCount = 1; int tooltipTextWidth = 0; for (ITextProperties textLine : tooltip) { - int textLineWidth = mc.fontRenderer.getWidth(textLine); + int textLineWidth = mc.font.width(textLine); if (textLineWidth > tooltipTextWidth) tooltipTextWidth = textLineWidth; } @@ -154,13 +154,13 @@ public class GoggleOverlayRenderer { posX = Math.min(posX, tooltipScreen.width - tooltipTextWidth - 20); posY = Math.min(posY, tooltipScreen.height - tooltipHeight - 20); - tooltipScreen.renderTooltip(ms, tooltip, posX, posY); + tooltipScreen.renderComponentTooltip(ms, tooltip, posX, posY); ItemStack item = AllItems.GOGGLES.asStack(); GuiGameElement.of(item) .at(posX + 10, posY - 16, 450) .render(ms); - ms.pop(); + ms.popPose(); } public static final class TooltipScreen extends Screen { @@ -170,9 +170,9 @@ public class GoggleOverlayRenderer { @Override public void init(Minecraft mc, int width, int height) { - this.client = mc; + this.minecraft = mc; this.itemRenderer = mc.getItemRenderer(); - this.textRenderer = mc.fontRenderer; + this.font = mc.font; this.width = width; this.height = height; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesItem.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesItem.java index 3f917e6be..f85c88d8a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesItem.java @@ -18,7 +18,7 @@ public class GogglesItem extends Item { public GogglesItem(Properties properties) { super(properties); - DispenserBlock.registerDispenseBehavior(this, ArmorItem.DISPENSER_BEHAVIOR); + DispenserBlock.registerBehavior(this, ArmorItem.DISPENSE_ITEM_BEHAVIOR); } @Override @@ -26,12 +26,12 @@ public class GogglesItem extends Item { return EquipmentSlotType.HEAD; } - public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) { - ItemStack itemstack = playerIn.getHeldItem(handIn); - EquipmentSlotType equipmentslottype = MobEntity.getSlotForItemStack(itemstack); - ItemStack itemstack1 = playerIn.getItemStackFromSlot(equipmentslottype); + public ActionResult use(World worldIn, PlayerEntity playerIn, Hand handIn) { + ItemStack itemstack = playerIn.getItemInHand(handIn); + EquipmentSlotType equipmentslottype = MobEntity.getEquipmentSlotForItem(itemstack); + ItemStack itemstack1 = playerIn.getItemBySlot(equipmentslottype); if (itemstack1.isEmpty()) { - playerIn.setItemStackToSlot(equipmentslottype, itemstack.copy()); + playerIn.setItemSlot(equipmentslottype, itemstack.copy()); itemstack.setCount(0); return new ActionResult<>(ActionResultType.SUCCESS, itemstack); } else { @@ -40,7 +40,7 @@ public class GogglesItem extends Item { } public static boolean canSeeParticles(PlayerEntity player) { - for (ItemStack itemStack : player.getArmorInventoryList()) + for (ItemStack itemStack : player.getArmorSlots()) if (AllItems.GOGGLES.isIn(itemStack)) return true; return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java index af546a856..b67227e94 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java @@ -42,7 +42,7 @@ public interface IHaveGoggleInformation { } default boolean containedFluidTooltip(List tooltip, boolean isPlayerSneaking, LazyOptional handler) { - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.goggles.fluid_container"))); + tooltip.add(componentSpacing.plainCopy().append(Lang.translate("gui.goggles.fluid_container"))); TranslationTextComponent mb = Lang.translate("generic.unit.millibuckets"); Optional resolve = handler.resolve(); if (!resolve.isPresent()) @@ -60,14 +60,14 @@ public interface IHaveGoggleInformation { if (fluidStack.isEmpty()) continue; - ITextComponent fluidName = new TranslationTextComponent(fluidStack.getTranslationKey()).formatted(TextFormatting.GRAY); - ITextComponent contained = new StringTextComponent(format(fluidStack.getAmount())).append(mb).formatted(TextFormatting.GOLD); - ITextComponent slash = new StringTextComponent(" / ").formatted(TextFormatting.GRAY); - ITextComponent capacity = new StringTextComponent(format(tank.getTankCapacity(i))).append(mb).formatted(TextFormatting.DARK_GRAY); + ITextComponent fluidName = new TranslationTextComponent(fluidStack.getTranslationKey()).withStyle(TextFormatting.GRAY); + ITextComponent contained = new StringTextComponent(format(fluidStack.getAmount())).append(mb).withStyle(TextFormatting.GOLD); + ITextComponent slash = new StringTextComponent(" / ").withStyle(TextFormatting.GRAY); + ITextComponent capacity = new StringTextComponent(format(tank.getTankCapacity(i))).append(mb).withStyle(TextFormatting.DARK_GRAY); - tooltip.add(indent.copy() + tooltip.add(indent.plainCopy() .append(fluidName)); - tooltip.add(indent.copy() + tooltip.add(indent.plainCopy() .append(contained) .append(slash) .append(capacity)); @@ -84,10 +84,10 @@ public interface IHaveGoggleInformation { if (!isEmpty) return true; - ITextComponent capacity = Lang.translate("gui.goggles.fluid_container.capacity").formatted(TextFormatting.GRAY); - ITextComponent amount = new StringTextComponent(format(tank.getTankCapacity(0))).append(mb).formatted(TextFormatting.GOLD); + ITextComponent capacity = Lang.translate("gui.goggles.fluid_container.capacity").withStyle(TextFormatting.GRAY); + ITextComponent amount = new StringTextComponent(format(tank.getTankCapacity(0))).append(mb).withStyle(TextFormatting.GOLD); - tooltip.add(indent.copy() + tooltip.add(indent.plainCopy() .append(capacity) .append(amount)); return true; @@ -106,7 +106,7 @@ public interface IHaveGoggleInformation { public void update() { format = NumberFormat.getInstance(Minecraft.getInstance() .getLanguageManager() - .getCurrentLanguage() + .getSelected() .getJavaLocale()); format.setMaximumFractionDigits(2); format.setMinimumFractionDigits(0); diff --git a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyItem.java b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyItem.java index b8571fded..fa37002d0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyItem.java @@ -12,11 +12,11 @@ import net.minecraft.util.math.MathHelper; public class SequencedAssemblyItem extends Item { public SequencedAssemblyItem(Properties p_i48487_1_) { - super(p_i48487_1_); + super(p_i48487_1_.stacksTo(1)); } @Override - public void fillItemGroup(ItemGroup p_150895_1_, NonNullList p_150895_2_) {} + public void fillItemCategory(ItemGroup p_150895_1_, NonNullList p_150895_2_) {} @Override public double getDurabilityForDisplay(ItemStack stack) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipe.java index d0f5f70fc..92f4f70a7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipe.java @@ -5,6 +5,7 @@ import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.stream.Stream; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.Create; @@ -12,6 +13,7 @@ import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.foundation.fluid.FluidIngredient; import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; import net.minecraft.client.Minecraft; import net.minecraft.inventory.IInventory; @@ -34,14 +36,14 @@ import net.minecraftforge.items.wrapper.RecipeWrapper; public class SequencedAssemblyRecipe implements IRecipe { - ResourceLocation id; - SequencedAssemblyRecipeSerializer serializer; + protected ResourceLocation id; + protected SequencedAssemblyRecipeSerializer serializer; - Ingredient ingredient; - List> sequence; - int loops; - ProcessingOutput transitionalItem; - List resultPool; + protected Ingredient ingredient; + protected List> sequence; + protected int loops; + protected ProcessingOutput transitionalItem; + protected List resultPool; public SequencedAssemblyRecipe(ResourceLocation recipeId, SequencedAssemblyRecipeSerializer serializer) { this.id = recipeId; @@ -53,13 +55,15 @@ public class SequencedAssemblyRecipe implements IRecipe { public static > Optional getRecipe(World world, C inv, IRecipeType type, Class recipeClass) { - return getRecipe(world, inv.getStackInSlot(0), type, recipeClass).filter(r -> r.matches(inv, world)); + //return getRecipe(world, inv.getStackInSlot(0), type, recipeClass).filter(r -> r.matches(inv, world)); + return getRecipes(world, inv.getItem(0), type, recipeClass).filter(r -> r.matches(inv, world)) + .findFirst(); } public static > Optional getRecipe(World world, ItemStack item, IRecipeType type, Class recipeClass) { List all = world.getRecipeManager() - .listAllOfType(AllRecipeTypes.SEQUENCED_ASSEMBLY.getType()); + .getAllRecipesFor(AllRecipeTypes.SEQUENCED_ASSEMBLY.getType()); for (SequencedAssemblyRecipe sequencedAssemblyRecipe : all) { if (!sequencedAssemblyRecipe.appliesTo(item)) continue; @@ -73,6 +77,24 @@ public class SequencedAssemblyRecipe implements IRecipe { return Optional.empty(); } + public static > Stream getRecipes(World world, ItemStack item, + IRecipeType type, Class recipeClass) { + List all = world.getRecipeManager() + .getAllRecipesFor(AllRecipeTypes.SEQUENCED_ASSEMBLY.getType()); + + return all.stream() + .filter(it -> it.appliesTo(item)) + .map(it -> Pair.of(it, it.getNextRecipe(item).getRecipe())) + .filter(it -> it.getSecond() + .getType() == type && recipeClass.isInstance(it.getSecond())) + .map(it -> { + it.getSecond() + .enforceNextResult(() -> it.getFirst().advance(item)); + return it.getSecond(); + }) + .map(recipeClass::cast); + } + private ItemStack advance(ItemStack input) { int step = getStep(input); if ((step + 1) / sequence.size() >= loops) @@ -100,7 +122,7 @@ public class SequencedAssemblyRecipe implements IRecipe { sequence.forEach(sr -> sr.getAsAssemblyRecipe() .addRequiredMachines(machines)); machines.stream() - .map(Ingredient::fromItems) + .map(Ingredient::of) .forEach(list::add); } @@ -154,17 +176,17 @@ public class SequencedAssemblyRecipe implements IRecipe { } @Override - public ItemStack getCraftingResult(RecipeWrapper p_77572_1_) { + public ItemStack assemble(RecipeWrapper p_77572_1_) { return ItemStack.EMPTY; } @Override - public boolean canFit(int p_194133_1_, int p_194133_2_) { + public boolean canCraftInDimensions(int p_194133_1_, int p_194133_2_) { return false; } @Override - public ItemStack getRecipeOutput() { + public ItemStack getResultItem() { return resultPool.get(0) .getStack(); } @@ -187,6 +209,11 @@ public class SequencedAssemblyRecipe implements IRecipe { return serializer; } + @Override + public boolean isSpecial() { + return true; + } + @Override public IRecipeType getType() { return AllRecipeTypes.SEQUENCED_ASSEMBLY.getType(); @@ -200,8 +227,8 @@ public class SequencedAssemblyRecipe implements IRecipe { CompoundNBT compound = stack.getTag() .getCompound("SequencedAssembly"); ResourceLocation resourceLocation = new ResourceLocation(compound.getString("id")); - Optional> recipe = Minecraft.getInstance().world.getRecipeManager() - .getRecipe(resourceLocation); + Optional> recipe = Minecraft.getInstance().level.getRecipeManager() + .byKey(resourceLocation); if (!recipe.isPresent()) return; IRecipe iRecipe = recipe.get(); @@ -214,9 +241,9 @@ public class SequencedAssemblyRecipe implements IRecipe { int total = length * sequencedAssemblyRecipe.loops; toolTip.add(new StringTextComponent("")); toolTip.add(Lang.translate("recipe.sequenced_assembly") - .formatted(TextFormatting.GRAY)); + .withStyle(TextFormatting.GRAY)); toolTip.add(Lang.translate("recipe.assembly.progress", step, total) - .formatted(TextFormatting.DARK_GRAY)); + .withStyle(TextFormatting.DARK_GRAY)); int remaining = total - step; for (int i = 0; i < length; i++) { @@ -227,10 +254,10 @@ public class SequencedAssemblyRecipe implements IRecipe { .getDescriptionForAssembly(); if (i == 0) toolTip.add(Lang.translate("recipe.assembly.next", textComponent) - .formatted(TextFormatting.AQUA)); + .withStyle(TextFormatting.AQUA)); else toolTip.add(new StringTextComponent("-> ").append(textComponent) - .formatted(TextFormatting.DARK_AQUA)); + .withStyle(TextFormatting.DARK_AQUA)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipeBuilder.java b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipeBuilder.java index 756209811..c1095a0b4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipeBuilder.java +++ b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipeBuilder.java @@ -8,12 +8,10 @@ import java.util.function.UnaryOperator; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeFactory; -import com.simibubi.create.foundation.utility.Lang; import net.minecraft.data.IFinishedRecipe; import net.minecraft.item.Item; @@ -34,7 +32,7 @@ public class SequencedAssemblyRecipeBuilder { public SequencedAssemblyRecipeBuilder(ResourceLocation id) { recipeConditions = new ArrayList<>(); this.recipe = new SequencedAssemblyRecipe(id, - (SequencedAssemblyRecipeSerializer) AllRecipeTypes.SEQUENCED_ASSEMBLY.serializer); + AllRecipeTypes.SEQUENCED_ASSEMBLY.getSerializer()); } public > SequencedAssemblyRecipeBuilder addStep(ProcessingRecipeFactory factory, @@ -51,11 +49,11 @@ public class SequencedAssemblyRecipeBuilder { } public SequencedAssemblyRecipeBuilder require(IItemProvider ingredient) { - return require(Ingredient.fromItems(ingredient)); + return require(Ingredient.of(ingredient)); } public SequencedAssemblyRecipeBuilder require(ITag.INamedTag tag) { - return require(Ingredient.fromTag(tag)); + return require(Ingredient.of(tag)); } public SequencedAssemblyRecipeBuilder require(Ingredient ingredient) { @@ -82,27 +80,31 @@ public class SequencedAssemblyRecipeBuilder { return this; } + public SequencedAssemblyRecipe build() { + return recipe; + } + public void build(Consumer consumer) { - consumer.accept(new DataGenResult(recipe, recipeConditions)); + consumer.accept(new DataGenResult(build(), recipeConditions)); } public static class DataGenResult implements IFinishedRecipe { - private List recipeConditions; - private SequencedAssemblyRecipeSerializer serializer; - private ResourceLocation id; private SequencedAssemblyRecipe recipe; + private List recipeConditions; + private ResourceLocation id; + private SequencedAssemblyRecipeSerializer serializer; public DataGenResult(SequencedAssemblyRecipe recipe, List recipeConditions) { this.recipeConditions = recipeConditions; this.recipe = recipe; - this.id = Create.asResource(Lang.asId(AllRecipeTypes.SEQUENCED_ASSEMBLY.name()) + "/" + recipe.getId() - .getPath()); + this.id = new ResourceLocation(recipe.getId().getNamespace(), + AllRecipeTypes.SEQUENCED_ASSEMBLY.getId().getPath() + "/" + recipe.getId().getPath()); this.serializer = (SequencedAssemblyRecipeSerializer) recipe.getSerializer(); } @Override - public void serialize(JsonObject json) { + public void serializeRecipeData(JsonObject json) { serializer.write(json, recipe); if (recipeConditions.isEmpty()) return; @@ -113,22 +115,22 @@ public class SequencedAssemblyRecipeBuilder { } @Override - public ResourceLocation getID() { + public ResourceLocation getId() { return id; } @Override - public IRecipeSerializer getSerializer() { + public IRecipeSerializer getType() { return serializer; } @Override - public JsonObject getAdvancementJson() { + public JsonObject serializeAdvancement() { return null; } @Override - public ResourceLocation getAdvancementID() { + public ResourceLocation getAdvancementId() { return null; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipeSerializer.java b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipeSerializer.java index d7c922399..91d54fd21 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipeSerializer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipeSerializer.java @@ -20,7 +20,7 @@ public class SequencedAssemblyRecipeSerializer extends ForgeRegistryEntry nestedRecipes.add(i.toJson())); recipe.resultPool.forEach(p -> results.add(p.serialize())); json.add("transitionalItem", recipe.transitionalItem.serialize()); @@ -31,20 +31,20 @@ public class SequencedAssemblyRecipeSerializer extends ForgeRegistryEntry sr.writeToBuffer(buffer)); buffer.writeVarInt(recipe.resultPool.size()); @@ -55,7 +55,7 @@ public class SequencedAssemblyRecipeSerializer extends ForgeRegistryEntry> { public static SequencedRecipe fromJson(JsonObject json, SequencedAssemblyRecipe parent, int index) { ResourceLocation parentId = parent.getId(); - IRecipe recipe = RecipeManager.deserializeRecipe( + IRecipe recipe = RecipeManager.fromJson( new ResourceLocation(parentId.getNamespace(), parentId.getPath() + "_step_" + index), json); if (recipe instanceof ProcessingRecipe && recipe instanceof IAssemblyRecipe) { ProcessingRecipe processingRecipe = (ProcessingRecipe) recipe; IAssemblyRecipe assemblyRecipe = (IAssemblyRecipe) recipe; if (assemblyRecipe.supportsAssembly()) { - Ingredient transit = Ingredient.fromStacks(parent.getTransitionalItem()); + Ingredient transit = Ingredient.of(parent.getTransitionalItem()); processingRecipe.getIngredients() .set(0, index == 0 ? Ingredient.merge(ImmutableList.of(transit, parent.getIngredient())) : transit); SequencedRecipe sequencedRecipe = new SequencedRecipe<>(processingRecipe); @@ -63,7 +63,7 @@ public class SequencedRecipe> { ProcessingRecipeSerializer serializer = (ProcessingRecipeSerializer) wrapped.getSerializer(); buffer.writeResourceLocation(ForgeRegistries.RECIPE_SERIALIZERS.getKey(serializer)); buffer.writeResourceLocation(wrapped.getId()); - serializer.write(buffer, wrapped); + serializer.toNetwork(buffer, wrapped); } public static SequencedRecipe readFromBuffer(PacketBuffer buffer) { @@ -73,7 +73,7 @@ public class SequencedRecipe> { if (!(serializer instanceof ProcessingRecipeSerializer)) throw new JsonParseException("Not a supported recipe type"); @SuppressWarnings("rawtypes") - ProcessingRecipe recipe = (ProcessingRecipe) serializer.read(resourcelocation1, buffer); + ProcessingRecipe recipe = (ProcessingRecipe) serializer.fromNetwork(resourcelocation1, buffer); return new SequencedRecipe<>(recipe); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java index d4399cde7..22b0bbe7f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java @@ -29,18 +29,18 @@ public class AirFlowParticle extends SimpleAnimatedParticle { protected AirFlowParticle(ClientWorld world, IAirCurrentSource source, double x, double y, double z, IAnimatedSprite sprite) { - super(world, x, y, z, sprite, world.rand.nextFloat() * .5f); + super(world, x, y, z, sprite, world.random.nextFloat() * .5f); this.source = source; - this.particleScale *= 0.75F; - this.maxAge = 40; - canCollide = false; + this.quadSize *= 0.75F; + this.lifetime = 40; + hasPhysics = false; selectSprite(7); Vector3d offset = VecHelper.offsetRandomly(Vector3d.ZERO, Create.RANDOM, .25f); - this.setPosition(posX + offset.x, posY + offset.y, posZ + offset.z); - this.prevPosX = posX; - this.prevPosY = posY; - this.prevPosZ = posZ; - setAlphaF(.25f); + this.setPos(x + offset.x, y + offset.y, z + offset.z); + this.xo = x; + this.yo = y; + this.zo = z; + setAlpha(.25f); } @Nonnull @@ -54,43 +54,43 @@ public class AirFlowParticle extends SimpleAnimatedParticle { dissipate(); return; } - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - if (this.age++ >= this.maxAge) { - this.setExpired(); + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + if (this.age++ >= this.lifetime) { + this.remove(); } else { - if (source.getAirCurrent() == null || !source.getAirCurrent().bounds.grow(.25f).contains(posX, posY, posZ)) { + if (source.getAirCurrent() == null || !source.getAirCurrent().bounds.inflate(.25f).contains(x, y, z)) { dissipate(); return; } - Vector3d directionVec = Vector3d.of(source.getAirCurrent().direction.getDirectionVec()); + Vector3d directionVec = Vector3d.atLowerCornerOf(source.getAirCurrent().direction.getNormal()); Vector3d motion = directionVec.scale(1 / 8f); if (!source.getAirCurrent().pushing) motion = motion.scale(-1); - double distance = new Vector3d(posX, posY, posZ).subtract(VecHelper.getCenterOf(source.getAirCurrentPos())) - .mul(directionVec).length() - .5f; + double distance = new Vector3d(x, y, z).subtract(VecHelper.getCenterOf(source.getAirCurrentPos())) + .multiply(directionVec).length() - .5f; if (distance > source.getAirCurrent().maxDistance + 1 || distance < -.25f) { dissipate(); return; } motion = motion.scale(source.getAirCurrent().maxDistance - (distance - 1f)).scale(.5f); - selectSprite((int) MathHelper.clamp((distance / source.getAirCurrent().maxDistance) * 8 + world.rand.nextInt(4), + selectSprite((int) MathHelper.clamp((distance / source.getAirCurrent().maxDistance) * 8 + level.random.nextInt(4), 0, 7)); morphType(distance); - motionX = motion.x; - motionY = motion.y; - motionZ = motion.z; + xd = motion.x; + yd = motion.y; + zd = motion.z; if (this.onGround) { - this.motionX *= 0.7; - this.motionZ *= 0.7; + this.xd *= 0.7; + this.zd *= 0.7; } - this.move(this.motionX, this.motionY, this.motionZ); + this.move(this.xd, this.yd, this.zd); } @@ -102,59 +102,59 @@ public class AirFlowParticle extends SimpleAnimatedParticle { InWorldProcessing.Type type = source.getAirCurrent().getSegmentAt((float) distance); if (type == InWorldProcessing.Type.SPLASHING) { - setColor(ColorHelper.mixColors(0x4499FF, 0x2277FF, world.rand.nextFloat())); - setAlphaF(1f); - selectSprite(world.rand.nextInt(3)); - if (world.rand.nextFloat() < 1 / 32f) - world.addParticle(ParticleTypes.BUBBLE, posX, posY, posZ, motionX * .125f, motionY * .125f, - motionZ * .125f); - if (world.rand.nextFloat() < 1 / 32f) - world.addParticle(ParticleTypes.BUBBLE_POP, posX, posY, posZ, motionX * .125f, motionY * .125f, - motionZ * .125f); + setColor(ColorHelper.mixColors(0x4499FF, 0x2277FF, level.random.nextFloat())); + setAlpha(1f); + selectSprite(level.random.nextInt(3)); + if (level.random.nextFloat() < 1 / 32f) + level.addParticle(ParticleTypes.BUBBLE, x, y, z, xd * .125f, yd * .125f, + zd * .125f); + if (level.random.nextFloat() < 1 / 32f) + level.addParticle(ParticleTypes.BUBBLE_POP, x, y, z, xd * .125f, yd * .125f, + zd * .125f); } if (type == InWorldProcessing.Type.SMOKING) { - setColor(ColorHelper.mixColors(0x0, 0x555555, world.rand.nextFloat())); - setAlphaF(1f); - selectSprite(world.rand.nextInt(3)); - if (world.rand.nextFloat() < 1 / 32f) - world.addParticle(ParticleTypes.SMOKE, posX, posY, posZ, motionX * .125f, motionY * .125f, - motionZ * .125f); - if (world.rand.nextFloat() < 1 / 32f) - world.addParticle(ParticleTypes.LARGE_SMOKE, posX, posY, posZ, motionX * .125f, motionY * .125f, - motionZ * .125f); + setColor(ColorHelper.mixColors(0x0, 0x555555, level.random.nextFloat())); + setAlpha(1f); + selectSprite(level.random.nextInt(3)); + if (level.random.nextFloat() < 1 / 32f) + level.addParticle(ParticleTypes.SMOKE, x, y, z, xd * .125f, yd * .125f, + zd * .125f); + if (level.random.nextFloat() < 1 / 32f) + level.addParticle(ParticleTypes.LARGE_SMOKE, x, y, z, xd * .125f, yd * .125f, + zd * .125f); } if (type == InWorldProcessing.Type.BLASTING) { - setColor(ColorHelper.mixColors(0xFF4400, 0xFF8855, world.rand.nextFloat())); - setAlphaF(.5f); - selectSprite(world.rand.nextInt(3)); - if (world.rand.nextFloat() < 1 / 32f) - world.addParticle(ParticleTypes.FLAME, posX, posY, posZ, motionX * .25f, motionY * .25f, - motionZ * .25f); - if (world.rand.nextFloat() < 1 / 16f) - world.addParticle(new BlockParticleData(ParticleTypes.BLOCK, Blocks.LAVA.getDefaultState()), posX, posY, - posZ, motionX * .25f, motionY * .25f, motionZ * .25f); + setColor(ColorHelper.mixColors(0xFF4400, 0xFF8855, level.random.nextFloat())); + setAlpha(.5f); + selectSprite(level.random.nextInt(3)); + if (level.random.nextFloat() < 1 / 32f) + level.addParticle(ParticleTypes.FLAME, x, y, z, xd * .25f, yd * .25f, + zd * .25f); + if (level.random.nextFloat() < 1 / 16f) + level.addParticle(new BlockParticleData(ParticleTypes.BLOCK, Blocks.LAVA.defaultBlockState()), x, y, + z, xd * .25f, yd * .25f, zd * .25f); } if (type == null) { setColor(0xEEEEEE); - setAlphaF(.25f); + setAlpha(.25f); setSize(.2f, .2f); } } private void dissipate() { - setExpired(); + remove(); } - public int getBrightnessForRender(float partialTick) { - BlockPos blockpos = new BlockPos(this.posX, this.posY, this.posZ); - return this.world.isBlockPresent(blockpos) ? WorldRenderer.getLightmapCoordinates(world, blockpos) : 0; + public int getLightColor(float partialTick) { + BlockPos blockpos = new BlockPos(this.x, this.y, this.z); + return this.level.isLoaded(blockpos) ? WorldRenderer.getLightColor(level, blockpos) : 0; } private void selectSprite(int index) { - setSprite(field_217584_C.get(index, 8)); + setSprite(sprites.get(index, 8)); } public static class Factory implements IParticleFactory { @@ -164,9 +164,9 @@ public class AirFlowParticle extends SimpleAnimatedParticle { this.spriteSet = animatedSprite; } - public Particle makeParticle(AirFlowParticleData data, ClientWorld worldIn, double x, double y, double z, + public Particle createParticle(AirFlowParticleData data, ClientWorld worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { - TileEntity te = worldIn.getTileEntity(new BlockPos(data.posX, data.posY, data.posZ)); + TileEntity te = worldIn.getBlockEntity(new BlockPos(data.posX, data.posY, data.posZ)); if (!(te instanceof IAirCurrentSource)) te = null; return new AirFlowParticle(worldIn, (IAirCurrentSource) te, x, y, z, this.spriteSet); diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticleData.java index 74f6d9a32..bff77492d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticleData.java @@ -26,7 +26,7 @@ public class AirFlowParticleData implements IParticleData, ICustomParticleDataWi .apply(i, AirFlowParticleData::new)); public static final IParticleData.IDeserializer DESERIALIZER = new IParticleData.IDeserializer() { - public AirFlowParticleData deserialize(ParticleType particleTypeIn, StringReader reader) + public AirFlowParticleData fromCommand(ParticleType particleTypeIn, StringReader reader) throws CommandSyntaxException { reader.expect(' '); int x = reader.readInt(); @@ -37,7 +37,7 @@ public class AirFlowParticleData implements IParticleData, ICustomParticleDataWi return new AirFlowParticleData(x, y, z); } - public AirFlowParticleData read(ParticleType particleTypeIn, PacketBuffer buffer) { + public AirFlowParticleData fromNetwork(ParticleType particleTypeIn, PacketBuffer buffer) { return new AirFlowParticleData(buffer.readInt(), buffer.readInt(), buffer.readInt()); } }; @@ -66,14 +66,14 @@ public class AirFlowParticleData implements IParticleData, ICustomParticleDataWi } @Override - public void write(PacketBuffer buffer) { + public void writeToNetwork(PacketBuffer buffer) { buffer.writeInt(posX); buffer.writeInt(posY); buffer.writeInt(posZ); } @Override - public String getParameters() { + public String writeToString() { return String.format(Locale.ROOT, "%s %d %d %d", AllParticleTypes.AIR_FLOW.parameter(), posX, posY, posZ); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java index ff51b5719..25d7d9f02 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java @@ -26,14 +26,14 @@ public class AirParticle extends SimpleAnimatedParticle { protected AirParticle(ClientWorld world, AirParticleData data, double x, double y, double z, double dx, double dy, double dz, IAnimatedSprite sprite) { - super(world, x, y, z, sprite, world.rand.nextFloat() * .5f); - particleScale *= 0.75F; - canCollide = false; + super(world, x, y, z, sprite, world.random.nextFloat() * .5f); + quadSize *= 0.75F; + hasPhysics = false; - setPosition(posX, posY, posZ); - originX = (float) (prevPosX = posX); - originY = (float) (prevPosY = posY); - originZ = (float) (prevPosZ = posZ); + setPos(x, y, z); + originX = (float) (xo = x); + originY = (float) (yo = y); + originZ = (float) (zo = z); targetX = (float) (x + dx); targetY = (float) (y + dy); targetZ = (float) (z + dz); @@ -45,13 +45,13 @@ public class AirParticle extends SimpleAnimatedParticle { // speed in m/ticks double length = new Vector3d(dx, dy, dz).length(); - maxAge = Math.min((int) (length / data.speed), 60); + lifetime = Math.min((int) (length / data.speed), 60); selectSprite(7); - setAlphaF(.25f); + setAlpha(.25f); if (length == 0) { - setExpired(); - setAlphaF(0); + remove(); + setAlpha(0); } } @@ -61,15 +61,15 @@ public class AirParticle extends SimpleAnimatedParticle { @Override public void tick() { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - if (this.age++ >= this.maxAge) { - this.setExpired(); + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + if (this.age++ >= this.lifetime) { + this.remove(); return; } - float progress = (float) Math.pow(((float) age) / maxAge, drag); + float progress = (float) Math.pow(((float) age) / lifetime, drag); float angle = (progress * 2 * 360 + twirlAngleOffset) % 360; Vector3d twirl = VecHelper.rotate(new Vector3d(0, twirlRadius, 0), angle, twirlAxis); @@ -77,21 +77,21 @@ public class AirParticle extends SimpleAnimatedParticle { float y = (float) (MathHelper.lerp(progress, originY, targetY) + twirl.y); float z = (float) (MathHelper.lerp(progress, originZ, targetZ) + twirl.z); - motionX = x - posX; - motionY = y - posY; - motionZ = z - posZ; + xd = x - x; + yd = y - y; + zd = z - z; - selectSpriteWithAge(field_217584_C); - this.move(this.motionX, this.motionY, this.motionZ); + setSpriteFromAge(sprites); + this.move(this.xd, this.yd, this.zd); } - public int getBrightnessForRender(float partialTick) { - BlockPos blockpos = new BlockPos(this.posX, this.posY, this.posZ); - return this.world.isBlockPresent(blockpos) ? WorldRenderer.getLightmapCoordinates(world, blockpos) : 0; + public int getLightColor(float partialTick) { + BlockPos blockpos = new BlockPos(this.x, this.y, this.z); + return this.level.isLoaded(blockpos) ? WorldRenderer.getLightColor(level, blockpos) : 0; } private void selectSprite(int index) { - setSprite(field_217584_C.get(index, 8)); + setSprite(sprites.get(index, 8)); } public static class Factory implements IParticleFactory { @@ -101,7 +101,7 @@ public class AirParticle extends SimpleAnimatedParticle { this.spriteSet = animatedSprite; } - public Particle makeParticle(AirParticleData data, ClientWorld worldIn, double x, double y, double z, double xSpeed, + public Particle createParticle(AirParticleData data, ClientWorld worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { return new AirParticle(worldIn, data, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java index 7159756f8..133dc3180 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java @@ -25,7 +25,7 @@ public class AirParticleData implements IParticleData, ICustomParticleDataWithSp public static final IParticleData.IDeserializer DESERIALIZER = new IParticleData.IDeserializer() { - public AirParticleData deserialize(ParticleType particleTypeIn, StringReader reader) + public AirParticleData fromCommand(ParticleType particleTypeIn, StringReader reader) throws CommandSyntaxException { reader.expect(' '); float drag = reader.readFloat(); @@ -34,7 +34,7 @@ public class AirParticleData implements IParticleData, ICustomParticleDataWithSp return new AirParticleData(drag, speed); } - public AirParticleData read(ParticleType particleTypeIn, PacketBuffer buffer) { + public AirParticleData fromNetwork(ParticleType particleTypeIn, PacketBuffer buffer) { return new AirParticleData(buffer.readFloat(), buffer.readFloat()); } }; @@ -57,13 +57,13 @@ public class AirParticleData implements IParticleData, ICustomParticleDataWithSp } @Override - public void write(PacketBuffer buffer) { + public void writeToNetwork(PacketBuffer buffer) { buffer.writeFloat(drag); buffer.writeFloat(speed); } @Override - public String getParameters() { + public String writeToString() { return String.format(Locale.ROOT, "%s %f %f", AllParticleTypes.AIR.parameter(), drag, speed); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java index f50fdf30d..bc68081d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java @@ -53,7 +53,7 @@ public class CubeParticle extends Particle { private static final IParticleRenderType renderType = new IParticleRenderType() { @Override - public void beginRender(BufferBuilder builder, TextureManager textureManager) { + public void begin(BufferBuilder builder, TextureManager textureManager) { RenderSystem.disableTexture(); // transparent, additive blending @@ -72,8 +72,8 @@ public class CubeParticle extends Particle { } @Override - public void finishRender(Tessellator tessellator) { - tessellator.draw(); + public void end(Tessellator tessellator) { + tessellator.end(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); RenderSystem.disableLighting(); @@ -86,9 +86,9 @@ public class CubeParticle extends Particle { public CubeParticle(ClientWorld world, double x, double y, double z, double motionX, double motionY, double motionZ) { super(world, x, y, z); - this.motionX = motionX; - this.motionY = motionY; - this.motionZ = motionZ; + this.xd = motionX; + this.yd = motionY; + this.zd = motionZ; setScale(0.2F); } @@ -99,7 +99,7 @@ public class CubeParticle extends Particle { } public void averageAge(int age) { - this.maxAge = (int) (age + (rand.nextDouble() * 2D - 1D) * 8); + this.lifetime = (int) (age + (random.nextDouble() * 2D - 1D) * 8); } public void setHot(boolean hot) { @@ -111,34 +111,34 @@ public class CubeParticle extends Particle { @Override public void tick() { if (this.hot && this.age > 0) { - if (this.prevPosY == this.posY) { + if (this.yo == this.y) { billowing = true; - field_21507 = false; // Prevent motion being ignored due to vertical collision - if (this.motionX == 0 && this.motionZ == 0) { - Vector3d diff = Vector3d.of(new BlockPos(posX, posY, posZ)).add(0.5, 0.5, 0.5).subtract(posX, posY, posZ); - this.motionX = -diff.x * 0.1; - this.motionZ = -diff.z * 0.1; + stoppedByCollision = false; // Prevent motion being ignored due to vertical collision + if (this.xd == 0 && this.zd == 0) { + Vector3d diff = Vector3d.atLowerCornerOf(new BlockPos(x, y, z)).add(0.5, 0.5, 0.5).subtract(x, y, z); + this.xd = -diff.x * 0.1; + this.zd = -diff.z * 0.1; } - this.motionX *= 1.1; - this.motionY *= 0.9; - this.motionZ *= 1.1; + this.xd *= 1.1; + this.yd *= 0.9; + this.zd *= 1.1; } else if (billowing) { - this.motionY *= 1.2; + this.yd *= 1.2; } } super.tick(); } @Override - public void buildGeometry(IVertexBuilder builder, ActiveRenderInfo renderInfo, float p_225606_3_) { - Vector3d projectedView = renderInfo.getProjectedView(); - float lerpedX = (float) (MathHelper.lerp(p_225606_3_, this.prevPosX, this.posX) - projectedView.getX()); - float lerpedY = (float) (MathHelper.lerp(p_225606_3_, this.prevPosY, this.posY) - projectedView.getY()); - float lerpedZ = (float) (MathHelper.lerp(p_225606_3_, this.prevPosZ, this.posZ) - projectedView.getZ()); + public void render(IVertexBuilder builder, ActiveRenderInfo renderInfo, float p_225606_3_) { + Vector3d projectedView = renderInfo.getPosition(); + float lerpedX = (float) (MathHelper.lerp(p_225606_3_, this.xo, this.x) - projectedView.x()); + float lerpedY = (float) (MathHelper.lerp(p_225606_3_, this.yo, this.y) - projectedView.y()); + float lerpedZ = (float) (MathHelper.lerp(p_225606_3_, this.zo, this.z) - projectedView.z()); // int light = getBrightnessForRender(p_225606_3_); int light = 15728880;// 15<<20 && 15<<4 - double ageMultiplier = 1 - Math.pow(age, 3) / Math.pow(maxAge, 3); + double ageMultiplier = 1 - Math.pow(age, 3) / Math.pow(lifetime, 3); for (int i = 0; i < 6; i++) { // 6 faces to a cube @@ -151,9 +151,9 @@ public class CubeParticle extends Particle { Vector3d normal = CUBE_NORMALS[i]; builder.vertex(vec.x, vec.y, vec.z) - .color(particleRed, particleGreen, particleBlue, particleAlpha) - .texture(0, 0) - .light(light) + .color(rCol, gCol, bCol, alpha) + .uv(0, 0) + .uv2(light) .normal((float) normal.x, (float) normal.y, (float) normal.z) .endVertex(); } @@ -170,7 +170,7 @@ public class CubeParticle extends Particle { public Factory() {} @Override - public Particle makeParticle(CubeParticleData data, ClientWorld world, double x, double y, double z, double motionX, + public Particle createParticle(CubeParticleData data, ClientWorld world, double x, double y, double z, double motionX, double motionY, double motionZ) { CubeParticle particle = new CubeParticle(world, x, y, z, motionX, motionY, motionZ); particle.setColor(data.r, data.g, data.b); diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java index 442a68b49..7bf66ce3c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java @@ -29,7 +29,7 @@ public class CubeParticleData implements IParticleData, ICustomParticleData DESERIALIZER = new IParticleData.IDeserializer() { @Override - public CubeParticleData deserialize(ParticleType type, StringReader reader) throws CommandSyntaxException { + public CubeParticleData fromCommand(ParticleType type, StringReader reader) throws CommandSyntaxException { reader.expect(' '); float r = reader.readFloat(); reader.expect(' '); @@ -46,7 +46,7 @@ public class CubeParticleData implements IParticleData, ICustomParticleData type, PacketBuffer buffer) { + public CubeParticleData fromNetwork(ParticleType type, PacketBuffer buffer) { return new CubeParticleData(buffer.readFloat(), buffer.readFloat(), buffer.readFloat(), buffer.readFloat(), buffer.readInt(), buffer.readBoolean()); } }; @@ -93,7 +93,7 @@ public class CubeParticleData implements IParticleData, ICustomParticleData> 16 & 255; j = j + (int) (f * 15.0F * 16.0F); @@ -76,20 +76,20 @@ public class HeaterParticle extends SimpleAnimatedParticle { @Override public void tick() { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - if (this.age++ >= this.maxAge) { - this.setExpired(); + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + if (this.age++ >= this.lifetime) { + this.remove(); } else { - this.selectSpriteWithAge(animatedSprite); - this.move(this.motionX, this.motionY, this.motionZ); - this.motionX *= (double) 0.96F; - this.motionY *= (double) 0.96F; - this.motionZ *= (double) 0.96F; + this.setSpriteFromAge(animatedSprite); + this.move(this.xd, this.yd, this.zd); + this.xd *= (double) 0.96F; + this.yd *= (double) 0.96F; + this.zd *= (double) 0.96F; if (this.onGround) { - this.motionX *= (double) 0.7F; - this.motionZ *= (double) 0.7F; + this.xd *= (double) 0.7F; + this.zd *= (double) 0.7F; } } } @@ -102,7 +102,7 @@ public class HeaterParticle extends SimpleAnimatedParticle { } @Override - public Particle makeParticle(HeaterParticleData data, ClientWorld worldIn, double x, double y, double z, double vx, + public Particle createParticle(HeaterParticleData data, ClientWorld worldIn, double x, double y, double z, double vx, double vy, double vz) { return new HeaterParticle(worldIn, data.r, data.g, data.b, x, y, z, vx, vy, vz, this.spriteSet); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/HeaterParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/HeaterParticleData.java index a547ba995..c2cf4c37e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/HeaterParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/HeaterParticleData.java @@ -32,7 +32,7 @@ public class HeaterParticleData implements IParticleData, ICustomParticleDataWit public static final IParticleData.IDeserializer DESERIALIZER = new IParticleData.IDeserializer() { @Override - public HeaterParticleData deserialize(ParticleType arg0, StringReader reader) + public HeaterParticleData fromCommand(ParticleType arg0, StringReader reader) throws CommandSyntaxException { reader.expect(' '); float r = reader.readFloat(); @@ -44,7 +44,7 @@ public class HeaterParticleData implements IParticleData, ICustomParticleDataWit } @Override - public HeaterParticleData read(ParticleType type, PacketBuffer buffer) { + public HeaterParticleData fromNetwork(ParticleType type, PacketBuffer buffer) { return new HeaterParticleData(buffer.readFloat(), buffer.readFloat(), buffer.readFloat()); } }; @@ -80,7 +80,7 @@ public class HeaterParticleData implements IParticleData, ICustomParticleDataWit } @Override - public String getParameters() { + public String writeToString() { return String.format(Locale.ROOT, "%s %f %f %f", AllParticleTypes.HEATER_PARTICLE.parameter(), r, g, b); } @@ -90,7 +90,7 @@ public class HeaterParticleData implements IParticleData, ICustomParticleDataWit } @Override - public void write(PacketBuffer buffer) { + public void writeToNetwork(PacketBuffer buffer) { buffer.writeFloat(r); buffer.writeFloat(g); buffer.writeFloat(b); diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleData.java index 8e067799c..8d76c0788 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleData.java @@ -20,7 +20,7 @@ public interface ICustomParticleData { return new ParticleType(false, getDeserializer()) { @Override - public Codec getCodec() { + public Codec codec() { return ICustomParticleData.this.getCodec(this); } }; @@ -31,7 +31,7 @@ public interface ICustomParticleData { @OnlyIn(Dist.CLIENT) public default void register(ParticleType type, ParticleManager particles) { - particles.registerFactory(type, getFactory()); + particles.register(type, getFactory()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleDataWithSprite.java b/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleDataWithSprite.java index 65dd04908..30c554549 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleDataWithSprite.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleDataWithSprite.java @@ -19,7 +19,7 @@ public interface ICustomParticleDataWithSprite extends return new ParticleType(false, getDeserializer()) { @Override - public Codec getCodec() { + public Codec codec() { return ICustomParticleDataWithSprite.this.getCodec(this); } }; @@ -37,7 +37,7 @@ public interface ICustomParticleDataWithSprite extends @Override @OnlyIn(Dist.CLIENT) public default void register(ParticleType type, ParticleManager particles) { - particles.registerFactory(type, getMetaFactory()); + particles.register(type, getMetaFactory()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java index ffb2f1996..28b6290b9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java @@ -31,15 +31,15 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { private RotationIndicatorParticle(ClientWorld world, double x, double y, double z, int color, float radius1, float radius2, float speed, Axis axis, int lifeSpan, boolean isVisible, IAnimatedSprite sprite) { super(world, x, y, z, sprite, 0); - this.motionX = 0; - this.motionY = 0; - this.motionZ = 0; + this.xd = 0; + this.yd = 0; + this.zd = 0; this.origin = new Vector3d(x, y, z); - this.particleScale *= 0.75F; - this.maxAge = lifeSpan + this.rand.nextInt(32); - this.setColorFade(color); + this.quadSize *= 0.75F; + this.lifetime = lifeSpan + this.random.nextInt(32); + this.setFadeColor(color); this.setColor(ColorHelper.mixColors(color, 0xFFFFFF, .5f)); - this.selectSpriteWithAge(sprite); + this.setSpriteFromAge(sprite); this.radius1 = radius1; this.radius = radius1; this.radius2 = radius2; @@ -48,9 +48,9 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { this.isVisible = isVisible; this.offset = axis.isHorizontal() ? new Vector3d(0, 1, 0) : new Vector3d(1, 0, 0); move(0, 0, 0); - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; } @Override @@ -60,21 +60,21 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { } @Override - public void buildGeometry(IVertexBuilder buffer, ActiveRenderInfo renderInfo, float partialTicks) { + public void render(IVertexBuilder buffer, ActiveRenderInfo renderInfo, float partialTicks) { if (!isVisible) return; - super.buildGeometry(buffer, renderInfo, partialTicks); + super.render(buffer, renderInfo, partialTicks); } public void move(double x, double y, double z) { - float time = AnimationTickHolder.getTicks(world); - float angle = (float) ((time * speed) % 360) - (speed / 2 * age * (((float) age) / maxAge)); + float time = AnimationTickHolder.getTicks(level); + float angle = (float) ((time * speed) % 360) - (speed / 2 * age * (((float) age) / lifetime)); if (speed < 0 && axis.isVertical()) angle += 180; Vector3d position = VecHelper.rotate(this.offset.scale(radius), angle, axis).add(origin); - posX = position.x; - posY = position.y; - posZ = position.z; + x = position.x; + y = position.y; + z = position.z; } public static class Factory implements IParticleFactory { @@ -84,11 +84,11 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { this.spriteSet = animatedSprite; } - public Particle makeParticle(RotationIndicatorParticleData data, ClientWorld worldIn, double x, double y, double z, + public Particle createParticle(RotationIndicatorParticleData data, ClientWorld worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { Minecraft mc = Minecraft.getInstance(); ClientPlayerEntity player = mc.player; - boolean visible = worldIn != mc.world || player != null && GogglesItem.canSeeParticles(player); + boolean visible = worldIn != mc.level || player != null && GogglesItem.canSeeParticles(player); return new RotationIndicatorParticle(worldIn, x, y, z, data.color, data.radius1, data.radius2, data.speed, data.getAxis(), data.lifeSpan, visible, this.spriteSet); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticleData.java index 23fb007e9..2827b49a8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticleData.java @@ -58,7 +58,7 @@ public class RotationIndicatorParticleData public static final IParticleData.IDeserializer DESERIALIZER = new IParticleData.IDeserializer() { - public RotationIndicatorParticleData deserialize(ParticleType particleTypeIn, + public RotationIndicatorParticleData fromCommand(ParticleType particleTypeIn, StringReader reader) throws CommandSyntaxException { reader.expect(' '); int color = reader.readInt(); @@ -75,7 +75,7 @@ public class RotationIndicatorParticleData return new RotationIndicatorParticleData(color, speed, rad1, rad2, lifeSpan, axis); } - public RotationIndicatorParticleData read(ParticleType particleTypeIn, + public RotationIndicatorParticleData fromNetwork(ParticleType particleTypeIn, PacketBuffer buffer) { return new RotationIndicatorParticleData(buffer.readInt(), buffer.readFloat(), buffer.readFloat(), buffer.readFloat(), buffer.readInt(), buffer.readChar()); @@ -113,7 +113,7 @@ public class RotationIndicatorParticleData } @Override - public void write(PacketBuffer buffer) { + public void writeToNetwork(PacketBuffer buffer) { buffer.writeInt(color); buffer.writeFloat(speed); buffer.writeFloat(radius1); @@ -123,7 +123,7 @@ public class RotationIndicatorParticleData } @Override - public String getParameters() { + public String writeToString() { return String.format(Locale.ROOT, "%s %d %.2f %.2f %.2f %d %c", AllParticleTypes.ROTATION_INDICATOR.parameter(), color, speed, radius1, radius2, lifeSpan, axis); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java index 3829c5339..673115935 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java @@ -50,11 +50,11 @@ import net.minecraftforge.items.ItemStackHandler; public class BasinBlock extends Block implements ITE, IWrenchable { - public static final DirectionProperty FACING = BlockStateProperties.FACING_EXCEPT_UP; + public static final DirectionProperty FACING = BlockStateProperties.FACING_HOPPER; public BasinBlock(Properties p_i48440_1_) { super(p_i48440_1_); - setDefaultState(getDefaultState().with(FACING, Direction.DOWN)); + registerDefaultState(defaultBlockState().setValue(FACING, Direction.DOWN)); } @Override @@ -63,13 +63,13 @@ public class BasinBlock extends Block implements ITE, IWrenchab } @Override - protected void fillStateContainer(Builder p_206840_1_) { - super.fillStateContainer(p_206840_1_.add(FACING)); + protected void createBlockStateDefinition(Builder p_206840_1_) { + super.createBlockStateDefinition(p_206840_1_.add(FACING)); } @Override - public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { - TileEntity tileEntity = world.getTileEntity(pos.up()); + public boolean canSurvive(BlockState state, IWorldReader world, BlockPos pos) { + TileEntity tileEntity = world.getBlockEntity(pos.above()); if (tileEntity instanceof BasinOperatingTileEntity) return false; return true; @@ -82,15 +82,15 @@ public class BasinBlock extends Block implements ITE, IWrenchab @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - if (!context.getWorld().isRemote) - withTileEntityDo(context.getWorld(), context.getPos(), bte -> bte.onWrenched(context.getFace())); + if (!context.getLevel().isClientSide) + withTileEntityDo(context.getLevel(), context.getClickedPos(), bte -> bte.onWrenched(context.getClickedFace())); return ActionResultType.SUCCESS; } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - ItemStack heldItem = player.getHeldItem(handIn); + ItemStack heldItem = player.getItemInHand(handIn); return onTileEntityUse(worldIn, pos, te -> { if (!heldItem.isEmpty()) { @@ -124,7 +124,7 @@ public class BasinBlock extends Block implements ITE, IWrenchab success = true; } if (success) - worldIn.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, .2f, + worldIn.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundCategory.PLAYERS, .2f, 1f + Create.RANDOM.nextFloat()); te.onEmptied(); return ActionResultType.SUCCESS; @@ -132,16 +132,16 @@ public class BasinBlock extends Block implements ITE, IWrenchab } @Override - public void onLanded(IBlockReader worldIn, Entity entityIn) { - super.onLanded(worldIn, entityIn); - if (!AllBlocks.BASIN.has(worldIn.getBlockState(entityIn.getBlockPos()))) + public void updateEntityAfterFallOn(IBlockReader worldIn, Entity entityIn) { + super.updateEntityAfterFallOn(worldIn, entityIn); + if (!AllBlocks.BASIN.has(worldIn.getBlockState(entityIn.blockPosition()))) return; if (!(entityIn instanceof ItemEntity)) return; if (!entityIn.isAlive()) return; ItemEntity itemEntity = (ItemEntity) entityIn; - withTileEntityDo(worldIn, entityIn.getBlockPos(), te -> { + withTileEntityDo(worldIn, entityIn.blockPosition(), te -> { // Tossed items bypass the quarter-stack limit te.inputInventory.withMaxStackSize(64); @@ -151,9 +151,9 @@ public class BasinBlock extends Block implements ITE, IWrenchab if (insertItem.isEmpty()) { itemEntity.remove(); - if (!itemEntity.world.isRemote) - AllTriggers.triggerForNearbyPlayers(AllTriggers.BASIN_THROW, itemEntity.world, - itemEntity.getBlockPos(), 3); + if (!itemEntity.level.isClientSide) + AllTriggers.triggerForNearbyPlayers(AllTriggers.BASIN_THROW, itemEntity.level, + itemEntity.blockPosition(), 3); return; } @@ -162,7 +162,7 @@ public class BasinBlock extends Block implements ITE, IWrenchab } @Override - public VoxelShape getRaytraceShape(BlockState p_199600_1_, IBlockReader p_199600_2_, BlockPos p_199600_3_) { + public VoxelShape getInteractionShape(BlockState p_199600_1_, IBlockReader p_199600_2_, BlockPos p_199600_3_) { return AllShapes.BASIN_RAYTRACE_SHAPE; } @@ -179,25 +179,25 @@ public class BasinBlock extends Block implements ITE, IWrenchab } @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) return; TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); withTileEntityDo(worldIn, pos, te -> { ItemHelper.dropContents(worldIn, pos, te.inputInventory); ItemHelper.dropContents(worldIn, pos, te.outputInventory); - te.spoutputBuffer.forEach(is -> Block.spawnAsEntity(worldIn, pos, is)); + te.spoutputBuffer.forEach(is -> Block.popResource(worldIn, pos, is)); }); - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } @Override - public boolean hasComparatorInputOverride(BlockState state) { + public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override - public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { + public int getAnalogOutputSignal(BlockState blockState, World worldIn, BlockPos pos) { return getTileEntityOptional(worldIn, pos).map(BasinTileEntity::getInputInventory) .map(ItemHelper::calcRedstoneFromInventory) .orElse(0); @@ -209,8 +209,8 @@ public class BasinBlock extends Block implements ITE, IWrenchab } public static boolean canOutputTo(IBlockReader world, BlockPos basinPos, Direction direction) { - BlockPos neighbour = basinPos.offset(direction); - BlockPos output = neighbour.down(); + BlockPos neighbour = basinPos.relative(direction); + BlockPos output = neighbour.below(); BlockState blockState = world.getBlockState(neighbour); if (FunnelBlock.isFunnel(blockState)) { @@ -220,7 +220,7 @@ public class BasinBlock extends Block implements ITE, IWrenchab .isEmpty()) { return false; } else { - TileEntity tileEntity = world.getTileEntity(output); + TileEntity tileEntity = world.getBlockEntity(output); if (tileEntity instanceof BeltTileEntity) { BeltTileEntity belt = (BeltTileEntity) tileEntity; return belt.getSpeed() == 0 || belt.getMovementFacing() != direction.getOpposite(); @@ -235,7 +235,7 @@ public class BasinBlock extends Block implements ITE, IWrenchab } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinGenerator.java index fe96055ac..5df06ac99 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinGenerator.java @@ -18,13 +18,13 @@ public class BasinGenerator extends SpecialBlockStateGen { @Override protected int getYRotation(BlockState state) { - return horizontalAngle(state.get(BasinBlock.FACING)); + return horizontalAngle(state.getValue(BasinBlock.FACING)); } @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - if (state.get(BasinBlock.FACING).getAxis().isVertical()) + if (state.getValue(BasinBlock.FACING).getAxis().isVertical()) return AssetLookup.partialBaseModel(ctx, prov); return AssetLookup.partialBaseModel(ctx, prov, "directional"); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java index 8c51a8fa8..1bf64f5ae 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java @@ -31,9 +31,9 @@ public class BasinMovementBehaviour extends MovementBehaviour { public void tick(MovementContext context) { super.tick(context); if (context.temporaryData == null || (boolean) context.temporaryData) { - Vector3d facingVec = context.rotation.apply(Vector3d.of(Direction.UP.getDirectionVec())); + Vector3d facingVec = context.rotation.apply(Vector3d.atLowerCornerOf(Direction.UP.getNormal())); facingVec.normalize(); - if (Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z) == Direction.DOWN) + if (Direction.getNearest(facingVec.x, facingVec.y, facingVec.z) == Direction.DOWN) dump(context, facingVec); } } @@ -46,8 +46,8 @@ public class BasinMovementBehaviour extends MovementBehaviour { continue; ItemEntity itemEntity = new ItemEntity(context.world, context.position.x, context.position.y, context.position.z, itemStackHandler.getStackInSlot(i)); - itemEntity.setMotion(facingVec.scale(.05)); - context.world.addEntity(itemEntity); + itemEntity.setDeltaMovement(facingVec.scale(.05)); + context.world.addFreshEntity(itemEntity); itemStackHandler.setStackInSlot(i, ItemStack.EMPTY); } context.tileData.put(key, itemStackHandler.serializeNBT()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java index a4f77ed6d..9eae5b034 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java @@ -60,8 +60,11 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { if (getSpeed() == 0) return true; if (isRunning()) - return false; - if (world == null || world.isRemote) + return true; + if (level == null || level.isClientSide) + return true; + if (!getBasin().filter(BasinTileEntity::canContinueProcessing) + .isPresent()) return true; List> recipes = getMatchingRecipes(); @@ -98,15 +101,16 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { if (!optionalBasin.isPresent()) return; BasinTileEntity basin = optionalBasin.get(); + boolean wasEmpty = basin.canContinueProcessing(); if (!BasinRecipe.apply(basin, currentRecipe)) return; Optional processedRecipeTrigger = getProcessedRecipeTrigger(); - if (world != null && !world.isRemote && processedRecipeTrigger.isPresent()) - AllTriggers.triggerForNearbyPlayers(processedRecipeTrigger.get(), world, pos, 4); + if (level != null && !level.isClientSide && processedRecipeTrigger.isPresent()) + AllTriggers.triggerForNearbyPlayers(processedRecipeTrigger.get(), level, worldPosition, 4); basin.inputTank.sendDataImmediately(); // Continue mixing - if (matchBasinRecipe(currentRecipe)) { + if (wasEmpty && matchBasinRecipe(currentRecipe)) { continueWithPreviousRecipe(); sendData(); } @@ -115,7 +119,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { } protected List> getMatchingRecipes() { - List> list = RecipeFinder.get(getRecipeCacheKey(), world, this::matchStaticFilters); + List> list = RecipeFinder.get(getRecipeCacheKey(), level, this::matchStaticFilters); return list.stream() .filter(this::matchBasinRecipe) .sorted((r1, r2) -> r2.getIngredients() @@ -128,9 +132,9 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { protected abstract void onBasinRemoved(); protected Optional getBasin() { - if (world == null) + if (level == null) return Optional.empty(); - TileEntity basinTE = world.getTileEntity(pos.down(2)); + TileEntity basinTE = level.getBlockEntity(worldPosition.below(2)); if (!(basinTE instanceof BasinTileEntity)) return Optional.empty(); return Optional.of((BasinTileEntity) basinTE); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java index 80e7a6349..a45124772 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java @@ -35,7 +35,7 @@ public class BasinRecipe extends ProcessingRecipe { if (filter == null) return false; - boolean filterTest = filter.test(recipe.getRecipeOutput()); + boolean filterTest = filter.test(recipe.getResultItem()); if (recipe instanceof BasinRecipe) { BasinRecipe basinRecipe = (BasinRecipe) recipe; if (basinRecipe.getRollableResults() @@ -66,9 +66,9 @@ public class BasinRecipe extends ProcessingRecipe { if (availableItems == null || availableFluids == null) return false; - HeatLevel heat = BasinTileEntity.getHeatLevelOf(basin.getWorld() - .getBlockState(basin.getPos() - .down(1))); + HeatLevel heat = BasinTileEntity.getHeatLevelOf(basin.getLevel() + .getBlockState(basin.getBlockPos() + .below(1))); if (isBasinRecipe && !((BasinRecipe) recipe).getRequiredHeat() .testBlazeBurner(heat)) return false; @@ -77,7 +77,7 @@ public class BasinRecipe extends ProcessingRecipe { List recipeOutputFluids = new ArrayList<>(); List ingredients = new LinkedList<>(recipe.getIngredients()); - ingredients.sort(Comparator.comparingInt(i -> i.getMatchingStacks().length)); + ingredients.sort(Comparator.comparingInt(i -> i.getItems().length)); List fluidIngredients = isBasinRecipe ? ((BasinRecipe) recipe).getFluidIngredients() : Collections.emptyList(); @@ -101,7 +101,7 @@ public class BasinRecipe extends ProcessingRecipe { continue; // Catalyst items are never consumed if (extracted.hasContainerItem() && extracted.getContainerItem() - .isItemEqual(extracted)) + .sameItem(extracted)) continue Ingredients; if (!simulate) availableItems.extractItem(slot, 1, false); @@ -155,7 +155,7 @@ public class BasinRecipe extends ProcessingRecipe { recipeOutputItems.addAll(((BasinRecipe) recipe).rollResults()); recipeOutputFluids.addAll(((BasinRecipe) recipe).getFluidResults()); } else - recipeOutputItems.add(recipe.getRecipeOutput()); + recipeOutputItems.add(recipe.getResultItem()); } if (!basin.acceptOutputs(recipeOutputItems, recipeOutputFluids, simulate)) @@ -168,7 +168,7 @@ public class BasinRecipe extends ProcessingRecipe { public static BasinRecipe convertShapeless(IRecipe recipe) { BasinRecipe basinRecipe = new ProcessingRecipeBuilder<>(BasinRecipe::new, recipe.getId()).withItemIngredients(recipe.getIngredients()) - .withSingleItemOutput(recipe.getRecipeOutput()) + .withSingleItemOutput(recipe.getResultItem()) .build(); return basinRecipe; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java index c19142761..d8249efa3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.processing; import java.util.Random; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; @@ -10,7 +11,6 @@ import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRendere import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -42,11 +42,11 @@ public class BasinRenderer extends SmartTileEntityRenderer { float fluidLevel = renderFluids(basin, partialTicks, ms, buffer, light, overlay); float level = MathHelper.clamp(fluidLevel - .3f, .125f, .6f); - ms.push(); + ms.pushPose(); - BlockPos pos = basin.getPos(); + BlockPos pos = basin.getBlockPos(); ms.translate(.5, .2f, .5); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(basin.ingredientRotation.getValue(partialTicks)); Random r = new Random(pos.hashCode()); @@ -68,51 +68,51 @@ public class BasinRenderer extends SmartTileEntityRenderer { if (stack.isEmpty()) continue; - ms.push(); + ms.pushPose(); if (fluidLevel > 0) { ms.translate(0, (MathHelper.sin( - AnimationTickHolder.getRenderTime(basin.getWorld()) / 12f + anglePartition * itemCount) + 1.5f) + AnimationTickHolder.getRenderTime(basin.getLevel()) / 12f + anglePartition * itemCount) + 1.5f) * 1 / 32f, 0); } Vector3d itemPosition = VecHelper.rotate(baseVector, anglePartition * itemCount, Axis.Y); ms.translate(itemPosition.x, itemPosition.y, itemPosition.z); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(anglePartition * itemCount + 35) .rotateX(65); for (int i = 0; i <= stack.getCount() / 8; i++) { - ms.push(); + ms.pushPose(); Vector3d vec = VecHelper.offsetRandomly(Vector3d.ZERO, r, 1 / 16f); ms.translate(vec.x, vec.y, vec.z); renderItem(ms, buffer, light, overlay, stack); - ms.pop(); + ms.popPose(); } - ms.pop(); + ms.popPose(); itemCount--; } - ms.pop(); + ms.popPose(); BlockState blockState = basin.getBlockState(); if (!(blockState.getBlock() instanceof BasinBlock)) return; - Direction direction = blockState.get(BasinBlock.FACING); + Direction direction = blockState.getValue(BasinBlock.FACING); if (direction == Direction.DOWN) return; - Vector3d directionVec = Vector3d.of(direction.getDirectionVec()); + Vector3d directionVec = Vector3d.atLowerCornerOf(direction.getNormal()); Vector3d outVec = VecHelper.getCenterOf(BlockPos.ZERO) .add(directionVec.scale(.55) .subtract(0, 1 / 2f, 0)); - boolean outToBasin = basin.getWorld() - .getBlockState(basin.getPos() - .offset(direction)) + boolean outToBasin = basin.getLevel() + .getBlockState(basin.getBlockPos() + .relative(direction)) .getBlock() instanceof BasinBlock; for (IntAttached intAttached : basin.visualizedOutputItems) { @@ -121,22 +121,22 @@ public class BasinRenderer extends SmartTileEntityRenderer { if (!outToBasin && progress > .35f) continue; - ms.push(); - MatrixStacker.of(ms) + ms.pushPose(); + MatrixTransformStack.of(ms) .translate(outVec) .translate(new Vector3d(0, Math.max(-.55f, -(progress * progress * 2)), 0)) .translate(directionVec.scale(progress * .5f)) .rotateY(AngleHelper.horizontalAngle(direction)) .rotateX(progress * 180); renderItem(ms, buffer, light, overlay, intAttached.getValue()); - ms.pop(); + ms.popPose(); } } protected void renderItem(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, ItemStack stack) { Minecraft.getInstance() .getItemRenderer() - .renderItem(stack, TransformType.GROUND, light, overlay, ms, buffer); + .renderStatic(stack, TransformType.GROUND, light, overlay, ms, buffer); } protected float renderFluids(BasinTileEntity basin, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index b15887024..e71fa7d2b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -88,6 +88,7 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor List disabledSpoutputs; Direction preferredSpoutput; protected List spoutputBuffer; + protected List spoutputFluidBuffer; public static final int OUTPUT_ANIMATION_TIME = 10; List> visualizedOutputItems; @@ -114,6 +115,7 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor disabledSpoutputs = new ArrayList<>(); preferredSpoutput = null; spoutputBuffer = new ArrayList<>(); + spoutputFluidBuffer = new ArrayList<>(); } @Override @@ -150,14 +152,16 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor preferredSpoutput = NBTHelper.readEnum(compound, "PreferredSpoutput", Direction.class); disabledSpoutputs.clear(); ListNBT disabledList = compound.getList("DisabledSpoutput", NBT.TAG_STRING); - disabledList.forEach(d -> disabledSpoutputs.add(Direction.valueOf(((StringNBT) d).getString()))); + disabledList.forEach(d -> disabledSpoutputs.add(Direction.valueOf(((StringNBT) d).getAsString()))); spoutputBuffer = NBTHelper.readItemList(compound.getList("Overflow", NBT.TAG_COMPOUND)); + spoutputFluidBuffer = NBTHelper.readCompoundList(compound.getList("FluidOverflow", NBT.TAG_COMPOUND), + FluidStack::loadFluidStackFromNBT); if (!clientPacket) return; NBTHelper.iterateCompoundList(compound.getList("VisualizedItems", NBT.TAG_COMPOUND), - c -> visualizedOutputItems.add(IntAttached.with(OUTPUT_ANIMATION_TIME, ItemStack.read(c)))); + c -> visualizedOutputItems.add(IntAttached.with(OUTPUT_ANIMATION_TIME, ItemStack.of(c)))); NBTHelper.iterateCompoundList(compound.getList("VisualizedFluids", NBT.TAG_COMPOUND), c -> visualizedOutputFluids .add(IntAttached.with(OUTPUT_ANIMATION_TIME, FluidStack.loadFluidStackFromNBT(c)))); @@ -172,9 +176,11 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (preferredSpoutput != null) NBTHelper.writeEnum(compound, "PreferredSpoutput", preferredSpoutput); ListNBT disabledList = new ListNBT(); - disabledSpoutputs.forEach(d -> disabledList.add(StringNBT.of(d.name()))); + disabledSpoutputs.forEach(d -> disabledList.add(StringNBT.valueOf(d.name()))); compound.put("DisabledSpoutput", disabledList); compound.put("Overflow", NBTHelper.writeItemList(spoutputBuffer)); + compound.put("FluidOverflow", + NBTHelper.writeCompoundList(spoutputFluidBuffer, fs -> fs.writeToNBT(new CompoundNBT()))); if (!clientPacket) return; @@ -192,11 +198,11 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor } @Override - public void remove() { + public void setRemoved() { onEmptied(); itemCapability.invalidate(); fluidCapability.invalidate(); - super.remove(); + super.setRemoved(); } @Nonnull @@ -218,10 +224,10 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor public void lazyTick() { super.lazyTick(); updateSpoutput(); - if (!world.isRemote) + if (!level.isClientSide) return; - TileEntity tileEntity = world.getTileEntity(pos.up(2)); + TileEntity tileEntity = level.getBlockEntity(worldPosition.above(2)); if (!(tileEntity instanceof MechanicalMixerTileEntity)) { setAreFluidsMoving(false); return; @@ -232,7 +238,7 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor public void onWrenched(Direction face) { BlockState blockState = getBlockState(); - Direction currentFacing = blockState.get(BasinBlock.FACING); + Direction currentFacing = blockState.getValue(BasinBlock.FACING); disabledSpoutputs.remove(face); if (currentFacing == face) { @@ -246,55 +252,55 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor } private void updateSpoutput() { - if (world.isRemote) + if (level.isClientSide) return; BlockState blockState = getBlockState(); - Direction currentFacing = blockState.get(BasinBlock.FACING); + Direction currentFacing = blockState.getValue(BasinBlock.FACING); if (currentFacing != Direction.DOWN) notifyChangeOfContents(); Direction newFacing = Direction.DOWN; for (Direction test : Iterate.horizontalDirections) { - boolean canOutputTo = BasinBlock.canOutputTo(world, pos, test); + boolean canOutputTo = BasinBlock.canOutputTo(level, worldPosition, test); if (canOutputTo && !disabledSpoutputs.contains(test)) newFacing = test; } - if (preferredSpoutput != null && BasinBlock.canOutputTo(world, pos, preferredSpoutput) + if (preferredSpoutput != null && BasinBlock.canOutputTo(level, worldPosition, preferredSpoutput) && preferredSpoutput != Direction.UP) newFacing = preferredSpoutput; if (newFacing != currentFacing) - world.setBlockState(pos, blockState.with(BasinBlock.FACING, newFacing)); + level.setBlockAndUpdate(worldPosition, blockState.setValue(BasinBlock.FACING, newFacing)); } @Override public void tick() { super.tick(); - if (world.isRemote) { + if (level.isClientSide) { createFluidParticles(); tickVisualizedOutputs(); ingredientRotationSpeed.tickChaser(); ingredientRotation.setValue(ingredientRotation.getValue() + ingredientRotationSpeed.getValue()); } - if (!spoutputBuffer.isEmpty() && !world.isRemote) + if ((!spoutputBuffer.isEmpty() || !spoutputFluidBuffer.isEmpty()) && !level.isClientSide) tryClearingSpoutputOverflow(); - if (!contentsChanged) return; + contentsChanged = false; getOperator().ifPresent(te -> te.basinChecker.scheduleUpdate()); for (Direction offset : Iterate.horizontalDirections) { - BlockPos toUpdate = pos.up() - .offset(offset); - BlockState stateToUpdate = world.getBlockState(toUpdate); + BlockPos toUpdate = worldPosition.above() + .relative(offset); + BlockState stateToUpdate = level.getBlockState(toUpdate); if (stateToUpdate.getBlock() instanceof BasinBlock - && stateToUpdate.get(BasinBlock.FACING) == offset.getOpposite()) { - TileEntity te = world.getTileEntity(toUpdate); + && stateToUpdate.getValue(BasinBlock.FACING) == offset.getOpposite()) { + TileEntity te = level.getBlockEntity(toUpdate); if (te instanceof BasinTileEntity) ((BasinTileEntity) te).contentsChanged = true; } @@ -305,33 +311,39 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof BasinBlock)) return; - Direction direction = blockState.get(BasinBlock.FACING); - TileEntity te = world.getTileEntity(pos.down() - .offset(direction)); + Direction direction = blockState.getValue(BasinBlock.FACING); + TileEntity te = level.getBlockEntity(worldPosition.below() + .relative(direction)); + FilteringBehaviour filter = null; InvManipulationBehaviour inserter = null; if (te != null) { - filter = TileEntityBehaviour.get(world, te.getPos(), FilteringBehaviour.TYPE); - inserter = TileEntityBehaviour.get(world, te.getPos(), InvManipulationBehaviour.TYPE); + filter = TileEntityBehaviour.get(level, te.getBlockPos(), FilteringBehaviour.TYPE); + inserter = TileEntityBehaviour.get(level, te.getBlockPos(), InvManipulationBehaviour.TYPE); } + IItemHandler targetInv = te == null ? null : te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite()) .orElse(inserter == null ? null : inserter.getInventory()); + + IFluidHandler targetTank = te == null ? null + : te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, direction.getOpposite()) + .orElse(null); + boolean update = false; for (Iterator iterator = spoutputBuffer.iterator(); iterator.hasNext();) { ItemStack itemStack = iterator.next(); if (direction == Direction.DOWN) { - Block.spawnAsEntity(world, pos, itemStack); + Block.popResource(level, worldPosition, itemStack); iterator.remove(); update = true; continue; } - if (targetInv == null) { - return; - } + if (targetInv == null) + break; if (!ItemHandlerHelper.insertItemStacked(targetInv, itemStack, true) .isEmpty()) continue; @@ -344,6 +356,34 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor visualizedOutputItems.add(IntAttached.withZero(itemStack)); } + for (Iterator iterator = spoutputFluidBuffer.iterator(); iterator.hasNext();) { + FluidStack fluidStack = iterator.next(); + + if (direction == Direction.DOWN) { + iterator.remove(); + update = true; + continue; + } + + if (targetTank == null) + break; + + for (boolean simulate : Iterate.trueAndFalse) { + FluidAction action = simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE; + int fill = targetTank instanceof SmartFluidTankBehaviour.InternalFluidHandler + ? ((SmartFluidTankBehaviour.InternalFluidHandler) targetTank).forceFill(fluidStack.copy(), action) + : targetTank.fill(fluidStack.copy(), action); + if (fill != fluidStack.getAmount()) + break; + if (simulate) + continue; + + update = true; + iterator.remove(); + visualizedOutputFluids.add(IntAttached.withZero(fluidStack)); + } + } + if (update) { notifyChangeOfContents(); sendData(); @@ -377,9 +417,9 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor } private Optional getOperator() { - if (world == null) + if (level == null) return Optional.empty(); - TileEntity te = world.getTileEntity(pos.up(2)); + TileEntity te = level.getBlockEntity(worldPosition.above(2)); if (te instanceof BasinOperatingTileEntity) return Optional.of((BasinOperatingTileEntity) te); return Optional.empty(); @@ -403,10 +443,14 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor @Override @OnlyIn(Dist.CLIENT) - public double getMaxRenderDistanceSquared() { + public double getViewDistance() { return 256; } + public boolean canContinueProcessing() { + return spoutputBuffer.isEmpty() && spoutputFluidBuffer.isEmpty(); + } + public boolean acceptOutputs(List outputItems, List outputFluids, boolean simulate) { outputInventory.allowInsertion(); outputTank.allowInsertion(); @@ -420,52 +464,54 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof BasinBlock)) return false; - Direction direction = blockState.get(BasinBlock.FACING); - IItemHandler targetInv = null; - IFluidHandler targetTank = null; - TileEntity te = null; + Direction direction = blockState.getValue(BasinBlock.FACING); + if (direction != Direction.DOWN) { + + TileEntity te = level.getBlockEntity(worldPosition.below() + .relative(direction)); - InvManipulationBehaviour inserter = null; - - if (direction == Direction.DOWN) { - // No output basin, gather locally - targetInv = outputInventory; - targetTank = outputTank.getCapability() - .orElse(null); - - } else { - // Output basin, try moving items to it - if (!spoutputBuffer.isEmpty()) - return false; - te = world.getTileEntity(pos.down() - .offset(direction)); - if (te == null) - return false; - - inserter = TileEntityBehaviour.get(world, te.getPos(), InvManipulationBehaviour.TYPE); - targetInv = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite()) + InvManipulationBehaviour inserter = + te == null ? null : TileEntityBehaviour.get(level, te.getBlockPos(), InvManipulationBehaviour.TYPE); + IItemHandler targetInv = te == null ? null + : te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite()) .orElse(inserter == null ? null : inserter.getInventory()); - targetTank = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, direction.getOpposite()) + IFluidHandler targetTank = te == null ? null + : te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, direction.getOpposite()) .orElse(null); + if (!outputItems.isEmpty() && targetInv == null) + return false; + if (!outputFluids.isEmpty() && targetTank == null) + return false; + + if (simulate) + return true; + for (ItemStack itemStack : outputItems) { + if (itemStack.hasContainerItem() && itemStack.getContainerItem() + .sameItem(itemStack)) + continue; + spoutputBuffer.add(itemStack.copy()); + } + for (FluidStack fluidStack : outputFluids) + spoutputFluidBuffer.add(fluidStack.copy()); + return true; } + IItemHandler targetInv = outputInventory; + IFluidHandler targetTank = outputTank.getCapability() + .orElse(null); + if (targetInv == null && !outputItems.isEmpty()) return false; - FilteringBehaviour filter = world == null || te == null ? null : TileEntityBehaviour.get(world, te.getPos(), FilteringBehaviour.TYPE); + for (ItemStack itemStack : outputItems) { // Catalyst items are never consumed if (itemStack.hasContainerItem() && itemStack.getContainerItem() - .isItemEqual(itemStack)) + .sameItem(itemStack)) continue; - - if (simulate || direction == Direction.DOWN) { - if (!ItemHandlerHelper.insertItemStacked(targetInv, itemStack.copy(), simulate) - .isEmpty() || (filter != null && !filter.test(itemStack))) - return false; - } else { - spoutputBuffer.add(itemStack.copy()); - } + if (!ItemHandlerHelper.insertItemStacked(targetInv, itemStack.copy(), simulate) + .isEmpty()) + return false; } if (outputFluids.isEmpty()) @@ -480,8 +526,6 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor : targetTank.fill(fluidStack.copy(), action); if (fill != fluidStack.getAmount()) return false; - else if (!simulate) - visualizedOutputFluids.add(IntAttached.withZero(fluidStack)); } return true; @@ -493,8 +537,8 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor } public static HeatLevel getHeatLevelOf(BlockState state) { - if (state.contains(BlazeBurnerBlock.HEAT_LEVEL)) - return state.get(BlazeBurnerBlock.HEAT_LEVEL); + if (state.hasProperty(BlazeBurnerBlock.HEAT_LEVEL)) + return state.getValue(BlazeBurnerBlock.HEAT_LEVEL); return AllTags.AllBlockTags.FAN_HEATERS.matches(state) ? HeatLevel.SMOULDERING : HeatLevel.NONE; } @@ -516,7 +560,7 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor } private void createFluidParticles() { - Random r = world.rand; + Random r = level.random; if (!visualizedOutputFluids.isEmpty()) createOutputFluidParticles(r); @@ -541,7 +585,7 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor float fluidLevel = MathHelper.clamp(totalUnits / 2000, 0, 1); float rim = 2 / 16f; float space = 12 / 16f; - float surface = pos.getY() + rim + space * fluidLevel + 1 / 32f; + float surface = worldPosition.getY() + rim + space * fluidLevel + 1 / 32f; if (areFluidsMoving) { createMovingFluidParticles(surface, segments); @@ -554,9 +598,9 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor for (TankSegment tankSegment : behaviour.getTanks()) { if (tankSegment.isEmpty(0)) continue; - float x = pos.getX() + rim + space * r.nextFloat(); - float z = pos.getZ() + rim + space * r.nextFloat(); - world.addOptionalParticle( + float x = worldPosition.getX() + rim + space * r.nextFloat(); + float z = worldPosition.getZ() + rim + space * r.nextFloat(); + level.addAlwaysVisibleParticle( new FluidParticleData(AllParticleTypes.BASIN_FLUID.get(), tankSegment.getRenderedFluid()), x, surface, z, 0, 0, 0); } @@ -567,11 +611,11 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof BasinBlock)) return; - Direction direction = blockState.get(BasinBlock.FACING); + Direction direction = blockState.getValue(BasinBlock.FACING); if (direction == Direction.DOWN) return; - Vector3d directionVec = Vector3d.of(direction.getDirectionVec()); - Vector3d outVec = VecHelper.getCenterOf(pos) + Vector3d directionVec = Vector3d.atLowerCornerOf(direction.getNormal()); + Vector3d outVec = VecHelper.getCenterOf(worldPosition) .add(directionVec.scale(.65) .subtract(0, 1 / 4f, 0)); Vector3d outMotion = directionVec.scale(1 / 16f) @@ -582,7 +626,7 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor FluidStack fluidStack = ia.getValue(); IParticleData fluidParticle = FluidFX.getFluidParticle(fluidStack); Vector3d m = VecHelper.offsetRandomly(outMotion, r, 1 / 16f); - world.addOptionalParticle(fluidParticle, outVec.x, outVec.y, outVec.z, m.x, m.y, m.z); + level.addAlwaysVisibleParticle(fluidParticle, outVec.x, outVec.y, outVec.z, m.x, m.y, m.z); }); } } @@ -590,7 +634,7 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor private void createMovingFluidParticles(float surface, int segments) { Vector3d pointer = new Vector3d(1, 0, 0).scale(1 / 16f); float interval = 360f / segments; - Vector3d centerOf = VecHelper.getCenterOf(pos); + Vector3d centerOf = VecHelper.getCenterOf(worldPosition); float intervalOffset = (AnimationTickHolder.getTicks() * 18) % 360; int currentSegment = 0; @@ -602,9 +646,9 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor continue; float angle = interval * (1 + currentSegment) + intervalOffset; Vector3d vec = centerOf.add(VecHelper.rotate(pointer, angle, Axis.Y)); - world.addOptionalParticle( + level.addAlwaysVisibleParticle( new FluidParticleData(AllParticleTypes.BASIN_FLUID.get(), tankSegment.getRenderedFluid()), - vec.getX(), surface, vec.getZ(), 1, 0, 0); + vec.x(), surface, vec.z(), 1, 0, 0); currentSegment++; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java b/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java index 8545a81d1..cddadc1cf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java @@ -27,7 +27,7 @@ public class EmptyingByBasin { if (stack.getItem() instanceof PotionItem) return true; - wrapper.setInventorySlotContents(0, stack); + wrapper.setItem(0, stack); if (AllRecipeTypes.EMPTYING.find(wrapper, world) .isPresent()) return true; @@ -52,7 +52,7 @@ public class EmptyingByBasin { if (stack.getItem() instanceof PotionItem) return PotionFluidHandler.emptyPotion(stack, simulate); - wrapper.setInventorySlotContents(0, stack); + wrapper.setItem(0, stack); Optional> recipe = AllRecipeTypes.EMPTYING.find(wrapper, world); if (recipe.isPresent()) { EmptyingRecipe emptyingRecipe = (EmptyingRecipe) recipe.get(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingRecipe.java index fbed9d886..8c7cebfab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingRecipe.java @@ -15,7 +15,7 @@ public class EmptyingRecipe extends ProcessingRecipe { @Override public boolean matches(RecipeWrapper inv, World p_77569_2_) { - return ingredients.get(0).test(inv.getStackInSlot(0)); + return ingredients.get(0).test(inv.getItem(0)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java b/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java index b433755f1..5f97cb6c1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java @@ -57,11 +57,11 @@ public class InWorldProcessing { public static Type byBlock(IBlockReader reader, BlockPos pos) { BlockState blockState = reader.getBlockState(pos); FluidState fluidState = reader.getFluidState(pos); - if (fluidState.getFluid() == Fluids.WATER || fluidState.getFluid() == Fluids.FLOWING_WATER) + if (fluidState.getType() == Fluids.WATER || fluidState.getType() == Fluids.FLOWING_WATER) return Type.SPLASHING; Block block = blockState.getBlock(); if (block == Blocks.FIRE || AllBlocks.LIT_BLAZE_BURNER.has(blockState) - || (BlockTags.CAMPFIRES.contains(block) && blockState.method_28500(CampfireBlock.LIT).orElse(false)) + || (BlockTags.CAMPFIRES.contains(block) && blockState.getOptionalValue(CampfireBlock.LIT).orElse(false)) || getHeatLevelOf(blockState) == BlazeBurnerBlock.HeatLevel.SMOULDERING) return Type.SMOKING; if (block == Blocks.LAVA || getHeatLevelOf(blockState).isAtLeast(BlazeBurnerBlock.HeatLevel.FADING)) @@ -79,7 +79,7 @@ public class InWorldProcessing { CompoundNBT processing = compound.getCompound("Processing"); if (Type.valueOf(processing.getString("Type")) != type) { - boolean canProcess = canProcess(entity.getItem(), type, entity.world); + boolean canProcess = canProcess(entity.getItem(), type, entity.level); processing.putString("Type", type.name()); if (!canProcess) processing.putInt("Time", -1); @@ -90,32 +90,32 @@ public class InWorldProcessing { return false; } } - return canProcess(entity.getItem(), type, entity.world); + return canProcess(entity.getItem(), type, entity.level); } private static boolean canProcess(ItemStack stack, Type type, World world) { if (type == Type.BLASTING) { - WRAPPER.setInventorySlotContents(0, stack); + WRAPPER.setItem(0, stack); Optional smeltingRecipe = world.getRecipeManager() - .getRecipe(IRecipeType.SMELTING, WRAPPER, world); + .getRecipeFor(IRecipeType.SMELTING, WRAPPER, world); if (smeltingRecipe.isPresent()) return true; - WRAPPER.setInventorySlotContents(0, stack); + WRAPPER.setItem(0, stack); Optional blastingRecipe = world.getRecipeManager() - .getRecipe(IRecipeType.BLASTING, WRAPPER, world); + .getRecipeFor(IRecipeType.BLASTING, WRAPPER, world); if (blastingRecipe.isPresent()) return true; - return !stack.getItem().isFireproof(); + return !stack.getItem().isFireResistant(); } if (type == Type.SMOKING) { - WRAPPER.setInventorySlotContents(0, stack); + WRAPPER.setItem(0, stack); Optional recipe = world.getRecipeManager() - .getRecipe(IRecipeType.SMOKING, WRAPPER, world); + .getRecipeFor(IRecipeType.SMOKING, WRAPPER, world); return recipe.isPresent(); } @@ -126,7 +126,7 @@ public class InWorldProcessing { } public static boolean isWashable(ItemStack stack, World world) { - SPLASHING_WRAPPER.setInventorySlotContents(0, stack); + SPLASHING_WRAPPER.setItem(0, stack); Optional recipe = AllRecipeTypes.SPLASHING.find(SPLASHING_WRAPPER, world); return recipe.isPresent(); } @@ -134,7 +134,7 @@ public class InWorldProcessing { public static void applyProcessing(ItemEntity entity, Type type) { if (decrementProcessingTime(entity, type) != 0) return; - List stacks = process(entity.getItem(), type, entity.world); + List stacks = process(entity.getItem(), type, entity.level); if (stacks == null) return; if (stacks.isEmpty()) { @@ -143,9 +143,9 @@ public class InWorldProcessing { } entity.setItem(stacks.remove(0)); for (ItemStack additional : stacks) { - ItemEntity entityIn = new ItemEntity(entity.world, entity.getX(), entity.getY(), entity.getZ(), additional); - entityIn.setMotion(entity.getMotion()); - entity.world.addEntity(entityIn); + ItemEntity entityIn = new ItemEntity(entity.level, entity.getX(), entity.getY(), entity.getZ(), additional); + entityIn.setDeltaMovement(entity.getDeltaMovement()); + entity.level.addFreshEntity(entityIn); } } @@ -181,29 +181,29 @@ public class InWorldProcessing { private static List process(ItemStack stack, Type type, World world) { if (type == Type.SPLASHING) { - SPLASHING_WRAPPER.setInventorySlotContents(0, stack); + SPLASHING_WRAPPER.setItem(0, stack); Optional recipe = AllRecipeTypes.SPLASHING.find(SPLASHING_WRAPPER, world); if (recipe.isPresent()) return applyRecipeOn(stack, recipe.get()); return null; } - WRAPPER.setInventorySlotContents(0, stack); + WRAPPER.setItem(0, stack); Optional smokingRecipe = world.getRecipeManager() - .getRecipe(IRecipeType.SMOKING, WRAPPER, world); + .getRecipeFor(IRecipeType.SMOKING, WRAPPER, world); if (type == Type.BLASTING) { if (!smokingRecipe.isPresent()) { - WRAPPER.setInventorySlotContents(0, stack); + WRAPPER.setItem(0, stack); Optional smeltingRecipe = world.getRecipeManager() - .getRecipe(IRecipeType.SMELTING, WRAPPER, world); + .getRecipeFor(IRecipeType.SMELTING, WRAPPER, world); if (smeltingRecipe.isPresent()) return applyRecipeOn(stack, smeltingRecipe.get()); - WRAPPER.setInventorySlotContents(0, stack); + WRAPPER.setItem(0, stack); Optional blastingRecipe = world.getRecipeManager() - .getRecipe(IRecipeType.BLASTING, WRAPPER, world); + .getRecipeFor(IRecipeType.BLASTING, WRAPPER, world); if (blastingRecipe.isPresent()) return applyRecipeOn(stack, blastingRecipe.get()); @@ -253,9 +253,9 @@ public class InWorldProcessing { } entity.setItem(stacks.remove(0)); for (ItemStack additional : stacks) { - ItemEntity entityIn = new ItemEntity(entity.world, entity.getX(), entity.getY(), entity.getZ(), additional); - entityIn.setMotion(entity.getMotion()); - entity.world.addEntity(entityIn); + ItemEntity entityIn = new ItemEntity(entity.level, entity.getX(), entity.getY(), entity.getZ(), additional); + entityIn.setDeltaMovement(entity.getDeltaMovement()); + entity.level.addFreshEntity(entityIn); } } @@ -285,7 +285,7 @@ public class InWorldProcessing { } } } else { - ItemStack out = recipe.getRecipeOutput() + ItemStack out = recipe.getResultItem() .copy(); stacks = ItemHelper.multipliedOutput(stackIn, out); } @@ -294,9 +294,9 @@ public class InWorldProcessing { } public static void spawnParticlesForProcessing(@Nullable World world, Vector3d vec, Type type) { - if (world == null || !world.isRemote) + if (world == null || !world.isClientSide) return; - if (world.rand.nextInt(8) != 0) + if (world.random.nextInt(8) != 0) return; switch (type) { @@ -309,10 +309,10 @@ public class InWorldProcessing { case SPLASHING: Vector3d color = ColorHelper.getRGB(0x0055FF); world.addParticle(new RedstoneParticleData((float) color.x, (float) color.y, (float) color.z, 1), - vec.x + (world.rand.nextFloat() - .5f) * .5f, vec.y + .5f, vec.z + (world.rand.nextFloat() - .5f) * .5f, + vec.x + (world.random.nextFloat() - .5f) * .5f, vec.y + .5f, vec.z + (world.random.nextFloat() - .5f) * .5f, 0, 1 / 8f, 0); - world.addParticle(ParticleTypes.SPIT, vec.x + (world.rand.nextFloat() - .5f) * .5f, vec.y + .5f, - vec.z + (world.rand.nextFloat() - .5f) * .5f, 0, 1 / 8f, 0); + world.addParticle(ParticleTypes.SPIT, vec.x + (world.random.nextFloat() - .5f) * .5f, vec.y + .5f, + vec.z + (world.random.nextFloat() - .5f) * .5f, 0, 1 / 8f, 0); break; default: break; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingInventory.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingInventory.java index d6bb73d3b..21fb2f34c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingInventory.java @@ -14,7 +14,7 @@ public class ProcessingInventory extends ItemStackHandler { private boolean limit; public ProcessingInventory(Consumer callback) { - super(10); + super(16); this.callback = callback; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java index 8303e0686..c83f362e8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java @@ -79,16 +79,16 @@ public class ProcessingOutput { throw new JsonSyntaxException("ProcessingOutput must be a json object"); JsonObject json = je.getAsJsonObject(); - String itemId = JSONUtils.getString(json, "item"); - int count = JSONUtils.getInt(json, "count", 1); - float chance = JSONUtils.hasField(json, "chance") ? JSONUtils.getFloat(json, "chance") : 1; + String itemId = JSONUtils.getAsString(json, "item"); + int count = JSONUtils.getAsInt(json, "count", 1); + float chance = JSONUtils.isValidNode(json, "chance") ? JSONUtils.getAsFloat(json, "chance") : 1; ItemStack itemstack = new ItemStack(ForgeRegistries.ITEMS.getValue(new ResourceLocation(itemId)), count); - if (JSONUtils.hasField(json, "nbt")) { + if (JSONUtils.isValidNode(json, "nbt")) { try { JsonElement element = json.get("nbt"); - itemstack.setTag(JsonToNBT.getTagFromJson( - element.isJsonObject() ? Create.GSON.toJson(element) : JSONUtils.getString(element, "nbt"))); + itemstack.setTag(JsonToNBT.parseTag( + element.isJsonObject() ? Create.GSON.toJson(element) : JSONUtils.convertToString(element, "nbt"))); } catch (CommandSyntaxException e) { e.printStackTrace(); } @@ -98,12 +98,12 @@ public class ProcessingOutput { } public void write(PacketBuffer buf) { - buf.writeItemStack(getStack()); + buf.writeItem(getStack()); buf.writeFloat(getChance()); } public static ProcessingOutput read(PacketBuffer buf) { - return new ProcessingOutput(buf.readItemStack(), buf.readFloat()); + return new ProcessingOutput(buf.readItem(), buf.readFloat()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java index e3b90a337..b5eb01f6f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.processing; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -11,11 +10,10 @@ import javax.annotation.ParametersAreNonnullByDefault; import org.apache.logging.log4j.Logger; import com.google.gson.JsonObject; -import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; import com.simibubi.create.foundation.fluid.FluidIngredient; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; import mcp.MethodsReturnNonnullByDefault; import net.minecraft.inventory.IInventory; @@ -43,24 +41,23 @@ public abstract class ProcessingRecipe implements IRecipe< private IRecipeType type; private IRecipeSerializer serializer; - private AllRecipeTypes enumType; - private Optional> forcedResult; + private IRecipeTypeInfo typeInfo; + private Supplier forcedResult; - public ProcessingRecipe(AllRecipeTypes recipeType, ProcessingRecipeParams params) { - - this.forcedResult = Optional.empty(); - this.enumType = recipeType; + public ProcessingRecipe(IRecipeTypeInfo typeInfo, ProcessingRecipeParams params) { + this.forcedResult = null; + this.typeInfo = typeInfo; this.processingDuration = params.processingDuration; this.fluidIngredients = params.fluidIngredients; this.fluidResults = params.fluidResults; - this.serializer = recipeType.serializer; + this.serializer = typeInfo.getSerializer(); this.requiredHeat = params.requiredHeat; this.ingredients = params.ingredients; - this.type = recipeType.type; + this.type = typeInfo.getType(); this.results = params.results; this.id = params.id; - validate(Lang.asId(recipeType.name())); + validate(typeInfo.getId()); } // Recipe type options: @@ -87,8 +84,8 @@ public abstract class ProcessingRecipe implements IRecipe< // - private void validate(String recipeTypeName) { - String messageHeader = "Your custom " + recipeTypeName + " recipe (" + id.toString() + ")"; + private void validate(ResourceLocation recipeTypeId) { + String messageHeader = "Your custom " + recipeTypeId + " recipe (" + id.toString() + ")"; Logger logger = Create.LOGGER; int ingredientCount = ingredients.size(); int outputCount = results.size(); @@ -144,7 +141,7 @@ public abstract class ProcessingRecipe implements IRecipe< } public void enforceNextResult(Supplier stack) { - forcedResult = Optional.of(stack); + forcedResult = stack; } public List rollResults() { @@ -152,8 +149,7 @@ public abstract class ProcessingRecipe implements IRecipe< NonNullList rollableResults = getRollableResults(); for (int i = 0; i < rollableResults.size(); i++) { ProcessingOutput output = rollableResults.get(i); - ItemStack stack = i == 0 && forcedResult.isPresent() ? forcedResult.get() - .get() : output.rollOutput(); + ItemStack stack = i == 0 && forcedResult != null ? forcedResult.get() : output.rollOutput(); if (!stack.isEmpty()) results.add(stack); } @@ -171,48 +167,52 @@ public abstract class ProcessingRecipe implements IRecipe< // IRecipe<> paperwork @Override - public ItemStack getCraftingResult(T inv) { - return getRecipeOutput(); + public ItemStack assemble(T inv) { + return getResultItem(); } @Override - public boolean canFit(int width, int height) { + public boolean canCraftInDimensions(int width, int height) { return true; } @Override - public ItemStack getRecipeOutput() { + public ItemStack getResultItem() { return getRollableResults().isEmpty() ? ItemStack.EMPTY : getRollableResults().get(0) .getStack(); } @Override - public ResourceLocation getId() { - return id; - } - - @Override - public boolean isDynamic() { + public boolean isSpecial() { return true; } - @Override - public IRecipeSerializer getSerializer() { - return serializer; - } - // Processing recipes do not show up in the recipe book @Override public String getGroup() { return "processing"; } + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public IRecipeSerializer getSerializer() { + return serializer; + } + @Override public IRecipeType getType() { return type; } + public IRecipeTypeInfo getTypeInfo() { + return typeInfo; + } + // Additional Data added by subtypes public void readAdditional(JsonObject json) {} @@ -223,8 +223,4 @@ public abstract class ProcessingRecipe implements IRecipe< public void writeAdditional(PacketBuffer buffer) {} - public AllRecipeTypes getEnumType() { - return enumType; - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java index be0045bae..19c839295 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java @@ -6,12 +6,10 @@ import java.util.function.Consumer; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.Create; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.FluidIngredient; -import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; import net.minecraft.data.IFinishedRecipe; import net.minecraft.fluid.Fluid; @@ -42,7 +40,7 @@ public class ProcessingRecipeBuilder> { } public ProcessingRecipeBuilder withItemIngredients(Ingredient... ingredients) { - return withItemIngredients(NonNullList.from(Ingredient.EMPTY, ingredients)); + return withItemIngredients(NonNullList.of(Ingredient.EMPTY, ingredients)); } public ProcessingRecipeBuilder withItemIngredients(NonNullList ingredients) { @@ -55,7 +53,7 @@ public class ProcessingRecipeBuilder> { } public ProcessingRecipeBuilder withItemOutputs(ProcessingOutput... outputs) { - return withItemOutputs(NonNullList.from(ProcessingOutput.EMPTY, outputs)); + return withItemOutputs(NonNullList.of(ProcessingOutput.EMPTY, outputs)); } public ProcessingRecipeBuilder withItemOutputs(NonNullList outputs) { @@ -64,7 +62,7 @@ public class ProcessingRecipeBuilder> { } public ProcessingRecipeBuilder withFluidIngredients(FluidIngredient... ingredients) { - return withFluidIngredients(NonNullList.from(FluidIngredient.EMPTY, ingredients)); + return withFluidIngredients(NonNullList.of(FluidIngredient.EMPTY, ingredients)); } public ProcessingRecipeBuilder withFluidIngredients(NonNullList ingredients) { @@ -73,7 +71,7 @@ public class ProcessingRecipeBuilder> { } public ProcessingRecipeBuilder withFluidOutputs(FluidStack... outputs) { - return withFluidOutputs(NonNullList.from(FluidStack.EMPTY, outputs)); + return withFluidOutputs(NonNullList.of(FluidStack.EMPTY, outputs)); } public ProcessingRecipeBuilder withFluidOutputs(NonNullList outputs) { @@ -106,11 +104,11 @@ public class ProcessingRecipeBuilder> { // Datagen shortcuts public ProcessingRecipeBuilder require(ITag.INamedTag tag) { - return require(Ingredient.fromTag(tag)); + return require(Ingredient.of(tag)); } public ProcessingRecipeBuilder require(IItemProvider item) { - return require(Ingredient.fromItems(item)); + return require(Ingredient.of(item)); } public ProcessingRecipeBuilder require(Ingredient ingredient) { @@ -193,15 +191,15 @@ public class ProcessingRecipeBuilder> { public static class ProcessingRecipeParams { - ResourceLocation id; - NonNullList ingredients; - NonNullList results; - NonNullList fluidIngredients; - NonNullList fluidResults; - int processingDuration; - HeatCondition requiredHeat; + protected ResourceLocation id; + protected NonNullList ingredients; + protected NonNullList results; + protected NonNullList fluidIngredients; + protected NonNullList fluidResults; + protected int processingDuration; + protected HeatCondition requiredHeat; - ProcessingRecipeParams(ResourceLocation id) { + protected ProcessingRecipeParams(ResourceLocation id) { this.id = id; ingredients = NonNullList.create(); results = NonNullList.create(); @@ -222,21 +220,21 @@ public class ProcessingRecipeBuilder> { @SuppressWarnings("unchecked") public DataGenResult(S recipe, List recipeConditions) { - this.recipeConditions = recipeConditions; - AllRecipeTypes recipeType = recipe.getEnumType(); - String typeName = Lang.asId(recipeType.name()); this.recipe = recipe; + this.recipeConditions = recipeConditions; + IRecipeTypeInfo recipeType = this.recipe.getTypeInfo(); + ResourceLocation typeId = recipeType.getId(); - if (!(recipeType.serializer instanceof ProcessingRecipeSerializer)) - throw new IllegalStateException("Cannot datagen ProcessingRecipe of type: " + typeName); + if (!(recipeType.getSerializer() instanceof ProcessingRecipeSerializer)) + throw new IllegalStateException("Cannot datagen ProcessingRecipe of type: " + typeId); - this.id = Create.asResource(typeName + "/" + recipe.getId() - .getPath()); + this.id = new ResourceLocation(recipe.getId().getNamespace(), + typeId.getPath() + "/" + recipe.getId().getPath()); this.serializer = (ProcessingRecipeSerializer) recipe.getSerializer(); } @Override - public void serialize(JsonObject json) { + public void serializeRecipeData(JsonObject json) { serializer.write(json, recipe); if (recipeConditions.isEmpty()) return; @@ -247,22 +245,22 @@ public class ProcessingRecipeBuilder> { } @Override - public ResourceLocation getID() { + public ResourceLocation getId() { return id; } @Override - public IRecipeSerializer getSerializer() { + public IRecipeSerializer getType() { return serializer; } @Override - public JsonObject getAdvancementJson() { + public JsonObject serializeAdvancement() { return null; } @Override - public ResourceLocation getAdvancementID() { + public ResourceLocation getAdvancementId() { return null; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeSerializer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeSerializer.java index 031a7f973..9d83395c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeSerializer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeSerializer.java @@ -35,7 +35,7 @@ public class ProcessingRecipeSerializer> extends F JsonArray jsonOutputs = new JsonArray(); recipe.getIngredients() - .forEach(i -> jsonIngredients.add(i.serialize())); + .forEach(i -> jsonIngredients.add(i.toJson())); recipe.getFluidIngredients() .forEach(i -> jsonIngredients.add(i.serialize())); @@ -65,16 +65,16 @@ public class ProcessingRecipeSerializer> extends F NonNullList results = NonNullList.create(); NonNullList fluidResults = NonNullList.create(); - for (JsonElement je : JSONUtils.getJsonArray(json, "ingredients")) { + for (JsonElement je : JSONUtils.getAsJsonArray(json, "ingredients")) { if (FluidIngredient.isFluidIngredient(je)) fluidIngredients.add(FluidIngredient.deserialize(je)); else - ingredients.add(Ingredient.deserialize(je)); + ingredients.add(Ingredient.fromJson(je)); } - for (JsonElement je : JSONUtils.getJsonArray(json, "results")) { + for (JsonElement je : JSONUtils.getAsJsonArray(json, "results")) { JsonObject jsonObject = je.getAsJsonObject(); - if (JSONUtils.hasField(jsonObject, "fluid")) + if (JSONUtils.isValidNode(jsonObject, "fluid")) fluidResults.add(FluidHelper.deserializeFluidStack(jsonObject)); else results.add(ProcessingOutput.deserialize(je)); @@ -85,10 +85,10 @@ public class ProcessingRecipeSerializer> extends F .withFluidIngredients(fluidIngredients) .withFluidOutputs(fluidResults); - if (JSONUtils.hasField(json, "processingTime")) - builder.duration(JSONUtils.getInt(json, "processingTime")); - if (JSONUtils.hasField(json, "heatRequirement")) - builder.requiresHeat(HeatCondition.deserialize(JSONUtils.getString(json, "heatRequirement"))); + if (JSONUtils.isValidNode(json, "processingTime")) + builder.duration(JSONUtils.getAsInt(json, "processingTime")); + if (JSONUtils.isValidNode(json, "heatRequirement")) + builder.requiresHeat(HeatCondition.deserialize(JSONUtils.getAsString(json, "heatRequirement"))); return builder.build(); } @@ -100,7 +100,7 @@ public class ProcessingRecipeSerializer> extends F NonNullList fluidOutputs = recipe.getFluidResults(); buffer.writeVarInt(ingredients.size()); - ingredients.forEach(i -> i.write(buffer)); + ingredients.forEach(i -> i.toNetwork(buffer)); buffer.writeVarInt(fluidIngredients.size()); fluidIngredients.forEach(i -> i.write(buffer)); @@ -122,7 +122,7 @@ public class ProcessingRecipeSerializer> extends F int size = buffer.readVarInt(); for (int i = 0; i < size; i++) - ingredients.add(Ingredient.read(buffer)); + ingredients.add(Ingredient.fromNetwork(buffer)); size = buffer.readVarInt(); for (int i = 0; i < size; i++) @@ -150,17 +150,17 @@ public class ProcessingRecipeSerializer> extends F } @Override - public final T read(ResourceLocation id, JsonObject json) { + public final T fromJson(ResourceLocation id, JsonObject json) { return readFromJson(id, json); } @Override - public final void write(PacketBuffer buffer, T recipe) { + public final void toNetwork(PacketBuffer buffer, T recipe) { writeToBuffer(buffer, recipe); } @Override - public final T read(ResourceLocation id, PacketBuffer buffer) { + public final T fromNetwork(ResourceLocation id, PacketBuffer buffer) { return readFromBuffer(id, buffer); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java index 527441ceb..077da0232 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java @@ -32,7 +32,6 @@ import net.minecraft.loot.conditions.ILootCondition.IBuilder; import net.minecraft.loot.conditions.SurvivesExplosion; import net.minecraft.pathfinding.PathType; import net.minecraft.state.EnumProperty; -import net.minecraft.state.Property; import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResult; @@ -58,24 +57,24 @@ import net.minecraftforge.common.util.FakePlayer; @ParametersAreNonnullByDefault public class BlazeBurnerBlock extends Block implements ITE { - public static final Property HEAT_LEVEL = EnumProperty.create("blaze", HeatLevel.class); + public static final EnumProperty HEAT_LEVEL = EnumProperty.create("blaze", HeatLevel.class); public BlazeBurnerBlock(Properties properties) { super(properties); - setDefaultState(super.getDefaultState().with(HEAT_LEVEL, HeatLevel.NONE)); + registerDefaultState(defaultBlockState().setValue(HEAT_LEVEL, HeatLevel.NONE)); } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder); builder.add(HEAT_LEVEL); } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState p_220082_4_, boolean p_220082_5_) { - if (world.isRemote) + public void onPlace(BlockState state, World world, BlockPos pos, BlockState p_220082_4_, boolean p_220082_5_) { + if (world.isClientSide) return; - TileEntity tileEntity = world.getTileEntity(pos.up()); + TileEntity tileEntity = world.getBlockEntity(pos.above()); if (!(tileEntity instanceof BasinTileEntity)) return; BasinTileEntity basin = (BasinTileEntity) tileEntity; @@ -84,14 +83,14 @@ public class BlazeBurnerBlock extends Block implements ITE p_149666_2_) { - p_149666_2_.add(AllItems.EMPTY_BLAZE_BURNER.asStack()); - super.fillItemGroup(p_149666_1_, p_149666_2_); + public void fillItemCategory(ItemGroup group, NonNullList list) { + list.add(AllItems.EMPTY_BLAZE_BURNER.asStack()); + super.fillItemCategory(group, list); } @Nullable @@ -106,73 +105,79 @@ public class BlazeBurnerBlock extends Block implements ITE p.sendBreakAnimation(hand)); - world.setBlockState(pos, AllBlocks.LIT_BLAZE_BURNER.getDefaultState()); + heldItem.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(hand)); + world.setBlockAndUpdate(pos, AllBlocks.LIT_BLAZE_BURNER.getDefaultState()); return ActionResultType.SUCCESS; } return ActionResultType.PASS; } - ActionResult res = tryInsert(state, world, pos, dontConsume ? heldItem.copy() : heldItem, forceOverflow, false); - ItemStack leftover = res.getResult(); - if (!world.isRemote && !dontConsume && !leftover.isEmpty()) { + boolean doNotConsume = player.isCreative(); + boolean forceOverflow = !(player instanceof FakePlayer); + + ActionResult res = tryInsert(state, world, pos, heldItem, doNotConsume, forceOverflow, false); + ItemStack leftover = res.getObject(); + if (!world.isClientSide && !doNotConsume && !leftover.isEmpty()) { if (heldItem.isEmpty()) { - player.setHeldItem(hand, leftover); - } else if (!player.inventory.addItemStackToInventory(leftover)) { - player.dropItem(leftover, false); + player.setItemInHand(hand, leftover); + } else if (!player.inventory.add(leftover)) { + player.drop(leftover, false); } } - return res.getType() == ActionResultType.SUCCESS ? res.getType() : ActionResultType.PASS; + return res.getResult() == ActionResultType.SUCCESS ? ActionResultType.SUCCESS : ActionResultType.PASS; } - public static ActionResult tryInsert(BlockState state, World world, BlockPos pos, ItemStack stack, boolean forceOverflow, - boolean simulate) { + public static ActionResult tryInsert(BlockState state, World world, BlockPos pos, ItemStack stack, boolean doNotConsume, + boolean forceOverflow, boolean simulate) { if (!state.hasTileEntity()) return ActionResult.fail(ItemStack.EMPTY); - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (!(te instanceof BlazeBurnerTileEntity)) return ActionResult.fail(ItemStack.EMPTY); BlazeBurnerTileEntity burnerTE = (BlazeBurnerTileEntity) te; + if (burnerTE.isCreativeFuel(stack)) { + if (!simulate) + burnerTE.applyCreativeFuel(); + return ActionResult.success(ItemStack.EMPTY); + } if (!burnerTE.tryUpdateFuel(stack, forceOverflow, simulate)) return ActionResult.fail(ItemStack.EMPTY); - - ItemStack container = stack.getContainerItem(); - if (!simulate && !world.isRemote) { - world.playSound(null, pos, SoundEvents.ENTITY_BLAZE_SHOOT, SoundCategory.BLOCKS, - .125f + world.rand.nextFloat() * .125f, .75f - world.rand.nextFloat() * .25f); - stack.shrink(1); - } - if (!container.isEmpty()) { - return ActionResult.success(container); + + if (!doNotConsume) { + ItemStack container = stack.getContainerItem(); + if (!world.isClientSide && !simulate) { + stack.shrink(1); + } + if (!container.isEmpty()) { + return ActionResult.success(container); + } } return ActionResult.success(ItemStack.EMPTY); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - ItemStack stack = context.getItem(); + ItemStack stack = context.getItemInHand(); Item item = stack.getItem(); - BlockState defaultState = getDefaultState(); + BlockState defaultState = defaultBlockState(); if (!(item instanceof BlazeBurnerBlockItem)) return defaultState; HeatLevel initialHeat = ((BlazeBurnerBlockItem) item).hasCapturedBlaze() ? HeatLevel.SMOULDERING : HeatLevel.NONE; - return defaultState.with(HEAT_LEVEL, initialHeat); + return defaultState.setValue(HEAT_LEVEL, initialHeat); } @Override @@ -183,83 +188,86 @@ public class BlazeBurnerBlock extends Block implements ITE= heatLevel.ordinal(); } + + @Override + public String getSerializedName() { + return Lang.asId(name()); + } } - - @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { - return false; - } - + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java index ee8b13bb2..8e033b5b5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java @@ -49,12 +49,12 @@ public class BlazeBurnerBlockItem extends BlockItem { public static BlazeBurnerBlockItem withBlaze(Block block, Properties properties) { return new BlazeBurnerBlockItem(block, properties, true); } - + @Override - public void addToBlockToItemMap(Map p_195946_1_, Item p_195946_2_) { + public void registerBlocks(Map p_195946_1_, Item p_195946_2_) { if (!hasCapturedBlaze()) return; - super.addToBlockToItemMap(p_195946_1_, p_195946_2_); + super.registerBlocks(p_195946_1_, p_195946_2_); } private BlazeBurnerBlockItem(Block block, Properties properties, boolean capturedBlaze) { @@ -63,31 +63,31 @@ public class BlazeBurnerBlockItem extends BlockItem { } @Override - public void fillItemGroup(ItemGroup p_150895_1_, NonNullList p_150895_2_) { + public void fillItemCategory(ItemGroup p_150895_1_, NonNullList p_150895_2_) { if (!hasCapturedBlaze()) return; - super.fillItemGroup(p_150895_1_, p_150895_2_); + super.fillItemCategory(p_150895_1_, p_150895_2_); } @Override - public String getTranslationKey() { - return hasCapturedBlaze() ? super.getTranslationKey() : "item.create." + getRegistryName().getPath(); + public String getDescriptionId() { + return hasCapturedBlaze() ? super.getDescriptionId() : "item.create." + getRegistryName().getPath(); } @Override - public ActionResultType onItemUse(ItemUseContext context) { + public ActionResultType useOn(ItemUseContext context) { if (hasCapturedBlaze()) - return super.onItemUse(context); + return super.useOn(context); - World world = context.getWorld(); - BlockPos pos = context.getPos(); - TileEntity te = world.getTileEntity(pos); + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); + TileEntity te = world.getBlockEntity(pos); PlayerEntity player = context.getPlayer(); if (!(te instanceof MobSpawnerTileEntity)) - return super.onItemUse(context); + return super.useOn(context); - AbstractSpawner spawner = ((MobSpawnerTileEntity) te).getSpawnerBaseLogic(); + AbstractSpawner spawner = ((MobSpawnerTileEntity) te).getSpawner(); List possibleSpawns = ObfuscationReflectionHelper.getPrivateValue(AbstractSpawner.class, spawner, "field_98285_e"); if (possibleSpawns.isEmpty()) { @@ -98,32 +98,32 @@ public class BlazeBurnerBlockItem extends BlockItem { ResourceLocation blazeId = EntityType.BLAZE.getRegistryName(); for (WeightedSpawnerEntity e : possibleSpawns) { - ResourceLocation spawnerEntityId = new ResourceLocation(e.getNbt() + ResourceLocation spawnerEntityId = new ResourceLocation(e.getTag() .getString("id")); if (!spawnerEntityId.equals(blazeId)) continue; spawnCaptureEffects(world, VecHelper.getCenterOf(pos)); - if (world.isRemote || player == null) + if (world.isClientSide || player == null) return ActionResultType.SUCCESS; - giveBurnerItemTo(player, context.getItem(), context.getHand()); + giveBurnerItemTo(player, context.getItemInHand(), context.getHand()); return ActionResultType.SUCCESS; } - return super.onItemUse(context); + return super.useOn(context); } @Override - public ActionResultType itemInteractionForEntity(ItemStack heldItem, PlayerEntity player, LivingEntity entity, Hand hand) { + public ActionResultType interactLivingEntity(ItemStack heldItem, PlayerEntity player, LivingEntity entity, Hand hand) { if (hasCapturedBlaze()) return ActionResultType.PASS; if (!(entity instanceof BlazeEntity)) return ActionResultType.PASS; - World world = player.world; - spawnCaptureEffects(world, entity.getPositionVec()); - if (world.isRemote) + World world = player.level; + spawnCaptureEffects(world, entity.position()); + if (world.isClientSide) return ActionResultType.FAIL; giveBurnerItemTo(player, heldItem, hand); @@ -136,18 +136,18 @@ public class BlazeBurnerBlockItem extends BlockItem { if (!player.isCreative()) heldItem.shrink(1); if (heldItem.isEmpty()) { - player.setHeldItem(hand, filled); + player.setItemInHand(hand, filled); return; } - player.inventory.placeItemBackInInventory(player.world, filled); + player.inventory.placeItemBackInInventory(player.level, filled); } private void spawnCaptureEffects(World world, Vector3d vec) { - if (world.isRemote) { + if (world.isClientSide) { for (int i = 0; i < 40; i++) { - Vector3d motion = VecHelper.offsetRandomly(Vector3d.ZERO, world.rand, .125f); + Vector3d motion = VecHelper.offsetRandomly(Vector3d.ZERO, world.random, .125f); world.addParticle(ParticleTypes.FLAME, vec.x, vec.y, vec.z, motion.x, motion.y, motion.z); - Vector3d circle = motion.mul(1, 0, 1) + Vector3d circle = motion.multiply(1, 0, 1) .normalize() .scale(.5f); world.addParticle(ParticleTypes.SMOKE, circle.x, vec.y, circle.z, 0, -0.125, 0); @@ -156,8 +156,8 @@ public class BlazeBurnerBlockItem extends BlockItem { } BlockPos soundPos = new BlockPos(vec); - world.playSound(null, soundPos, SoundEvents.ENTITY_BLAZE_HURT, SoundCategory.HOSTILE, .25f, .75f); - world.playSound(null, soundPos, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.HOSTILE, .5f, .75f); + world.playSound(null, soundPos, SoundEvents.BLAZE_HURT, SoundCategory.HOSTILE, .25f, .75f); + world.playSound(null, soundPos, SoundEvents.FIRE_EXTINGUISH, SoundCategory.HOSTILE, .5f, .75f); } public boolean hasCapturedBlaze() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java index 07582c253..ffd36c804 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java @@ -1,11 +1,22 @@ package com.simibubi.create.content.contraptions.processing.burner; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerTileEntity.FuelType; +import net.minecraft.block.BlockState; import net.minecraft.entity.projectile.EggEntity; +import net.minecraft.entity.projectile.PotionEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionUtils; +import net.minecraft.potion.Potions; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.vector.Vector3d; @@ -18,6 +29,11 @@ import net.minecraftforge.fml.common.Mod; public class BlazeBurnerHandler { @SubscribeEvent + public static void onThrowableImpact(ProjectileImpactEvent.Throwable event) { + thrownEggsGetEatenByBurner(event); + splashExtinguishesBurner(event); + } + public static void thrownEggsGetEatenByBurner(ProjectileImpactEvent.Throwable event) { if (!(event.getThrowable() instanceof EggEntity)) return; @@ -26,32 +42,71 @@ public class BlazeBurnerHandler { .getType() != RayTraceResult.Type.BLOCK) return; - TileEntity tile = event.getThrowable().world.getTileEntity(new BlockPos(event.getRayTraceResult() - .getHitVec())); + TileEntity tile = event.getThrowable().level.getBlockEntity(new BlockPos(event.getRayTraceResult() + .getLocation())); if (!(tile instanceof BlazeBurnerTileEntity)) { return; } event.setCanceled(true); event.getThrowable() - .setMotion(Vector3d.ZERO); + .setDeltaMovement(Vector3d.ZERO); event.getThrowable() .remove(); - World world = event.getThrowable().world; - if (world.isRemote) + World world = event.getThrowable().level; + if (world.isClientSide) return; - + BlazeBurnerTileEntity heater = (BlazeBurnerTileEntity) tile; - if (heater.activeFuel != FuelType.SPECIAL) { - heater.activeFuel = FuelType.NORMAL; - heater.remainingBurnTime = - MathHelper.clamp(heater.remainingBurnTime + 80, 0, BlazeBurnerTileEntity.maxHeatCapacity); - heater.updateBlockState(); - heater.notifyUpdate(); + if (!heater.isCreative()) { + if (heater.activeFuel != FuelType.SPECIAL) { + heater.activeFuel = FuelType.NORMAL; + heater.remainingBurnTime = + MathHelper.clamp(heater.remainingBurnTime + 80, 0, BlazeBurnerTileEntity.MAX_HEAT_CAPACITY); + heater.updateBlockState(); + heater.notifyUpdate(); + } + } + + AllSoundEvents.BLAZE_MUNCH.playOnServer(world, heater.getBlockPos()); + } + + public static void splashExtinguishesBurner(ProjectileImpactEvent.Throwable event) { + if (event.getThrowable().level.isClientSide) + return; + + if (!(event.getThrowable() instanceof PotionEntity)) + return; + PotionEntity entity = (PotionEntity) event.getThrowable(); + + if (event.getRayTraceResult() + .getType() != RayTraceResult.Type.BLOCK) + return; + + ItemStack stack = entity.getItem(); + Potion potion = PotionUtils.getPotion(stack); + if (potion == Potions.WATER && PotionUtils.getMobEffects(stack).isEmpty()) { + BlockRayTraceResult result = (BlockRayTraceResult) event.getRayTraceResult(); + World world = entity.level; + Direction face = result.getDirection(); + BlockPos pos = result.getBlockPos().relative(face); + + extinguishLitBurners(world, pos, face); + extinguishLitBurners(world, pos.relative(face.getOpposite()), face); + + for (Direction face1 : Direction.Plane.HORIZONTAL) { + extinguishLitBurners(world, pos.relative(face1), face1); + } + } + } + + private static void extinguishLitBurners(World world, BlockPos pos, Direction direction) { + BlockState state = world.getBlockState(pos); + if (AllBlocks.LIT_BLAZE_BURNER.has(state)) { + world.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); + world.setBlockAndUpdate(pos, AllBlocks.BLAZE_BURNER.getDefaultState()); } - - AllSoundEvents.BLAZE_MUNCH.playOnServer(world, heater.getPos()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java index cf99503c0..9f000b228 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -29,7 +29,7 @@ public class BlazeBurnerRenderer extends SafeTileEntityRenderer tileEntityTypeIn) { super(tileEntityTypeIn); activeFuel = FuelType.NONE; remainingBurnTime = 0; headAngle = LerpedFloat.angular(); + isCreative = false; + } + + public FuelType getActiveFuel() { + return activeFuel; + } + + public int getRemainingBurnTime() { + return remainingBurnTime; + } + + public boolean isCreative() { + return isCreative; } @Override public void tick() { super.tick(); - if (world.isRemote) { + + if (level.isClientSide) { tickRotation(); spawnParticles(getHeatLevelFromBlock(), 1); return; } + if (isCreative) + return; + if (remainingBurnTime > 0) remainingBurnTime--; @@ -65,25 +99,29 @@ public class BlazeBurnerTileEntity extends SmartTileEntity { if (activeFuel == FuelType.SPECIAL) { activeFuel = FuelType.NORMAL; - remainingBurnTime = maxHeatCapacity / 2; + remainingBurnTime = MAX_HEAT_CAPACITY / 2; } else activeFuel = FuelType.NONE; + updateBlockState(); notifyUpdate(); } private void tickRotation() { - ClientPlayerEntity player = Minecraft.getInstance().player; float target = 0; + ClientPlayerEntity player = Minecraft.getInstance().player; if (player != null) { - double x = player.getX(); - double z = player.getZ(); + double x; + double z; if (isVirtual()) { x = -4; z = -10; + } else { + x = player.getX(); + z = player.getZ(); } - double dx = x - (getPos().getX() + 0.5); - double dz = z - (getPos().getZ() + 0.5); + double dx = x - (getBlockPos().getX() + 0.5); + double dz = z - (getBlockPos().getZ() + 0.5); target = AngleHelper.deg(-MathHelper.atan2(dz, dx)) - 90; } target = headAngle.getValue() + AngleHelper.getShortestAngleDiff(headAngle.getValue(), target); @@ -96,8 +134,12 @@ public class BlazeBurnerTileEntity extends SmartTileEntity { @Override public void write(CompoundNBT compound, boolean clientPacket) { - compound.putInt("fuelLevel", activeFuel.ordinal()); - compound.putInt("burnTimeRemaining", remainingBurnTime); + if (!isCreative) { + compound.putInt("fuelLevel", activeFuel.ordinal()); + compound.putInt("burnTimeRemaining", remainingBurnTime); + } else { + compound.putBoolean("isCreative", true); + } super.write(compound, clientPacket); } @@ -105,22 +147,44 @@ public class BlazeBurnerTileEntity extends SmartTileEntity { protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { activeFuel = FuelType.values()[compound.getInt("fuelLevel")]; remainingBurnTime = compound.getInt("burnTimeRemaining"); + isCreative = compound.getBoolean("isCreative"); super.fromTag(state, compound, clientPacket); } + public BlazeBurnerBlock.HeatLevel getHeatLevelFromBlock() { + return BlazeBurnerBlock.getHeatLevelOf(getBlockState()); + } + + public void updateBlockState() { + setBlockHeat(getHeatLevelFromFuelType(activeFuel)); + } + + protected void setBlockHeat(HeatLevel heat) { + HeatLevel inBlockState = getHeatLevelFromBlock(); + if (inBlockState == heat) + return; + level.setBlockAndUpdate(worldPosition, getBlockState().setValue(BlazeBurnerBlock.HEAT_LEVEL, heat)); + notifyUpdate(); + } + /** - * @return true if the heater updated its burn time and a item should be + * @return true if the heater updated its burn time and an item should be * consumed */ - boolean tryUpdateFuel(ItemStack itemStack, boolean forceOverflow, boolean simulate) { - FuelType newFuel = FuelType.NONE; - int newBurnTime = ForgeHooks.getBurnTime(itemStack); + protected boolean tryUpdateFuel(ItemStack itemStack, boolean forceOverflow, boolean simulate) { + if (isCreative) + return false; + + FuelType newFuel = FuelType.NONE; + int newBurnTime; - if (newBurnTime > 0) - newFuel = FuelType.NORMAL; if (AllItems.BLAZE_CAKE.isIn(itemStack)) { newBurnTime = 1000; newFuel = FuelType.SPECIAL; + } else { + newBurnTime = ForgeHooks.getBurnTime(itemStack); + if (newBurnTime > 0) + newFuel = FuelType.NORMAL; } if (newFuel == FuelType.NONE) @@ -131,9 +195,9 @@ public class BlazeBurnerTileEntity extends SmartTileEntity { return false; if (newFuel == activeFuel) { - if (remainingBurnTime + newBurnTime > maxHeatCapacity && !forceOverflow) + if (remainingBurnTime + newBurnTime > MAX_HEAT_CAPACITY && !forceOverflow) return false; - newBurnTime = MathHelper.clamp(remainingBurnTime + newBurnTime, 0, maxHeatCapacity); + newBurnTime = MathHelper.clamp(remainingBurnTime + newBurnTime, 0, MAX_HEAT_CAPACITY); } if (simulate) @@ -142,28 +206,44 @@ public class BlazeBurnerTileEntity extends SmartTileEntity { activeFuel = newFuel; remainingBurnTime = newBurnTime; - if (world.isRemote) { - HeatLevel level = getHeatLevelFromFuelType(newFuel); + if (level.isClientSide) { + HeatLevel level = getHeatLevelFromFuelType(activeFuel); for (int i = 0; i < 20; i++) spawnParticles(level, 1 + (.25 * (i / 4))); - return true; + } else { + playSound(); + updateBlockState(); } - updateBlockState(); return true; } - public BlazeBurnerBlock.HeatLevel getHeatLevelFromBlock() { - return BlazeBurnerBlock.getHeatLevelOf(getBlockState()); + protected void applyCreativeFuel() { + boolean wasCreative = isCreative; + + activeFuel = FuelType.NONE; + remainingBurnTime = 0; + isCreative = true; + + if (level.isClientSide) { + for (int i = 0; i < 30; i++) { + double burstMult = 1 + (.25 * (i / 4)); + spawnParticle(CREATIVE_PARTICLE_COLORS, 0.04F, 35, false, 0.03 * burstMult, 0.15 * burstMult); + } + } else { + playSound(); + if (wasCreative) + setBlockHeat(getHeatLevelFromBlock().nextActiveLevel()); + } } - public void updateBlockState() { - HeatLevel inBlockState = getHeatLevelFromBlock(); - HeatLevel inTE = getHeatLevelFromFuelType(activeFuel); - if (inBlockState == inTE) - return; - world.setBlockState(pos, getBlockState().with(BlazeBurnerBlock.HEAT_LEVEL, inTE)); - notifyUpdate(); + public boolean isCreativeFuel(ItemStack stack) { + return AllItems.CREATIVE_BLAZE_CAKE.isIn(stack); + } + + protected void playSound() { + level.playSound(null, worldPosition, SoundEvents.BLAZE_SHOOT, SoundCategory.BLOCKS, + .125f + level.random.nextFloat() * .125f, .75f - level.random.nextFloat() * .25f); } protected HeatLevel getHeatLevelFromFuelType(FuelType fuel) { @@ -173,7 +253,7 @@ public class BlazeBurnerTileEntity extends SmartTileEntity { level = HeatLevel.SEETHING; break; case NORMAL: - boolean lowPercent = (double) remainingBurnTime / maxHeatCapacity < 0.1; + boolean lowPercent = (double) remainingBurnTime / MAX_HEAT_CAPACITY < 0.1; level = lowPercent ? HeatLevel.FADING : HeatLevel.KINDLED; break; default: @@ -183,13 +263,13 @@ public class BlazeBurnerTileEntity extends SmartTileEntity { return level; } - private void spawnParticles(HeatLevel heatLevel, double burstMult) { - if (world == null) + protected void spawnParticles(HeatLevel heatLevel, double burstMult) { + if (level == null) return; if (heatLevel == BlazeBurnerBlock.HeatLevel.NONE) return; - Random r = world.getRandom(); + Random r = level.getRandom(); switch (heatLevel) { case SMOULDERING: if (r.nextDouble() > 0.25) @@ -216,20 +296,31 @@ public class BlazeBurnerTileEntity extends SmartTileEntity { } } - private void spawnParticle(HeatLevel heatLevel, float scale, int avgAge, boolean hot, double speed, double spread) { - Random random = world.getRandom(); - Vector3d color = randomColor(heatLevel); - world.addOptionalParticle( + protected void spawnParticle(Vector3d color, float scale, int avgAge, boolean hot, double speed, double spread) { + Random random = level.getRandom(); + level.addAlwaysVisibleParticle( new CubeParticleData((float) color.x, (float) color.y, (float) color.z, scale, avgAge, hot), - (double) pos.getX() + 0.5D + (random.nextDouble() * 2.0 - 1D) * spread, - (double) pos.getY() + 0.6D + (random.nextDouble() / 4.0), - (double) pos.getZ() + 0.5D + (random.nextDouble() * 2.0 - 1D) * spread, 0.0D, speed, 0.0D); + (double) worldPosition.getX() + 0.5D + (random.nextDouble() * 2.0 - 1D) * spread, + (double) worldPosition.getY() + 0.6D + (random.nextDouble() / 4.0), + (double) worldPosition.getZ() + 0.5D + (random.nextDouble() * 2.0 - 1D) * spread, 0.0D, speed, 0.0D); } - private static Vector3d randomColor(BlazeBurnerBlock.HeatLevel heatLevel) { - if (heatLevel == BlazeBurnerBlock.HeatLevel.NONE) - return new Vector3d(0, 0, 0); - return ColorHelper.getRGB(heatParticleColors[heatLevel.ordinal() - 1][(int) (Math.random() * 4)]); + protected void spawnParticle(Vector3d[] colors, float scale, int avgAge, boolean hot, double speed, double spread) { + Vector3d color; + if (colors.length == 0) { + color = EMPTY_COLOR; + } else { + color = colors[(int) (Math.random() * colors.length)]; + } + spawnParticle(color, scale, avgAge, hot, speed, spread); + } + + protected void spawnParticle(HeatLevel heatLevel, float scale, int avgAge, boolean hot, double speed, double spread) { + spawnParticle(PARTICLE_COLORS[heatLevel.ordinal()], scale, avgAge, hot, speed, spread); + } + + public enum FuelType { + NONE, NORMAL, SPECIAL } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java index cfe315f79..f81829625 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java @@ -4,16 +4,20 @@ import java.util.Random; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.particles.ParticleTypes; import net.minecraft.pathfinding.PathType; +import net.minecraft.state.EnumProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.tags.ItemTags; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; +import net.minecraft.util.IStringSerializable; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; @@ -25,43 +29,48 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.ToolType; public class LitBlazeBurnerBlock extends Block { -// 1.16: add a soul fire variant + public static final EnumProperty FLAME_TYPE = EnumProperty.create("flame_type", FlameType.class); -// public enum FlameType implements IStringSerializable { -// REGULAR, SOULFIRE; -// -// @Override -// public String getName() { -// return Lang.asId(name()); -// } -// -// } - - public LitBlazeBurnerBlock(Properties p_i48440_1_) { - super(p_i48440_1_); + public LitBlazeBurnerBlock(Properties properties) { + super(properties); + registerDefaultState(defaultBlockState().setValue(FLAME_TYPE, FlameType.REGULAR)); } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FLAME_TYPE); + } + + @Override + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) { - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); - // Check for 'Shovels' - if (!heldItem.canHarvestBlock(Blocks.SNOW.getDefaultState())) - return ActionResultType.PASS; - - world.playSound(player, pos, SoundEvents.ENTITY_GENERIC_EXTINGUISH_FIRE, SoundCategory.BLOCKS, .5f, 2); - - if (world.isRemote) + if (heldItem.getToolTypes().contains(ToolType.SHOVEL)) { + world.playSound(player, pos, SoundEvents.GENERIC_EXTINGUISH_FIRE, SoundCategory.BLOCKS, 0.5f, 2); + if (world.isClientSide) + return ActionResultType.SUCCESS; + heldItem.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(hand)); + world.setBlockAndUpdate(pos, AllBlocks.BLAZE_BURNER.getDefaultState()); return ActionResultType.SUCCESS; - if (!player.isCreative()) - heldItem.damageItem(1, player, p -> p.sendBreakAnimation(hand)); + } - world.setBlockState(pos, AllBlocks.BLAZE_BURNER.getDefaultState()); - return ActionResultType.SUCCESS; + if (state.getValue(FLAME_TYPE) == FlameType.REGULAR) { + if (heldItem.getItem().is(ItemTags.SOUL_FIRE_BASE_BLOCKS)) { + world.playSound(player, pos, SoundEvents.SOUL_SAND_PLACE, SoundCategory.BLOCKS, 1.0f, world.random.nextFloat() * 0.4F + 0.8F); + if (world.isClientSide) + return ActionResultType.SUCCESS; + world.setBlockAndUpdate(pos, defaultBlockState().setValue(FLAME_TYPE, FlameType.SOUL)); + return ActionResultType.SUCCESS; + } + } + + return ActionResultType.PASS; } @Override @@ -77,19 +86,30 @@ public class LitBlazeBurnerBlock extends Block { } @OnlyIn(Dist.CLIENT) - public void animateTick(BlockState p_180655_1_, World world, BlockPos pos, Random random) { - world.addOptionalParticle(ParticleTypes.LARGE_SMOKE, true, + public void animateTick(BlockState state, World world, BlockPos pos, Random random) { + world.addAlwaysVisibleParticle(ParticleTypes.LARGE_SMOKE, true, (double) pos.getX() + 0.5D + random.nextDouble() / 3.0D * (double) (random.nextBoolean() ? 1 : -1), (double) pos.getY() + random.nextDouble() + random.nextDouble(), (double) pos.getZ() + 0.5D + random.nextDouble() / 3.0D * (double) (random.nextBoolean() ? 1 : -1), 0.0D, 0.07D, 0.0D); if (random.nextInt(10) == 0) { - world.playSound((double) ((float) pos.getX() + 0.5F), (double) ((float) pos.getY() + 0.5F), - (double) ((float) pos.getZ() + 0.5F), SoundEvents.BLOCK_CAMPFIRE_CRACKLE, SoundCategory.BLOCKS, + world.playLocalSound((double) ((float) pos.getX() + 0.5F), (double) ((float) pos.getY() + 0.5F), + (double) ((float) pos.getZ() + 0.5F), SoundEvents.CAMPFIRE_CRACKLE, SoundCategory.BLOCKS, 0.25F + random.nextFloat() * .25f, random.nextFloat() * 0.7F + 0.6F, false); } + if (state.getValue(FLAME_TYPE) == FlameType.SOUL) { + if (random.nextInt(8) == 0) { + world.addParticle(ParticleTypes.SOUL, + pos.getX() + 0.5F + random.nextDouble() / 4 * (random.nextBoolean() ? 1 : -1), + pos.getY() + 0.3F + random.nextDouble() / 2, + pos.getZ() + 0.5F + random.nextDouble() / 4 * (random.nextBoolean() ? 1 : -1), + 0.0, random.nextDouble() * 0.04 + 0.04, 0.0); + } + return; + } + if (random.nextInt(5) == 0) { for (int i = 0; i < random.nextInt(1) + 1; ++i) { world.addParticle(ParticleTypes.LAVA, (double) ((float) pos.getX() + 0.5F), @@ -98,15 +118,15 @@ public class LitBlazeBurnerBlock extends Block { } } } - + @Override - public boolean hasComparatorInputOverride(BlockState p_149740_1_) { + public boolean hasAnalogOutputSignal(BlockState p_149740_1_) { return true; } - + @Override - public int getComparatorInputOverride(BlockState state, World p_180641_2_, BlockPos p_180641_3_) { - return 1; + public int getAnalogOutputSignal(BlockState state, World p_180641_2_, BlockPos p_180641_3_) { + return state.getValue(FLAME_TYPE) == FlameType.REGULAR ? 1 : 2; } @Override @@ -115,10 +135,28 @@ public class LitBlazeBurnerBlock extends Block { return AllBlocks.BLAZE_BURNER.get() .getCollisionShape(state, reader, pos, context); } - + @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } + public static int getLight(BlockState state) { + if (state.getValue(FLAME_TYPE) == FlameType.SOUL) + return 9; + else + return 12; + } + + public enum FlameType implements IStringSerializable { + + REGULAR, SOUL; + + @Override + public String getSerializedName() { + return Lang.asId(name()); + } + + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java index 19a563c35..a05ec6708 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java @@ -56,19 +56,19 @@ public class GantryShaftBlock extends DirectionalKineticBlock { START, MIDDLE, END, SINGLE; @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(PART, POWERED)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(PART, POWERED)); } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { - ItemStack heldItem = player.getHeldItem(hand); + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { + ItemStack heldItem = player.getItemInHand(hand); IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId); if (!placementHelper.matchesItem(heldItem)) @@ -80,25 +80,25 @@ public class GantryShaftBlock extends DirectionalKineticBlock { @Override public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - return AllShapes.EIGHT_VOXEL_POLE.get(state.get(FACING) + return AllShapes.EIGHT_VOXEL_POLE.get(state.getValue(FACING) .getAxis()); } @Override - public BlockRenderType getRenderType(BlockState state) { + public BlockRenderType getRenderShape(BlockState state) { return BlockRenderType.ENTITYBLOCK_ANIMATED; } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world, + public BlockState updateShape(BlockState state, Direction direction, BlockState neighbour, IWorld world, BlockPos pos, BlockPos neighbourPos) { - Direction facing = state.get(FACING); + Direction facing = state.getValue(FACING); Axis axis = facing.getAxis(); if (direction.getAxis() != axis) return state; - boolean connect = AllBlocks.GANTRY_SHAFT.has(neighbour) && neighbour.get(FACING) == facing; + boolean connect = AllBlocks.GANTRY_SHAFT.has(neighbour) && neighbour.getValue(FACING) == facing; - Part part = state.get(PART); + Part part = state.getValue(PART); if (direction.getAxisDirection() == facing.getAxisDirection()) { if (connect) { if (part == Part.END) @@ -125,58 +125,58 @@ public class GantryShaftBlock extends DirectionalKineticBlock { } } - return state.with(PART, part); + return state.setValue(PART, part); } public GantryShaftBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(POWERED, false) - .with(PART, Part.SINGLE)); + registerDefaultState(defaultBlockState().setValue(POWERED, false) + .setValue(PART, Part.SINGLE)); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { BlockState state = super.getStateForPlacement(context); - BlockPos pos = context.getPos(); - World world = context.getWorld(); - Direction face = context.getFace(); + BlockPos pos = context.getClickedPos(); + World world = context.getLevel(); + Direction face = context.getClickedFace(); - BlockState neighbour = world.getBlockState(pos.offset(state.get(FACING) + BlockState neighbour = world.getBlockState(pos.relative(state.getValue(FACING) .getOpposite())); BlockState clickedState = - AllBlocks.GANTRY_SHAFT.has(neighbour) ? neighbour : world.getBlockState(pos.offset(face.getOpposite())); + AllBlocks.GANTRY_SHAFT.has(neighbour) ? neighbour : world.getBlockState(pos.relative(face.getOpposite())); - if (AllBlocks.GANTRY_SHAFT.has(clickedState) && clickedState.get(FACING) - .getAxis() == state.get(FACING) + if (AllBlocks.GANTRY_SHAFT.has(clickedState) && clickedState.getValue(FACING) + .getAxis() == state.getValue(FACING) .getAxis()) { - Direction facing = clickedState.get(FACING); - state = state.with(FACING, context.getPlayer() == null || !context.getPlayer() - .isSneaking() ? facing : facing.getOpposite()); + Direction facing = clickedState.getValue(FACING); + state = state.setValue(FACING, context.getPlayer() == null || !context.getPlayer() + .isShiftKeyDown() ? facing : facing.getOpposite()); } - return state.with(POWERED, shouldBePowered(state, world, pos)); + return state.setValue(POWERED, shouldBePowered(state, world, pos)); } @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { ActionResultType onWrenched = super.onWrenched(state, context); - if (onWrenched.isAccepted()) { - BlockPos pos = context.getPos(); - World world = context.getWorld(); + if (onWrenched.consumesAction()) { + BlockPos pos = context.getClickedPos(); + World world = context.getLevel(); neighborChanged(world.getBlockState(pos), world, pos, state.getBlock(), pos, false); } return onWrenched; } @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { - super.onBlockAdded(state, worldIn, pos, oldState, isMoving); + public void onPlace(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { + super.onPlace(state, worldIn, pos, oldState, isMoving); - if (!worldIn.isRemote() && oldState.getBlock().is(AllBlocks.GANTRY_SHAFT.get())) { - Part oldPart = oldState.get(PART), part = state.get(PART); + if (!worldIn.isClientSide() && oldState.getBlock().is(AllBlocks.GANTRY_SHAFT.get())) { + Part oldPart = oldState.getValue(PART), part = state.getValue(PART); if ((oldPart != Part.MIDDLE && part == Part.MIDDLE) || (oldPart == Part.SINGLE && part != Part.SINGLE)) { - TileEntity te = worldIn.getTileEntity(pos); + TileEntity te = worldIn.getBlockEntity(pos); if (te instanceof GantryShaftTileEntity) ((GantryShaftTileEntity) te).checkAttachedCarriageBlocks(); } @@ -186,13 +186,13 @@ public class GantryShaftBlock extends DirectionalKineticBlock { @Override public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_, boolean p_220069_6_) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; - boolean previouslyPowered = state.get(POWERED); - boolean shouldPower = worldIn.isBlockPowered(pos); // shouldBePowered(state, worldIn, pos); + boolean previouslyPowered = state.getValue(POWERED); + boolean shouldPower = worldIn.hasNeighborSignal(pos); // shouldBePowered(state, worldIn, pos); if (!previouslyPowered && !shouldPower && shouldBePowered(state, worldIn, pos)) { - worldIn.setBlockState(pos, state.with(POWERED, true), 3); + worldIn.setBlock(pos, state.setValue(POWERED, true), 3); return; } @@ -201,52 +201,52 @@ public class GantryShaftBlock extends DirectionalKineticBlock { // Collect affected gantry shafts List toUpdate = new ArrayList<>(); - Direction facing = state.get(FACING); + Direction facing = state.getValue(FACING); Axis axis = facing.getAxis(); for (Direction d : Iterate.directionsInAxis(axis)) { - BlockPos currentPos = pos.offset(d); + BlockPos currentPos = pos.relative(d); while (true) { - if (!worldIn.isBlockPresent(currentPos)) + if (!worldIn.isLoaded(currentPos)) break; BlockState currentState = worldIn.getBlockState(currentPos); if (!(currentState.getBlock() instanceof GantryShaftBlock)) break; - if (currentState.get(FACING) != facing) + if (currentState.getValue(FACING) != facing) break; - if (!shouldPower && currentState.get(POWERED) && worldIn.isBlockPowered(currentPos)) + if (!shouldPower && currentState.getValue(POWERED) && worldIn.hasNeighborSignal(currentPos)) return; - if (currentState.get(POWERED) == shouldPower) + if (currentState.getValue(POWERED) == shouldPower) break; toUpdate.add(currentPos); - currentPos = currentPos.offset(d); + currentPos = currentPos.relative(d); } } toUpdate.add(pos); for (BlockPos blockPos : toUpdate) { BlockState blockState = worldIn.getBlockState(blockPos); - TileEntity te = worldIn.getTileEntity(blockPos); + TileEntity te = worldIn.getBlockEntity(blockPos); if (te instanceof KineticTileEntity) ((KineticTileEntity) te).detachKinetics(); if (blockState.getBlock() instanceof GantryShaftBlock) - worldIn.setBlockState(blockPos, blockState.with(POWERED, shouldPower), 2); + worldIn.setBlock(blockPos, blockState.setValue(POWERED, shouldPower), 2); } } protected boolean shouldBePowered(BlockState state, World worldIn, BlockPos pos) { - boolean shouldPower = worldIn.isBlockPowered(pos); + boolean shouldPower = worldIn.hasNeighborSignal(pos); - Direction facing = state.get(FACING); + Direction facing = state.getValue(FACING); for (Direction d : Iterate.directionsInAxis(facing.getAxis())) { - BlockPos neighbourPos = pos.offset(d); - if (!worldIn.isBlockPresent(neighbourPos)) + BlockPos neighbourPos = pos.relative(d); + if (!worldIn.isLoaded(neighbourPos)) continue; BlockState neighbourState = worldIn.getBlockState(neighbourPos); if (!(neighbourState.getBlock() instanceof GantryShaftBlock)) continue; - if (neighbourState.get(FACING) != facing) + if (neighbourState.getValue(FACING) != facing) continue; - shouldPower |= neighbourState.get(POWERED); + shouldPower |= neighbourState.getValue(POWERED); } return shouldPower; @@ -254,13 +254,13 @@ public class GantryShaftBlock extends DirectionalKineticBlock { @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.get(FACING) + return face.getAxis() == state.getValue(FACING) .getAxis(); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(FACING) + return state.getValue(FACING) .getAxis(); } @@ -272,7 +272,7 @@ public class GantryShaftBlock extends DirectionalKineticBlock { @Override protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) { return super.areStatesKineticallyEquivalent(oldState, newState) - && oldState.get(POWERED) == newState.get(POWERED); + && oldState.getValue(POWERED) == newState.getValue(POWERED); } @Override @@ -286,14 +286,14 @@ public class GantryShaftBlock extends DirectionalKineticBlock { } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } public static class PlacementHelper extends PoleHelper { public PlacementHelper() { - super(AllBlocks.GANTRY_SHAFT::has, s -> s.get(FACING) + super(AllBlocks.GANTRY_SHAFT::has, s -> s.getValue(FACING) .getAxis(), FACING); } @@ -305,7 +305,7 @@ public class GantryShaftBlock extends DirectionalKineticBlock { @Override public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { PlacementOffset offset = super.getOffset(player, world, state, pos, ray); - offset.withTransform(offset.getTransform().andThen(s -> s.with(POWERED, state.get(POWERED)))); + offset.withTransform(offset.getTransform().andThen(s -> s.setValue(POWERED, state.getValue(POWERED)))); return offset; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java index 4cd68bcbf..2d29850bb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java @@ -23,16 +23,16 @@ public class GantryShaftTileEntity extends KineticTileEntity { if (!canAssembleOn()) return; for (Direction d : Iterate.directions) { - if (d.getAxis() == getBlockState().get(GantryShaftBlock.FACING) + if (d.getAxis() == getBlockState().getValue(GantryShaftBlock.FACING) .getAxis()) continue; - BlockPos offset = pos.offset(d); - BlockState pinionState = world.getBlockState(offset); + BlockPos offset = worldPosition.relative(d); + BlockState pinionState = level.getBlockState(offset); if (!AllBlocks.GANTRY_CARRIAGE.has(pinionState)) continue; - if (pinionState.get(GantryCarriageBlock.FACING) != d) + if (pinionState.getValue(GantryCarriageBlock.FACING) != d) continue; - TileEntity tileEntity = world.getTileEntity(offset); + TileEntity tileEntity = level.getBlockEntity(offset); if (tileEntity instanceof GantryCarriageTileEntity) ((GantryCarriageTileEntity) tileEntity).queueAssembly(); } @@ -52,37 +52,37 @@ public class GantryShaftTileEntity extends KineticTileEntity { if (connectedViaAxes) return defaultModifier; - if (!stateFrom.get(GantryShaftBlock.POWERED)) + if (!stateFrom.getValue(GantryShaftBlock.POWERED)) return defaultModifier; if (!AllBlocks.GANTRY_CARRIAGE.has(stateTo)) return defaultModifier; - Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ()); - if (stateTo.get(GantryCarriageBlock.FACING) != direction) + Direction direction = Direction.getNearest(diff.getX(), diff.getY(), diff.getZ()); + if (stateTo.getValue(GantryCarriageBlock.FACING) != direction) return defaultModifier; - return GantryCarriageTileEntity.getGantryPinionModifier(stateFrom.get(GantryShaftBlock.FACING), - stateTo.get(GantryCarriageBlock.FACING)); + return GantryCarriageTileEntity.getGantryPinionModifier(stateFrom.getValue(GantryShaftBlock.FACING), + stateTo.getValue(GantryCarriageBlock.FACING)); } @Override public boolean isCustomConnection(KineticTileEntity other, BlockState state, BlockState otherState) { if (!AllBlocks.GANTRY_CARRIAGE.has(otherState)) return false; - final BlockPos diff = other.getPos() - .subtract(pos); - Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ()); - return otherState.get(GantryCarriageBlock.FACING) == direction; + final BlockPos diff = other.getBlockPos() + .subtract(worldPosition); + Direction direction = Direction.getNearest(diff.getX(), diff.getY(), diff.getZ()); + return otherState.getValue(GantryCarriageBlock.FACING) == direction; } public boolean canAssembleOn() { BlockState blockState = getBlockState(); if (!AllBlocks.GANTRY_SHAFT.has(blockState)) return false; - if (blockState.get(GantryShaftBlock.POWERED)) + if (blockState.getValue(GantryShaftBlock.POWERED)) return false; float speed = getPinionMovementSpeed(); - switch (blockState.get(GantryShaftBlock.PART)) { + switch (blockState.getValue(GantryShaftBlock.PART)) { case END: return speed < 0; case MIDDLE: diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java index 46a4f25d4..c0838a5c9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java @@ -50,27 +50,27 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockState above = context.getWorld() - .getBlockState(context.getPos() - .up()); - if (ICogWheel.isLargeCog(above) && above.get(CogWheelBlock.AXIS) + BlockState above = context.getLevel() + .getBlockState(context.getClickedPos() + .above()); + if (ICogWheel.isLargeCog(above) && above.getValue(CogWheelBlock.AXIS) .isHorizontal()) - return getDefaultState().with(HORIZONTAL_AXIS, above.get(CogWheelBlock.AXIS) == Axis.X ? Axis.Z : Axis.X); + return defaultBlockState().setValue(HORIZONTAL_AXIS, above.getValue(CogWheelBlock.AXIS) == Axis.X ? Axis.Z : Axis.X); return super.getStateForPlacement(context); } @Override public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos neighbourPos, boolean p_220069_6_) { - if (neighbourPos.equals(pos.up())) + if (neighbourPos.equals(pos.above())) withTileEntityDo(world, pos, SpeedControllerTileEntity::updateBracket); } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); IPlacementHelper helper = PlacementHelpers.get(placementHelperId); if (helper.matchesItem(heldItem)) return helper.getOffset(player, world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); @@ -97,18 +97,18 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements @Override public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { - BlockPos newPos = pos.up(); + BlockPos newPos = pos.above(); if (!world.getBlockState(newPos) .getMaterial() .isReplaceable()) return PlacementOffset.fail(); - Axis newAxis = state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X; + Axis newAxis = state.getValue(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X; if (!CogWheelBlock.isValidCogwheelPosition(true, world, newPos, newAxis)) return PlacementOffset.fail(); - return PlacementOffset.success(newPos, s -> s.with(CogWheelBlock.AXIS, newAxis)); + return PlacementOffset.success(newPos, s -> s.setValue(CogWheelBlock.AXIS, newAxis)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index cb6c22d09..54349d915 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -31,24 +31,24 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer builder) { - super.fillStateContainer(builder.add(STATE, VERTICAL)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(STATE, VERTICAL)); } @Override @@ -63,18 +63,18 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen @Override public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; - if (!worldIn.getPendingBlockTicks() - .isTickPending(pos, this)) - worldIn.getPendingBlockTicks() + if (!worldIn.getBlockTicks() + .willTickThisTick(pos, this)) + worldIn.getBlockTicks() .scheduleTick(pos, this, 0); } @Override - public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { - boolean previouslyPowered = state.get(STATE) != 0; - boolean isPowered = worldIn.isBlockPowered(pos); + public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { + boolean previouslyPowered = state.getValue(STATE) != 0; + boolean isPowered = worldIn.hasNeighborSignal(pos); withTileEntityDo(worldIn, pos, sgte -> sgte.onRedstoneUpdate(isPowered, previouslyPowered)); } @@ -85,21 +85,21 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - if (state.get(VERTICAL)) + if (state.getValue(VERTICAL)) return face.getAxis() .isVertical(); return super.hasShaftTowards(world, pos, state, face); } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - ItemStack held = player.getHeldItemMainhand(); + ItemStack held = player.getMainHandItem(); if (AllItems.WRENCH.isIn(held)) return ActionResultType.PASS; if (held.getItem() instanceof BlockItem) { BlockItem blockItem = (BlockItem) held.getItem(); - if (blockItem.getBlock() instanceof KineticBlock && hasShaftTowards(worldIn, pos, state, hit.getFace())) + if (blockItem.getBlock() instanceof KineticBlock && hasShaftTowards(worldIn, pos, state, hit.getDirection())) return ActionResultType.PASS; } @@ -118,7 +118,7 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen public BlockState getStateForPlacement(BlockItemUseContext context) { Axis preferredAxis = RotatedPillarKineticBlock.getPreferredAxis(context); if (preferredAxis != null && (context.getPlayer() == null || !context.getPlayer() - .isSneaking())) + .isShiftKeyDown())) return withAxis(preferredAxis, context); return withAxis(context.getNearestLookingDirection() .getAxis(), context); @@ -128,9 +128,9 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen public ActionResultType onWrenched(BlockState state, ItemUseContext context) { BlockState newState = state; - if (context.getFace() + if (context.getClickedFace() .getAxis() != Axis.Y) - if (newState.get(HORIZONTAL_AXIS) != context.getFace() + if (newState.getValue(HORIZONTAL_AXIS) != context.getClickedFace() .getAxis()) newState = newState.cycle(VERTICAL); @@ -138,16 +138,16 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen } private BlockState withAxis(Axis axis, BlockItemUseContext context) { - BlockState state = getDefaultState().with(VERTICAL, axis.isVertical()); + BlockState state = defaultBlockState().setValue(VERTICAL, axis.isVertical()); if (axis.isVertical()) - return state.with(HORIZONTAL_AXIS, context.getPlacementHorizontalFacing() + return state.setValue(HORIZONTAL_AXIS, context.getHorizontalDirection() .getAxis()); - return state.with(HORIZONTAL_AXIS, axis); + return state.setValue(HORIZONTAL_AXIS, axis); } @Override public Axis getRotationAxis(BlockState state) { - if (state.get(VERTICAL)) + if (state.getValue(VERTICAL)) return Axis.Y; return super.getRotationAxis(state); } @@ -158,13 +158,13 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen } @Override - public boolean hasComparatorInputOverride(BlockState p_149740_1_) { + public boolean hasAnalogOutputSignal(BlockState p_149740_1_) { return true; } @Override - public int getComparatorInputOverride(BlockState state, World world, BlockPos pos) { - return state.get(STATE) + public int getAnalogOutputSignal(BlockState state, World world, BlockPos pos) { + return state.getValue(STATE) .intValue(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftGenerator.java index 86b5f5b59..9301fecdd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftGenerator.java @@ -13,19 +13,19 @@ public class SequencedGearshiftGenerator extends SpecialBlockStateGen { @Override protected int getXRotation(BlockState state) { - return state.get(SequencedGearshiftBlock.VERTICAL) ? 90 : 0; + return state.getValue(SequencedGearshiftBlock.VERTICAL) ? 90 : 0; } @Override protected int getYRotation(BlockState state) { - return state.get(SequencedGearshiftBlock.HORIZONTAL_AXIS) == Axis.X ? 90 : 0; + return state.getValue(SequencedGearshiftBlock.HORIZONTAL_AXIS) == Axis.X ? 90 : 0; } @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { String variant = "idle"; - int seq = state.get(SequencedGearshiftBlock.STATE); + int seq = state.getValue(SequencedGearshiftBlock.STATE); if (seq > 0) variant = "seq_" + seq; return prov.models() diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java index 5ba9d46bd..30a7063fc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java @@ -35,7 +35,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { public SequencedGearshiftScreen(SequencedGearshiftTileEntity te) { super(Lang.translate("gui.sequenced_gearshift.title")); this.instructions = te.instructions; - this.pos = te.getPos(); + this.pos = te.getBlockPos(); compareTag = Instruction.serializeAll(instructions); } @@ -147,14 +147,14 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { label(ms, 36, yOffset - 3, Lang.translate(def.translationKey)); if (def.hasValueParameter) { String text = def.formatValue(instruction.value); - int stringWidth = textRenderer.getStringWidth(text); + int stringWidth = font.width(text); label(ms, 90 + (12 - stringWidth / 2), yOffset - 3, new StringTextComponent(text)); } if (def.hasSpeedParameter) label(ms, 127, yOffset - 3, instruction.speedModifier.label); } - drawCenteredText(ms, textRenderer, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); GuiGameElement.of(renderedItem) .at(x + background.width + 6, y + background.height - 56, -200) @@ -163,7 +163,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { } private void label(MatrixStack ms, int x, int y, ITextComponent text) { - textRenderer.drawWithShadow(ms, text, guiLeft + x, guiTop + 26 + y, 0xFFFFEE); + font.drawShadow(ms, text, guiLeft + x, guiTop + 26 + y, 0xFFFFEE); } public void sendPacket() { @@ -201,7 +201,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { @Override public boolean mouseClicked(double x, double y, int button) { if (confirmButton.isHovered()) { - client.player.closeScreen(); + minecraft.player.closeContainer(); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java index c65896513..4801c13ac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java @@ -35,7 +35,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { if (isIdle()) return; - if (world.isRemote) + if (level.isClientSide) return; if (currentInstructionDuration < 0) return; @@ -78,8 +78,8 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { return; if (isPowered == isRunning) return; - if (!world.isBlockPowered(pos)) { - world.setBlockState(pos, getBlockState().with(SequencedGearshiftBlock.STATE, 0), 3); + if (!level.hasNeighborSignal(worldPosition)) { + level.setBlock(worldPosition, getBlockState().setValue(SequencedGearshiftBlock.STATE, 0), 3); return; } if (getSpeed() == 0) @@ -113,8 +113,8 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { currentInstructionDuration = -1; currentInstructionProgress = 0; timer = 0; - if (!world.isBlockPowered(pos)) - world.setBlockState(pos, getBlockState().with(SequencedGearshiftBlock.STATE, 0), 3); + if (!level.hasNeighborSignal(worldPosition)) + level.setBlock(worldPosition, getBlockState().setValue(SequencedGearshiftBlock.STATE, 0), 3); else sendData(); return; @@ -125,7 +125,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { currentInstruction = instructionIndex; currentInstructionProgress = 0; timer = 0; - world.setBlockState(pos, getBlockState().with(SequencedGearshiftBlock.STATE, instructionIndex + 1), 3); + level.setBlock(worldPosition, getBlockState().setValue(SequencedGearshiftBlock.STATE, instructionIndex + 1), 3); } public Instruction getInstruction(int instructionIndex) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index 0385ae526..d72e079f6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -84,19 +84,19 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE p_149666_2_) { + public void fillItemCategory(ItemGroup p_149666_1_, NonNullList p_149666_2_) { p_149666_2_.add(AllItems.BELT_CONNECTOR.asStack()); } @Override protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) { - return super.areStatesKineticallyEquivalent(oldState, newState) && oldState.get(PART) == newState.get(PART); + return super.areStatesKineticallyEquivalent(oldState, newState) && oldState.getValue(PART) == newState.getValue(PART); } @Override @@ -109,10 +109,10 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE getDrops(BlockState state, net.minecraft.loot.LootContext.Builder builder) { List drops = super.getDrops(state, builder); - TileEntity tileEntity = builder.get(LootParameters.BLOCK_ENTITY); + TileEntity tileEntity = builder.getOptionalParameter(LootParameters.BLOCK_ENTITY); if (tileEntity instanceof BeltTileEntity && ((BeltTileEntity) tileEntity).hasPulley()) drops.addAll(AllBlocks.SHAFT.getDefaultState() .getDrops(builder)); @@ -143,7 +143,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE 0) + if (entityIn.getDeltaMovement().y > 0) return; if (!entityIn.isAlive()) return; @@ -220,7 +220,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE te.applyColor(DyeColor.getColor(heldItem))); return ActionResultType.SUCCESS; } @@ -263,7 +263,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE te.setCasingType(CasingType.BRASS)); @@ -297,7 +297,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE te.setCasingType(CasingType.ANDESITE)); @@ -309,21 +309,21 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE te.setCasingType(CasingType.NONE)); return ActionResultType.SUCCESS; } - if (state.get(PART) == BeltPart.PULLEY) { - if (world.isRemote) + if (state.getValue(PART) == BeltPart.PULLEY) { + if (world.isClientSide) return ActionResultType.SUCCESS; - KineticTileEntity.switchToBlockState(world, pos, state.with(PART, BeltPart.MIDDLE)); + KineticTileEntity.switchToBlockState(world, pos, state.setValue(PART, BeltPart.MIDDLE)); if (player != null && !player.isCreative()) player.inventory.placeItemBackInInventory(world, AllBlocks.SHAFT.asStack()); return ActionResultType.SUCCESS; @@ -333,9 +333,9 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(SLOPE, PART, CASING); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override @@ -387,15 +387,15 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE required = new ArrayList<>(); - if (state.get(PART) != BeltPart.MIDDLE) + if (state.getValue(PART) != BeltPart.MIDDLE) required.add(AllBlocks.SHAFT.asStack()); - if (state.get(PART) == BeltPart.START) + if (state.getValue(PART) == BeltPart.START) required.add(AllItems.BELT_CONNECTOR.asStack()); if (required.isEmpty()) return ItemRequirement.NONE; @@ -599,22 +599,22 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - Boolean casing = state.get(BeltBlock.CASING); + Boolean casing = state.getValue(BeltBlock.CASING); if (!casing) return prov.models() .getExistingFile(prov.modLoc("block/belt/particle")); - BeltPart part = state.get(BeltBlock.PART); - Direction direction = state.get(BeltBlock.HORIZONTAL_FACING); - BeltSlope slope = state.get(BeltBlock.SLOPE); + BeltPart part = state.getValue(BeltBlock.PART); + Direction direction = state.getValue(BeltBlock.HORIZONTAL_FACING); + BeltSlope slope = state.getValue(BeltBlock.SLOPE); boolean downward = slope == BeltSlope.DOWNWARD; boolean diagonal = slope == BeltSlope.UPWARD || downward; boolean vertical = slope == BeltSlope.VERTICAL; @@ -63,8 +63,8 @@ public class BeltGenerator extends SpecialBlockStateGen { slope = BeltSlope.SIDEWAYS; String path = "block/" + (casing ? "belt_casing/" : "belt/"); - String slopeName = slope.getString(); - String partName = part.getString(); + String slopeName = slope.getSerializedName(); + String partName = part.getSerializedName(); if (diagonal) slopeName = "diagonal"; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java index 9ce688a16..a2a339ba3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java @@ -18,13 +18,13 @@ public class BeltHelper { return stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY) .isPresent() || stack.getItem() - .isIn(AllItemTags.UPRIGHT_ON_BELT.tag); + .is(AllItemTags.UPRIGHT_ON_BELT.tag); } public static BeltTileEntity getSegmentTE(IWorld world, BlockPos pos) { if (!world.isAreaLoaded(pos, 0)) return null; - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); if (!(tileEntity instanceof BeltTileEntity)) return null; return (BeltTileEntity) tileEntity; @@ -46,36 +46,36 @@ public class BeltHelper { public static BeltTileEntity getBeltAtSegment(BeltTileEntity controller, int segment) { BlockPos pos = getPositionForOffset(controller, segment); - TileEntity te = controller.getWorld() - .getTileEntity(pos); + TileEntity te = controller.getLevel() + .getBlockEntity(pos); if (te == null || !(te instanceof BeltTileEntity)) return null; return (BeltTileEntity) te; } public static BlockPos getPositionForOffset(BeltTileEntity controller, int offset) { - BlockPos pos = controller.getPos(); + BlockPos pos = controller.getBlockPos(); Vector3i vec = controller.getBeltFacing() - .getDirectionVec(); + .getNormal(); BeltSlope slope = controller.getBlockState() - .get(BeltBlock.SLOPE); + .getValue(BeltBlock.SLOPE); int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0; - return pos.add(offset * vec.getX(), MathHelper.clamp(offset, 0, controller.beltLength - 1) * verticality, + return pos.offset(offset * vec.getX(), MathHelper.clamp(offset, 0, controller.beltLength - 1) * verticality, offset * vec.getZ()); } public static Vector3d getVectorForOffset(BeltTileEntity controller, float offset) { BeltSlope slope = controller.getBlockState() - .get(BeltBlock.SLOPE); + .getValue(BeltBlock.SLOPE); int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0; float verticalMovement = verticality; if (offset < .5) verticalMovement = 0; verticalMovement = verticalMovement * (Math.min(offset, controller.beltLength - .5f) - .5f); - Vector3d vec = VecHelper.getCenterOf(controller.getPos()); - Vector3d horizontalMovement = Vector3d.of(controller.getBeltFacing() - .getDirectionVec()).scale(offset - .5f); + Vector3d vec = VecHelper.getCenterOf(controller.getBlockPos()); + Vector3d horizontalMovement = Vector3d.atLowerCornerOf(controller.getBeltFacing() + .getNormal()).scale(offset - .5f); if (slope == BeltSlope.VERTICAL) horizontalMovement = Vector3d.ZERO; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 510e9f125..749cc33c7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -5,8 +5,9 @@ import java.util.function.Supplier; import com.jozufozu.flywheel.backend.instancing.InstanceData; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.core.PartialModel; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; @@ -15,7 +16,6 @@ import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.AllMaterialSpecs; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.item.DyeColor; import net.minecraft.util.Direction; @@ -43,8 +43,8 @@ public class BeltInstance extends KineticTileInstance { keys = new ArrayList<>(2); - beltSlope = blockState.get(BeltBlock.SLOPE); - facing = blockState.get(BeltBlock.HORIZONTAL_FACING); + beltSlope = blockState.getValue(BeltBlock.SLOPE); + facing = blockState.getValue(BeltBlock.HORIZONTAL_FACING); upward = beltSlope == BeltSlope.UPWARD; diagonal = beltSlope.isDiagonal(); sideways = beltSlope == BeltSlope.SIDEWAYS; @@ -52,7 +52,7 @@ public class BeltInstance extends KineticTileInstance { alongX = facing.getAxis() == Direction.Axis.X; alongZ = facing.getAxis() == Direction.Axis.Z; - BeltPart part = blockState.get(BeltBlock.PART); + BeltPart part = blockState.getValue(BeltBlock.PART); boolean start = part == BeltPart.START; boolean end = part == BeltPart.END; DyeColor color = tile.color.orElse(null); @@ -61,7 +61,9 @@ public class BeltInstance extends KineticTileInstance { PartialModel beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom); SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); - Instancer beltModel = materialManager.getMaterial(AllMaterialSpecs.BELTS).getModel(beltPartial, blockState); + Instancer beltModel = materialManager.defaultSolid() + .material(AllMaterialSpecs.BELTS) + .getModel(beltPartial, blockState); keys.add(setup(beltModel.createInstance(), bottom, spriteShift)); @@ -128,7 +130,7 @@ public class BeltInstance extends KineticTileInstance { Supplier ms = () -> { MatrixStack modelTransform = new MatrixStack(); - MatrixStacker msr = MatrixStacker.of(modelTransform); + MatrixTransformStack msr = MatrixTransformStack.of(modelTransform); msr.centre(); if (axis == Direction.Axis.X) msr.rotateY(90); @@ -144,8 +146,8 @@ public class BeltInstance extends KineticTileInstance { } private Direction getOrientation() { - Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) - .rotateY(); + Direction dir = blockState.getValue(BeltBlock.HORIZONTAL_FACING) + .getClockWise(); if (beltSlope == BeltSlope.SIDEWAYS) dir = Direction.UP; @@ -155,7 +157,7 @@ public class BeltInstance extends KineticTileInstance { private BeltData setup(BeltData key, boolean bottom, SpriteShiftEntry spriteShift) { boolean downward = beltSlope == BeltSlope.DOWNWARD; float rotX = (!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0) + (downward ? 180 : 0) + (sideways ? 90 : 0) + (vertical && alongZ ? 180 : 0); - float rotY = facing.getHorizontalAngle() + ((diagonal ^ alongX) && !downward ? 180 : 0) + (sideways && alongZ ? 180 : 0) + (vertical && alongX ? 90 : 0); + float rotY = facing.toYRot() + ((diagonal ^ alongX) && !downward ? 180 : 0) + (sideways && alongZ ? 180 : 0) + (vertical && alongX ? 90 : 0); float rotZ = (sideways ? 90 : 0) + (vertical && alongX ? 90 : 0); Quaternion q = new Quaternion(rotX, rotY, rotZ, true); @@ -167,8 +169,8 @@ public class BeltInstance extends KineticTileInstance { .setRotationOffset(bottom ? 0.5f : 0f) .setColor(tile) .setPosition(getInstancePosition()) - .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(world.getLightLevel(LightType.SKY, pos)); + .setBlockLight(world.getBrightness(LightType.BLOCK, pos)) + .setSkyLight(world.getBrightness(LightType.SKY, pos)); return key; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java index 668cbad48..5a1539690 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java @@ -51,7 +51,7 @@ public class BeltModel extends BakedModelWrapper { TextureAtlasSprite original = quad.getSprite(); TextureAtlasSprite target = spriteShift.getTarget(); BakedQuad newQuad = QuadHelper.clone(quad); - int[] vertexData = newQuad.getVertexData(); + int[] vertexData = newQuad.getVertices(); for (int vertex = 0; vertex < vertexData.length; vertex += format.getIntegerSize()) { int uvOffset = 16 / 4; @@ -60,9 +60,9 @@ public class BeltModel extends BakedModelWrapper { float u = Float.intBitsToFloat(vertexData[uIndex]); float v = Float.intBitsToFloat(vertexData[vIndex]); vertexData[uIndex] = - Float.floatToRawIntBits(target.getInterpolatedU(SuperByteBuffer.getUnInterpolatedU(original, u))); + Float.floatToRawIntBits(target.getU(SuperByteBuffer.getUnInterpolatedU(original, u))); vertexData[vIndex] = - Float.floatToRawIntBits(target.getInterpolatedV(SuperByteBuffer.getUnInterpolatedV(original, v))); + Float.floatToRawIntBits(target.getV(SuperByteBuffer.getUnInterpolatedV(original, v))); } quads.set(i, newQuad); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java index 90c20c6eb..d864d7bb8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java @@ -8,7 +8,7 @@ public enum BeltPart implements IStringSerializable { START, MIDDLE, END, PULLEY; @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 780de7876..c9fd274bd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -5,6 +5,7 @@ import java.util.function.Supplier; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.core.PartialModel; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; @@ -21,7 +22,6 @@ import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import net.minecraft.block.BlockState; @@ -49,7 +49,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { } @Override - public boolean isGlobalRenderer(BeltTileEntity te) { + public boolean shouldRenderOffScreen(BeltTileEntity te) { return te.isController(); } @@ -57,14 +57,14 @@ public class BeltRenderer extends SafeTileEntityRenderer { protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (!Backend.getInstance().canUseInstancing(te.getWorld())) { + if (!Backend.getInstance().canUseInstancing(te.getLevel())) { BlockState blockState = te.getBlockState(); if (!AllBlocks.BELT.has(blockState)) return; - BeltSlope beltSlope = blockState.get(BeltBlock.SLOPE); - BeltPart part = blockState.get(BeltBlock.PART); - Direction facing = blockState.get(BeltBlock.HORIZONTAL_FACING); + BeltSlope beltSlope = blockState.getValue(BeltBlock.SLOPE); + BeltPart part = blockState.getValue(BeltBlock.PART); + Direction facing = blockState.getValue(BeltBlock.HORIZONTAL_FACING); AxisDirection axisDirection = facing.getAxisDirection(); boolean downward = beltSlope == BeltSlope.DOWNWARD; @@ -76,9 +76,9 @@ public class BeltRenderer extends SafeTileEntityRenderer { boolean alongX = facing.getAxis() == Axis.X; MatrixStack localTransforms = new MatrixStack(); - MatrixStacker msr = MatrixStacker.of(localTransforms); - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - float renderTick = AnimationTickHolder.getRenderTime(te.getWorld()); + MatrixTransformStack msr = MatrixTransformStack.of(localTransforms); + IVertexBuilder vb = buffer.getBuffer(RenderType.solid()); + float renderTick = AnimationTickHolder.getRenderTime(te.getLevel()); msr.centre(); msr.rotateY(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0)); @@ -106,13 +106,13 @@ public class BeltRenderer extends SafeTileEntityRenderer { // UV shift float speed = te.getSpeed(); if (speed != 0 || te.color.isPresent()) { - float time = renderTick * axisDirection.getOffset(); + float time = renderTick * axisDirection.getStep(); if (diagonal && (downward ^ alongX) || !sideways && !diagonal && alongX || sideways && axisDirection == AxisDirection.NEGATIVE) speed = -speed; float scrollMult = diagonal ? 3f / 8f : 0.5f; - float spriteSize = spriteShift.getTarget().getMaxV() - spriteShift.getTarget().getMinV(); + float spriteSize = spriteShift.getTarget().getV1() - spriteShift.getTarget().getV0(); double scroll = speed * time / (31.5 * 16) + (bottom ? 0.5 : 0.0); scroll = scroll - Math.floor(scroll); @@ -130,11 +130,11 @@ public class BeltRenderer extends SafeTileEntityRenderer { } if (te.hasPulley()) { - Direction dir = sideways ? Direction.UP : blockState.get(BeltBlock.HORIZONTAL_FACING).rotateY(); + Direction dir = sideways ? Direction.UP : blockState.getValue(BeltBlock.HORIZONTAL_FACING).getClockWise(); Supplier matrixStackSupplier = () -> { MatrixStack stack = new MatrixStack(); - MatrixStacker stacker = MatrixStacker.of(stack); + MatrixTransformStack stacker = MatrixTransformStack.of(stack); stacker.centre(); if (dir.getAxis() == Axis.X) stacker.rotateY(90); if (dir.getAxis() == Axis.Y) stacker.rotateX(90); @@ -183,26 +183,26 @@ public class BeltRenderer extends SafeTileEntityRenderer { if (te.beltLength == 0) return; - ms.push(); + ms.pushPose(); Direction beltFacing = te.getBeltFacing(); Vector3i directionVec = beltFacing - .getDirectionVec(); - Vector3d beltStartOffset = Vector3d.of(directionVec).scale(-.5) + .getNormal(); + Vector3d beltStartOffset = Vector3d.atLowerCornerOf(directionVec).scale(-.5) .add(.5, 13 / 16f + .125f, .5); ms.translate(beltStartOffset.x, beltStartOffset.y, beltStartOffset.z); BeltSlope slope = te.getBlockState() - .get(BeltBlock.SLOPE); + .getValue(BeltBlock.SLOPE); int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0; boolean slopeAlongX = beltFacing .getAxis() == Axis.X; - boolean onContraption = te.getWorld() instanceof WrappedWorld; + boolean onContraption = te.getLevel() instanceof WrappedWorld; for (TransportedItemStack transported : te.getInventory() .getTransportedItems()) { - ms.push(); - MatrixStacker.of(ms) + ms.pushPose(); + MatrixTransformStack.of(ms) .nudge(transported.angle); float offset = MathHelper.lerp(partialTicks, transported.prevBeltPosition, transported.beltPosition); float sideOffset = MathHelper.lerp(partialTicks, transported.prevSideOffset, transported.sideOffset); @@ -218,7 +218,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { if (offset < .5) verticalMovement = 0; verticalMovement = verticalMovement * (Math.min(offset, te.beltLength - .5f) - .5f); - Vector3d offsetVec = Vector3d.of(directionVec).scale(offset) + Vector3d offsetVec = Vector3d.atLowerCornerOf(directionVec).scale(offset) .add(0, verticalMovement, 0); boolean onSlope = slope != BeltSlope.HORIZONTAL && MathHelper.clamp(offset, .5f, te.beltLength - .5f) == offset; @@ -230,7 +230,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { ms.translate(offsetVec.x, offsetVec.y, offsetVec.z); boolean alongX = beltFacing - .rotateY() + .getClockWise() .getAxis() == Axis.X; if (!alongX) sideOffset *= -1; @@ -239,42 +239,42 @@ public class BeltRenderer extends SafeTileEntityRenderer { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); boolean renderUpright = BeltHelper.isItemUpright(transported.stack); - boolean blockItem = itemRenderer.getItemModelWithOverrides(transported.stack, te.getWorld(), null) + boolean blockItem = itemRenderer.getModel(transported.stack, te.getLevel(), null) .isGui3d(); int count = (int) (MathHelper.log2((int) (transported.stack.getCount()))) / 2; Random r = new Random(transported.angle); - if (Minecraft.getInstance().gameSettings.graphicsMode == GraphicsFanciness.FANCY) { - Vector3d shadowPos = Vector3d.of(te.getPos()).add(beltStartOffset.scale(1) + if (Minecraft.getInstance().options.graphicsMode == GraphicsFanciness.FANCY) { + Vector3d shadowPos = Vector3d.atLowerCornerOf(te.getBlockPos()).add(beltStartOffset.scale(1) .add(offsetVec) .add(alongX ? sideOffset : 0, .39, alongX ? 0 : sideOffset)); ShadowRenderHelper.renderShadow(ms, buffer, shadowPos, .75f, blockItem ? .2f : .2f); } if (renderUpright) { - Entity renderViewEntity = Minecraft.getInstance().renderViewEntity; + Entity renderViewEntity = Minecraft.getInstance().cameraEntity; if (renderViewEntity != null) { - Vector3d positionVec = renderViewEntity.getPositionVec(); + Vector3d positionVec = renderViewEntity.position(); Vector3d vectorForOffset = BeltHelper.getVectorForOffset(te, offset); Vector3d diff = vectorForOffset.subtract(positionVec); float yRot = (float) MathHelper.atan2(diff.z, -diff.x); - ms.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion((float) (yRot + Math.PI / 2))); + ms.mulPose(Vector3f.YP.rotation((float) (yRot + Math.PI / 2))); } ms.translate(0, 3 / 32d, 1 / 16f); } if (!renderUpright) - ms.multiply(new Vector3f(slopeAlongX ? 0 : 1, 0, slopeAlongX ? 1 : 0).getDegreesQuaternion(slopeAngle)); + ms.mulPose(new Vector3f(slopeAlongX ? 0 : 1, 0, slopeAlongX ? 1 : 0).rotationDegrees(slopeAngle)); if (onSlope) ms.translate(0, 1 / 8f, 0); for (int i = 0; i <= count; i++) { - ms.push(); + ms.pushPose(); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(transported.angle)); + ms.mulPose(Vector3f.YP.rotationDegrees(transported.angle)); if (!blockItem && !renderUpright) { ms.translate(0, -.09375, 0); - ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(90)); + ms.mulPose(Vector3f.XP.rotationDegrees(90)); } if (blockItem) { @@ -282,21 +282,21 @@ public class BeltRenderer extends SafeTileEntityRenderer { } ms.scale(.5f, .5f, .5f); - itemRenderer.renderItem(transported.stack, TransformType.FIXED, stackLight, overlay, ms, buffer); - ms.pop(); + itemRenderer.renderStatic(transported.stack, TransformType.FIXED, stackLight, overlay, ms, buffer); + ms.popPose(); if (!renderUpright) { if (!blockItem) - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(10)); + ms.mulPose(Vector3f.YP.rotationDegrees(10)); ms.translate(0, blockItem ? 1 / 64d : 1 / 16d, 0); } else ms.translate(0, 0, -1 / 16f); } - ms.pop(); + ms.popPose(); } - ms.pop(); + ms.popPose(); } protected int getPackedLight(BeltTileEntity controller, float beltPos) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java index 572fc124d..aa20a4d02 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.relays.belt; -import static net.minecraft.block.Block.makeCuboidShape; +import static net.minecraft.block.Block.box; import java.util.HashMap; import java.util.Map; @@ -76,27 +76,27 @@ public class BeltShapes { FLAT_FULL_PART = makeFlatFull(), FLAT_END_PART = makeFlatEnding(); - private static final VoxelShape SOUTH_MASK = makeCuboidShape(0,-5,8,16,16+5,16); - private static final VoxelShape NORTH_MASK = makeCuboidShape(0,-5,0,16,16+5,8); + private static final VoxelShape SOUTH_MASK = box(0,-5,8,16,16+5,16); + private static final VoxelShape NORTH_MASK = box(0,-5,0,16,16+5,8); //Vertical Shapes private static final VoxelShaper VERTICAL_FULL = VerticalBeltShaper.make(FLAT_FULL_PART), VERTICAL_END = VerticalBeltShaper.make(compose(FLAT_END_PART, FLAT_FULL_PART)), VERTICAL_START = VerticalBeltShaper.make(compose(FLAT_FULL_PART, FLAT_END_PART)); - + //Flat Shapes private static final VoxelShaper FLAT_FULL = VoxelShaper.forHorizontalAxis(FLAT_FULL_PART, Axis.Z), FLAT_END = VoxelShaper.forHorizontal(compose(FLAT_END_PART, FLAT_FULL_PART), Direction.SOUTH), FLAT_START = VoxelShaper.forHorizontal(compose(FLAT_FULL_PART, FLAT_END_PART), Direction.SOUTH); - + //Sideways Shapes private static final VoxelShaper SIDE_FULL = VoxelShaper.forHorizontalAxis(SIDEWAYS_FULL_PART, Axis.Z), SIDE_END = VoxelShaper.forHorizontal(compose(SIDEWAYS_END_PART, SIDEWAYS_FULL_PART), Direction.SOUTH), SIDE_START = VoxelShaper.forHorizontal(compose(SIDEWAYS_FULL_PART, SIDEWAYS_END_PART), Direction.SOUTH); - + //Sloped Shapes private static final VoxelShaper SLOPE_DESC = VoxelShaper.forHorizontal(SLOPE_DESC_PART, Direction.SOUTH), @@ -107,20 +107,20 @@ public class BeltShapes { SLOPE_ASC_START = VoxelShaper.forHorizontal(compose(SLOPE_ASC_PART, FLAT_END_PART), Direction.SOUTH); private static final VoxelShaper - PARTIAL_CASING = VoxelShaper.forHorizontal(makeCuboidShape(0, 0, 5, 16, 11, 16), Direction.SOUTH); + PARTIAL_CASING = VoxelShaper.forHorizontal(box(0, 0, 5, 16, 11, 16), Direction.SOUTH); static Map cache = new HashMap<>(); static Map collisionCache = new HashMap<>(); private static VoxelShape compose(VoxelShape southPart, VoxelShape northPart){ return VoxelShapes.or( - VoxelShapes.combine(SOUTH_MASK, southPart, IBooleanFunction.AND), - VoxelShapes.combine(NORTH_MASK, northPart, IBooleanFunction.AND) + VoxelShapes.joinUnoptimized(SOUTH_MASK, southPart, IBooleanFunction.AND), + VoxelShapes.joinUnoptimized(NORTH_MASK, northPart, IBooleanFunction.AND) ); } private static VoxelShape makeSlopePart(boolean ascendingInstead) { - VoxelShape slice = makeCuboidShape(1, 0, 16, 15, 11, 15); + VoxelShape slice = box(1, 0, 16, 15, 11, 15); VoxelShape result = VoxelShapes.empty(); for (int i = 0; i < 16; i++) { @@ -129,7 +129,7 @@ public class BeltShapes { result = VoxelShapes.or( result,//move slice i voxels "right" and i-5 voxels "down" - slice.withOffset(0, yOffset / 16f, -i / 16f)); + slice.move(0, yOffset / 16f, -i / 16f)); } return result; @@ -137,24 +137,24 @@ public class BeltShapes { private static VoxelShape makeFlatEnding(){ return VoxelShapes.or( - makeCuboidShape(1,4,0,15,12,16), - makeCuboidShape(1,3,1,15,13,15) + box(1,4,0,15,12,16), + box(1,3,1,15,13,15) ); } private static VoxelShape makeFlatFull(){ - return makeCuboidShape(1,3,0,15,13,16); + return box(1,3,0,15,13,16); } - + private static VoxelShape makeSidewaysEnding(){ return VoxelShapes.or( - makeCuboidShape(4,1,0,12,15,16), - makeCuboidShape(3,1,1,13,15,15) + box(4,1,0,12,15,16), + box(3,1,1,13,15,15) ); } - + private static VoxelShape makeSidewaysFull(){ - return makeCuboidShape(3,1,0,13,15,16); + return box(3,1,0,13,15,16); } public static VoxelShape getShape(BlockState state) { @@ -164,20 +164,20 @@ public class BeltShapes { cache.put(state, createdShape); return createdShape; } - + public static VoxelShape getCollisionShape(BlockState state) { if (collisionCache.containsKey(state)) return collisionCache.get(state); - VoxelShape createdShape = VoxelShapes.combine(AllShapes.BELT_COLLISION_MASK, getShape(state), IBooleanFunction.AND); + VoxelShape createdShape = VoxelShapes.joinUnoptimized(AllShapes.BELT_COLLISION_MASK, getShape(state), IBooleanFunction.AND); collisionCache.put(state, createdShape); return createdShape; } private static VoxelShape getBeltShape(BlockState state) { - Direction facing = state.get(BeltBlock.HORIZONTAL_FACING); + Direction facing = state.getValue(BeltBlock.HORIZONTAL_FACING); Axis axis = facing.getAxis(); - BeltPart part = state.get(BeltBlock.PART); - BeltSlope slope = state.get(BeltBlock.SLOPE); + BeltPart part = state.getValue(BeltBlock.PART); + BeltSlope slope = state.getValue(BeltBlock.SLOPE); //vertical if (slope == BeltSlope.VERTICAL) { @@ -194,7 +194,7 @@ public class BeltShapes { //flat ending return (part == BeltPart.START ? FLAT_START : FLAT_END).get(facing); } - + //sideways part if (slope == BeltSlope.SIDEWAYS) { if (part == BeltPart.MIDDLE || part == BeltPart.PULLEY) @@ -217,12 +217,12 @@ public class BeltShapes { } private static VoxelShape getCasingShape(BlockState state) { - if (!state.get(BeltBlock.CASING)) + if (!state.getValue(BeltBlock.CASING)) return VoxelShapes.empty(); - Direction facing = state.get(BeltBlock.HORIZONTAL_FACING); - BeltPart part = state.get(BeltBlock.PART); - BeltSlope slope = state.get(BeltBlock.SLOPE); + Direction facing = state.getValue(BeltBlock.HORIZONTAL_FACING); + BeltPart part = state.getValue(BeltBlock.PART); + BeltSlope slope = state.getValue(BeltBlock.SLOPE); if (slope == BeltSlope.VERTICAL) return VoxelShapes.empty(); @@ -242,7 +242,7 @@ public class BeltShapes { return slope == BeltSlope.DOWNWARD ? AllShapes.CASING_11PX.get(Direction.UP) : PARTIAL_CASING.get(facing); //something went wrong - return VoxelShapes.fullCube(); + return VoxelShapes.block(); } private static class VerticalBeltShaper extends VoxelShaper { @@ -254,7 +254,7 @@ public class BeltShapes { Direction.Plane.HORIZONTAL,//idk, this can probably be improved :S direction -> new Vector3d( direction.getAxisDirection() == Direction.AxisDirection.POSITIVE ? 0 : 180, - -direction.getHorizontalAngle(), + -direction.toYRot(), 0)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java index ba8b4a8f5..16114f955 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java @@ -8,7 +8,7 @@ public enum BeltSlope implements IStringSerializable { HORIZONTAL, UPWARD, DOWNWARD, VERTICAL, SIDEWAYS; @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index 5beca0399..30ac4da87 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -105,8 +105,8 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis // Init belt if (beltLength == 0) - BeltBlock.initBelt(world, pos); - if (!AllBlocks.BELT.has(world.getBlockState(pos))) + BeltBlock.initBelt(level, worldPosition); + if (!AllBlocks.BELT.has(level.getBlockState(worldPosition))) return; initializeItemHandler(); @@ -115,7 +115,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis if (!isController()) return; - if (light == null && world.isRemote) { + if (light == null && level.isClientSide) { initializeLight(); LightUpdater.getInstance() .startListening(getBeltVolume(), this); @@ -134,7 +134,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis passengers.forEach((entity, info) -> { boolean canBeTransported = BeltMovementHandler.canBeTransported(entity); boolean leftTheBelt = - info.getTicksSinceLastCollision() > ((getBlockState().get(BeltBlock.SLOPE) != HORIZONTAL) ? 3 : 1); + info.getTicksSinceLastCollision() > ((getBlockState().getValue(BeltBlock.SLOPE) != HORIZONTAL) ? 3 : 1); if (!canBeTransported || leftTheBelt) { toRemove.add(entity); return; @@ -158,15 +158,15 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis if (!isController()) return super.makeRenderBoundingBox(); else - return super.makeRenderBoundingBox().grow(beltLength + 1); + return super.makeRenderBoundingBox().inflate(beltLength + 1); } protected void initializeItemHandler() { - if (world.isRemote || itemHandler.isPresent()) + if (level.isClientSide || itemHandler.isPresent()) return; - if (!world.isBlockPresent(controller)) + if (!level.isLoaded(controller)) return; - TileEntity te = world.getTileEntity(controller); + TileEntity te = level.getBlockEntity(controller); if (te == null || !(te instanceof BeltTileEntity)) return; BeltInventory inventory = ((BeltTileEntity) te).getInventory(); @@ -187,8 +187,8 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); itemHandler.invalidate(); } @@ -214,7 +214,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis super.fromTag(state, compound, clientPacket); if (compound.getBoolean("IsController")) - controller = pos; + controller = worldPosition; color = compound.contains("Dye") ? Optional.of(NBTHelper.readEnum(compound, "Dye", DyeColor.class)) : Optional.empty(); @@ -240,8 +240,8 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis return; if (!isVirtual()) requestModelDataUpdate(); - if (hasWorld()) - world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16); + if (hasLevel()) + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 16); } @Override @@ -260,12 +260,12 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis } else if (color.isPresent() && color.get() == colorIn) return; - for (BlockPos blockPos : BeltBlock.getBeltChain(world, getController())) { - BeltTileEntity belt = BeltHelper.getSegmentTE(world, blockPos); + for (BlockPos blockPos : BeltBlock.getBeltChain(level, getController())) { + BeltTileEntity belt = BeltHelper.getSegmentTE(level, blockPos); if (belt == null) continue; belt.color = Optional.ofNullable(colorIn); - belt.markDirty(); + belt.setChanged(); belt.sendData(); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedRenderDispatcher.enqueueUpdate(belt)); } @@ -274,9 +274,9 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis public BeltTileEntity getControllerTE() { if (controller == null) return null; - if (!world.isBlockPresent(controller)) + if (!level.isLoaded(controller)) return null; - TileEntity te = world.getTileEntity(controller); + TileEntity te = level.getBlockEntity(controller); if (te == null || !(te instanceof BeltTileEntity)) return null; return (BeltTileEntity) te; @@ -287,12 +287,12 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis } public BlockPos getController() { - return controller == null ? pos : controller; + return controller == null ? worldPosition : controller; } public boolean isController() { - return controller != null && pos.getX() == controller.getX() && pos.getY() == controller.getY() - && pos.getZ() == controller.getZ(); + return controller != null && worldPosition.getX() == controller.getX() && worldPosition.getY() == controller.getY() + && worldPosition.getZ() == controller.getZ(); } public float getBeltMovementSpeed() { @@ -301,7 +301,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis public float getDirectionAwareBeltMovementSpeed() { int offset = getBeltFacing().getAxisDirection() - .getOffset(); + .getStep(); if (getBeltFacing().getAxis() == Axis.X) offset *= -1; return getBeltMovementSpeed() * offset; @@ -310,7 +310,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis public boolean hasPulley() { if (!AllBlocks.BELT.has(getBlockState())) return false; - return getBlockState().get(BeltBlock.PART) != MIDDLE; + return getBlockState().getValue(BeltBlock.PART) != MIDDLE; } protected boolean isLastBelt() { @@ -318,15 +318,15 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis return false; Direction direction = getBeltFacing(); - if (getBlockState().get(BeltBlock.SLOPE) == BeltSlope.VERTICAL) + if (getBlockState().getValue(BeltBlock.SLOPE) == BeltSlope.VERTICAL) return false; - BeltPart part = getBlockState().get(BeltBlock.PART); + BeltPart part = getBlockState().getValue(BeltBlock.PART); if (part == MIDDLE) return false; boolean movingPositively = (getSpeed() > 0 == (direction.getAxisDirection() - .getOffset() == 1)) ^ direction.getAxis() == Axis.X; + .getStep() == 1)) ^ direction.getAxis() == Axis.X; return part == BeltPart.START ^ movingPositively; } @@ -343,16 +343,16 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis return BlockPos.ZERO; final BlockState blockState = getBlockState(); - final Direction beltFacing = blockState.get(BlockStateProperties.HORIZONTAL_FACING); - final BeltSlope slope = blockState.get(BeltBlock.SLOPE); - final BeltPart part = blockState.get(BeltBlock.PART); + final Direction beltFacing = blockState.getValue(BlockStateProperties.HORIZONTAL_FACING); + final BeltSlope slope = blockState.getValue(BeltBlock.SLOPE); + final BeltPart part = blockState.getValue(BeltBlock.PART); final Axis axis = beltFacing.getAxis(); - Direction movementFacing = Direction.getFacingFromAxis(axis == Axis.X ? NEGATIVE : POSITIVE, axis); - boolean notHorizontal = blockState.get(BeltBlock.SLOPE) != HORIZONTAL; + Direction movementFacing = Direction.get(axis == Axis.X ? NEGATIVE : POSITIVE, axis); + boolean notHorizontal = blockState.getValue(BeltBlock.SLOPE) != HORIZONTAL; if (getSpeed() < 0) movementFacing = movementFacing.getOpposite(); - Vector3i movement = movementFacing.getDirectionVec(); + Vector3i movement = movementFacing.getNormal(); boolean slopeBeforeHalf = (part == BeltPart.END) == (beltFacing.getAxisDirection() == POSITIVE); boolean onSlope = notHorizontal && (part == MIDDLE || slopeBeforeHalf == firstHalf || ignoreHalves); @@ -366,12 +366,12 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis public Direction getMovementFacing() { Axis axis = getBeltFacing().getAxis(); - return Direction.getFacingFromAxisDirection(axis, + return Direction.fromAxisAndDirection(axis, getBeltMovementSpeed() < 0 ^ axis == Axis.X ? NEGATIVE : POSITIVE); } protected Direction getBeltFacing() { - return getBlockState().get(BlockStateProperties.HORIZONTAL_FACING); + return getBlockState().getValue(BlockStateProperties.HORIZONTAL_FACING); } public BeltInventory getInventory() { @@ -408,15 +408,15 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis if (casing == type) return; if (casing != CasingType.NONE) - world.playEvent(2001, pos, - Block.getStateId(casing == CasingType.ANDESITE ? AllBlocks.ANDESITE_CASING.getDefaultState() + level.levelEvent(2001, worldPosition, + Block.getId(casing == CasingType.ANDESITE ? AllBlocks.ANDESITE_CASING.getDefaultState() : AllBlocks.BRASS_CASING.getDefaultState())); casing = type; boolean shouldBlockHaveCasing = type != CasingType.NONE; BlockState blockState = getBlockState(); - if (blockState.get(BeltBlock.CASING) != shouldBlockHaveCasing) - KineticTileEntity.switchToBlockState(world, pos, blockState.with(BeltBlock.CASING, shouldBlockHaveCasing)); - markDirty(); + if (blockState.getValue(BeltBlock.CASING) != shouldBlockHaveCasing) + KineticTileEntity.switchToBlockState(level, worldPosition, blockState.setValue(BeltBlock.CASING, shouldBlockHaveCasing)); + setChanged(); sendData(); } @@ -424,8 +424,8 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis if (getSpeed() == 0) return false; BlockState state = getBlockState(); - if (state.contains(BeltBlock.SLOPE) - && (state.get(BeltBlock.SLOPE) == BeltSlope.SIDEWAYS || state.get(BeltBlock.SLOPE) == BeltSlope.VERTICAL)) + if (state.hasProperty(BeltBlock.SLOPE) + && (state.getValue(BeltBlock.SLOPE) == BeltSlope.SIDEWAYS || state.getValue(BeltBlock.SLOPE) == BeltSlope.VERTICAL)) return false; return getMovementFacing() != side.getOpposite(); } @@ -441,7 +441,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis if (nextInventory == null) return inserted; - TileEntity teAbove = world.getTileEntity(pos.up()); + TileEntity teAbove = level.getBlockEntity(worldPosition.above()); if (teAbove instanceof BrassTunnelTileEntity) { BrassTunnelTileEntity tunnelTE = (BrassTunnelTileEntity) teAbove; if (tunnelTE.hasDistributionBehaviour()) { @@ -475,7 +475,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis .isVertical()) { if (movementFacing != side) { transportedStack.sideOffset = side.getAxisDirection() - .getOffset() * .35f; + .getStep() * .35f; if (side.getAxis() == Axis.X) transportedStack.sideOffset *= -1; } else @@ -490,7 +490,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis BeltTunnelInteractionHandler.flapTunnel(nextInventory, index, side.getOpposite(), true); nextInventory.addItem(transportedStack); - nextBeltController.markDirty(); + nextBeltController.setChanged(); nextBeltController.sendData(); return empty; } @@ -505,8 +505,8 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis @Override protected boolean canPropagateDiagonally(IRotate block, BlockState state) { - return state.contains(BeltBlock.SLOPE) - && (state.get(BeltBlock.SLOPE) == BeltSlope.UPWARD || state.get(BeltBlock.SLOPE) == BeltSlope.DOWNWARD); + return state.hasProperty(BeltBlock.SLOPE) + && (state.getValue(BeltBlock.SLOPE) == BeltSlope.UPWARD || state.getValue(BeltBlock.SLOPE) == BeltSlope.DOWNWARD); } @Override @@ -519,15 +519,15 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis @Override public boolean shouldRenderNormally() { - if (world == null) + if (level == null) return isController(); BlockState state = getBlockState(); - return state != null && state.contains(BeltBlock.PART) && state.get(BeltBlock.PART) == BeltPart.START; + return state != null && state.hasProperty(BeltBlock.PART) && state.getValue(BeltBlock.PART) == BeltPart.START; } @Override public boolean onLightUpdate(IBlockDisplayReader world, LightType type, GridAlignedBB changed) { - if (this.removed) { + if (this.remove) { return true; } @@ -547,7 +547,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis private GridAlignedBB getBeltVolume() { BlockPos endPos = BeltHelper.getPositionForOffset(this, beltLength - 1); - GridAlignedBB bb = GridAlignedBB.from(pos, endPos); + GridAlignedBB bb = GridAlignedBB.from(worldPosition, endPos); bb.fixMinMax(); return bb; } @@ -556,40 +556,40 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis if (beltLength > 0) { light = new byte[beltLength * 2]; - Vector3i vec = getBeltFacing().getDirectionVec(); - BeltSlope slope = getBlockState().get(BeltBlock.SLOPE); + Vector3i vec = getBeltFacing().getNormal(); + BeltSlope slope = getBlockState().getValue(BeltBlock.SLOPE); int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0; BlockPos.Mutable pos = new BlockPos.Mutable(controller.getX(), controller.getY(), controller.getZ()); for (int i = 0; i < beltLength * 2; i += 2) { - light[i] = (byte) world.getLightLevel(LightType.BLOCK, pos); - light[i + 1] = (byte) world.getLightLevel(LightType.SKY, pos); + light[i] = (byte) level.getBrightness(LightType.BLOCK, pos); + light[i + 1] = (byte) level.getBrightness(LightType.SKY, pos); pos.move(vec.getX(), verticality, vec.getZ()); } } } private void updateBlockLight() { - Vector3i vec = getBeltFacing().getDirectionVec(); - BeltSlope slope = getBlockState().get(BeltBlock.SLOPE); + Vector3i vec = getBeltFacing().getNormal(); + BeltSlope slope = getBlockState().getValue(BeltBlock.SLOPE); int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0; BlockPos.Mutable pos = new BlockPos.Mutable(controller.getX(), controller.getY(), controller.getZ()); for (int i = 0; i < beltLength * 2; i += 2) { - light[i] = (byte) world.getLightLevel(LightType.BLOCK, pos); + light[i] = (byte) level.getBrightness(LightType.BLOCK, pos); pos.move(vec.getX(), verticality, vec.getZ()); } } private void updateSkyLight() { - Vector3i vec = getBeltFacing().getDirectionVec(); - BeltSlope slope = getBlockState().get(BeltBlock.SLOPE); + Vector3i vec = getBeltFacing().getNormal(); + BeltSlope slope = getBlockState().getValue(BeltBlock.SLOPE); int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0; BlockPos.Mutable pos = new BlockPos.Mutable(controller.getX(), controller.getY(), controller.getZ()); for (int i = 1; i < beltLength * 2; i += 2) { - light[i] = (byte) world.getLightLevel(LightType.SKY, pos); + light[i] = (byte) level.getBrightness(LightType.SKY, pos); pos.move(vec.getX(), verticality, vec.getZ()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorHandler.java index 420cf78e5..d6c8d2719 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorHandler.java @@ -29,15 +29,15 @@ public class BeltConnectorHandler { public static void tick() { PlayerEntity player = Minecraft.getInstance().player; - World world = Minecraft.getInstance().world; + World world = Minecraft.getInstance().level; if (player == null || world == null) return; - if (Minecraft.getInstance().currentScreen != null) + if (Minecraft.getInstance().screen != null) return; for (Hand hand : Hand.values()) { - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); if (!AllItems.BELT_CONNECTOR.isIn(heldItem)) continue; @@ -50,12 +50,12 @@ public class BeltConnectorHandler { BlockPos first = NBTUtil.readBlockPos(tag.getCompound("FirstPulley")); - if (!world.getBlockState(first).contains(BlockStateProperties.AXIS)) + if (!world.getBlockState(first).hasProperty(BlockStateProperties.AXIS)) continue; Axis axis = world.getBlockState(first) - .get(BlockStateProperties.AXIS); + .getValue(BlockStateProperties.AXIS); - RayTraceResult rayTrace = Minecraft.getInstance().objectMouseOver; + RayTraceResult rayTrace = Minecraft.getInstance().hitResult; if (rayTrace == null || !(rayTrace instanceof BlockRayTraceResult)) { if (r.nextInt(50) == 0) { world.addParticle(new RedstoneParticleData(.3f, .9f, .5f, 1), @@ -65,25 +65,25 @@ public class BeltConnectorHandler { return; } - BlockPos selected = ((BlockRayTraceResult) rayTrace).getPos(); + BlockPos selected = ((BlockRayTraceResult) rayTrace).getBlockPos(); if (world.getBlockState(selected) .getMaterial() .isReplaceable()) return; if (!ShaftBlock.isShaft(world.getBlockState(selected))) - selected = selected.offset(((BlockRayTraceResult) rayTrace).getFace()); - if (!selected.withinDistance(first, AllConfigs.SERVER.kinetics.maxBeltLength.get())) + selected = selected.relative(((BlockRayTraceResult) rayTrace).getDirection()); + if (!selected.closerThan(first, AllConfigs.SERVER.kinetics.maxBeltLength.get())) return; boolean canConnect = BeltConnectorItem.validateAxis(world, selected) && BeltConnectorItem.canConnect(world, first, selected); - Vector3d start = Vector3d.of(first); - Vector3d end = Vector3d.of(selected); + Vector3d start = Vector3d.atLowerCornerOf(first); + Vector3d end = Vector3d.atLowerCornerOf(selected); Vector3d actualDiff = end.subtract(start); - end = end.subtract(axis.getCoordinate(actualDiff.x, 0, 0), axis.getCoordinate(0, actualDiff.y, 0), - axis.getCoordinate(0, 0, actualDiff.z)); + end = end.subtract(axis.choose(actualDiff.x, 0, 0), axis.choose(0, actualDiff.y, 0), + axis.choose(0, 0, actualDiff.z)); Vector3d diff = end.subtract(start); double x = Math.abs(diff.x); @@ -98,7 +98,7 @@ public class BeltConnectorHandler { for (int i = -1; i <= 1; i++) for (int j = -1; j <= 1; j++) for (int k = -1; k <= 1; k++) { - if (axis.getCoordinate(i, j, k) != 0) + if (axis.choose(i, j, k) != 0) continue; if (axis == Axis.Y && i != 0 && k != 0) continue; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java index 1df40f3b8..e9f63918c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java @@ -41,44 +41,44 @@ public class BeltConnectorItem extends BlockItem { } @Override - public String getTranslationKey() { - return getDefaultTranslationKey(); + public String getDescriptionId() { + return getOrCreateDescriptionId(); } @Override - public void fillItemGroup(ItemGroup p_150895_1_, NonNullList p_150895_2_) { + public void fillItemCategory(ItemGroup p_150895_1_, NonNullList p_150895_2_) { if (p_150895_1_ == Create.BASE_CREATIVE_TAB) return; - super.fillItemGroup(p_150895_1_, p_150895_2_); + super.fillItemCategory(p_150895_1_, p_150895_2_); } @Nonnull @Override - public ActionResultType onItemUse(ItemUseContext context) { + public ActionResultType useOn(ItemUseContext context) { PlayerEntity playerEntity = context.getPlayer(); - if (playerEntity != null && playerEntity.isSneaking()) { - context.getItem() + if (playerEntity != null && playerEntity.isShiftKeyDown()) { + context.getItemInHand() .setTag(null); return ActionResultType.SUCCESS; } - World world = context.getWorld(); - BlockPos pos = context.getPos(); + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); boolean validAxis = validateAxis(world, pos); - if (world.isRemote) + if (world.isClientSide) return validAxis ? ActionResultType.SUCCESS : ActionResultType.FAIL; - CompoundNBT tag = context.getItem() + CompoundNBT tag = context.getItemInHand() .getOrCreateTag(); BlockPos firstPulley = null; // Remove first if no longer existant or valid if (tag.contains("FirstPulley")) { firstPulley = NBTUtil.readBlockPos(tag.getCompound("FirstPulley")); - if (!validateAxis(world, firstPulley) || !firstPulley.withinDistance(pos, maxLength() * 2)) { + if (!validateAxis(world, firstPulley) || !firstPulley.closerThan(pos, maxLength() * 2)) { tag.remove("FirstPulley"); - context.getItem() + context.getItemInHand() .setTag(tag); } } @@ -95,25 +95,25 @@ public class BeltConnectorItem extends BlockItem { createBelts(world, firstPulley, pos); AllTriggers.triggerFor(AllTriggers.CONNECT_BELT, playerEntity); if (!playerEntity.isCreative()) - context.getItem() + context.getItemInHand() .shrink(1); } - if (!context.getItem() + if (!context.getItemInHand() .isEmpty()) { - context.getItem() + context.getItemInHand() .setTag(null); - playerEntity.getCooldownTracker() - .setCooldown(this, 5); + playerEntity.getCooldowns() + .addCooldown(this, 5); } return ActionResultType.SUCCESS; } tag.put("FirstPulley", NBTUtil.writeBlockPos(pos)); - context.getItem() + context.getItemInHand() .setTag(tag); - playerEntity.getCooldownTracker() - .setCooldown(this, 5); + playerEntity.getCooldowns() + .addCooldown(this, 5); return ActionResultType.SUCCESS; } @@ -124,8 +124,8 @@ public class BeltConnectorItem extends BlockItem { BlockPos diff = end.subtract(start); if (diff.getX() == diff.getZ()) - facing = Direction.getFacingFromAxis(facing.getAxisDirection(), world.getBlockState(start) - .get(BlockStateProperties.AXIS) == Axis.X ? Axis.Z : Axis.X); + facing = Direction.get(facing.getAxisDirection(), world.getBlockState(start) + .getValue(BlockStateProperties.AXIS) == Axis.X ? Axis.Z : Axis.X); List beltsToCreate = getBeltChainBetween(start, end, slope, facing); BlockState beltBlock = AllBlocks.BELT.getDefaultState(); @@ -136,11 +136,11 @@ public class BeltConnectorItem extends BlockItem { boolean pulley = ShaftBlock.isShaft(shaftState); if (part == BeltPart.MIDDLE && pulley) part = BeltPart.PULLEY; - if (pulley && shaftState.get(AbstractShaftBlock.AXIS) == Axis.Y) + if (pulley && shaftState.getValue(AbstractShaftBlock.AXIS) == Axis.Y) slope = BeltSlope.SIDEWAYS; - world.setBlockState(pos, beltBlock.with(BeltBlock.SLOPE, slope) - .with(BeltBlock.PART, part) - .with(BeltBlock.HORIZONTAL_FACING, facing), 3); + KineticTileEntity.switchToBlockState(world, pos, beltBlock.setValue(BeltBlock.SLOPE, slope) + .setValue(BeltBlock.PART, part) + .setValue(BeltBlock.HORIZONTAL_FACING, facing)); } } @@ -152,10 +152,10 @@ public class BeltConnectorItem extends BlockItem { if (diff.getX() == 0 && diff.getZ() == 0) axisDirection = diff.getY() > 0 ? AxisDirection.POSITIVE : AxisDirection.NEGATIVE; else - axisDirection = beltAxis.getCoordinate(diff.getX(), 0, diff.getZ()) > 0 ? AxisDirection.POSITIVE + axisDirection = beltAxis.choose(diff.getX(), 0, diff.getZ()) > 0 ? AxisDirection.POSITIVE : AxisDirection.NEGATIVE; - return Direction.getFacingFromAxis(axisDirection, beltAxis); + return Direction.get(axisDirection, beltAxis); } private static BeltSlope getSlopeBetween(BlockPos start, BlockPos end) { @@ -178,13 +178,13 @@ public class BeltConnectorItem extends BlockItem { positions.add(current); if (slope == BeltSlope.VERTICAL) { - current = current.up(direction.getAxisDirection() == AxisDirection.POSITIVE ? 1 : -1); + current = current.above(direction.getAxisDirection() == AxisDirection.POSITIVE ? 1 : -1); continue; } - current = current.offset(direction); + current = current.relative(direction); if (slope != BeltSlope.HORIZONTAL) - current = current.up(slope == BeltSlope.UPWARD ? 1 : -1); + current = current.above(slope == BeltSlope.UPWARD ? 1 : -1); } while (!current.equals(end) && limit-- > 0); @@ -197,12 +197,12 @@ public class BeltConnectorItem extends BlockItem { return false; if (!world.isAreaLoaded(second, 1)) return false; - if (!second.withinDistance(first, maxLength())) + if (!second.closerThan(first, maxLength())) return false; BlockPos diff = second.subtract(first); Axis shaftAxis = world.getBlockState(first) - .get(BlockStateProperties.AXIS); + .getValue(BlockStateProperties.AXIS); int x = diff.getX(); int y = diff.getY(); @@ -210,18 +210,18 @@ public class BeltConnectorItem extends BlockItem { int sames = ((Math.abs(x) == Math.abs(y)) ? 1 : 0) + ((Math.abs(y) == Math.abs(z)) ? 1 : 0) + ((Math.abs(z) == Math.abs(x)) ? 1 : 0); - if (shaftAxis.getCoordinate(x, y, z) != 0) + if (shaftAxis.choose(x, y, z) != 0) return false; if (sames != 1) return false; if (shaftAxis != world.getBlockState(second) - .get(BlockStateProperties.AXIS)) + .getValue(BlockStateProperties.AXIS)) return false; if (shaftAxis == Axis.Y && x != 0 && z != 0) return false; - TileEntity tileEntity = world.getTileEntity(first); - TileEntity tileEntity2 = world.getTileEntity(second); + TileEntity tileEntity = world.getBlockEntity(first); + TileEntity tileEntity2 = world.getBlockEntity(second); if (!(tileEntity instanceof KineticTileEntity)) return false; @@ -235,10 +235,10 @@ public class BeltConnectorItem extends BlockItem { BlockPos step = new BlockPos(Math.signum(diff.getX()), Math.signum(diff.getY()), Math.signum(diff.getZ())); int limit = 1000; - for (BlockPos currentPos = first.add(step); !currentPos.equals(second) && limit-- > 0; currentPos = - currentPos.add(step)) { + for (BlockPos currentPos = first.offset(step); !currentPos.equals(second) && limit-- > 0; currentPos = + currentPos.offset(step)) { BlockState blockState = world.getBlockState(currentPos); - if (ShaftBlock.isShaft(blockState) && blockState.get(AbstractShaftBlock.AXIS) == shaftAxis) + if (ShaftBlock.isShaft(blockState) && blockState.getValue(AbstractShaftBlock.AXIS) == shaftAxis) continue; if (!blockState.getMaterial() .isReplaceable()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java index 39400e412..8399a5788 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java @@ -26,12 +26,12 @@ public class BeltCrusherInteractionHandler { for (int segment = firstUpcomingSegment; beltMovementPositive ? segment <= nextOffset : segment + 1 >= nextOffset; segment += step) { BlockPos crusherPos = BeltHelper.getPositionForOffset(beltInventory.belt, segment) - .up(); - World world = beltInventory.belt.getWorld(); + .above(); + World world = beltInventory.belt.getLevel(); BlockState crusherState = world.getBlockState(crusherPos); if (!(crusherState.getBlock() instanceof CrushingWheelControllerBlock)) continue; - Direction crusherFacing = crusherState.get(CrushingWheelControllerBlock.FACING); + Direction crusherFacing = crusherState.getValue(CrushingWheelControllerBlock.FACING); Direction movementFacing = beltInventory.belt.getMovementFacing(); if (crusherFacing != movementFacing) continue; @@ -46,7 +46,7 @@ public class BeltCrusherInteractionHandler { return false; currentItem.beltPosition = crusherEntry; - TileEntity te = world.getTileEntity(crusherPos); + TileEntity te = world.getBlockEntity(crusherPos); if (!(te instanceof CrushingWheelControllerTileEntity)) return true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java index 8ea4af97f..b2c504191 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java @@ -28,21 +28,21 @@ public class BeltFunnelInteractionHandler { for (int segment = firstUpcomingSegment; beltMovementPositive ? segment <= nextOffset : segment + 1 >= nextOffset; segment += step) { BlockPos funnelPos = BeltHelper.getPositionForOffset(beltInventory.belt, segment) - .up(); - World world = beltInventory.belt.getWorld(); + .above(); + World world = beltInventory.belt.getLevel(); BlockState funnelState = world.getBlockState(funnelPos); if (!(funnelState.getBlock() instanceof BeltFunnelBlock)) continue; - Direction funnelFacing = funnelState.get(BeltFunnelBlock.HORIZONTAL_FACING); + Direction funnelFacing = funnelState.getValue(BeltFunnelBlock.HORIZONTAL_FACING); Direction movementFacing = beltInventory.belt.getMovementFacing(); boolean blocking = funnelFacing == movementFacing.getOpposite(); if (funnelFacing == movementFacing) continue; - if (funnelState.get(BeltFunnelBlock.SHAPE) == Shape.PUSHING) + if (funnelState.getValue(BeltFunnelBlock.SHAPE) == Shape.PUSHING) continue; float funnelEntry = segment + .5f; - if (funnelState.get(BeltFunnelBlock.SHAPE) == Shape.EXTENDED) + if (funnelState.getValue(BeltFunnelBlock.SHAPE) == Shape.EXTENDED) funnelEntry += .499f * (beltMovementPositive ? -1 : 1); boolean hasCrossed = nextOffset > funnelEntry && beltMovementPositive @@ -52,13 +52,13 @@ public class BeltFunnelInteractionHandler { if (blocking) currentItem.beltPosition = funnelEntry; - if (world.isRemote || funnelState.method_28500(BeltFunnelBlock.POWERED).orElse(false)) + if (world.isClientSide || funnelState.getOptionalValue(BeltFunnelBlock.POWERED).orElse(false)) if (blocking) return true; else continue; - TileEntity te = world.getTileEntity(funnelPos); + TileEntity te = world.getBlockEntity(funnelPos); if (!(te instanceof FunnelTileEntity)) return true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index d445f9567..a7e684e09 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -55,7 +55,7 @@ public class BeltInventory { toInsert.clear(); items.removeAll(toRemove); toRemove.clear(); - belt.markDirty(); + belt.setChanged(); belt.sendData(); } @@ -66,7 +66,7 @@ public class BeltInventory { if (beltMovementPositive != belt.getDirectionAwareBeltMovementSpeed() > 0) { beltMovementPositive = !beltMovementPositive; Collections.reverse(items); - belt.markDirty(); + belt.setChanged(); belt.sendData(); } @@ -79,10 +79,10 @@ public class BeltInventory { float beltSpeed = belt.getDirectionAwareBeltMovementSpeed(); Direction movementFacing = belt.getMovementFacing(); boolean horizontal = belt.getBlockState() - .get(BeltBlock.SLOPE) == BeltSlope.HORIZONTAL; + .getValue(BeltBlock.SLOPE) == BeltSlope.HORIZONTAL; float spacing = 1; - World world = belt.getWorld(); - boolean onClient = world.isRemote && !belt.isVirtual(); + World world = belt.getLevel(); + boolean onClient = world.isClientSide && !belt.isVirtual(); // resolve ending only when items will reach it this tick Ending ending = Ending.UNRESOLVED; @@ -105,7 +105,7 @@ public class BeltInventory { movement *= ServerSpeedProvider.get(); // Don't move if held by processing (client) - if (world.isRemote && currentItem.locked) + if (world.isClientSide && currentItem.locked) continue; // Don't move if held by external components @@ -256,7 +256,7 @@ public class BeltInventory { continue; if (stackHandlerBehaviour == null) continue; - if (BeltProcessingBehaviour.isBlocked(belt.getWorld(), BeltHelper.getPositionForOffset(belt, segment))) + if (BeltProcessingBehaviour.isBlocked(belt.getLevel(), BeltHelper.getPositionForOffset(belt, segment))) continue; ProcessingResult result = processingBehaviour.handleReceivedItem(currentItem, stackHandlerBehaviour); @@ -276,12 +276,12 @@ public class BeltInventory { } protected BeltProcessingBehaviour getBeltProcessingAtSegment(int segment) { - return TileEntityBehaviour.get(belt.getWorld(), BeltHelper.getPositionForOffset(belt, segment) - .up(2), BeltProcessingBehaviour.TYPE); + return TileEntityBehaviour.get(belt.getLevel(), BeltHelper.getPositionForOffset(belt, segment) + .above(2), BeltProcessingBehaviour.TYPE); } protected TransportedItemStackHandlerBehaviour getTransportedItemStackHandlerAtSegment(int segment) { - return TileEntityBehaviour.get(belt.getWorld(), BeltHelper.getPositionForOffset(belt, segment), + return TileEntityBehaviour.get(belt.getLevel(), BeltHelper.getPositionForOffset(belt, segment), TransportedItemStackHandlerBehaviour.TYPE); } @@ -296,7 +296,7 @@ public class BeltInventory { } private Ending resolveEnding() { - World world = belt.getWorld(); + World world = belt.getLevel(); BlockPos nextPosition = BeltHelper.getPositionForOffset(belt, beltMovementPositive ? belt.beltLength : -1); // if (AllBlocks.BRASS_BELT_FUNNEL.has(world.getBlockState(lastPosition.up()))) @@ -397,15 +397,15 @@ public class BeltInventory { ItemStack ejected = stack.stack; Vector3d outPos = BeltHelper.getVectorForOffset(belt, stack.beltPosition); float movementSpeed = Math.max(Math.abs(belt.getBeltMovementSpeed()), 1 / 8f); - Vector3d outMotion = Vector3d.of(belt.getBeltChainDirection()).scale(movementSpeed) + Vector3d outMotion = Vector3d.atLowerCornerOf(belt.getBeltChainDirection()).scale(movementSpeed) .add(0, 1 / 8f, 0); outPos = outPos.add(outMotion.normalize().scale(0.001)); - ItemEntity entity = new ItemEntity(belt.getWorld(), outPos.x, outPos.y + 6 / 16f, outPos.z, ejected); - entity.setMotion(outMotion); - entity.setDefaultPickupDelay(); - entity.velocityChanged = true; - belt.getWorld() - .addEntity(entity); + ItemEntity entity = new ItemEntity(belt.getLevel(), outPos.x, outPos.y + 6 / 16f, outPos.z, ejected); + entity.setDeltaMovement(outMotion); + entity.setDefaultPickUpDelay(); + entity.hurtMarked = true; + belt.getLevel() + .addFreshEntity(entity); } public void ejectAll() { @@ -434,7 +434,7 @@ public class BeltInventory { toRemove.add(transported); } if (dirty) { - belt.markDirty(); + belt.setChanged(); belt.sendData(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java index e96ebabdf..6983ce99b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java @@ -43,7 +43,7 @@ public class BeltMovementHandler { public void refresh(BlockPos collision, BlockState belt) { ticksSinceLastCollision = 0; - lastCollidedPos = new BlockPos(collision).toImmutable(); + lastCollidedPos = new BlockPos(collision).immutable(); lastCollidedState = belt; } @@ -60,19 +60,19 @@ public class BeltMovementHandler { public static boolean canBeTransported(Entity entity) { if (!entity.isAlive()) return false; - if (entity instanceof PlayerEntity && ((PlayerEntity) entity).isSneaking()) + if (entity instanceof PlayerEntity && ((PlayerEntity) entity).isShiftKeyDown()) return false; return true; } public static void transportEntity(BeltTileEntity beltTe, Entity entityIn, TransportedEntityInfo info) { BlockPos pos = info.lastCollidedPos; - World world = beltTe.getWorld(); - TileEntity te = world.getTileEntity(pos); - TileEntity tileEntityBelowPassenger = world.getTileEntity(entityIn.getBlockPos()); + World world = beltTe.getLevel(); + TileEntity te = world.getBlockEntity(pos); + TileEntity tileEntityBelowPassenger = world.getBlockEntity(entityIn.blockPosition()); BlockState blockState = info.lastCollidedState; Direction movementFacing = - Direction.getFacingFromAxisDirection(blockState.get(BlockStateProperties.HORIZONTAL_FACING) + Direction.fromAxisAndDirection(blockState.getValue(BlockStateProperties.HORIZONTAL_FACING) .getAxis(), beltTe.getSpeed() < 0 ? POSITIVE : NEGATIVE); boolean collidedWithBelt = te instanceof BeltTileEntity; @@ -85,7 +85,7 @@ public class BeltMovementHandler { // Too slow boolean notHorizontal = beltTe.getBlockState() - .get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL; + .getValue(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL; if (Math.abs(beltTe.getSpeed()) < 1) return; @@ -96,18 +96,18 @@ public class BeltMovementHandler { // Lock entities in place boolean isPlayer = entityIn instanceof PlayerEntity; if (entityIn instanceof LivingEntity && !isPlayer) - ((LivingEntity) entityIn).addPotionEffect(new EffectInstance(Effects.SLOWNESS, 10, 1, false, false)); + ((LivingEntity) entityIn).addEffect(new EffectInstance(Effects.MOVEMENT_SLOWDOWN, 10, 1, false, false)); - final Direction beltFacing = blockState.get(BlockStateProperties.HORIZONTAL_FACING); - final BeltSlope slope = blockState.get(BeltBlock.SLOPE); + final Direction beltFacing = blockState.getValue(BlockStateProperties.HORIZONTAL_FACING); + final BeltSlope slope = blockState.getValue(BeltBlock.SLOPE); final Axis axis = beltFacing.getAxis(); float movementSpeed = beltTe.getBeltMovementSpeed(); - final Direction movementDirection = Direction.getFacingFromAxis(axis == Axis.X ? NEGATIVE : POSITIVE, axis); + final Direction movementDirection = Direction.get(axis == Axis.X ? NEGATIVE : POSITIVE, axis); - Vector3i centeringDirection = Direction.getFacingFromAxis(POSITIVE, beltFacing.rotateY() + Vector3i centeringDirection = Direction.get(POSITIVE, beltFacing.getClockWise() .getAxis()) - .getDirectionVec(); - Vector3d movement = Vector3d.of(movementDirection.getDirectionVec()) + .getNormal(); + Vector3d movement = Vector3d.atLowerCornerOf(movementDirection.getNormal()) .scale(movementSpeed); double diffCenter = @@ -115,7 +115,7 @@ public class BeltMovementHandler { if (Math.abs(diffCenter) > 48 / 64f) return; - BeltPart part = blockState.get(BeltBlock.PART); + BeltPart part = blockState.getValue(BeltBlock.PART); float top = 13 / 16f; boolean onSlope = notHorizontal && (part == BeltPart.MIDDLE || part == BeltPart.PULLEY || part == (slope == BeltSlope.UPWARD ? BeltPart.END : BeltPart.START) && entityIn.getY() - pos.getY() < top @@ -132,19 +132,19 @@ public class BeltMovementHandler { } if (movingUp) - movement = movement.add(0, Math.abs(axis.getCoordinate(movement.x, movement.y, movement.z)), 0); + movement = movement.add(0, Math.abs(axis.choose(movement.x, movement.y, movement.z)), 0); if (movingDown) - movement = movement.add(0, -Math.abs(axis.getCoordinate(movement.x, movement.y, movement.z)), 0); + movement = movement.add(0, -Math.abs(axis.choose(movement.x, movement.y, movement.z)), 0); - Vector3d centering = Vector3d.of(centeringDirection).scale(diffCenter * Math.min(Math.abs(movementSpeed), .1f) * 4); + Vector3d centering = Vector3d.atLowerCornerOf(centeringDirection).scale(diffCenter * Math.min(Math.abs(movementSpeed), .1f) * 4); if (!(entityIn instanceof LivingEntity) - || ((LivingEntity) entityIn).moveForward == 0 && ((LivingEntity) entityIn).moveStrafing == 0) + || ((LivingEntity) entityIn).zza == 0 && ((LivingEntity) entityIn).xxa == 0) movement = movement.add(centering); - float step = entityIn.stepHeight; + float step = entityIn.maxUpStep; if (!isPlayer) - entityIn.stepHeight = 1; + entityIn.maxUpStep = 1; // Entity Collisions if (Math.abs(movementSpeed) < .5f) { @@ -152,12 +152,12 @@ public class BeltMovementHandler { .scale(0.5); AxisAlignedBB bb = entityIn.getBoundingBox(); AxisAlignedBB checkBB = new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); - checkBB = checkBB.offset(checkDistance) - .grow(-Math.abs(checkDistance.x), -Math.abs(checkDistance.y), -Math.abs(checkDistance.z)); - List list = world.getEntitiesWithinAABBExcludingEntity(entityIn, checkBB); + checkBB = checkBB.move(checkDistance) + .inflate(-Math.abs(checkDistance.x), -Math.abs(checkDistance.y), -Math.abs(checkDistance.z)); + List list = world.getEntities(entityIn, checkBB); list.removeIf(e -> shouldIgnoreBlocking(entityIn, e)); if (!list.isEmpty()) { - entityIn.setMotion(0, 0, 0); + entityIn.setDeltaMovement(0, 0, 0); info.ticksSinceLastCollision--; return; } @@ -169,10 +169,10 @@ public class BeltMovementHandler { float minVelocity = .13f; float yMovement = (float) -(Math.max(Math.abs(movement.y), minVelocity)); entityIn.move(SELF, new Vector3d(0, yMovement, 0)); - entityIn.move(SELF, movement.mul(1, 0, 1)); + entityIn.move(SELF, movement.multiply(1, 0, 1)); } else if (movingDown) { - entityIn.move(SELF, movement.mul(1, 0, 1)); - entityIn.move(SELF, movement.mul(0, 1, 0)); + entityIn.move(SELF, movement.multiply(1, 0, 1)); + entityIn.move(SELF, movement.multiply(0, 1, 0)); } else { entityIn.move(SELF, movement); } @@ -180,17 +180,17 @@ public class BeltMovementHandler { entityIn.onGround = true; if (!isPlayer) - entityIn.stepHeight = step; + entityIn.maxUpStep = step; - boolean movedPastEndingSlope = onSlope && (AllBlocks.BELT.has(world.getBlockState(entityIn.getBlockPos())) - || AllBlocks.BELT.has(world.getBlockState(entityIn.getBlockPos() - .down()))); + boolean movedPastEndingSlope = onSlope && (AllBlocks.BELT.has(world.getBlockState(entityIn.blockPosition())) + || AllBlocks.BELT.has(world.getBlockState(entityIn.blockPosition() + .below()))); if (movedPastEndingSlope && !movingDown && Math.abs(movementSpeed) > 0) - entityIn.setPosition(entityIn.getX(), entityIn.getY() + movement.y, entityIn.getZ()); + entityIn.setPos(entityIn.getX(), entityIn.getY() + movement.y, entityIn.getZ()); if (movedPastEndingSlope) { - entityIn.setMotion(movement); - entityIn.velocityChanged = true; + entityIn.setDeltaMovement(movement); + entityIn.hurtMarked = true; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java index 6ff160496..4dee31a2e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java @@ -40,8 +40,8 @@ public class BeltTunnelInteractionHandler { return true; } - World world = beltInventory.belt.getWorld(); - boolean onServer = !world.isRemote || beltInventory.belt.isVirtual(); + World world = beltInventory.belt.getLevel(); + boolean onServer = !world.isClientSide || beltInventory.belt.isVirtual(); boolean removed = false; BeltTunnelTileEntity nextTunnel = getTunnelOnSegment(beltInventory, upcomingSegment); @@ -54,7 +54,7 @@ public class BeltTunnelInteractionHandler { brassTunnel.setStackToDistribute(current.stack); current.stack = ItemStack.EMPTY; beltInventory.belt.sendData(); - beltInventory.belt.markDirty(); + beltInventory.belt.setChanged(); } removed = true; } @@ -62,17 +62,17 @@ public class BeltTunnelInteractionHandler { BlockState blockState = nextTunnel.getBlockState(); if (current.stack.getCount() > 1 && AllBlocks.ANDESITE_TUNNEL.has(blockState) && BeltTunnelBlock.isJunction(blockState) - && movementFacing.getAxis() == blockState.get(BeltTunnelBlock.HORIZONTAL_AXIS)) { + && movementFacing.getAxis() == blockState.getValue(BeltTunnelBlock.HORIZONTAL_AXIS)) { for (Direction d : Iterate.horizontalDirections) { - if (d.getAxis() == blockState.get(BeltTunnelBlock.HORIZONTAL_AXIS)) + if (d.getAxis() == blockState.getValue(BeltTunnelBlock.HORIZONTAL_AXIS)) continue; if (!nextTunnel.flaps.containsKey(d)) continue; - BlockPos outpos = nextTunnel.getPos() - .down() - .offset(d); - if (!world.isBlockPresent(outpos)) + BlockPos outpos = nextTunnel.getBlockPos() + .below() + .relative(d); + if (!world.isLoaded(outpos)) return true; DirectBeltInputBehaviour behaviour = TileEntityBehaviour.get(world, outpos, DirectBeltInputBehaviour.TYPE); @@ -110,13 +110,13 @@ public class BeltTunnelInteractionHandler { Direction movementDirection) { BeltTileEntity belt = beltInventory.belt; BlockPos pos = BeltHelper.getPositionForOffset(belt, offset) - .up(); - if (!(belt.getWorld() + .above(); + if (!(belt.getLevel() .getBlockState(pos) .getBlock() instanceof BrassTunnelBlock)) return false; - TileEntity te = belt.getWorld() - .getTileEntity(pos); + TileEntity te = belt.getLevel() + .getBlockEntity(pos); if (te == null || !(te instanceof BrassTunnelTileEntity)) return false; BrassTunnelTileEntity tunnel = (BrassTunnelTileEntity) te; @@ -133,16 +133,16 @@ public class BeltTunnelInteractionHandler { protected static BeltTunnelTileEntity getTunnelOnSegment(BeltInventory beltInventory, int offset) { BeltTileEntity belt = beltInventory.belt; if (belt.getBlockState() - .get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) + .getValue(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) return null; - return getTunnelOnPosition(belt.getWorld(), BeltHelper.getPositionForOffset(belt, offset)); + return getTunnelOnPosition(belt.getLevel(), BeltHelper.getPositionForOffset(belt, offset)); } public static BeltTunnelTileEntity getTunnelOnPosition(World world, BlockPos pos) { - pos = pos.up(); + pos = pos.above(); if (!(world.getBlockState(pos).getBlock() instanceof BeltTunnelBlock)) return null; - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (te == null || !(te instanceof BeltTunnelTileEntity)) return null; return ((BeltTunnelTileEntity) te); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/ItemHandlerBeltSegment.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/ItemHandlerBeltSegment.java index 896051089..c29866810 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/ItemHandlerBeltSegment.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/ItemHandlerBeltSegment.java @@ -35,7 +35,7 @@ public class ItemHandlerBeltSegment implements IItemHandler { newStack.beltPosition = offset + .5f + (beltInventory.beltMovementPositive ? -1 : 1) / 16f; newStack.prevBeltPosition = newStack.beltPosition; this.beltInventory.addItem(newStack); - this.beltInventory.belt.markDirty(); + this.beltInventory.belt.setChanged(); this.beltInventory.belt.sendData(); } return ItemStack.EMPTY; @@ -52,7 +52,7 @@ public class ItemHandlerBeltSegment implements IItemHandler { amount = Math.min(amount, transported.stack.getCount()); ItemStack extracted = simulate ? transported.stack.copy().split(amount) : transported.stack.split(amount); if (!simulate) { - this.beltInventory.belt.markDirty(); + this.beltInventory.belt.setChanged(); this.beltInventory.belt.sendData(); } return extracted; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java index 85cea6d9a..522d43fb2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java @@ -73,7 +73,7 @@ public class TransportedItemStack implements Comparable { nbt.putFloat("PrevOffset", prevSideOffset); nbt.putInt("InSegment", insertedAt); nbt.putInt("Angle", angle); - nbt.putInt("InDirection", insertedFrom.getIndex()); + nbt.putInt("InDirection", insertedFrom.get3DDataValue()); if (locked) nbt.putBoolean("Locked", locked); if (lockedExternally) @@ -82,14 +82,14 @@ public class TransportedItemStack implements Comparable { } public static TransportedItemStack read(CompoundNBT nbt) { - TransportedItemStack stack = new TransportedItemStack(ItemStack.read(nbt.getCompound("Item"))); + TransportedItemStack stack = new TransportedItemStack(ItemStack.of(nbt.getCompound("Item"))); stack.beltPosition = nbt.getFloat("Pos"); stack.prevBeltPosition = nbt.getFloat("PrevPos"); stack.sideOffset = nbt.getFloat("Offset"); stack.prevSideOffset = nbt.getFloat("PrevOffset"); stack.insertedAt = nbt.getInt("InSegment"); stack.angle = nbt.getInt("Angle"); - stack.insertedFrom = Direction.byIndex(nbt.getInt("InDirection")); + stack.insertedFrom = Direction.from3DDataValue(nbt.getInt("InDirection")); stack.locked = nbt.getBoolean("Locked"); stack.lockedExternally = nbt.getBoolean("LockedExternally"); return stack; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java index ec3e1aff9..992bb5a84 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/AbstractShaftBlock.java @@ -35,7 +35,7 @@ public abstract class AbstractShaftBlock extends RotatedPillarKineticBlock public AbstractShaftBlock(Properties properties) { super(properties); - setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); + registerDefaultState(super.defaultBlockState().setValue(BlockStateProperties.WATERLOGGED, false)); } @Override @@ -44,7 +44,7 @@ public abstract class AbstractShaftBlock extends RotatedPillarKineticBlock } @Override - public PushReaction getPushReaction(BlockState state) { + public PushReaction getPistonPushReaction(BlockState state) { return PushReaction.NORMAL; } @@ -55,52 +55,52 @@ public abstract class AbstractShaftBlock extends RotatedPillarKineticBlock @Override @SuppressWarnings("deprecation") - public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { if (state != newState && !isMoving) - removeBracket(world, pos, true).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); - super.onReplaced(state, world, pos, newState, isMoving); + removeBracket(world, pos, true).ifPresent(stack -> Block.popResource(world, pos, stack)); + super.onRemove(state, world, pos, newState, isMoving); } // IRotate: @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.get(AXIS); + return face.getAxis() == state.getValue(AXIS); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(AXIS); + return state.getValue(AXIS); } @Override public FluidState getFluidState(BlockState state) { - return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) - : Fluids.EMPTY.getDefaultState(); + return state.getValue(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getSource(false) + : Fluids.EMPTY.defaultFluidState(); } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(BlockStateProperties.WATERLOGGED); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, IWorld world, BlockPos pos, BlockPos neighbourPos) { - if (state.get(BlockStateProperties.WATERLOGGED)) { - world.getPendingFluidTicks() - .scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + if (state.getValue(BlockStateProperties.WATERLOGGED)) { + world.getLiquidTicks() + .scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return state; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - FluidState ifluidstate = context.getWorld() - .getFluidState(context.getPos()); - return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, - Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + FluidState ifluidstate = context.getLevel() + .getFluidState(context.getClickedPos()); + return super.getStateForPlacement(context).setValue(BlockStateProperties.WATERLOGGED, + Boolean.valueOf(ifluidstate.getType() == Fluids.WATER)); } @Override @@ -110,13 +110,13 @@ public abstract class AbstractShaftBlock extends RotatedPillarKineticBlock return Optional.empty(); BlockState bracket = behaviour.getBracket(); behaviour.removeBracket(inOnReplacedContext); - if (bracket == Blocks.AIR.getDefaultState()) + if (bracket == Blocks.AIR.defaultBlockState()) return Optional.empty(); return Optional.of(new ItemStack(bracket.getBlock())); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java index 390a3ed1d..e4a432b7f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java @@ -67,8 +67,8 @@ public class BracketedKineticBlockModel extends BakedModelWrapper { public void putBracket(BlockState state) { this.bracket = Minecraft.getInstance() - .getBlockRendererDispatcher() - .getModelForState(state); + .getBlockRenderer() + .getBlockModel(state); } public IBakedModel getBracket() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java index c926acd2f..1e677317c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java @@ -64,8 +64,8 @@ public class BracketedTileEntityBehaviour extends TileEntityBehaviour { public void removeBracket(boolean inOnReplacedContext) { World world = getWorld(); - if (!world.isRemote) - world.playEvent(2001, getPos(), Block.getStateId(getBracket())); + if (!world.isClientSide) + world.levelEvent(2001, getPos(), Block.getId(getBracket())); this.bracket = Optional.empty(); reRender = true; if (inOnReplacedContext) @@ -75,11 +75,11 @@ public class BracketedTileEntityBehaviour extends TileEntityBehaviour { } public boolean isBracketPresent() { - return getBracket() != Blocks.AIR.getDefaultState(); + return getBracket() != Blocks.AIR.defaultBlockState(); } public BlockState getBracket() { - return bracket.orElse(Blocks.AIR.getDefaultState()); + return bracket.orElse(Blocks.AIR.defaultBlockState()); } @Override @@ -108,7 +108,7 @@ public class BracketedTileEntityBehaviour extends TileEntityBehaviour { if (nbt.contains("Bracket")) bracket = Optional.of(NBTUtil.readBlockState(nbt.getCompound("Bracket"))); if (clientPacket && nbt.contains("Redraw")) - getWorld().notifyBlockUpdate(getPos(), tileEntity.getBlockState(), tileEntity.getBlockState(), 16); + getWorld().sendBlockUpdated(getPos(), tileEntity.getBlockState(), tileEntity.getBlockState(), 16); super.read(nbt, clientPacket); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java index 7662c10f5..b22bb9457 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java @@ -54,12 +54,12 @@ public class CogWheelBlock extends AbstractShaftBlock implements ICogWheel { @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return (isLarge ? AllShapes.LARGE_GEAR : AllShapes.SMALL_GEAR).get(state.get(AXIS)); + return (isLarge ? AllShapes.LARGE_GEAR : AllShapes.SMALL_GEAR).get(state.getValue(AXIS)); } @Override - public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { - return isValidCogwheelPosition(ICogWheel.isLargeCog(state), worldIn, pos, state.get(AXIS)); + public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos) { + return isValidCogwheelPosition(ICogWheel.isLargeCog(state), worldIn, pos, state.getValue(AXIS)); } public static boolean isValidCogwheelPosition(boolean large, IWorldReader worldIn, BlockPos pos, Axis cogAxis) { @@ -67,9 +67,9 @@ public class CogWheelBlock extends AbstractShaftBlock implements ICogWheel { if (facing.getAxis() == cogAxis) continue; - BlockPos offsetPos = pos.offset(facing); + BlockPos offsetPos = pos.relative(facing); BlockState blockState = worldIn.getBlockState(offsetPos); - if (blockState.contains(AXIS) && facing.getAxis() == blockState.get(AXIS)) + if (blockState.hasProperty(AXIS) && facing.getAxis() == blockState.getValue(AXIS)) continue; if (ICogWheel.isLargeCog(blockState) || large && ICogWheel.isSmallCog(blockState)) @@ -79,16 +79,16 @@ public class CogWheelBlock extends AbstractShaftBlock implements ICogWheel { } protected Axis getAxisForPlacement(BlockItemUseContext context) { - if (context.getPlayer() != null && context.getPlayer().isSneaking()) - return context.getFace().getAxis(); + if (context.getPlayer() != null && context.getPlayer().isShiftKeyDown()) + return context.getClickedFace().getAxis(); - World world = context.getWorld(); - BlockState stateBelow = world.getBlockState(context.getPos().down()); + World world = context.getLevel(); + BlockState stateBelow = world.getBlockState(context.getClickedPos().below()); if (AllBlocks.ROTATION_SPEED_CONTROLLER.has(stateBelow) && isLargeCog()) - return stateBelow.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X; + return stateBelow.getValue(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X; - BlockPos placedOnPos = context.getPos().offset(context.getFace().getOpposite()); + BlockPos placedOnPos = context.getClickedPos().relative(context.getClickedFace().getOpposite()); BlockState placedAgainst = world.getBlockState(placedOnPos); Block block = placedAgainst.getBlock(); @@ -96,15 +96,15 @@ public class CogWheelBlock extends AbstractShaftBlock implements ICogWheel { return ((IRotate) block).getRotationAxis(placedAgainst); Axis preferredAxis = getPreferredAxis(context); - return preferredAxis != null ? preferredAxis : context.getFace().getAxis(); + return preferredAxis != null ? preferredAxis : context.getClickedFace().getAxis(); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - boolean shouldWaterlog = context.getWorld().getFluidState(context.getPos()).getFluid() == Fluids.WATER; - return this.getDefaultState() - .with(AXIS, getAxisForPlacement(context)) - .with(BlockStateProperties.WATERLOGGED, shouldWaterlog); + boolean shouldWaterlog = context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER; + return this.defaultBlockState() + .setValue(AXIS, getAxisForPlacement(context)) + .setValue(BlockStateProperties.WATERLOGGED, shouldWaterlog); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java index a1e96d272..23b34992a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java @@ -46,21 +46,21 @@ public class CogwheelBlockItem extends BlockItem { @Override public ActionResultType onItemUseFirst(ItemStack stack, ItemUseContext context) { - World world = context.getWorld(); - BlockPos pos = context.getPos(); + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); BlockState state = world.getBlockState(pos); IPlacementHelper helper = PlacementHelpers.get(placementHelperId); PlayerEntity player = context.getPlayer(); - BlockRayTraceResult ray = new BlockRayTraceResult(context.getHitVec(), context.getFace(), pos, true); - if (helper.matchesState(state) && player != null && !player.isSneaking()) { + BlockRayTraceResult ray = new BlockRayTraceResult(context.getClickLocation(), context.getClickedFace(), pos, true); + if (helper.matchesState(state) && player != null && !player.isShiftKeyDown()) { return helper.getOffset(player, world, state, pos, ray).placeInWorld(world, this, player, context.getHand(), ray); } if (integratedCogHelperId != -1) { helper = PlacementHelpers.get(integratedCogHelperId); - if (helper.matchesState(state) && player != null && !player.isSneaking()) { + if (helper.matchesState(state) && player != null && !player.isShiftKeyDown()) { return helper.getOffset(player, world, state, pos, ray).placeInWorld(world, this, player, context.getHand(), ray); } } @@ -71,33 +71,33 @@ public class CogwheelBlockItem extends BlockItem { @Override // Trigger cogwheel criterion protected boolean placeBlock(BlockItemUseContext context, BlockState state) { - triggerShiftingGearsAdvancement(context.getWorld(), context.getPos(), state, context.getPlayer()); + triggerShiftingGearsAdvancement(context.getLevel(), context.getClickedPos(), state, context.getPlayer()); return super.placeBlock(context, state); } protected void triggerShiftingGearsAdvancement(World world, BlockPos pos, BlockState state, PlayerEntity player) { - if (world.isRemote || player == null) + if (world.isClientSide || player == null) return; - Axis axis = state.get(CogWheelBlock.AXIS); + Axis axis = state.getValue(CogWheelBlock.AXIS); for (Axis perpendicular1 : Iterate.axes) { if (perpendicular1 == axis) continue; - Direction d1 = Direction.getFacingFromAxis(AxisDirection.POSITIVE, perpendicular1); + Direction d1 = Direction.get(AxisDirection.POSITIVE, perpendicular1); for (Axis perpendicular2 : Iterate.axes) { if (perpendicular1 == perpendicular2) continue; if (axis == perpendicular2) continue; - Direction d2 = Direction.getFacingFromAxis(AxisDirection.POSITIVE, perpendicular2); + Direction d2 = Direction.get(AxisDirection.POSITIVE, perpendicular2); for (int offset1 : Iterate.positiveAndNegative) { for (int offset2 : Iterate.positiveAndNegative) { - BlockPos connectedPos = pos.offset(d1, offset1) - .offset(d2, offset2); + BlockPos connectedPos = pos.relative(d1, offset1) + .relative(d2, offset2); BlockState blockState = world.getBlockState(connectedPos); if (!(blockState.getBlock() instanceof CogWheelBlock)) continue; - if (blockState.get(CogWheelBlock.AXIS) != axis) + if (blockState.getValue(CogWheelBlock.AXIS) != axis) continue; if (ICogWheel.isLargeCog(blockState) == large) continue; @@ -123,12 +123,12 @@ public class CogwheelBlockItem extends BlockItem { if (!((CogWheelBlock) state.getBlock()).isLarge) { List directions = - IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS)); + IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getLocation(), state.getValue(AXIS)); for (Direction dir : directions) { - BlockPos newPos = pos.offset(dir); + BlockPos newPos = pos.relative(dir); - if (!CogWheelBlock.isValidCogwheelPosition(false, world, newPos, state.get(AXIS))) + if (!CogWheelBlock.isValidCogwheelPosition(false, world, newPos, state.getValue(AXIS))) continue; if (!world.getBlockState(newPos) @@ -136,7 +136,7 @@ public class CogwheelBlockItem extends BlockItem { .isReplaceable()) continue; - return PlacementOffset.success(newPos, s -> s.with(AXIS, state.get(AXIS))); + return PlacementOffset.success(newPos, s -> s.setValue(AXIS, state.getValue(AXIS))); } @@ -161,13 +161,13 @@ public class CogwheelBlockItem extends BlockItem { return PlacementOffset.fail(); if (((CogWheelBlock) state.getBlock()).isLarge) { - Direction side = IPlacementHelper.orderedByDistanceOnlyAxis(pos, ray.getHitVec(), state.get(AXIS)) + Direction side = IPlacementHelper.orderedByDistanceOnlyAxis(pos, ray.getLocation(), state.getValue(AXIS)) .get(0); List directions = - IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS)); + IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getLocation(), state.getValue(AXIS)); for (Direction dir : directions) { - BlockPos newPos = pos.offset(dir) - .offset(side); + BlockPos newPos = pos.relative(dir) + .relative(side); if (!CogWheelBlock.isValidCogwheelPosition(true, world, newPos, dir.getAxis())) continue; @@ -177,7 +177,7 @@ public class CogwheelBlockItem extends BlockItem { .isReplaceable()) continue; - return PlacementOffset.success(newPos, s -> s.with(AXIS, dir.getAxis())); + return PlacementOffset.success(newPos, s -> s.setValue(AXIS, dir.getAxis())); } return PlacementOffset.fail(); @@ -198,34 +198,34 @@ public class CogwheelBlockItem extends BlockItem { @Override public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { // diagonal gears of different size - Direction closest = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS)) + Direction closest = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getLocation(), state.getValue(AXIS)) .get(0); - List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), - state.get(AXIS), d -> d.getAxis() != closest.getAxis()); + List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getLocation(), + state.getValue(AXIS), d -> d.getAxis() != closest.getAxis()); for (Direction dir : directions) { - BlockPos newPos = pos.offset(dir) - .offset(closest); + BlockPos newPos = pos.relative(dir) + .relative(closest); if (!world.getBlockState(newPos) .getMaterial() .isReplaceable()) continue; - if (!CogWheelBlock.isValidCogwheelPosition(ICogWheel.isLargeCog(state), world, newPos, state.get(AXIS))) + if (!CogWheelBlock.isValidCogwheelPosition(ICogWheel.isLargeCog(state), world, newPos, state.getValue(AXIS))) continue; - return PlacementOffset.success(newPos, s -> s.with(AXIS, state.get(AXIS))); + return PlacementOffset.success(newPos, s -> s.setValue(AXIS, state.getValue(AXIS))); } return PlacementOffset.fail(); } protected boolean hitOnShaft(BlockState state, BlockRayTraceResult ray) { - return AllShapes.SIX_VOXEL_POLE.get(state.get(AXIS)) - .getBoundingBox() - .grow(0.001) - .contains(ray.getHitVec() - .subtract(ray.getHitVec() + return AllShapes.SIX_VOXEL_POLE.get(state.getValue(AXIS)) + .bounds() + .inflate(0.001) + .contains(ray.getLocation() + .subtract(ray.getLocation() .align(Iterate.axisSet))); } } @@ -245,14 +245,14 @@ public class CogwheelBlockItem extends BlockItem { @Override public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { - Direction face = ray.getFace(); + Direction face = ray.getDirection(); Axis newAxis; - if (state.contains(HorizontalKineticBlock.HORIZONTAL_FACING)) - newAxis = state.get(HorizontalKineticBlock.HORIZONTAL_FACING) + if (state.hasProperty(HorizontalKineticBlock.HORIZONTAL_FACING)) + newAxis = state.getValue(HorizontalKineticBlock.HORIZONTAL_FACING) .getAxis(); - else if (state.contains(DirectionalKineticBlock.FACING)) - newAxis = state.get(DirectionalKineticBlock.FACING) + else if (state.hasProperty(DirectionalKineticBlock.FACING)) + newAxis = state.getValue(DirectionalKineticBlock.FACING) .getAxis(); else newAxis = Axis.Y; @@ -261,11 +261,11 @@ public class CogwheelBlockItem extends BlockItem { return PlacementOffset.fail(); List directions = - IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), face.getAxis(), newAxis); + IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getLocation(), face.getAxis(), newAxis); for (Direction d : directions) { - BlockPos newPos = pos.offset(face) - .offset(d); + BlockPos newPos = pos.relative(face) + .relative(d); if (!world.getBlockState(newPos) .getMaterial() @@ -275,7 +275,7 @@ public class CogwheelBlockItem extends BlockItem { if (!CogWheelBlock.isValidCogwheelPosition(false, world, newPos, newAxis)) return PlacementOffset.fail(); - return PlacementOffset.success(newPos, s -> s.with(CogWheelBlock.AXIS, newAxis)); + return PlacementOffset.success(newPos, s -> s.setValue(CogWheelBlock.AXIS, newAxis)); } return PlacementOffset.fail(); @@ -298,14 +298,14 @@ public class CogwheelBlockItem extends BlockItem { @Override public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { - Direction face = ray.getFace(); + Direction face = ray.getDirection(); Axis newAxis; - if (state.contains(HorizontalKineticBlock.HORIZONTAL_FACING)) - newAxis = state.get(HorizontalKineticBlock.HORIZONTAL_FACING) + if (state.hasProperty(HorizontalKineticBlock.HORIZONTAL_FACING)) + newAxis = state.getValue(HorizontalKineticBlock.HORIZONTAL_FACING) .getAxis(); - else if (state.contains(DirectionalKineticBlock.FACING)) - newAxis = state.get(DirectionalKineticBlock.FACING) + else if (state.hasProperty(DirectionalKineticBlock.FACING)) + newAxis = state.getValue(DirectionalKineticBlock.FACING) .getAxis(); else newAxis = Axis.Y; @@ -313,10 +313,10 @@ public class CogwheelBlockItem extends BlockItem { if (face.getAxis() == newAxis) return PlacementOffset.fail(); - List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), newAxis); + List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getLocation(), newAxis); for (Direction d : directions) { - BlockPos newPos = pos.offset(d); + BlockPos newPos = pos.relative(d); if (!world.getBlockState(newPos) .getMaterial() @@ -328,7 +328,7 @@ public class CogwheelBlockItem extends BlockItem { return PlacementOffset.success() .at(newPos) - .withTransform(s -> s.with(CogWheelBlock.AXIS, newAxis)); + .withTransform(s -> s.setValue(CogWheelBlock.AXIS, newAxis)); } return PlacementOffset.fail(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java index 51c02d3af..c00d1a77f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java @@ -40,7 +40,7 @@ public class ShaftBlock extends AbstractShaftBlock { @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.SIX_VOXEL_POLE.get(state.get(AXIS)); + return AllShapes.SIX_VOXEL_POLE.get(state.getValue(AXIS)); } @Override @@ -54,12 +54,12 @@ public class ShaftBlock extends AbstractShaftBlock { } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { - if (player.isSneaking() || !player.isAllowEdit()) + if (player.isShiftKeyDown() || !player.mayBuild()) return ActionResultType.PASS; - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); for (EncasedShaftBlock encasedShaft : new EncasedShaftBlock[] { AllBlocks.ANDESITE_ENCASED_SHAFT.get(), AllBlocks.BRASS_ENCASED_SHAFT.get() }) { @@ -67,12 +67,12 @@ public class ShaftBlock extends AbstractShaftBlock { .isIn(heldItem)) continue; - if (world.isRemote) + if (world.isClientSide) return ActionResultType.SUCCESS; AllTriggers.triggerFor(AllTriggers.CASING_SHAFT, player); - KineticTileEntity.switchToBlockState(world, pos, encasedShaft.getDefaultState() - .with(AXIS, state.get(AXIS))); + KineticTileEntity.switchToBlockState(world, pos, encasedShaft.defaultBlockState() + .setValue(AXIS, state.getValue(AXIS))); return ActionResultType.SUCCESS; } @@ -90,7 +90,7 @@ public class ShaftBlock extends AbstractShaftBlock { private PlacementHelper(){ super( state -> state.getBlock() instanceof AbstractShaftBlock, - state -> state.get(AXIS), + state -> state.getValue(AXIS), AXIS ); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java index 5c651a8a7..4545e3f4a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java @@ -27,7 +27,7 @@ public class SimpleKineticTileEntity extends KineticTileEntity { @Override public AxisAlignedBB makeRenderBoundingBox() { - return new AxisAlignedBB(pos).grow(1); + return new AxisAlignedBB(worldPosition).inflate(1); } @Override @@ -35,10 +35,10 @@ public class SimpleKineticTileEntity extends KineticTileEntity { if (!ICogWheel.isLargeCog(state)) return super.addPropagationLocations(block, state, neighbours); - BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1)) + BlockPos.betweenClosedStream(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1)) .forEach(offset -> { - if (offset.distanceSq(0, 0, 0, false) == BlockPos.ZERO.distanceSq(1, 1, 0, false)) - neighbours.add(pos.add(offset)); + if (offset.distSqr(0, 0, 0, false) == BlockPos.ZERO.distSqr(1, 1, 0, false)) + neighbours.add(worldPosition.offset(offset)); }); return neighbours; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AbstractEncasedShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AbstractEncasedShaftBlock.java index df29e6e41..2dcbf534f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AbstractEncasedShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AbstractEncasedShaftBlock.java @@ -21,8 +21,8 @@ public abstract class AbstractEncasedShaftBlock extends RotatedPillarKineticBloc } @Override - protected void fillStateContainer(StateContainer.Builder builder) { - super.fillStateContainer(builder); + protected void createBlockStateDefinition(StateContainer.Builder builder) { + super.createBlockStateDefinition(builder); } @Override @@ -31,28 +31,28 @@ public abstract class AbstractEncasedShaftBlock extends RotatedPillarKineticBloc } @Override - public PushReaction getPushReaction(@Nullable BlockState state) { + public PushReaction getPistonPushReaction(@Nullable BlockState state) { return PushReaction.NORMAL; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { if (context.getPlayer() != null && context.getPlayer() - .isSneaking()) + .isShiftKeyDown()) return super.getStateForPlacement(context); Direction.Axis preferredAxis = getPreferredAxis(context); - return this.getDefaultState() - .with(AXIS, preferredAxis == null ? context.getNearestLookingDirection() + return this.defaultBlockState() + .setValue(AXIS, preferredAxis == null ? context.getNearestLookingDirection() .getAxis() : preferredAxis); } @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.get(AXIS); + return face.getAxis() == state.getValue(AXIS); } @Override public Direction.Axis getRotationAxis(BlockState state) { - return state.get(AXIS); + return state.getValue(AXIS); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyBlock.java index 5ecd6ee43..54b44f711 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyBlock.java @@ -20,12 +20,12 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements ITE builder) { - super.fillStateContainer(builder.add(POWERED)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(POWERED)); } @Override @@ -34,8 +34,8 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements ITE builder) { - super.fillStateContainer(builder.add(PART, CONNECTED_ALONG_FIRST_COORDINATE)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(PART, CONNECTED_ALONG_FIRST_COORDINATE)); } @Override @@ -58,28 +58,28 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { Axis placedAxis = context.getNearestLookingDirection() .getAxis(); Axis axis = context.getPlayer() != null && context.getPlayer() - .isSneaking() ? placedAxis : getPreferredAxis(context); + .isShiftKeyDown() ? placedAxis : getPreferredAxis(context); if (axis == null) axis = placedAxis; - BlockState state = getDefaultState().with(AXIS, axis); + BlockState state = defaultBlockState().setValue(AXIS, axis); for (Direction facing : Iterate.directions) { if (facing.getAxis() == axis) continue; - BlockPos pos = context.getPos(); - BlockPos offset = pos.offset(facing); - state = updatePostPlacement(state, facing, context.getWorld() - .getBlockState(offset), context.getWorld(), pos, offset); + BlockPos pos = context.getClickedPos(); + BlockPos offset = pos.relative(facing); + state = updateShape(state, facing, context.getLevel() + .getBlockState(offset), context.getLevel(), pos, offset); } return state; } @Override - public BlockState updatePostPlacement(BlockState stateIn, Direction face, BlockState neighbour, IWorld worldIn, + public BlockState updateShape(BlockState stateIn, Direction face, BlockState neighbour, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) { - Part part = stateIn.get(PART); - Axis axis = stateIn.get(AXIS); - boolean connectionAlongFirst = stateIn.get(CONNECTED_ALONG_FIRST_COORDINATE); + Part part = stateIn.getValue(PART); + Axis axis = stateIn.getValue(AXIS); + boolean connectionAlongFirst = stateIn.getValue(CONNECTED_ALONG_FIRST_COORDINATE); Axis connectionAxis = connectionAlongFirst ? (axis == Axis.X ? Axis.Y : Axis.X) : (axis == Axis.Z ? Axis.Y : Axis.Z); @@ -94,19 +94,19 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { if (facingAlongFirst != connectionAlongFirst || part == Part.NONE) return stateIn; if (part == Part.MIDDLE) - return stateIn.with(PART, positive ? Part.END : Part.START); + return stateIn.setValue(PART, positive ? Part.END : Part.START); if ((part == Part.START) == positive) - return stateIn.with(PART, Part.NONE); + return stateIn.setValue(PART, Part.NONE); return stateIn; } - Part otherPart = neighbour.get(PART); - Axis otherAxis = neighbour.get(AXIS); - boolean otherConnection = neighbour.get(CONNECTED_ALONG_FIRST_COORDINATE); + Part otherPart = neighbour.getValue(PART); + Axis otherAxis = neighbour.getValue(AXIS); + boolean otherConnection = neighbour.getValue(CONNECTED_ALONG_FIRST_COORDINATE); Axis otherConnectionAxis = otherConnection ? (otherAxis == Axis.X ? Axis.Y : Axis.X) : (otherAxis == Axis.Z ? Axis.Y : Axis.Z); - if (neighbour.get(AXIS) == faceAxis) + if (neighbour.getValue(AXIS) == faceAxis) return stateIn; if (otherPart != Part.NONE && otherConnectionAxis != faceAxis) return stateIn; @@ -121,34 +121,34 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { if ((part == Part.START) != positive) part = Part.MIDDLE; - return stateIn.with(PART, part) - .with(CONNECTED_ALONG_FIRST_COORDINATE, connectionAlongFirst); + return stateIn.setValue(PART, part) + .setValue(CONNECTED_ALONG_FIRST_COORDINATE, connectionAlongFirst); } @Override public BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace) { - if (originalState.get(PART) == Part.NONE) + if (originalState.getValue(PART) == Part.NONE) return super.getRotatedBlockState(originalState, targetedFace); return super.getRotatedBlockState(originalState, - Direction.getFacingFromAxis(AxisDirection.POSITIVE, getConnectionAxis(originalState))); + Direction.get(AxisDirection.POSITIVE, getConnectionAxis(originalState))); } @Override public BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) { // Blocks.AIR.getDefaultState() // .updateNeighbors(context.getWorld(), context.getPos(), 1); - Axis axis = newState.get(AXIS); - newState = getDefaultState().with(AXIS, axis); - if (newState.contains(BlockStateProperties.POWERED)) - newState = newState.with(BlockStateProperties.POWERED, context.getWorld() - .isBlockPowered(context.getPos())); + Axis axis = newState.getValue(AXIS); + newState = defaultBlockState().setValue(AXIS, axis); + if (newState.hasProperty(BlockStateProperties.POWERED)) + newState = newState.setValue(BlockStateProperties.POWERED, context.getLevel() + .hasNeighborSignal(context.getClickedPos())); for (Direction facing : Iterate.directions) { if (facing.getAxis() == axis) continue; - BlockPos pos = context.getPos(); - BlockPos offset = pos.offset(facing); - newState = updatePostPlacement(newState, facing, context.getWorld() - .getBlockState(offset), context.getWorld(), pos, offset); + BlockPos pos = context.getClickedPos(); + BlockPos offset = pos.relative(facing); + newState = updateShape(newState, facing, context.getLevel() + .getBlockState(offset), context.getLevel(), pos, offset); } // newState.updateNeighbors(context.getWorld(), context.getPos(), 1 | 2); return newState; @@ -156,16 +156,16 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.get(AXIS); + return face.getAxis() == state.getValue(AXIS); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(AXIS); + return state.getValue(AXIS); } public static boolean areBlocksConnected(BlockState state, BlockState other, Direction facing) { - Part part = state.get(PART); + Part part = state.getValue(PART); Axis connectionAxis = getConnectionAxis(state); Axis otherConnectionAxis = getConnectionAxis(other); @@ -182,8 +182,8 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { } protected static Axis getConnectionAxis(BlockState state) { - Axis axis = state.get(AXIS); - boolean connectionAlongFirst = state.get(CONNECTED_ALONG_FIRST_COORDINATE); + Axis axis = state.getValue(AXIS); + boolean connectionAlongFirst = state.getValue(CONNECTED_ALONG_FIRST_COORDINATE); Axis connectionAxis = connectionAlongFirst ? (axis == Axis.X ? Axis.Y : Axis.X) : (axis == Axis.Z ? Axis.Y : Axis.Z); return connectionAxis; @@ -208,7 +208,7 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { START, MIDDLE, END, NONE; @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltGenerator.java index 5ef334001..0e75bbb16 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltGenerator.java @@ -22,9 +22,9 @@ public class EncasedBeltGenerator extends SpecialBlockStateGen { @Override protected int getXRotation(BlockState state) { - EncasedBeltBlock.Part part = state.get(EncasedBeltBlock.PART); - boolean connectedAlongFirst = state.get(EncasedBeltBlock.CONNECTED_ALONG_FIRST_COORDINATE); - Axis axis = state.get(EncasedBeltBlock.AXIS); + EncasedBeltBlock.Part part = state.getValue(EncasedBeltBlock.PART); + boolean connectedAlongFirst = state.getValue(EncasedBeltBlock.CONNECTED_ALONG_FIRST_COORDINATE); + Axis axis = state.getValue(EncasedBeltBlock.AXIS); if (part == Part.NONE) return axis == Axis.Y ? 90 : 0; @@ -37,9 +37,9 @@ public class EncasedBeltGenerator extends SpecialBlockStateGen { @Override protected int getYRotation(BlockState state) { - EncasedBeltBlock.Part part = state.get(EncasedBeltBlock.PART); - boolean connectedAlongFirst = state.get(EncasedBeltBlock.CONNECTED_ALONG_FIRST_COORDINATE); - Axis axis = state.get(EncasedBeltBlock.AXIS); + EncasedBeltBlock.Part part = state.getValue(EncasedBeltBlock.PART); + boolean connectedAlongFirst = state.getValue(EncasedBeltBlock.CONNECTED_ALONG_FIRST_COORDINATE); + Axis axis = state.getValue(EncasedBeltBlock.AXIS); if (part == Part.NONE) return axis == Axis.X ? 90 : 0; @@ -58,8 +58,8 @@ public class EncasedBeltGenerator extends SpecialBlockStateGen { } protected String getModelSuffix(BlockState state) { - EncasedBeltBlock.Part part = state.get(EncasedBeltBlock.PART); - Axis axis = state.get(EncasedBeltBlock.AXIS); + EncasedBeltBlock.Part part = state.getValue(EncasedBeltBlock.PART); + Axis axis = state.getValue(EncasedBeltBlock.AXIS); if (part == Part.NONE) return "single"; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedShaftBlock.java index 09e6749a7..7ff8a064f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedShaftBlock.java @@ -43,10 +43,10 @@ public class EncasedShaftBlock extends AbstractEncasedShaftBlock implements ISpe @Override public ActionResultType onSneakWrenched(BlockState state, ItemUseContext context) { - if (context.getWorld().isRemote) + if (context.getLevel().isClientSide) return ActionResultType.SUCCESS; - context.getWorld().playEvent(2001, context.getPos(), Block.getStateId(state)); - KineticTileEntity.switchToBlockState(context.getWorld(), context.getPos(), AllBlocks.SHAFT.getDefaultState().with(AXIS, state.get(AXIS))); + context.getLevel().levelEvent(2001, context.getClickedPos(), Block.getId(state)); + KineticTileEntity.switchToBlockState(context.getLevel(), context.getClickedPos(), AllBlocks.SHAFT.getDefaultState().setValue(AXIS, state.getValue(AXIS))); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/GearshiftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/GearshiftBlock.java index 9e381f491..c96a2cb6d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/GearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/GearshiftBlock.java @@ -27,7 +27,7 @@ public class GearshiftBlock extends AbstractEncasedShaftBlock implements ITE builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(POWERED); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return super.getStateForPlacement(context).with(POWERED, - context.getWorld().isBlockPowered(context.getPos())); + return super.getStateForPlacement(context).setValue(POWERED, + context.getLevel().hasNeighborSignal(context.getClickedPos())); } @Override public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; - boolean previouslyPowered = state.get(POWERED); - if (previouslyPowered != worldIn.isBlockPowered(pos)) { + boolean previouslyPowered = state.getValue(POWERED); + if (previouslyPowered != worldIn.hasNeighborSignal(pos)) { detachKinetics(worldIn, pos, true); - worldIn.setBlockState(pos, state.cycle(POWERED), 2); + worldIn.setBlock(pos, state.cycle(POWERED), 2); } } @@ -66,19 +66,19 @@ public class GearshiftBlock extends AbstractEncasedShaftBlock implements ITE 1 ? 4 : 1; if (particleCount == 1 && rand.nextFloat() > 1 / 4f) @@ -163,7 +163,7 @@ public class GaugeBlock extends DirectionalAxisKineticBlock { for (int i = 0; i < particleCount; i++) { Vector3d mul = VecHelper.offsetRandomly(Vector3d.ZERO, rand, .25f) - .mul(new Vector3d(1, 1, 1).subtract(positiveFaceVec)) + .multiply(new Vector3d(1, 1, 1).subtract(positiveFaceVec)) .normalize() .scale(.3f); Vector3d offset = VecHelper.getCenterOf(pos) @@ -179,17 +179,17 @@ public class GaugeBlock extends DirectionalAxisKineticBlock { @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return GAUGE.get(state.get(FACING), state.get(AXIS_ALONG_FIRST_COORDINATE)); + return GAUGE.get(state.getValue(FACING), state.getValue(AXIS_ALONG_FIRST_COORDINATE)); } @Override - public boolean hasComparatorInputOverride(BlockState state) { + public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override - public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { - TileEntity te = worldIn.getTileEntity(pos); + public int getAnalogOutputSignal(BlockState blockState, World worldIn, BlockPos pos) { + TileEntity te = worldIn.getBlockEntity(pos); if (te instanceof GaugeTileEntity) { GaugeTileEntity gaugeTileEntity = (GaugeTileEntity) te; return MathHelper.ceil(MathHelper.clamp(gaugeTileEntity.dialTarget * 14, 0, 15)); @@ -198,7 +198,7 @@ public class GaugeBlock extends DirectionalAxisKineticBlock { } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java index de3a27ed8..f38497777 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java @@ -4,8 +4,10 @@ import java.util.ArrayList; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.core.materials.ModelData; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; +import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -13,7 +15,6 @@ import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.util.Direction; import net.minecraft.util.math.MathHelper; @@ -36,7 +37,7 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns Instancer headModel = getHeadModel(); ms = new MatrixStack(); - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); msr.translate(getInstancePosition()); float progress = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), gaugeTile.prevDialState, gaugeTile.dialState); @@ -61,12 +62,12 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns public void beginFrame() { GaugeTileEntity gaugeTile = (GaugeTileEntity) tile; - if (MathHelper.epsilonEquals(gaugeTile.prevDialState, gaugeTile.dialState)) + if (MathHelper.equal(gaugeTile.prevDialState, gaugeTile.dialState)) return; float progress = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), gaugeTile.prevDialState, gaugeTile.dialState); - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); for (DialFace faceEntry : faces) { faceEntry.updateTransform(msr, progress); @@ -99,10 +100,10 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns this.face = face; } - private void setupTransform(MatrixStacker msr, float progress) { + private void setupTransform(MatrixTransformStack msr, float progress) { float dialPivot = 5.75f / 16; - ms.push(); + ms.pushPose(); rotateToFace(msr); getSecond().setTransform(ms); @@ -113,13 +114,13 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns getFirst().setTransform(ms); - ms.pop(); + ms.popPose(); } - private void updateTransform(MatrixStacker msr, float progress) { + private void updateTransform(MatrixTransformStack msr, float progress) { float dialPivot = 5.75f / 16; - ms.push(); + ms.pushPose(); rotateToFace(msr) .translate(0, dialPivot, dialPivot) @@ -128,12 +129,12 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns getFirst().setTransform(ms); - ms.pop(); + ms.popPose(); } - protected MatrixStacker rotateToFace(MatrixStacker msr) { + protected TransformStack rotateToFace(TransformStack msr) { return msr.centre() - .rotate(Direction.UP, (float) ((-face.getHorizontalAngle() - 90) / 180 * Math.PI)) + .rotate(Direction.UP, (float) ((-face.toYRot() - 90) / 180 * Math.PI)) .unCentre(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java index 442cb9bdf..182c75728 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java @@ -40,12 +40,12 @@ public class GaugeRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; super.renderSafe(te, partialTicks, ms, buffer, light, overlay); BlockState gaugeState = te.getBlockState(); GaugeTileEntity gaugeTE = (GaugeTileEntity) te; - int lightCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), gaugeState, te.getPos()); + int lightCoords = WorldRenderer.getLightColor(te.getLevel(), gaugeState, te.getBlockPos()); PartialModel partialModel = (type == Type.SPEED ? AllBlockPartials.GAUGE_HEAD_SPEED : AllBlockPartials.GAUGE_HEAD_STRESS); SuperByteBuffer headBuffer = @@ -56,11 +56,11 @@ public class GaugeRenderer extends KineticTileEntityRenderer { float progress = MathHelper.lerp(partialTicks, gaugeTE.prevDialState, gaugeTE.dialState); for (Direction facing : Iterate.directions) { - if (!((GaugeBlock) gaugeState.getBlock()).shouldRenderHeadOnFace(te.getWorld(), te.getPos(), gaugeState, + if (!((GaugeBlock) gaugeState.getBlock()).shouldRenderHeadOnFace(te.getLevel(), te.getBlockPos(), gaugeState, facing)) continue; - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + IVertexBuilder vb = buffer.getBuffer(RenderType.solid()); rotateBufferTowards(dialBuffer, facing).translate(0, dialPivot, dialPivot) .rotate(Direction.EAST, (float) (Math.PI / 2 * -progress)) .translate(0, -dialPivot, -dialPivot) @@ -78,7 +78,7 @@ public class GaugeRenderer extends KineticTileEntityRenderer { } protected SuperByteBuffer rotateBufferTowards(SuperByteBuffer buffer, Direction target) { - return buffer.rotateCentered(Direction.UP, (float) ((-target.getHorizontalAngle() - 90) / 180 * Math.PI)); + return buffer.rotateCentered(Direction.UP, (float) ((-target.toYRot() - 90) / 180 * Math.PI)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java index 1a1c4a8b2..dfe96cf3c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java @@ -41,13 +41,13 @@ public class GaugeTileEntity extends KineticTileEntity implements IHaveGoggleInf super.tick(); prevDialState = dialState; dialState += (dialTarget - dialState) * .125f; - if (dialState > 1 && world.rand.nextFloat() < 1 / 2f) - dialState -= (dialState - 1) * world.rand.nextFloat(); + if (dialState > 1 && level.random.nextFloat() < 1 / 2f) + dialState -= (dialState - 1) * level.random.nextFloat(); } @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.gauge.info_header"))); + tooltip.add(componentSpacing.plainCopy().append(Lang.translate("gui.gauge.info_header"))); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java index 1bdb7b191..391949d6e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java @@ -29,10 +29,10 @@ public class SpeedGaugeTileEntity extends GaugeTileEntity { : ColorHelper.mixColors(SpeedLevel.of(speed) .getColor(), 0xffffff, .25f); if (speed == 69) - AllTriggers.triggerForNearbyPlayers(AllTriggers.SPEED_READ, world, pos, 6, GogglesItem::canSeeParticles); + AllTriggers.triggerForNearbyPlayers(AllTriggers.SPEED_READ, level, worldPosition, 6, GogglesItem::canSeeParticles); dialTarget = getDialTarget(speed); - markDirty(); + setChanged(); } public static float getDialTarget(float speed) { @@ -59,8 +59,8 @@ public class SpeedGaugeTileEntity extends GaugeTileEntity { public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { super.addToGoggleTooltip(tooltip, isPlayerSneaking); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.speedometer.title").formatted(TextFormatting.GRAY))); - tooltip.add(componentSpacing.copy().append(SpeedLevel.getFormattedSpeedText(speed, isOverStressed()))); + tooltip.add(componentSpacing.plainCopy().append(Lang.translate("gui.speedometer.title").withStyle(TextFormatting.GRAY))); + tooltip.add(componentSpacing.plainCopy().append(SpeedLevel.getFormattedSpeedText(speed, isOverStressed()))); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java index 470522dff..1ea44cb46 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java @@ -43,7 +43,7 @@ public class StressGaugeTileEntity extends GaugeTileEntity { } sendData(); - markDirty(); + setChanged(); } @Override @@ -51,7 +51,7 @@ public class StressGaugeTileEntity extends GaugeTileEntity { super.onSpeedChanged(prevSpeed); if (getSpeed() == 0) { dialTarget = 0; - markDirty(); + setChanged(); return; } @@ -68,30 +68,30 @@ public class StressGaugeTileEntity extends GaugeTileEntity { double capacity = getNetworkCapacity(); double stressFraction = getNetworkStress() / (capacity == 0 ? 1 : capacity); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.stressometer.title").formatted(TextFormatting.GRAY))); + tooltip.add(componentSpacing.plainCopy().append(Lang.translate("gui.stressometer.title").withStyle(TextFormatting.GRAY))); if (getTheoreticalSpeed() == 0) - tooltip.add(new StringTextComponent(spacing + ItemDescription.makeProgressBar(3, -1)).append(Lang.translate("gui.stressometer.no_rotation")).formatted(TextFormatting.DARK_GRAY)); + tooltip.add(new StringTextComponent(spacing + ItemDescription.makeProgressBar(3, -1)).append(Lang.translate("gui.stressometer.no_rotation")).withStyle(TextFormatting.DARK_GRAY)); // tooltip.add(new StringTextComponent(TextFormatting.DARK_GRAY + ItemDescription.makeProgressBar(3, -1) // + Lang.translate("gui.stressometer.no_rotation"))); else { - tooltip.add(componentSpacing.copy().append(StressImpact.getFormattedStressText(stressFraction))); + tooltip.add(componentSpacing.plainCopy().append(StressImpact.getFormattedStressText(stressFraction))); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.stressometer.capacity").formatted(TextFormatting.GRAY))); + tooltip.add(componentSpacing.plainCopy().append(Lang.translate("gui.stressometer.capacity").withStyle(TextFormatting.GRAY))); double remainingCapacity = capacity - getNetworkStress(); ITextComponent su = Lang.translate("generic.unit.stress"); - IFormattableTextComponent stressTooltip = componentSpacing.copy() + IFormattableTextComponent stressTooltip = componentSpacing.plainCopy() .append(new StringTextComponent(" " + IHaveGoggleInformation.format(remainingCapacity)) - .append(su.copy()) - .formatted(StressImpact.of(stressFraction).getRelativeColor())); + .append(su.plainCopy()) + .withStyle(StressImpact.of(stressFraction).getRelativeColor())); if (remainingCapacity != capacity) { stressTooltip - .append(new StringTextComponent(" / ").formatted(TextFormatting.GRAY)) + .append(new StringTextComponent(" / ").withStyle(TextFormatting.GRAY)) .append(new StringTextComponent(IHaveGoggleInformation.format(capacity)) - .append(su.copy()) - .formatted(TextFormatting.DARK_GRAY)); + .append(su.plainCopy()) + .withStyle(TextFormatting.DARK_GRAY)); } tooltip.add(stressTooltip); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxBlock.java index bb867e1a0..83a2a74a9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxBlock.java @@ -35,20 +35,20 @@ public class GearboxBlock extends RotatedPillarKineticBlock { } @Override - public PushReaction getPushReaction(BlockState state) { + public PushReaction getPistonPushReaction(BlockState state) { return PushReaction.PUSH_ONLY; } @Override - public void fillItemGroup(ItemGroup group, NonNullList items) { - super.fillItemGroup(group, items); + public void fillItemCategory(ItemGroup group, NonNullList items) { + super.fillItemCategory(group, items); items.add(AllItems.VERTICAL_GEARBOX.asStack()); } @SuppressWarnings("deprecation") @Override public List getDrops(BlockState state, Builder builder) { - if (state.get(AXIS).isVertical()) + if (state.getValue(AXIS).isVertical()) return super.getDrops(state, builder); return Arrays.asList(new ItemStack(AllItems.VERTICAL_GEARBOX.get())); } @@ -56,25 +56,25 @@ public class GearboxBlock extends RotatedPillarKineticBlock { @Override public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, PlayerEntity player) { - if (state.get(AXIS).isVertical()) + if (state.getValue(AXIS).isVertical()) return super.getPickBlock(state, target, world, pos, player); return new ItemStack(AllItems.VERTICAL_GEARBOX.get()); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return getDefaultState().with(AXIS, Axis.Y); + return defaultBlockState().setValue(AXIS, Axis.Y); } // IRotate: @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() != state.get(AXIS); + return face.getAxis() != state.getValue(AXIS); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(AXIS); + return state.getValue(AXIS); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index fc795f92e..0b86084aa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -4,9 +4,9 @@ import java.util.EnumMap; import java.util.Map; import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.instancing.InstanceMaterial; +import com.jozufozu.flywheel.backend.material.InstanceMaterial; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.RotatingData; @@ -27,10 +27,10 @@ public class GearboxInstance extends KineticTileInstance { keys = new EnumMap<>(Direction.class); - final Direction.Axis boxAxis = blockState.get(BlockStateProperties.AXIS); + final Direction.Axis boxAxis = blockState.getValue(BlockStateProperties.AXIS); - int blockLight = world.getLightLevel(LightType.BLOCK, pos); - int skyLight = world.getLightLevel(LightType.SKY, pos); + int blockLight = world.getBrightness(LightType.BLOCK, pos); + int skyLight = world.getBrightness(LightType.SKY, pos); updateSourceFacing(); InstanceMaterial rotatingMaterial = getRotatingMaterial(); @@ -44,7 +44,7 @@ public class GearboxInstance extends KineticTileInstance { RotatingData key = shaft.createInstance(); - key.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + key.setRotationAxis(Direction.get(Direction.AxisDirection.POSITIVE, axis).step()) .setRotationalSpeed(getSpeed(direction)) .setRotationOffset(getRotationOffset(axis)).setColor(tile) .setPosition(getInstancePosition()) @@ -70,7 +70,7 @@ public class GearboxInstance extends KineticTileInstance { protected void updateSourceFacing() { if (tile.hasSource()) { BlockPos source = tile.source.subtract(pos); - sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ()); + sourceFacing = Direction.getNearest(source.getX(), source.getY(), source.getZ()); } else { sourceFacing = null; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 0c9313b2f..2bd534af4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -27,11 +27,11 @@ public class GearboxRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; - final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); - final BlockPos pos = te.getPos(); - float time = AnimationTickHolder.getRenderTime(te.getWorld()); + final Axis boxAxis = te.getBlockState().getValue(BlockStateProperties.AXIS); + final BlockPos pos = te.getBlockPos(); + float time = AnimationTickHolder.getRenderTime(te.getLevel()); for (Direction direction : Iterate.directions) { final Axis axis = direction.getAxis(); @@ -43,8 +43,8 @@ public class GearboxRenderer extends KineticTileEntityRenderer { float angle = (time * te.getSpeed() * 3f / 10) % 360; if (te.getSpeed() != 0 && te.hasSource()) { - BlockPos source = te.source.subtract(te.getPos()); - Direction sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ()); + BlockPos source = te.source.subtract(te.getBlockPos()); + Direction sourceFacing = Direction.getNearest(source.getX(), source.getY(), source.getZ()); if (sourceFacing.getAxis() == direction.getAxis()) angle *= sourceFacing == direction ? 1 : -1; else if (sourceFacing.getAxisDirection() == direction.getAxisDirection()) @@ -55,7 +55,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { angle = angle / 180f * (float) Math.PI; kineticRotationTransform(shaft, te, axis, angle, light); - shaft.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + shaft.renderInto(ms, buffer.getBuffer(RenderType.solid())); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearshiftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearshiftTileEntity.java index a819022c1..2e4b6cf62 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearshiftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearshiftTileEntity.java @@ -15,7 +15,7 @@ public class GearshiftTileEntity extends SplitShaftTileEntity { @Override public float getRotationSpeedModifier(Direction face) { if (hasSource()) { - if (face != getSourceFacing() && getBlockState().get(BlockStateProperties.POWERED)) + if (face != getSourceFacing() && getBlockState().getValue(BlockStateProperties.POWERED)) return -1; } return 1; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/VerticalGearboxItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/VerticalGearboxItem.java index 153b85154..23832729b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/VerticalGearboxItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/VerticalGearboxItem.java @@ -27,25 +27,25 @@ public class VerticalGearboxItem extends BlockItem { } @Override - public void fillItemGroup(ItemGroup p_150895_1_, NonNullList p_150895_2_) { + public void fillItemCategory(ItemGroup p_150895_1_, NonNullList p_150895_2_) { } @Override - public String getTranslationKey() { + public String getDescriptionId() { return "item.create.vertical_gearbox"; } @Override - public void addToBlockToItemMap(Map p_195946_1_, Item p_195946_2_) { + public void registerBlocks(Map p_195946_1_, Item p_195946_2_) { } @Override - protected boolean onBlockPlaced(BlockPos pos, World world, PlayerEntity player, ItemStack stack, BlockState state) { + protected boolean updateCustomBlockEntityTag(BlockPos pos, World world, PlayerEntity player, ItemStack stack, BlockState state) { Axis prefferedAxis = null; for (Direction side : Iterate.horizontalDirections) { - BlockState blockState = world.getBlockState(pos.offset(side)); + BlockState blockState = world.getBlockState(pos.relative(side)); if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(world, pos.offset(side), blockState, + if (((IRotate) blockState.getBlock()).hasShaftTowards(world, pos.relative(side), blockState, side.getOpposite())) if (prefferedAxis != null && prefferedAxis != side.getAxis()) { prefferedAxis = null; @@ -56,11 +56,11 @@ public class VerticalGearboxItem extends BlockItem { } } - Axis axis = prefferedAxis == null ? player.getHorizontalFacing() - .rotateY() + Axis axis = prefferedAxis == null ? player.getDirection() + .getClockWise() .getAxis() : prefferedAxis == Axis.X ? Axis.Z : Axis.X; - world.setBlockState(pos, state.with(BlockStateProperties.AXIS, axis)); - return super.onBlockPlaced(pos, world, player, stack, state); + world.setBlockAndUpdate(pos, state.setValue(BlockStateProperties.AXIS, axis)); + return super.updateCustomBlockEntityTag(pos, world, player, stack, state); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java index 68b5365a5..7c6102815 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java @@ -27,43 +27,43 @@ import net.minecraft.world.server.ServerWorld; public interface IWrenchable { default ActionResultType onWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - BlockState rotated = getRotatedBlockState(state, context.getFace()); - if (!rotated.isValidPosition(world, context.getPos())) + World world = context.getLevel(); + BlockState rotated = getRotatedBlockState(state, context.getClickedFace()); + if (!rotated.canSurvive(world, context.getClickedPos())) return ActionResultType.PASS; - KineticTileEntity.switchToBlockState(world, context.getPos(), updateAfterWrenched(rotated, context)); + KineticTileEntity.switchToBlockState(world, context.getClickedPos(), updateAfterWrenched(rotated, context)); - TileEntity te = context.getWorld() - .getTileEntity(context.getPos()); + TileEntity te = context.getLevel() + .getBlockEntity(context.getClickedPos()); if (te != null) - te.updateContainingBlockInfo(); + te.clearCache(); if (te instanceof GeneratingKineticTileEntity) { ((GeneratingKineticTileEntity) te).reActivateSource = true; } - if (world.getBlockState(context.getPos()) != state) - playRotateSound(world, context.getPos()); + if (world.getBlockState(context.getClickedPos()) != state) + playRotateSound(world, context.getClickedPos()); return ActionResultType.SUCCESS; } default BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) { // return newState; - return Block.getValidBlockForPosition(newState, context.getWorld(), context.getPos()); + return Block.updateFromNeighbourShapes(newState, context.getLevel(), context.getClickedPos()); } default ActionResultType onSneakWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - BlockPos pos = context.getPos(); + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); PlayerEntity player = context.getPlayer(); if (world instanceof ServerWorld) { if (player != null && !player.isCreative()) - Block.getDrops(state, (ServerWorld) world, pos, world.getTileEntity(pos), player, context.getItem()) + Block.getDrops(state, (ServerWorld) world, pos, world.getBlockEntity(pos), player, context.getItemInHand()) .forEach(itemStack -> { player.inventory.placeItemBackInInventory(world, itemStack); }); - state.spawnAdditionalDrops((ServerWorld) world, pos, ItemStack.EMPTY); + state.spawnAfterBreak((ServerWorld) world, pos, ItemStack.EMPTY); world.destroyBlock(pos, false); playRemoveSound(world, pos); } @@ -82,42 +82,42 @@ public interface IWrenchable { BlockState newState = originalState; if (targetedFace.getAxis() == Direction.Axis.Y) { - if (originalState.contains(HorizontalAxisKineticBlock.HORIZONTAL_AXIS)) - return originalState.with(HorizontalAxisKineticBlock.HORIZONTAL_AXIS, DirectionHelper - .rotateAround(VoxelShaper.axisAsFace(originalState.get(HorizontalAxisKineticBlock.HORIZONTAL_AXIS)), + if (originalState.hasProperty(HorizontalAxisKineticBlock.HORIZONTAL_AXIS)) + return originalState.setValue(HorizontalAxisKineticBlock.HORIZONTAL_AXIS, DirectionHelper + .rotateAround(VoxelShaper.axisAsFace(originalState.getValue(HorizontalAxisKineticBlock.HORIZONTAL_AXIS)), targetedFace.getAxis()) .getAxis()); - if (originalState.contains(HorizontalKineticBlock.HORIZONTAL_FACING)) - return originalState.with(HorizontalKineticBlock.HORIZONTAL_FACING, DirectionHelper - .rotateAround(originalState.get(HorizontalKineticBlock.HORIZONTAL_FACING), targetedFace.getAxis())); + if (originalState.hasProperty(HorizontalKineticBlock.HORIZONTAL_FACING)) + return originalState.setValue(HorizontalKineticBlock.HORIZONTAL_FACING, DirectionHelper + .rotateAround(originalState.getValue(HorizontalKineticBlock.HORIZONTAL_FACING), targetedFace.getAxis())); } - if (originalState.contains(RotatedPillarKineticBlock.AXIS)) - return originalState.with(RotatedPillarKineticBlock.AXIS, + if (originalState.hasProperty(RotatedPillarKineticBlock.AXIS)) + return originalState.setValue(RotatedPillarKineticBlock.AXIS, DirectionHelper - .rotateAround(VoxelShaper.axisAsFace(originalState.get(RotatedPillarKineticBlock.AXIS)), + .rotateAround(VoxelShaper.axisAsFace(originalState.getValue(RotatedPillarKineticBlock.AXIS)), targetedFace.getAxis()) .getAxis()); - if (!originalState.contains(DirectionalKineticBlock.FACING)) + if (!originalState.hasProperty(DirectionalKineticBlock.FACING)) return originalState; - Direction stateFacing = originalState.get(DirectionalKineticBlock.FACING); + Direction stateFacing = originalState.getValue(DirectionalKineticBlock.FACING); if (stateFacing.getAxis() .equals(targetedFace.getAxis())) { - if (originalState.contains(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE)) + if (originalState.hasProperty(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE)) return originalState.cycle(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE); else return originalState; } else { do { - newState = newState.with(DirectionalKineticBlock.FACING, - DirectionHelper.rotateAround(newState.get(DirectionalKineticBlock.FACING), targetedFace.getAxis())); + newState = newState.setValue(DirectionalKineticBlock.FACING, + DirectionHelper.rotateAround(newState.getValue(DirectionalKineticBlock.FACING), targetedFace.getAxis())); if (targetedFace.getAxis() == Direction.Axis.Y - && newState.contains(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE)) + && newState.hasProperty(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE)) newState = newState.cycle(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE); - } while (newState.get(DirectionalKineticBlock.FACING) + } while (newState.getValue(DirectionalKineticBlock.FACING) .getAxis() .equals(targetedFace.getAxis())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java index e2c79126c..9161d4309 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java @@ -29,22 +29,22 @@ public interface IWrenchableWithBracket extends IWrenchable { } default boolean tryRemoveBracket(ItemUseContext context) { - World world = context.getWorld(); - BlockPos pos = context.getPos(); + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); Optional bracket = removeBracket(world, pos, false); BlockState blockState = world.getBlockState(pos); if (bracket.isPresent()) { PlayerEntity player = context.getPlayer(); - if (!world.isRemote && !player.isCreative()) + if (!world.isClientSide && !player.isCreative()) player.inventory.placeItemBackInInventory(world, bracket.get()); - if (!world.isRemote && AllBlocks.FLUID_PIPE.has(blockState)) { + if (!world.isClientSide && AllBlocks.FLUID_PIPE.has(blockState)) { Axis preferred = FluidPropagator.getStraightPipeAxis(blockState); Direction preferredDirection = - preferred == null ? Direction.UP : Direction.getFacingFromAxis(AxisDirection.POSITIVE, preferred); + preferred == null ? Direction.UP : Direction.get(AxisDirection.POSITIVE, preferred); BlockState updated = AllBlocks.FLUID_PIPE.get() .updateBlockState(blockState, preferredDirection, null, world, pos); if (updated != blockState) - world.setBlockState(pos, updated); + world.setBlockAndUpdate(pos, updated); } return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItem.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItem.java index 190156a87..79131ad98 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItem.java @@ -30,23 +30,23 @@ public class WrenchItem extends Item { @Nonnull @Override - public ActionResultType onItemUse(ItemUseContext context) { + public ActionResultType useOn(ItemUseContext context) { PlayerEntity player = context.getPlayer(); - if (player == null || !player.isAllowEdit()) - return super.onItemUse(context); + if (player == null || !player.mayBuild()) + return super.useOn(context); - BlockState state = context.getWorld() - .getBlockState(context.getPos()); + BlockState state = context.getLevel() + .getBlockState(context.getClickedPos()); Block block = state.getBlock(); if (!(block instanceof IWrenchable)) { if (canWrenchPickup(state)) return onItemUseOnOther(context); - return super.onItemUse(context); + return super.useOn(context); } IWrenchable actor = (IWrenchable) block; - if (player.isSneaking()) + if (player.isShiftKeyDown()) return actor.onSneakWrenched(state, context); return actor.onWrenched(state, context); } @@ -57,15 +57,15 @@ public class WrenchItem extends Item { private ActionResultType onItemUseOnOther(ItemUseContext context) { PlayerEntity player = context.getPlayer(); - World world = context.getWorld(); - BlockPos pos = context.getPos(); + World world = context.getLevel(); + BlockPos pos = context.getClickedPos(); BlockState state = world.getBlockState(pos); if (!(world instanceof ServerWorld)) return ActionResultType.SUCCESS; if (player != null && !player.isCreative()) - Block.getDrops(state, (ServerWorld) world, pos, world.getTileEntity(pos), player, context.getItem()) + Block.getDrops(state, (ServerWorld) world, pos, world.getBlockEntity(pos), player, context.getItemInHand()) .forEach(itemStack -> player.inventory.placeItemBackInInventory(world, itemStack)); - state.spawnAdditionalDrops((ServerWorld) world, pos, ItemStack.EMPTY); + state.spawnAfterBreak((ServerWorld) world, pos, ItemStack.EMPTY); world.destroyBlock(pos, false); AllSoundEvents.WRENCH_REMOVE.playOnServer(world, pos, 1, Create.RANDOM.nextFloat() * .5f + .5f); return ActionResultType.SUCCESS; @@ -76,13 +76,13 @@ public class WrenchItem extends Item { if (!(target instanceof AbstractMinecartEntity)) return; PlayerEntity player = event.getPlayer(); - ItemStack heldItem = player.getHeldItemMainhand(); + ItemStack heldItem = player.getMainHandItem(); if (!AllItems.WRENCH.isIn(heldItem)) return; if (player.isCreative()) return; AbstractMinecartEntity minecart = (AbstractMinecartEntity) target; - minecart.attackEntityFrom(DamageSource.causePlayerDamage(player), 100); + minecart.hurt(DamageSource.playerAttack(player), 100); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java index 7b9e15cda..41ae4fec9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java @@ -20,7 +20,7 @@ public class WrenchItemRenderer extends CustomRenderedItemModelRenderer onItemRightClick(World p_77659_1_, PlayerEntity p_77659_2_, Hand p_77659_3_) { - p_77659_2_.setActiveHand(p_77659_3_); - return ActionResult.success(p_77659_2_.getHeldItem(p_77659_3_)); + public ActionResult use(World p_77659_1_, PlayerEntity p_77659_2_, Hand p_77659_3_) { + p_77659_2_.startUsingItem(p_77659_3_); + return ActionResult.success(p_77659_2_.getItemInHand(p_77659_3_)); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java index 60c3e3754..92957ffc5 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java @@ -14,7 +14,7 @@ public class ChromaticCompoundColor implements IItemColor { public int getColor(ItemStack stack, int layer) { Minecraft mc = Minecraft.getInstance(); float pt = AnimationTickHolder.getPartialTicks(); - float progress = (float) ((mc.player.getYaw(pt)) / 180 * Math.PI) + (AnimationTickHolder.getRenderTime() / 10f); + float progress = (float) ((mc.player.getViewYRot(pt)) / 180 * Math.PI) + (AnimationTickHolder.getRenderTime() / 10f); if (layer == 0) return ColorHelper.mixColors(0x6e5773, 0x6B3074, ((float) MathHelper.sin(progress) + 1) / 2); if (layer == 1) diff --git a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java index 3b7d0ae2d..9e0cb506f 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java @@ -34,7 +34,7 @@ public class ChromaticCompoundItem extends Item { } @Override - public boolean shouldSyncTag() { + public boolean shouldOverrideMultiplayerNbt() { return true; } @@ -65,15 +65,15 @@ public class ChromaticCompoundItem extends Item { @Override public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { double y = entity.getY(); - double yMotion = entity.getMotion().y; - World world = entity.world; + double yMotion = entity.getDeltaMovement().y; + World world = entity.level; CompoundNBT data = entity.getPersistentData(); CompoundNBT itemData = entity.getItem() .getOrCreateTag(); - Vector3d positionVec = entity.getPositionVec(); + Vector3d positionVec = entity.position(); CRecipes config = AllConfigs.SERVER.recipes; - if (world.isRemote) { + if (world.isClientSide) { int light = itemData.getInt("CollectingLight"); if (random.nextInt(config.lightSourceCountForRefinedRadiance.get() + 20) < light) { Vector3d start = VecHelper.offsetRandomly(positionVec, random, 3); @@ -100,11 +100,11 @@ public class ChromaticCompoundItem extends Item { if (itemData.getInt("CollectingLight") >= config.lightSourceCountForRefinedRadiance.get()) { ItemStack newStack = AllItems.REFINED_RADIANCE.asStack(); ItemEntity newEntity = new ItemEntity(world, entity.getX(), entity.getY(), entity.getZ(), newStack); - newEntity.setMotion(entity.getMotion()); + newEntity.setDeltaMovement(entity.getDeltaMovement()); newEntity.getPersistentData() .putBoolean("JustCreated", true); itemData.remove("CollectingLight"); - world.addEntity(newEntity); + world.addFreshEntity(newEntity); stack.split(1); entity.setItem(stack); @@ -125,17 +125,17 @@ public class ChromaticCompoundItem extends Item { while (testPos.getY() > 0) { testPos.move(Direction.DOWN); BlockState state = world.getBlockState(testPos); - if (state.getOpacity(world, testPos) >= 15 && state.getBlock() != Blocks.BEDROCK) + if (state.getLightBlock(world, testPos) >= 15 && state.getBlock() != Blocks.BEDROCK) break; if (state.getBlock() == Blocks.BEACON) { - TileEntity te = world.getTileEntity(testPos); + TileEntity te = world.getBlockEntity(testPos); if (!(te instanceof BeaconTileEntity)) break; BeaconTileEntity bte = (BeaconTileEntity) te; - if (bte.getLevels() != 0 && !bte.beamSegments.isEmpty()) + if (bte.getLevels() != 0 && !bte.beamSections.isEmpty()) isOverBeacon = true; break; @@ -151,7 +151,7 @@ public class ChromaticCompoundItem extends Item { } // Find a light source and eat it. - Random r = world.rand; + Random r = world.random; int range = 3; float rate = 1 / 2f; if (r.nextFloat() > rate) @@ -161,15 +161,15 @@ public class ChromaticCompoundItem extends Item { BlockState state = world.getBlockState(randomOffset); if (state.getLightValue(world, randomOffset) == 0) return false; - if (state.getBlockHardness(world, randomOffset) == -1) + if (state.getDestroySpeed(world, randomOffset) == -1) return false; if (state.getBlock() == Blocks.BEACON) return false; RayTraceContext context = new RayTraceContext(positionVec, VecHelper.getCenterOf(randomOffset), BlockMode.COLLIDER, FluidMode.NONE, entity); - if (!randomOffset.equals(world.rayTraceBlocks(context) - .getPos())) + if (!randomOffset.equals(world.clip(context) + .getBlockPos())) return false; world.destroyBlock(randomOffset, false); @@ -178,9 +178,9 @@ public class ChromaticCompoundItem extends Item { newStack.getOrCreateTag() .putInt("CollectingLight", itemData.getInt("CollectingLight") + 1); ItemEntity newEntity = new ItemEntity(world, entity.getX(), entity.getY(), entity.getZ(), newStack); - newEntity.setMotion(entity.getMotion()); - newEntity.setDefaultPickupDelay(); - world.addEntity(newEntity); + newEntity.setDeltaMovement(entity.getDeltaMovement()); + newEntity.setDefaultPickUpDelay(); + world.addFreshEntity(newEntity); entity.lifespan = 6000; if (stack.isEmpty()) entity.remove(); diff --git a/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java b/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java index 2921241d3..328164c20 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java @@ -19,13 +19,13 @@ public class NoGravMagicalDohickyItem extends Item { @Override public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { - World world = entity.world; - Vector3d pos = entity.getPositionVec(); + World world = entity.level; + Vector3d pos = entity.position(); CompoundNBT persistentData = entity.getPersistentData(); - if (world.isRemote) { - if (world.rand.nextFloat() < getIdleParticleChance(entity)) { - Vector3d ppos = VecHelper.offsetRandomly(pos, world.rand, .5f); + if (world.isClientSide) { + if (world.random.nextFloat() < getIdleParticleChance(entity)) { + Vector3d ppos = VecHelper.offsetRandomly(pos, world.random, .5f); world.addParticle(ParticleTypes.END_ROD, ppos.x, pos.y, ppos.z, 0, -.1f, 0); } @@ -33,7 +33,7 @@ public class NoGravMagicalDohickyItem extends Item { Vector3d basemotion = new Vector3d(0, 1, 0); world.addParticle(ParticleTypes.FLASH, pos.x, pos.y, pos.z, 0, 0, 0); for (int i = 0; i < 20; i++) { - Vector3d motion = VecHelper.offsetRandomly(basemotion, world.rand, 1); + Vector3d motion = VecHelper.offsetRandomly(basemotion, world.random, 1); world.addParticle(ParticleTypes.WITCH, pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); world.addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/RefinedRadianceItem.java b/src/main/java/com/simibubi/create/content/curiosities/RefinedRadianceItem.java index c853d6be7..3cb9584e7 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/RefinedRadianceItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/RefinedRadianceItem.java @@ -11,14 +11,14 @@ public class RefinedRadianceItem extends NoGravMagicalDohickyItem { } @Override - public boolean hasEffect(ItemStack stack) { + public boolean isFoil(ItemStack stack) { return true; } @Override protected void onCreated(ItemEntity entity, CompoundNBT persistentData) { super.onCreated(entity, persistentData); - entity.setMotion(entity.getMotion() + entity.setDeltaMovement(entity.getDeltaMovement() .add(0, .15f, 0)); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/ShadowSteelItem.java b/src/main/java/com/simibubi/create/content/curiosities/ShadowSteelItem.java index 007e0f627..9f59e52c8 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ShadowSteelItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ShadowSteelItem.java @@ -14,13 +14,13 @@ public class ShadowSteelItem extends NoGravMagicalDohickyItem { protected void onCreated(ItemEntity entity, CompoundNBT persistentData) { super.onCreated(entity, persistentData); float yMotion = (entity.fallDistance + 3) / 50f; - entity.setMotion(0, yMotion, 0); + entity.setDeltaMovement(0, yMotion, 0); } @Override protected float getIdleParticleChance(ItemEntity entity) { return (float) (MathHelper.clamp(entity.getItem() - .getCount() - 10, MathHelper.clamp(entity.getMotion().y * 20, 5, 20), 100) / 64f); + .getCount() - 10, MathHelper.clamp(entity.getDeltaMovement().y * 20, 5, 20), 100) / 64f); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java b/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java index 65768046d..dc4725be6 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java @@ -20,60 +20,60 @@ public class TreeFertilizerItem extends Item { } @Override - public ActionResultType onItemUse(ItemUseContext context) { - BlockState state = context.getWorld() - .getBlockState(context.getPos()); + public ActionResultType useOn(ItemUseContext context) { + BlockState state = context.getLevel() + .getBlockState(context.getClickedPos()); Block block = state.getBlock(); if (block instanceof SaplingBlock) { - if (context.getWorld().isRemote) { - BoneMealItem.spawnBonemealParticles(context.getWorld(), context.getPos(), 100); + if (context.getLevel().isClientSide) { + BoneMealItem.addGrowthParticles(context.getLevel(), context.getClickedPos(), 100); return ActionResultType.SUCCESS; } - BlockPos saplingPos = context.getPos(); - TreesDreamWorld world = new TreesDreamWorld((ServerWorld) context.getWorld(), saplingPos); + BlockPos saplingPos = context.getClickedPos(); + TreesDreamWorld world = new TreesDreamWorld((ServerWorld) context.getLevel(), saplingPos); - for (BlockPos pos : BlockPos.getAllInBoxMutable(-1, 0, -1, 1, 0, 1)) { - if (context.getWorld() - .getBlockState(saplingPos.add(pos)) + for (BlockPos pos : BlockPos.betweenClosed(-1, 0, -1, 1, 0, 1)) { + if (context.getLevel() + .getBlockState(saplingPos.offset(pos)) .getBlock() == block) - world.setBlockState(pos.up(10), state.with(SaplingBlock.STAGE, 1)); + world.setBlockAndUpdate(pos.above(10), state.setValue(SaplingBlock.STAGE, 1)); } - ((SaplingBlock) block).grow(world, world.getRandom(), BlockPos.ZERO.up(10), - state.with(SaplingBlock.STAGE, 1)); + ((SaplingBlock) block).performBonemeal(world, world.getRandom(), BlockPos.ZERO.above(10), + state.setValue(SaplingBlock.STAGE, 1)); for (BlockPos pos : world.blocksAdded.keySet()) { - BlockPos actualPos = pos.add(saplingPos).down(10); + BlockPos actualPos = pos.offset(saplingPos).below(10); BlockState newState = world.blocksAdded.get(pos); // Don't replace Bedrock - if (context.getWorld() + if (context.getLevel() .getBlockState(actualPos) - .getBlockHardness(context.getWorld(), actualPos) == -1) + .getDestroySpeed(context.getLevel(), actualPos) == -1) continue; // Don't replace solid blocks with leaves - if (!newState.isNormalCube(world, pos) - && !context.getWorld() + if (!newState.isRedstoneConductor(world, pos) + && !context.getLevel() .getBlockState(actualPos) - .getCollisionShape(context.getWorld(), actualPos) + .getCollisionShape(context.getLevel(), actualPos) .isEmpty()) continue; - context.getWorld() - .setBlockState(actualPos, newState); + context.getLevel() + .setBlockAndUpdate(actualPos, newState); } if (context.getPlayer() != null && !context.getPlayer() .isCreative()) - context.getItem() + context.getItemInHand() .shrink(1); return ActionResultType.SUCCESS; } - return super.onItemUse(context); + return super.useOn(context); } private class TreesDreamWorld extends PlacementSimulationServerWorld { @@ -83,7 +83,7 @@ public class TreeFertilizerItem extends Item { protected TreesDreamWorld(ServerWorld wrapped, BlockPos saplingPos) { super(wrapped); this.saplingPos = saplingPos; - soil = wrapped.getBlockState(saplingPos.down()); + soil = wrapped.getBlockState(saplingPos.below()); } @Override @@ -94,10 +94,10 @@ public class TreeFertilizerItem extends Item { } @Override - public boolean setBlockState(BlockPos pos, BlockState newState, int flags) { + public boolean setBlock(BlockPos pos, BlockState newState, int flags) { if (newState.getBlock() == Blocks.PODZOL) return true; - return super.setBlockState(pos, newState, flags); + return super.setBlock(pos, newState, flags); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/AllArmorMaterials.java b/src/main/java/com/simibubi/create/content/curiosities/armor/AllArmorMaterials.java index 1b0f7f6e1..5129dbbdf 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/AllArmorMaterials.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/AllArmorMaterials.java @@ -16,7 +16,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; public enum AllArmorMaterials implements IArmorMaterial { COPPER("copper", 7, new int[] { 1, 3, 4, 2 }, 25, AllSoundEvents.COPPER_ARMOR_EQUIP.getMainEvent(), 0.0F, 0.0F, - () -> Ingredient.fromItems(AllItems.COPPER_INGOT.get())) + () -> Ingredient.of(AllItems.COPPER_INGOT.get())) ; @@ -42,24 +42,24 @@ public enum AllArmorMaterials implements IArmorMaterial { this.repairMaterial = new LazyValue<>(p_i231593_10_); } - public int getDurability(EquipmentSlotType p_200896_1_) { + public int getDurabilityForSlot(EquipmentSlotType p_200896_1_) { return MAX_DAMAGE_ARRAY[p_200896_1_.getIndex()] * this.maxDamageFactor; } - public int getDamageReductionAmount(EquipmentSlotType p_200902_1_) { + public int getDefenseForSlot(EquipmentSlotType p_200902_1_) { return this.damageReductionAmountArray[p_200902_1_.getIndex()]; } - public int getEnchantability() { + public int getEnchantmentValue() { return this.enchantability; } - public SoundEvent getSoundEvent() { + public SoundEvent getEquipSound() { return this.soundEvent; } - public Ingredient getRepairMaterial() { - return this.repairMaterial.getValue(); + public Ingredient getRepairIngredient() { + return this.repairMaterial.get(); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java b/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java index d38cb9ff2..a53b0d477 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java @@ -1,10 +1,12 @@ package com.simibubi.create.content.curiosities.armor; +import com.simibubi.create.AllEnchantments; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.config.AllConfigs; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; @@ -16,7 +18,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; public class BackTankUtil { public static ItemStack get(LivingEntity entity) { - for (ItemStack itemStack : entity.getArmorInventoryList()) + for (ItemStack itemStack : entity.getArmorSlots()) if (AllItems.COPPER_BACKTANK.isIn(itemStack)) return itemStack; return ItemStack.EMPTY; @@ -28,17 +30,26 @@ public class BackTankUtil { public static float getAir(ItemStack backtank) { CompoundNBT tag = backtank.getOrCreateTag(); - return tag.getFloat("Air"); + return Math.min(tag.getFloat("Air"), maxAir(backtank)); } public static void consumeAir(ItemStack backtank, float i) { CompoundNBT tag = backtank.getOrCreateTag(); - tag.putFloat("Air", getAir(backtank) - i); + tag.putFloat("Air", Math.min(getAir(backtank) - i, maxAir(backtank))); backtank.setTag(tag); } - private static float maxAir() { - return AllConfigs.SERVER.curiosities.maxAirInBacktank.get(); + public static int maxAir(ItemStack backtank) { + return maxAir(EnchantmentHelper.getItemEnchantmentLevel(AllEnchantments.CAPACITY.get(), backtank)); + } + + public static int maxAir(int enchantLevel) { + return AllConfigs.SERVER.curiosities.airInBacktank.get() + + AllConfigs.SERVER.curiosities.enchantedBacktankCapacity.get() * enchantLevel; + } + + public static int maxAirWithoutEnchants() { + return AllConfigs.SERVER.curiosities.airInBacktank.get(); } public static boolean canAbsorbDamage(LivingEntity entity, int usesPerTank) { @@ -51,7 +62,7 @@ public class BackTankUtil { return false; if (!hasAirRemaining(backtank)) return false; - float cost = maxAir() / usesPerTank; + float cost = ((float) maxAirWithoutEnchants()) / usesPerTank; consumeAir(backtank, cost); return true; } @@ -67,7 +78,7 @@ public class BackTankUtil { return 0; ItemStack backtank = get(player); if (backtank.isEmpty() || !hasAirRemaining(backtank)) - return MathHelper.hsvToRGB( + return MathHelper.hsvToRgb( Math.max(0.0F, (float) (1.0F - getDurabilityForDisplay(stack, usesPerTank))) / 3.0F, 1.0F, 1.0F); return backtank.getItem() .getRGBDurabilityForDisplay(backtank); @@ -82,7 +93,7 @@ public class BackTankUtil { return 0; ItemStack backtank = get(player); if (backtank.isEmpty() || !hasAirRemaining(backtank)) - return (double) stack.getDamage() / (double) stack.getMaxDamage(); + return (double) stack.getDamageValue() / (double) stack.getMaxDamage(); return backtank.getItem() .getDurabilityForDisplay(backtank); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CapacityEnchantment.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CapacityEnchantment.java new file mode 100644 index 000000000..49b31df0d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CapacityEnchantment.java @@ -0,0 +1,27 @@ +package com.simibubi.create.content.curiosities.armor; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentType; +import net.minecraft.inventory.EquipmentSlotType; +import net.minecraft.item.ItemStack; + +public class CapacityEnchantment extends Enchantment { + + public CapacityEnchantment(Rarity p_i46731_1_, EnchantmentType p_i46731_2_, EquipmentSlotType[] p_i46731_3_) { + super(p_i46731_1_, p_i46731_2_, p_i46731_3_); + } + + @Override + public int getMaxLevel() { + return 3; + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack) { + return stack.getItem() instanceof ICapacityEnchantable; + } + + public interface ICapacityEnchantable { + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperArmorItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperArmorItem.java index 01ccb623e..3b8274e37 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperArmorItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperArmorItem.java @@ -10,11 +10,11 @@ import net.minecraft.item.ItemStack; public class CopperArmorItem extends ArmorItem { public CopperArmorItem(EquipmentSlotType p_i48534_2_, Properties p_i48534_3_) { - super(AllArmorMaterials.COPPER, p_i48534_2_, p_i48534_3_); + super(AllArmorMaterials.COPPER, p_i48534_2_, p_i48534_3_.stacksTo(1)); } public boolean isWornBy(Entity entity) { - for (ItemStack itemStack : entity.getArmorInventoryList()) + for (ItemStack itemStack : entity.getArmorSlots()) if (itemStack.getItem() == this) return true; return false; diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java index 2d97378b4..851ce18cc 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java @@ -53,21 +53,21 @@ public class CopperBacktankArmorLayer model = (BipedModel) entityModel; BlockState renderedState = AllBlocks.COPPER_BACKTANK.getDefaultState() - .with(CopperBacktankBlock.HORIZONTAL_FACING, Direction.SOUTH); - RenderType renderType = Atlases.getEntityCutout(); + .setValue(CopperBacktankBlock.HORIZONTAL_FACING, Direction.SOUTH); + RenderType renderType = Atlases.cutoutBlockSheet(); SuperByteBuffer backtank = CreateClient.BUFFER_CACHE.renderBlock(renderedState); SuperByteBuffer cogs = CreateClient.BUFFER_CACHE.renderPartial(AllBlockPartials.COPPER_BACKTANK_COGS, renderedState); - model.bipedBody.rotate(ms); + model.body.translateAndRotate(ms); ms.translate(-1 / 2f, 10 / 16f, 1f); ms.scale(1, -1, -1); backtank.forEntityRender() @@ -79,20 +79,20 @@ public class CopperBacktankArmorLayer renderer : renderManager.renderers.values()) registerOn(renderer); } @@ -112,19 +112,19 @@ public class CopperBacktankArmorLayer builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(BlockStateProperties.WATERLOGGED); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); + } + + @Override + public boolean hasAnalogOutputSignal(BlockState p_149740_1_) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState p_180641_1_, World world, BlockPos pos) { + return getTileEntityOptional(world, pos).map(CopperBacktankTileEntity::getComparatorOutput) + .orElse(0); } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, IWorld world, BlockPos pos, BlockPos neighbourPos) { - if (state.get(BlockStateProperties.WATERLOGGED)) { - world.getPendingFluidTicks() - .scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + if (state.getValue(BlockStateProperties.WATERLOGGED)) { + world.getLiquidTicks() + .scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return state; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - FluidState ifluidstate = context.getWorld() - .getFluidState(context.getPos()); - return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, - Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + FluidState ifluidstate = context.getLevel() + .getFluidState(context.getClickedPos()); + return super.getStateForPlacement(context).setValue(BlockStateProperties.WATERLOGGED, + Boolean.valueOf(ifluidstate.getType() == Fluids.WATER)); } @Override @@ -89,55 +104,68 @@ public class CopperBacktankBlock extends HorizontalKineticBlock } @Override - public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { - super.onBlockPlacedBy(worldIn, pos, state, placer, stack); - if (worldIn.isRemote) + public void setPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { + super.setPlacedBy(worldIn, pos, state, placer, stack); + if (worldIn.isClientSide) return; if (stack == null) return; withTileEntityDo(worldIn, pos, te -> { + te.setCapacityEnchantLevel(EnchantmentHelper.getItemEnchantmentLevel(AllEnchantments.CAPACITY.get(), stack)); te.setAirLevel(stack.getOrCreateTag() .getInt("Air")); - if (stack.hasDisplayName()) - te.setCustomName(stack.getDisplayName()); + if (stack.isEnchanted()) + te.setEnchantmentTag(stack.getEnchantmentTags()); + if (stack.hasCustomHoverName()) + te.setCustomName(stack.getHoverName()); }); } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand p_225533_5_, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand p_225533_5_, BlockRayTraceResult p_225533_6_) { if (player == null) return ActionResultType.PASS; if (player instanceof FakePlayer) return ActionResultType.PASS; - if (player.isSneaking()) + if (player.isShiftKeyDown()) return ActionResultType.PASS; - if (player.getHeldItemMainhand() + if (player.getMainHandItem() .getItem() instanceof BlockItem) return ActionResultType.PASS; - if (!player.getItemStackFromSlot(EquipmentSlotType.CHEST) + if (!player.getItemBySlot(EquipmentSlotType.CHEST) .isEmpty()) return ActionResultType.PASS; - if (!world.isRemote) { - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, .75f, 1); - player.setItemStackToSlot(EquipmentSlotType.CHEST, getItem(world, pos, state)); + if (!world.isClientSide) { + world.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundCategory.PLAYERS, .75f, 1); + player.setItemSlot(EquipmentSlotType.CHEST, getCloneItemStack(world, pos, state)); world.destroyBlock(pos, false); } return ActionResultType.SUCCESS; } @Override - public ItemStack getItem(IBlockReader p_185473_1_, BlockPos p_185473_2_, BlockState p_185473_3_) { + public ItemStack getCloneItemStack(IBlockReader p_185473_1_, BlockPos p_185473_2_, BlockState p_185473_3_) { ItemStack item = AllItems.COPPER_BACKTANK.asStack(); Optional tileEntityOptional = getTileEntityOptional(p_185473_1_, p_185473_2_); + int air = tileEntityOptional.map(CopperBacktankTileEntity::getAirLevel) .orElse(0); + CompoundNBT tag = item.getOrCreateTag(); + tag.putInt("Air", air); + + ListNBT enchants = tileEntityOptional.map(CopperBacktankTileEntity::getEnchantmentTag) + .orElse(new ListNBT()); + if (!enchants.isEmpty()) { + ListNBT enchantmentTagList = item.getEnchantmentTags(); + enchantmentTagList.addAll(enchants); + tag.put("Enchantments", enchantmentTagList); + } + ITextComponent customName = tileEntityOptional.map(CopperBacktankTileEntity::getCustomName) .orElse(null); - item.getOrCreateTag() - .putInt("Air", air); if (customName != null) - item.setDisplayName(customName); + item.setHoverName(customName); return item; } @@ -158,7 +186,7 @@ public class CopperBacktankBlock extends HorizontalKineticBlock } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankInstance.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankInstance.java index dda0ab339..ad251f267 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankInstance.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.curiosities.armor; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatingData; diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankItem.java index 7e537816d..81df65440 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankItem.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.curiosities.armor; -import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.content.curiosities.armor.CapacityEnchantment.ICapacityEnchantable; import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.BlockItem; @@ -12,7 +12,7 @@ import net.minecraft.util.ActionResultType; import net.minecraft.util.NonNullList; import net.minecraft.util.math.MathHelper; -public class CopperBacktankItem extends CopperArmorItem { +public class CopperBacktankItem extends CopperArmorItem implements ICapacityEnchantable { public static final int DURABILITY_BAR = 0xefefef; private BlockItem blockItem; @@ -23,14 +23,19 @@ public class CopperBacktankItem extends CopperArmorItem { } @Override - public ActionResultType onItemUse(ItemUseContext p_195939_1_) { - return blockItem.onItemUse(p_195939_1_); + public ActionResultType useOn(ItemUseContext p_195939_1_) { + return blockItem.useOn(p_195939_1_); } @Override - public boolean isDamageable() { + public boolean canBeDepleted() { return false; } + + @Override + public boolean isEnchantable(ItemStack p_77616_1_) { + return true; + } @Override public int getRGBDurabilityForDisplay(ItemStack stack) { @@ -38,13 +43,13 @@ public class CopperBacktankItem extends CopperArmorItem { } @Override - public void fillItemGroup(ItemGroup p_150895_1_, NonNullList p_150895_2_) { - if (!isInGroup(p_150895_1_)) + public void fillItemCategory(ItemGroup p_150895_1_, NonNullList p_150895_2_) { + if (!allowdedIn(p_150895_1_)) return; ItemStack stack = new ItemStack(this); CompoundNBT nbt = new CompoundNBT(); - nbt.putInt("Air", AllConfigs.SERVER.curiosities.maxAirInBacktank.get()); + nbt.putInt("Air", BackTankUtil.maxAirWithoutEnchants()); stack.setTag(nbt); p_150895_2_.add(stack); } @@ -52,7 +57,7 @@ public class CopperBacktankItem extends CopperArmorItem { @Override public double getDurabilityForDisplay(ItemStack stack) { return 1 - MathHelper - .clamp(getRemainingAir(stack) / ((float) AllConfigs.SERVER.curiosities.maxAirInBacktank.get()), 0, 1); + .clamp(getRemainingAir(stack) / ((float) BackTankUtil.maxAir(stack)), 0, 1); } @Override @@ -64,5 +69,5 @@ public class CopperBacktankItem extends CopperArmorItem { CompoundNBT orCreateTag = stack.getOrCreateTag(); return orCreateTag.getInt("Air"); } - + } diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankRenderer.java index 1fe8b76a6..c9075a4ae 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankRenderer.java @@ -31,14 +31,14 @@ public class CopperBacktankRenderer extends KineticTileEntityRenderer { cogs.matrixStacker() .centre() .rotateY(180 + AngleHelper.horizontalAngle(te.getBlockState() - .get(CopperBacktankBlock.HORIZONTAL_FACING))) + .getValue(CopperBacktankBlock.HORIZONTAL_FACING))) .unCentre() .translate(0, 6.5f / 16, 11f / 16) .rotate(Direction.EAST, - AngleHelper.rad(te.getSpeed() / 4f * AnimationTickHolder.getRenderTime(te.getWorld()) % 360)) + AngleHelper.rad(te.getSpeed() / 4f * AnimationTickHolder.getRenderTime(te.getLevel()) % 360)) .translate(0, -6.5f / 16, -11f / 16); cogs.light(light) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + .renderInto(ms, buffer.getBuffer(RenderType.solid())); } @Override diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankTileEntity.java index 30b63d8c2..b03b79038 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankTileEntity.java @@ -5,12 +5,15 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.particle.AirParticleData; -import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.tileEntity.ComparatorUtil; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; import net.minecraft.particles.ParticleTypes; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction.Axis; import net.minecraft.util.INameable; @@ -18,6 +21,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.common.util.Constants.NBT; public class CopperBacktankTileEntity extends KineticTileEntity implements INameable { @@ -25,8 +29,12 @@ public class CopperBacktankTileEntity extends KineticTileEntity implements IName public int airLevelTimer; private ITextComponent customName; + private int capacityEnchantLevel; + private ListNBT enchantmentTag; + public CopperBacktankTileEntity(TileEntityType typeIn) { super(typeIn); + enchantmentTag = new ListNBT(); } @Override @@ -34,34 +42,94 @@ public class CopperBacktankTileEntity extends KineticTileEntity implements IName super.tick(); if (getSpeed() == 0) return; + + BlockState state = getBlockState(); + BooleanProperty waterProperty = BlockStateProperties.WATERLOGGED; + if (state.hasProperty(waterProperty) && state.getValue(waterProperty)) + return; + if (airLevelTimer > 0) { airLevelTimer--; return; } - int max = getMaxAir(); - if (world.isRemote) { - Vector3d centerOf = VecHelper.getCenterOf(pos); + int max = BackTankUtil.maxAir(capacityEnchantLevel); + if (level.isClientSide) { + Vector3d centerOf = VecHelper.getCenterOf(worldPosition); Vector3d v = VecHelper.offsetRandomly(centerOf, Create.RANDOM, .65f); Vector3d m = centerOf.subtract(v); if (airLevel != max) - world.addParticle(new AirParticleData(1, .05f), v.x, v.y, v.z, m.x, m.y, m.z); + level.addParticle(new AirParticleData(1, .05f), v.x, v.y, v.z, m.x, m.y, m.z); return; } if (airLevel == max) return; + int prevComparatorLevel = getComparatorOutput(); float abs = Math.abs(getSpeed()); int increment = MathHelper.clamp(((int) abs - 100) / 20, 1, 5); airLevel = Math.min(max, airLevel + increment); + if (getComparatorOutput() != prevComparatorLevel && !level.isClientSide) + level.updateNeighbourForOutputSignal(worldPosition, state.getBlock()); if (airLevel == max) sendData(); airLevelTimer = MathHelper.clamp((int) (128f - abs / 5f) - 108, 0, 20); } - protected int getMaxAir() { - return AllConfigs.SERVER.curiosities.maxAirInBacktank.get(); + public int getComparatorOutput() { + int max = BackTankUtil.maxAir(capacityEnchantLevel); + return ComparatorUtil.fractionToRedstoneLevel(airLevel / (float) max); + } + + @Override + protected void write(CompoundNBT compound, boolean clientPacket) { + super.write(compound, clientPacket); + compound.putInt("Air", airLevel); + compound.putInt("Timer", airLevelTimer); + compound.putInt("CapacityEnchantment", capacityEnchantLevel); + if (this.customName != null) + compound.putString("CustomName", ITextComponent.Serializer.toJson(this.customName)); + compound.put("Enchantments", enchantmentTag); + } + + @Override + protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { + super.fromTag(state, compound, clientPacket); + int prev = airLevel; + capacityEnchantLevel = compound.getInt("CapacityEnchantment"); + airLevel = compound.getInt("Air"); + airLevelTimer = compound.getInt("Timer"); + enchantmentTag = compound.getList("Enchantments", NBT.TAG_COMPOUND); + if (compound.contains("CustomName", 8)) + this.customName = ITextComponent.Serializer.fromJson(compound.getString("CustomName")); + if (prev != 0 && prev != airLevel && airLevel == BackTankUtil.maxAir(capacityEnchantLevel) && clientPacket) + playFilledEffect(); + } + + protected void playFilledEffect() { + AllSoundEvents.CONFIRM.playAt(level, worldPosition, 0.4f, 1, true); + Vector3d baseMotion = new Vector3d(.25, 0.1, 0); + Vector3d baseVec = VecHelper.getCenterOf(worldPosition); + for (int i = 0; i < 360; i += 10) { + Vector3d m = VecHelper.rotate(baseMotion, i, Axis.Y); + Vector3d v = baseVec.add(m.normalize() + .scale(.25f)); + + level.addParticle(ParticleTypes.SPIT, v.x, v.y, v.z, m.x, m.y, m.z); + } + } + + @Override + public ITextComponent getName() { + return this.customName != null ? this.customName + : new TranslationTextComponent(AllItems.COPPER_BACKTANK.get() + .getDescriptionId()); + } + + @Override + public boolean shouldRenderNormally() { + return true; } public int getAirLevel() { @@ -81,50 +149,16 @@ public class CopperBacktankTileEntity extends KineticTileEntity implements IName return customName; } - @Override - protected void write(CompoundNBT compound, boolean clientPacket) { - super.write(compound, clientPacket); - compound.putInt("Air", airLevel); - compound.putInt("Timer", airLevelTimer); - if (this.customName != null) - compound.putString("CustomName", ITextComponent.Serializer.toJson(this.customName)); + public ListNBT getEnchantmentTag() { + return enchantmentTag; } - @Override - protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { - super.fromTag(state, compound, clientPacket); - int prev = airLevel; - airLevel = compound.getInt("Air"); - airLevelTimer = compound.getInt("Timer"); - if (compound.contains("CustomName", 8)) - this.customName = ITextComponent.Serializer.fromJson(compound.getString("CustomName")); - if (prev != 0 && prev != airLevel && airLevel == getMaxAir() && clientPacket) - playFilledEffect(); + public void setEnchantmentTag(ListNBT enchantmentTag) { + this.enchantmentTag = enchantmentTag; } - protected void playFilledEffect() { - AllSoundEvents.CONFIRM.playAt(world, pos, 0.4f, 1, true); - Vector3d baseMotion = new Vector3d(.25, 0.1, 0); - Vector3d baseVec = VecHelper.getCenterOf(pos); - for (int i = 0; i < 360; i += 10) { - Vector3d m = VecHelper.rotate(baseMotion, i, Axis.Y); - Vector3d v = baseVec.add(m.normalize() - .scale(.25f)); - - world.addParticle(ParticleTypes.SPIT, v.x, v.y, v.z, m.x, m.y, m.z); - } - } - - @Override - public ITextComponent getName() { - return this.customName != null ? this.customName - : new TranslationTextComponent(AllItems.COPPER_BACKTANK.get() - .getTranslationKey()); - } - - @Override - public boolean shouldRenderNormally() { - return true; + public void setCapacityEnchantLevel(int capacityEnchantLevel) { + this.capacityEnchantLevel = capacityEnchantLevel; } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java index 9b83bbb72..bde20ed32 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java @@ -26,9 +26,9 @@ public class DivingBootsItem extends CopperArmorItem { if (!affects(entity)) return; - Vector3d motion = entity.getMotion(); - Boolean isJumping = ObfuscationReflectionHelper.getPrivateValue(LivingEntity.class, entity, "field_70703_bu"); - entity.onGround |= entity.collidedVertically; + Vector3d motion = entity.getDeltaMovement(); + Boolean isJumping = ObfuscationReflectionHelper.getPrivateValue(LivingEntity.class, entity, "field_70703_bu"); // jumping + entity.onGround |= entity.verticalCollision; if (isJumping && entity.onGround) { motion = motion.add(0, .5f, 0); @@ -38,10 +38,10 @@ public class DivingBootsItem extends CopperArmorItem { } float multiplier = 1.3f; - if (motion.mul(1, 0, 1) - .length() < 0.145f && (entity.moveForward > 0 || entity.moveStrafing != 0) && !entity.isSneaking()) - motion = motion.mul(multiplier, 1, multiplier); - entity.setMotion(motion); + if (motion.multiply(1, 0, 1) + .length() < 0.145f && (entity.zza > 0 || entity.xxa != 0) && !entity.isShiftKeyDown()) + motion = motion.multiply(multiplier, 1, multiplier); + entity.setDeltaMovement(motion); } protected static boolean affects(LivingEntity entity) { @@ -59,7 +59,7 @@ public class DivingBootsItem extends CopperArmorItem { return false; if (entity instanceof PlayerEntity) { PlayerEntity playerEntity = (PlayerEntity) entity; - if (playerEntity.abilities.isFlying) + if (playerEntity.abilities.flying) return false; } return true; diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java index dae5e477a..18d5f81ed 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java @@ -24,18 +24,18 @@ public class DivingHelmetItem extends CopperArmorItem { @SubscribeEvent public static void breatheUnderwater(LivingUpdateEvent event) { LivingEntity entity = event.getEntityLiving(); - World world = entity.world; + World world = entity.level; boolean second = world.getGameTime() % 20 == 0; - boolean drowning = entity.getAir() == 0; + boolean drowning = entity.getAirSupply() == 0; - if (world.isRemote) + if (world.isClientSide) entity.getPersistentData() .remove("VisualBacktankAir"); if (!AllItems.DIVING_HELMET.get() .isWornBy(entity)) return; - if (!entity.areEyesInFluid(FluidTags.WATER)) + if (!entity.isEyeInFluid(FluidTags.WATER)) return; if (entity instanceof PlayerEntity && ((PlayerEntity) entity).isCreative()) return; @@ -47,17 +47,17 @@ public class DivingHelmetItem extends CopperArmorItem { return; if (drowning) - entity.setAir(10); + entity.setAirSupply(10); - if (world.isRemote) + if (world.isClientSide) entity.getPersistentData() .putInt("VisualBacktankAir", (int) BackTankUtil.getAir(backtank)); if (!second) return; - entity.setAir(Math.min(entity.getMaxAir(), entity.getAir() + 10)); - entity.addPotionEffect(new EffectInstance(Effects.WATER_BREATHING, 30, 0, true, false, true)); + entity.setAirSupply(Math.min(entity.getMaxAirSupply(), entity.getAirSupply() + 10)); + entity.addEffect(new EffectInstance(Effects.WATER_BREATHING, 30, 0, true, false, true)); BackTankUtil.consumeAir(backtank, 1); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellBlock.java b/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellBlock.java index 36d98baa4..c3f4e7bc5 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellBlock.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellBlock.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.curiosities.bell; import javax.annotation.Nullable; +import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.BellBlock; @@ -27,42 +28,47 @@ public abstract class AbstractBellBlock exten @Override @Nullable - public TileEntity createNewTileEntity(IBlockReader block) { + public TileEntity newBlockEntity(IBlockReader block) { return null; } - protected VoxelShape getShape(BlockState state) { - return VoxelShapes.fullCube(); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, IBlockReader reader, BlockPos pos, ISelectionContext selection) { - return this.getShape(state); - } - @Override public VoxelShape getShape(BlockState state, IBlockReader reader, BlockPos pos, ISelectionContext selection) { - return this.getShape(state); + Direction facing = state.getValue(FACING); + switch (state.getValue(ATTACHMENT)) { + case CEILING: + return AllShapes.BELL_CEILING.get(facing); + case DOUBLE_WALL: + return AllShapes.BELL_DOUBLE_WALL.get(facing); + case FLOOR: + return AllShapes.BELL_FLOOR.get(facing); + case SINGLE_WALL: + return AllShapes.BELL_WALL.get(facing); + default: + return VoxelShapes.block(); + } } @Override - public boolean ring(World world, BlockState state, BlockRayTraceResult hit, @Nullable PlayerEntity player, boolean flag) { - BlockPos pos = hit.getPos(); - Direction direction = hit.getFace(); + public boolean onHit(World world, BlockState state, BlockRayTraceResult hit, @Nullable PlayerEntity player, + boolean flag) { + BlockPos pos = hit.getBlockPos(); + Direction direction = hit.getDirection(); if (direction == null) - direction = world.getBlockState(pos).get(field_220133_a); + direction = world.getBlockState(pos) + .getValue(FACING); - if (!this.canRingFrom(state, direction, hit.getHitVec().y - pos.getY())) + if (!this.canRingFrom(state, direction, hit.getLocation().y - pos.getY())) return false; TE te = getTileEntity(world, pos); if (te == null || !te.ring(world, pos, direction)) return false; - if (!world.isRemote) { + if (!world.isClientSide) { playSound(world, pos); if (player != null) - player.addStat(Stats.BELL_RING); + player.awardStat(Stats.BELL_RING); } return true; @@ -74,17 +80,17 @@ public abstract class AbstractBellBlock exten if (heightChange > 0.8124) return false; - Direction direction = state.get(field_220133_a); - BellAttachment bellAttachment = state.get(field_220134_b); - switch(bellAttachment) { - case FLOOR: - case CEILING: - return direction.getAxis() == hitDir.getAxis(); - case SINGLE_WALL: - case DOUBLE_WALL: - return direction.getAxis() != hitDir.getAxis(); - default: - return false; + Direction direction = state.getValue(FACING); + BellAttachment bellAttachment = state.getValue(ATTACHMENT); + switch (bellAttachment) { + case FLOOR: + case CEILING: + return direction.getAxis() == hitDir.getAxis(); + case SINGLE_WALL: + case DOUBLE_WALL: + return direction.getAxis() != hitDir.getAxis(); + default: + return false; } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/BasicParticleData.java b/src/main/java/com/simibubi/create/content/curiosities/bell/BasicParticleData.java index 9f6374e97..4ff8f8328 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/BasicParticleData.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/BasicParticleData.java @@ -29,12 +29,12 @@ public abstract class BasicParticleData implements IParticle BasicParticleData data = this; return new IParticleData.IDeserializer>() { @Override - public BasicParticleData deserialize(ParticleType> arg0, StringReader reader) { + public BasicParticleData fromCommand(ParticleType> arg0, StringReader reader) { return data; } @Override - public BasicParticleData read(ParticleType> type, PacketBuffer buffer) { + public BasicParticleData fromNetwork(ParticleType> type, PacketBuffer buffer) { return data; } }; @@ -60,10 +60,10 @@ public abstract class BasicParticleData implements IParticle } @Override - public String getParameters() { + public String writeToString() { return Registry.PARTICLE_TYPE.getKey(getType()).toString(); } @Override - public void write(PacketBuffer buffer) { } + public void writeToNetwork(PacketBuffer buffer) { } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java index 1b68c75a4..37d12a927 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java @@ -26,21 +26,21 @@ public class BellRenderer extends SafeTileEnt @Override protected void renderSafe(TE te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { BlockState state = te.getBlockState(); - Direction facing = state.get(BellBlock.field_220133_a); - BellAttachment attachment = state.get(BellBlock.field_220134_b); + Direction facing = state.getValue(BellBlock.FACING); + BellAttachment attachment = state.getValue(BellBlock.ATTACHMENT); SuperByteBuffer bell = PartialBufferer.get(te.getBellModel(), state); if (te.isRinging) - bell.rotateCentered(te.ringDirection.rotateYCCW(), getSwingAngle(te.ringingTicks + partialTicks)); + bell.rotateCentered(te.ringDirection.getCounterClockWise(), getSwingAngle(te.ringingTicks + partialTicks)); float rY = AngleHelper.horizontalAngle(facing); if (attachment == BellAttachment.SINGLE_WALL || attachment == BellAttachment.DOUBLE_WALL) rY += 90; bell.rotateCentered(Direction.UP, AngleHelper.rad(rY)); - IVertexBuilder vb = buffer.getBuffer(RenderType.getCutout()); - int lightCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), state, te.getPos()); + IVertexBuilder vb = buffer.getBuffer(RenderType.cutout()); + int lightCoords = WorldRenderer.getLightColor(te.getLevel(), state, te.getBlockPos()); bell.light(lightCoords).renderInto(ms, vb); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellPulser.java b/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellPulser.java deleted file mode 100644 index 3948d8491..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellPulser.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.simibubi.create.content.curiosities.bell; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.networking.AllPackets; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.LogicalSide; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import net.minecraftforge.fml.network.PacketDistributor; - -@EventBusSubscriber -public class CursedBellPulser { - - public static final int DISTANCE = 3; - public static final int RECHARGE_TICKS = 8; - - @SubscribeEvent - public static void cursedBellCreatesPulse(TickEvent.PlayerTickEvent event) { - if (event.phase != TickEvent.Phase.END) - return; - if (event.side != LogicalSide.SERVER) - return; - if (event.player.isSpectator()) - return; - - if (event.player.world.getGameTime() % RECHARGE_TICKS != 0) - return; - - if (event.player.isHolding(AllBlocks.CURSED_BELL::is)) - sendPulse(event.player.world, event.player.getBlockPos(), DISTANCE, false); - } - - public static void sendPulse(World world, BlockPos pos, int distance, boolean canOverlap) { - Chunk chunk = world.getChunkAt(pos); - AllPackets.channel.send(PacketDistributor.TRACKING_CHUNK.with(() -> chunk), new SoulPulseEffectPacket(pos, distance, canOverlap)); - } - -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/CustomRotationParticle.java b/src/main/java/com/simibubi/create/content/curiosities/bell/CustomRotationParticle.java index 3e82e828d..66e708d8d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/CustomRotationParticle.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/CustomRotationParticle.java @@ -1,10 +1,12 @@ package com.simibubi.create.content.curiosities.bell; +import com.jozufozu.flywheel.backend.OptifineHandler; import com.mojang.blaze3d.vertex.IVertexBuilder; import net.minecraft.client.particle.IAnimatedSprite; import net.minecraft.client.particle.SimpleAnimatedParticle; import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.world.ClientWorld; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Quaternion; @@ -26,20 +28,20 @@ public class CustomRotationParticle extends SimpleAnimatedParticle { } public Quaternion getCustomRotation(ActiveRenderInfo camera, float partialTicks) { - Quaternion quaternion = new Quaternion(camera.getRotation()); - if (particleAngle != 0.0F) { - float angle = MathHelper.lerp(partialTicks, prevParticleAngle, particleAngle); - quaternion.multiply(Vector3f.POSITIVE_Z.getRadialQuaternion(angle)); + Quaternion quaternion = new Quaternion(camera.rotation()); + if (roll != 0.0F) { + float angle = MathHelper.lerp(partialTicks, oRoll, roll); + quaternion.mul(Vector3f.ZP.rotation(angle)); } return quaternion; } @Override - public void buildGeometry(IVertexBuilder builder, ActiveRenderInfo camera, float partialTicks) { - Vector3d cameraPos = camera.getProjectedView(); - float originX = (float) (MathHelper.lerp(partialTicks, prevPosX, posX) - cameraPos.getX()); - float originY = (float) (MathHelper.lerp(partialTicks, prevPosY, posY) - cameraPos.getY()); - float originZ = (float) (MathHelper.lerp(partialTicks, prevPosZ, posZ) - cameraPos.getZ()); + public void render(IVertexBuilder builder, ActiveRenderInfo camera, float partialTicks) { + Vector3d cameraPos = camera.getPosition(); + float originX = (float) (MathHelper.lerp(partialTicks, xo, x) - cameraPos.x()); + float originY = (float) (MathHelper.lerp(partialTicks, yo, y) - cameraPos.y()); + float originZ = (float) (MathHelper.lerp(partialTicks, zo, z) - cameraPos.z()); Vector3f[] vertices = new Vector3f[] { new Vector3f(-1.0F, -1.0F, 0.0F), @@ -47,24 +49,24 @@ public class CustomRotationParticle extends SimpleAnimatedParticle { new Vector3f(1.0F, 1.0F, 0.0F), new Vector3f(1.0F, -1.0F, 0.0F) }; - float scale = getScale(partialTicks); + float scale = getQuadSize(partialTicks); Quaternion rotation = getCustomRotation(camera, partialTicks); for(int i = 0; i < 4; ++i) { Vector3f vertex = vertices[i]; - vertex.func_214905_a(rotation); + vertex.transform(rotation); vertex.mul(scale); vertex.add(originX, originY, originZ); } - float minU = mirror ? getMaxU() : getMinU(); - float maxU = mirror ? getMinU() : getMaxU(); - float minV = getMinV(); - float maxV = getMaxV(); - int brightness = getBrightnessForRender(partialTicks); - builder.vertex(vertices[0].getX(), vertices[0].getY(), vertices[0].getZ()).texture(maxU, maxV).color(particleRed, particleGreen, particleBlue, particleAlpha).light(brightness).endVertex(); - builder.vertex(vertices[1].getX(), vertices[1].getY(), vertices[1].getZ()).texture(maxU, minV).color(particleRed, particleGreen, particleBlue, particleAlpha).light(brightness).endVertex(); - builder.vertex(vertices[2].getX(), vertices[2].getY(), vertices[2].getZ()).texture(minU, minV).color(particleRed, particleGreen, particleBlue, particleAlpha).light(brightness).endVertex(); - builder.vertex(vertices[3].getX(), vertices[3].getY(), vertices[3].getZ()).texture(minU, maxV).color(particleRed, particleGreen, particleBlue, particleAlpha).light(brightness).endVertex(); + float minU = mirror ? getU1() : getU0(); + float maxU = mirror ? getU0() : getU1(); + float minV = getV0(); + float maxV = getV1(); + int brightness = OptifineHandler.usingShaders() ? LightTexture.pack(12, 15 ) : getLightColor(partialTicks); + builder.vertex(vertices[0].x(), vertices[0].y(), vertices[0].z()).uv(maxU, maxV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); + builder.vertex(vertices[1].x(), vertices[1].y(), vertices[1].z()).uv(maxU, minV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); + builder.vertex(vertices[2].x(), vertices[2].y(), vertices[2].z()).uv(minU, minV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); + builder.vertex(vertices[3].x(), vertices[3].y(), vertices[3].z()).uv(minU, maxV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellBlock.java b/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellBlock.java similarity index 53% rename from src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellBlock.java rename to src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellBlock.java index 82962ec5b..7b02626a5 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellBlock.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellBlock.java @@ -9,31 +9,31 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -public class CursedBellBlock extends AbstractBellBlock { +public class HauntedBellBlock extends AbstractBellBlock { - public CursedBellBlock(Properties properties) { + public HauntedBellBlock(Properties properties) { super(properties); } @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.CURSED_BELL.create(); + return AllTileEntities.HAUNTED_BELL.create(); } @Override - public Class getTileEntityClass() { - return CursedBellTileEntity.class; + public Class getTileEntityClass() { + return HauntedBellTileEntity.class; } @Override public void playSound(World world, BlockPos pos) { - AllSoundEvents.CURSED_BELL_USE.playOnServer(world, pos, 4f, 1f); + AllSoundEvents.HAUNTED_BELL_USE.playOnServer(world, pos, 4f, 1f); } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { if (oldState.getBlock() != this) - withTileEntityDo(world, pos, CursedBellTileEntity::startEffect); + withTileEntityDo(world, pos, HauntedBellTileEntity::startEffect); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellMovementBehaviour.java b/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellMovementBehaviour.java similarity index 79% rename from src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellMovementBehaviour.java rename to src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellMovementBehaviour.java index 7976cf8a1..bbd46e191 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellMovementBehaviour.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import net.minecraft.util.math.BlockPos; -public class CursedBellMovementBehaviour extends BellMovementBehaviour { +public class HauntedBellMovementBehaviour extends BellMovementBehaviour { public static final int DISTANCE = 3; @@ -18,9 +18,9 @@ public class CursedBellMovementBehaviour extends BellMovementBehaviour { @Override public void visitNewPosition(MovementContext context, BlockPos pos) { - if (!context.world.isRemote && getRecharge(context) == 0) { - CursedBellPulser.sendPulse(context.world, pos, DISTANCE, true); - setRecharge(context, CursedBellTileEntity.RECHARGE_TICKS); + if (!context.world.isClientSide && getRecharge(context) == 0) { + HauntedBellPulser.sendPulse(context.world, pos, DISTANCE, false); + setRecharge(context, HauntedBellTileEntity.RECHARGE_TICKS); playSound(context); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellPulser.java b/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellPulser.java new file mode 100644 index 000000000..a26c96c1f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellPulser.java @@ -0,0 +1,69 @@ +package com.simibubi.create.content.curiosities.bell; + +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.IntAttached; + +import net.minecraft.entity.Entity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.network.PacketDistributor; + +@EventBusSubscriber +public class HauntedBellPulser { + + public static final int DISTANCE = 3; + public static final int RECHARGE_TICKS = 8; + public static final int WARMUP_TICKS = 10; + + public static final Cache> WARMUP = CacheBuilder.newBuilder() + .expireAfterAccess(250, TimeUnit.MILLISECONDS) + .build(); + + @SubscribeEvent + public static void hauntedBellCreatesPulse(TickEvent.PlayerTickEvent event) { + if (event.phase != TickEvent.Phase.END) + return; + if (event.side != LogicalSide.SERVER) + return; + if (event.player.isSpectator()) + return; + if (!event.player.isHolding(AllBlocks.HAUNTED_BELL::is)) + return; + + Entity player = event.player; + boolean firstPulse = false; + + try { + IntAttached ticker = WARMUP.get(player.getUUID(), () -> IntAttached.with(WARMUP_TICKS, player)); + firstPulse = ticker.getFirst() + .intValue() == 1; + ticker.decrement(); + if (!ticker.isOrBelowZero()) + return; + } catch (ExecutionException e) { + } + + long gameTime = player.level.getGameTime(); + if (firstPulse || gameTime % RECHARGE_TICKS != 0) + sendPulse(player.level, event.player.blockPosition(), DISTANCE, false); + } + + public static void sendPulse(World world, BlockPos pos, int distance, boolean canOverlap) { + Chunk chunk = world.getChunkAt(pos); + AllPackets.channel.send(PacketDistributor.TRACKING_CHUNK.with(() -> chunk), + new SoulPulseEffectPacket(pos, distance, canOverlap)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellTileEntity.java similarity index 77% rename from src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellTileEntity.java rename to src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellTileEntity.java index c99d1cf64..4847c815e 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellTileEntity.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellTileEntity.java @@ -17,7 +17,7 @@ import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class CursedBellTileEntity extends AbstractBellTileEntity { +public class HauntedBellTileEntity extends AbstractBellTileEntity { public static final int DISTANCE = 10; public static final int RECHARGE_TICKS = 65; @@ -25,7 +25,7 @@ public class CursedBellTileEntity extends AbstractBellTileEntity { public int effectTicks = 0; - public CursedBellTileEntity(TileEntityType type) { + public HauntedBellTileEntity(TileEntityType type) { super(type); } @@ -34,7 +34,7 @@ public class CursedBellTileEntity extends AbstractBellTileEntity { @Override public PartialModel getBellModel() { - return AllBlockPartials.CURSED_BELL; + return AllBlockPartials.HAUNTED_BELL; } @Override @@ -45,8 +45,8 @@ public class CursedBellTileEntity extends AbstractBellTileEntity { if (!super.ring(world, pos, direction)) return false; - if (!world.isRemote) - CursedBellPulser.sendPulse(world, pos, DISTANCE, true); + if (!world.isClientSide) + HauntedBellPulser.sendPulse(world, pos, DISTANCE, false); startEffect(); @@ -78,10 +78,10 @@ public class CursedBellTileEntity extends AbstractBellTileEntity { return; effectTicks--; - if (!world.isRemote) + if (!level.isClientSide) return; - Random rand = world.getRandom(); + Random rand = level.getRandom(); if (rand.nextFloat() > 0.25f) return; @@ -90,19 +90,19 @@ public class CursedBellTileEntity extends AbstractBellTileEntity { } protected void spawnParticle(Random rand) { - double x = pos.getX() + rand.nextDouble(); - double y = pos.getY() + 0.5; - double z = pos.getZ() + rand.nextDouble(); + double x = worldPosition.getX() + rand.nextDouble(); + double y = worldPosition.getY() + 0.5; + double z = worldPosition.getZ() + rand.nextDouble(); double vx = rand.nextDouble() * 0.04 - 0.02; double vy = 0.1; double vz = rand.nextDouble() * 0.04 - 0.02; - world.addParticle(ParticleTypes.SOUL, x, y, z, vx, vy, vz); + level.addParticle(ParticleTypes.SOUL, x, y, z, vx, vy, vz); } protected void playSound(Random rand) { float vol = rand.nextFloat() * 0.4F + rand.nextFloat() > 0.9F ? 0.6F : 0.0F; float pitch = 0.6F + rand.nextFloat() * 0.4F; - world.playSound(null, pos, SoundEvents.PARTICLE_SOUL_ESCAPE, SoundCategory.BLOCKS, vol, pitch); + level.playSound(null, worldPosition, SoundEvents.SOUL_ESCAPE, SoundCategory.BLOCKS, vol, pitch); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellBlock.java b/src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellBlock.java index ae11068e0..054b37668 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellBlock.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellBlock.java @@ -46,15 +46,15 @@ public class PeculiarBellBlock extends AbstractBellBlock if (newState == null) return null; - World world = ctx.getWorld(); - BlockPos pos = ctx.getPos(); - return tryConvert(world, pos, newState, world.getBlockState(pos.offset(Direction.DOWN))); + World world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + return tryConvert(world, pos, newState, world.getBlockState(pos.relative(Direction.DOWN))); } @Override - public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld world, + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, IWorld world, BlockPos currentPos, BlockPos facingPos) { - BlockState newState = super.updatePostPlacement(state, facing, facingState, world, currentPos, facingPos); + BlockState newState = super.updateShape(state, facing, facingState, world, currentPos, facingPos); if (facing != Direction.DOWN) return newState; @@ -66,16 +66,16 @@ public class PeculiarBellBlock extends AbstractBellBlock if (!(Blocks.SOUL_FIRE.is(underBlock) || Blocks.SOUL_CAMPFIRE.is(underBlock))) return state; - if (world.isRemote()) { + if (world.isClientSide()) { spawnConversionParticles(world, pos); } else if (world instanceof World) { - AllSoundEvents.CURSED_BELL_CONVERT.playOnServer((World) world, pos); + AllSoundEvents.HAUNTED_BELL_CONVERT.playOnServer((World) world, pos); } - return AllBlocks.CURSED_BELL.getDefaultState() - .with(CursedBellBlock.field_220133_a, state.get(field_220133_a)) - .with(CursedBellBlock.field_220134_b, state.get(field_220134_b)) - .with(CursedBellBlock.POWERED, state.get(POWERED)); + return AllBlocks.HAUNTED_BELL.getDefaultState() + .setValue(HauntedBellBlock.FACING, state.getValue(FACING)) + .setValue(HauntedBellBlock.ATTACHMENT, state.getValue(ATTACHMENT)) + .setValue(HauntedBellBlock.POWERED, state.getValue(POWERED)); } public void spawnConversionParticles(IWorld world, BlockPos blockPos) { @@ -84,8 +84,8 @@ public class PeculiarBellBlock extends AbstractBellBlock for (int i = 0; i < num; i++) { float pitch = random.nextFloat() * 120 - 90; float yaw = random.nextFloat() * 360; - Vector3d vel = Vector3d.fromPitchYaw(pitch, yaw).scale(random.nextDouble() * 0.1 + 0.1); - Vector3d pos = Vector3d.ofCenter(blockPos); + Vector3d vel = Vector3d.directionFromRotation(pitch, yaw).scale(random.nextDouble() * 0.1 + 0.1); + Vector3d pos = Vector3d.atCenterOf(blockPos); world.addParticle(ParticleTypes.SOUL_FIRE_FLAME, pos.x, pos.y, pos.z, vel.x, vel.y, vel.z); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulBaseParticle.java b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulBaseParticle.java index ce3f4820f..d65e73073 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulBaseParticle.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulBaseParticle.java @@ -6,6 +6,7 @@ import net.minecraft.client.particle.IAnimatedSprite; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.world.ClientWorld; import net.minecraft.particles.ParticleType; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Quaternion; import net.minecraft.util.math.vector.Vector3f; @@ -17,26 +18,26 @@ public class SoulBaseParticle extends CustomRotationParticle { IAnimatedSprite spriteSet) { super(worldIn, x, y, z, spriteSet, 0); this.animatedSprite = spriteSet; - this.particleScale = 0.5f; - this.setSize(this.particleScale, this.particleScale); - this.loopLength = 16 + (int) (this.rand.nextFloat() * 2f - 1f); - this.maxAge = (int) (90.0F / (this.rand.nextFloat() * 0.36F + 0.64F)); + this.quadSize = 0.5f; + this.setSize(this.quadSize, this.quadSize); + this.loopLength = 16 + (int) (this.random.nextFloat() * 2f - 1f); + this.lifetime = (int) (90.0F / (this.random.nextFloat() * 0.36F + 0.64F)); this.selectSpriteLoopingWithAge(animatedSprite); - this.field_21507 = true; // disable movement + this.stoppedByCollision = true; // disable movement } @Override public void tick() { - if (this.age++ >= this.maxAge) { - this.setExpired(); - } else { - this.selectSpriteLoopingWithAge(animatedSprite); - } + selectSpriteLoopingWithAge(animatedSprite); + + BlockPos pos = new BlockPos(x, y, z); + if (age++ >= lifetime || !SoulPulseEffect.isDark(level, pos)) + remove(); } @Override public Quaternion getCustomRotation(ActiveRenderInfo camera, float partialTicks) { - return Vector3f.POSITIVE_X.getDegreesQuaternion(90); + return Vector3f.XP.rotationDegrees(90); } public static class Data extends BasicParticleData { diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulParticle.java b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulParticle.java index ce36d72b4..32eb92bdf 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulParticle.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulParticle.java @@ -1,14 +1,16 @@ package com.simibubi.create.content.curiosities.bell; +import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllParticleTypes; import net.minecraft.client.particle.IAnimatedSprite; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.world.ClientWorld; +import net.minecraft.particles.IParticleData; import net.minecraft.particles.ParticleType; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Quaternion; -import net.minecraft.world.LightType; +import net.minecraft.util.math.vector.Vector3f; public class SoulParticle extends CustomRotationParticle { @@ -27,65 +29,110 @@ public class SoulParticle extends CustomRotationParticle { protected int firstEndFrame = 33; protected int endFrames = 20; - protected int totalFrames = 53; - - protected int ticksPerFrame = 2; - protected AnimationStage animationStage; + protected int totalFrames = 53; + protected int ticksPerFrame = 2; + + protected boolean isPerimeter = false; + protected boolean isExpandingPerimeter = false; + protected boolean isVisible = true; + protected int perimeterFrames = 8; + public SoulParticle(ClientWorld worldIn, double x, double y, double z, double vx, double vy, double vz, - IAnimatedSprite spriteSet) { + IAnimatedSprite spriteSet, IParticleData data) { super(worldIn, x, y, z, spriteSet, 0); this.animatedSprite = spriteSet; - this.particleScale = 0.5f; - this.setSize(this.particleScale, this.particleScale); + this.quadSize = 0.5f; + this.setSize(this.quadSize, this.quadSize); - this.loopLength = loopFrames + (int) (this.rand.nextFloat() * 5f - 4f); - this.startTicks = startFrames + (int) (this.rand.nextFloat() * 5f - 4f); - this.endTicks = endFrames + (int) (this.rand.nextFloat() * 5f - 4f); - this.numLoops = (int)(1f + this.rand.nextFloat() * 2f); + this.loopLength = loopFrames + (int) (this.random.nextFloat() * 5f - 4f); + this.startTicks = startFrames + (int) (this.random.nextFloat() * 5f - 4f); + this.endTicks = endFrames + (int) (this.random.nextFloat() * 5f - 4f); + this.numLoops = (int) (1f + this.random.nextFloat() * 2f); this.setFrame(0); - this.field_21507 = true; // disable movement - this.mirror = this.rand.nextBoolean(); + this.stoppedByCollision = true; // disable movement + this.mirror = this.random.nextBoolean(); - this.animationStage = new StartAnimation(this); + this.isPerimeter = data instanceof PerimeterData; + this.isExpandingPerimeter = data instanceof ExpandingPerimeterData; + this.animationStage = !isPerimeter ? new StartAnimation(this) : new PerimeterAnimation(this); + if (isPerimeter) { + yo = y -= .5f - 1 / 128f; + totalFrames = perimeterFrames; + isVisible = false; + } } @Override public void tick() { + animationStage.tick(); + animationStage = animationStage.getNext(); - this.animationStage.tick(); - - this.animationStage = animationStage.getNext(); - + BlockPos pos = new BlockPos(x, y, z); if (animationStage == null) - this.setExpired(); - if (world.getLightLevel(LightType.BLOCK, new BlockPos(posX, posY, posZ)) > 7) - this.setExpired(); + remove(); + if (!SoulPulseEffect.isDark(level, pos)) { + isVisible = true; + if (!isPerimeter) + remove(); + } else if (isPerimeter) + isVisible = false; + } + + @Override + public void render(IVertexBuilder builder, ActiveRenderInfo camera, float partialTicks) { + if (!isVisible) + return; + super.render(builder, camera, partialTicks); } public void setFrame(int frame) { if (frame >= 0 && frame < totalFrames) - this.setSprite(animatedSprite.get(frame, totalFrames)); + setSprite(animatedSprite.get(frame, totalFrames)); } @Override public Quaternion getCustomRotation(ActiveRenderInfo camera, float partialTicks) { - return new Quaternion(0, -camera.getYaw(), 0, true); + if (isPerimeter) + return Vector3f.XP.rotationDegrees(90); + return new Quaternion(0, -camera.getYRot(), 0, true); } public static class Data extends BasicParticleData { @Override public IBasicParticleFactory getBasicFactory() { - return SoulParticle::new; + return (worldIn, x, y, z, vx, vy, vz, spriteSet) -> new SoulParticle(worldIn, x, y, z, vx, vy, vz, + spriteSet, this); } + @Override public ParticleType getType() { return AllParticleTypes.SOUL.get(); } } + public static class PerimeterData extends BasicParticleData { + @Override + public IBasicParticleFactory getBasicFactory() { + return (worldIn, x, y, z, vx, vy, vz, spriteSet) -> new SoulParticle(worldIn, x, y, z, vx, vy, vz, + spriteSet, this); + } + + @Override + public ParticleType getType() { + return AllParticleTypes.SOUL_PERIMETER.get(); + } + } + + public static class ExpandingPerimeterData extends PerimeterData { + @Override + public ParticleType getType() { + return AllParticleTypes.SOUL_EXPANDING_PERIMETER.get(); + } + } + public static abstract class AnimationStage { protected final SoulParticle particle; @@ -121,7 +168,8 @@ public class SoulParticle extends CustomRotationParticle { public void tick() { super.tick(); - particle.setFrame(particle.firstStartFrame + (int) (getAnimAge() / (float) particle.startTicks * particle.startFrames)); + particle.setFrame( + particle.firstStartFrame + (int) (getAnimAge() / (float) particle.startTicks * particle.startFrames)); } @Override @@ -147,9 +195,11 @@ public class SoulParticle extends CustomRotationParticle { int loopTick = getLoopTick(); - if (loopTick == 0) loops++; + if (loopTick == 0) + loops++; - particle.setFrame(particle.firstLoopFrame + loopTick);//(int) (((float) loopTick / (float) particle.loopLength) * particle.loopFrames)); + particle.setFrame(particle.firstLoopFrame + loopTick);// (int) (((float) loopTick / (float) + // particle.loopLength) * particle.loopFrames)); } @@ -176,7 +226,8 @@ public class SoulParticle extends CustomRotationParticle { public void tick() { super.tick(); - particle.setFrame(particle.firstEndFrame + (int) ((getAnimAge() / (float) particle.endTicks) * particle.endFrames)); + particle.setFrame( + particle.firstEndFrame + (int) ((getAnimAge() / (float) particle.endTicks) * particle.endFrames)); } @@ -188,4 +239,26 @@ public class SoulParticle extends CustomRotationParticle { return null; } } + + public static class PerimeterAnimation extends AnimationStage { + + public PerimeterAnimation(SoulParticle particle) { + super(particle); + } + + @Override + public void tick() { + super.tick(); + particle.setFrame((int) getAnimAge() % particle.perimeterFrames); + } + + @Override + public AnimationStage getNext() { + if (animAge < (particle.isExpandingPerimeter ? 8 + : particle.startTicks + particle.endTicks + particle.numLoops * particle.loopLength)) + return this; + else + return null; + } + } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java index 13923f0e3..437555c64 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java @@ -5,6 +5,9 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.simibubi.create.content.curiosities.bell.SoulParticle.ExpandingPerimeterData; +import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.entity.EntitySpawnPlacementRegistry; import net.minecraft.entity.EntityType; import net.minecraft.util.math.AxisAlignedBB; @@ -17,7 +20,7 @@ import net.minecraft.world.spawner.WorldEntitySpawner; public class SoulPulseEffect { - public static final int MAX_DISTANCE = 10; + public static final int MAX_DISTANCE = 11; private static final List> LAYERS = genLayers(); private static final int WAITING_TICKS = 100; @@ -50,10 +53,10 @@ public class SoulPulseEffect { if (ticks < 0 || ticks % TICKS_PER_LAYER != 0) return null; - List spawns = getSoulSpawns(world); + List spawns = getPotentialSoulSpawns(world); while (spawns.isEmpty() && ticks > 0) { ticks -= TICKS_PER_LAYER; - spawns.addAll(getSoulSpawns(world)); + spawns.addAll(getPotentialSoulSpawns(world)); } return spawns; } @@ -62,37 +65,50 @@ public class SoulPulseEffect { return distance - ticks / TICKS_PER_LAYER - 1; } - public List getSoulSpawns(World world) { + public List getPotentialSoulSpawns(World world) { if (world == null) return new ArrayList<>(); - return getLayer(currentLayerIdx()).map(p -> p.add(pos)) - .filter(p -> canSpawnSoulAt(world, p)) - .collect(Collectors.toList()); + return getLayer(currentLayerIdx()).map(p -> p.offset(pos)) + .filter(p -> canSpawnSoulAt(world, p, true)) + .collect(Collectors.toList()); } - public boolean canSpawnSoulAt(World world, BlockPos at) { + public static boolean isDark(World world, BlockPos at) { + return world.getBrightness(LightType.BLOCK, at) < 8; + } + + public static boolean canSpawnSoulAt(World world, BlockPos at, boolean ignoreLight) { EntityType dummy = EntityType.ZOMBIE; double dummyWidth = 0.2, dummyHeight = 0.75; double w2 = dummyWidth / 2; return world != null - && WorldEntitySpawner.canCreatureTypeSpawnAtLocation( - EntitySpawnPlacementRegistry.PlacementType.ON_GROUND, world, at, dummy) - && world.getLightLevel(LightType.BLOCK, at) < 8 - && world.getBlockCollisions(null, new AxisAlignedBB( - at.getX() + 0.5 - w2, at.getY(), at.getZ() + 0.5 - w2, - at.getX() + 0.5 + w2, at.getY() + dummyHeight, at.getZ() + 0.5 + w2 - ), (a,b) -> true).allMatch(VoxelShape::isEmpty); + && WorldEntitySpawner + .isSpawnPositionOk(EntitySpawnPlacementRegistry.PlacementType.ON_GROUND, world, at, dummy) + && (ignoreLight || isDark(world, at)) + && world + .getBlockCollisions(null, + new AxisAlignedBB(at.getX() + 0.5 - w2, at.getY(), at.getZ() + 0.5 - w2, at.getX() + 0.5 + w2, + at.getY() + dummyHeight, at.getZ() + 0.5 + w2), + (a, b) -> true) + .allMatch(VoxelShape::isEmpty); } public void spawnParticles(World world, BlockPos at) { - if (world == null || !world.isRemote) + if (world == null || !world.isClientSide) return; - Vector3d p = Vector3d.of(at); - world.addOptionalParticle(new SoulParticle.Data(), p.x + 0.5, p.y + 0.5, p.z + 0.5, 0, 0, 0); - world.addParticle(new SoulBaseParticle.Data(), p.x + 0.5, p.y + 0.01, p.z + 0.5, 0, 0, 0); + Vector3d p = Vector3d.atLowerCornerOf(at); + if (canOverlap()) + world.addAlwaysVisibleParticle(((int) Math.round(VecHelper.getCenterOf(pos) + .distanceTo(VecHelper.getCenterOf(at)))) >= distance ? new SoulParticle.PerimeterData() + : new ExpandingPerimeterData(), + p.x + 0.5, p.y + 0.5, p.z + 0.5, 0, 0, 0); + if (world.getBrightness(LightType.BLOCK, at) < 8) { + world.addAlwaysVisibleParticle(new SoulParticle.Data(), p.x + 0.5, p.y + 0.5, p.z + 0.5, 0, 0, 0); + world.addParticle(new SoulBaseParticle.Data(), p.x + 0.5, p.y + 0.01, p.z + 0.5, 0, 0, 0); + } } private static List> genLayers() { @@ -105,7 +121,7 @@ public class SoulPulseEffect { for (int z = 0; z < MAX_DISTANCE; z++) { BlockPos candidate = new BlockPos(x, y, z); - int dist = (int) Math.round(Math.sqrt(candidate.distanceSq(0, 0, 0, false))); + int dist = (int) Math.round(Math.sqrt(candidate.distSqr(0, 0, 0, false))); if (dist > MAX_DISTANCE) continue; if (dist <= 0) @@ -142,7 +158,8 @@ public class SoulPulseEffect { public static Stream getLayer(int idx) { if (idx < 0 || idx >= MAX_DISTANCE) return Stream.empty(); - return LAYERS.get(idx).stream(); + return LAYERS.get(idx) + .stream(); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorBlock.java b/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorBlock.java deleted file mode 100644 index d303e77a4..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorBlock.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.simibubi.create.content.curiosities.projector; - -import javax.annotation.Nullable; - -import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.gui.ScreenOpener; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.world.IBlockReader; -import net.minecraft.world.World; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.DistExecutor; - -public class ChromaticProjectorBlock extends Block implements ITE { - public ChromaticProjectorBlock(Properties p_i48440_1_) { - super(p_i48440_1_); - } - - @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, - BlockRayTraceResult hit) { - ItemStack held = player.getHeldItemMainhand(); - if (AllItems.WRENCH.isIn(held)) - return ActionResultType.PASS; - - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, - () -> () -> withTileEntityDo(worldIn, pos, te -> this.displayScreen(te, player))); - return ActionResultType.SUCCESS; - } - - @OnlyIn(value = Dist.CLIENT) - protected void displayScreen(ChromaticProjectorTileEntity te, PlayerEntity player) { - if (player instanceof ClientPlayerEntity) - ScreenOpener.open(new ChromaticProjectorScreen(te)); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return null;//AllTileEntities.CHROMATIC_PROJECTOR.create(); - } - - @Override - public Class getTileEntityClass() { - return ChromaticProjectorTileEntity.class; - } -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorInstance.java b/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorInstance.java deleted file mode 100644 index 2cd7c8f6f..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorInstance.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.simibubi.create.content.curiosities.projector; - -import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; -import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; -import com.simibubi.create.foundation.render.effects.EffectsHandler; - -public class ChromaticProjectorInstance extends TileEntityInstance implements IDynamicInstance { - - public ChromaticProjectorInstance(MaterialManager renderer, ChromaticProjectorTileEntity tile) { - super(renderer, tile); - } - - @Override - public void beginFrame() { - EffectsHandler instance = EffectsHandler.getInstance(); - - if (instance != null) - instance.addSphere(tile.getFilter()); - } - - @Override - public boolean decreaseFramerateWithDistance() { - return false; - } - - @Override - public void remove() { - - } -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorScreen.java b/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorScreen.java deleted file mode 100644 index 1e46fa747..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorScreen.java +++ /dev/null @@ -1,314 +0,0 @@ -package com.simibubi.create.content.curiosities.projector; - -import java.util.Collections; -import java.util.Vector; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; -import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.GuiGameElement; -import com.simibubi.create.foundation.gui.widgets.IconButton; -import com.simibubi.create.foundation.gui.widgets.ScrollInput; -import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; -import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; -import com.simibubi.create.foundation.utility.Lang; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; - -public class ChromaticProjectorScreen extends AbstractSimiScreen { - - private AllGuiTextures background; - private ChromaticProjectorTileEntity tile; - private Vector stages; - - private ItemStack renderedItem = ItemStack.EMPTY;//AllBlocks.CHROMATIC_PROJECTOR.asStack(); - private Vector> inputs; - - private IconButton confirmButton; - - private ScrollInput radius; - private ScrollInput density; - private ScrollInput feather; - private ScrollInput fade; - - private IconButton blend; - - private ScrollInput strength; - private IconButton fieldEffect; - - private IconButton rChannel; - private IconButton gChannel; - private IconButton bChannel; - - public ChromaticProjectorScreen(ChromaticProjectorTileEntity te) { - super(Lang.translate("gui.chromatic_projector.title")); - background = AllGuiTextures.PROJECTOR; - tile = te; - stages = te.stages; - } - - @Override - protected void init() { - setWindowSize(background.width, background.height); - setWindowOffset(-25, 0); - super.init(); - widgets.clear(); - - int x = guiLeft; - int y = guiTop; - - inputs = new Vector<>(FilterStep.MAX_STEPS); - for (int row = 0; row < inputs.capacity(); row++) - inputs.add(new Vector<>(2)); - - for (int row = 0; row < stages.size(); row++) - initInputsOfRow(row, x, y); - - confirmButton = - new IconButton(x + background.width - 33, y + background.height - 26, AllIcons.I_CONFIRM); - widgets.add(confirmButton); - - initEffectSettings(x, y); - initMetaSettings(x, y); - } - - public void initInputsOfRow(int x, int y, int row) { - x += 30; - y += 18; - int rowHeight = 22; - - Vector rowInputs = inputs.get(row); - rowInputs.forEach(widgets::remove); - rowInputs.clear(); - FilterStep filter = stages.get(row); - - final int x1 = x; - final int y1 = y; - ScrollInput type = - new SelectionScrollInput(x, y + rowHeight * row, 86, 18) - .forOptions(ColorEffect.getOptions()) - .calling(state -> stageUpdated(x1, y1, row, state)) - .setState(filter.filter.id) - .titled(Lang.translate("gui.chromatic_projector.filter")); - ScrollInput value = - new ScrollInput(x + 86 + 2, y + rowHeight * row, 28, 18) - .calling(state -> filter.value = state); - - rowInputs.add(type); - rowInputs.add(value); - - widgets.addAll(rowInputs); - updateParamsOfRow(row); - } - - public void updateParamsOfRow(int row) { - FilterStep instruction = stages.get(row); - Vector rowInputs = inputs.get(row); - ColorEffect def = instruction.filter; - boolean hasValue = def.hasParameter; - - ScrollInput value = rowInputs.get(1); - value.active = value.visible = hasValue; - if (hasValue) - value.withRange(def.minValue, def.maxValue + 1) - //.titled(Lang.translate(def.parameterKey)) - .setState(instruction.value) - .onChanged(); - - value.withStepFunction(def.step()); - } - - private void initEffectSettings(int x, int y) { - x += 188; - y += 40; - - radius = new ScrollInput(x, y, 28, 18) - .titled(Lang.translate("gui.chromatic_projector.radius")) - .withStepFunction(ctx -> step(ctx, 2)) - .calling(tile::setRadius) - .withRange(0, 201) - .setState((int) (tile.radius * 2)); - y += 22; - feather = new ScrollInput(x, y, 28, 18) - .titled(Lang.translate("gui.chromatic_projector.feather")) - .withStepFunction(ctx -> step(ctx, 5)) - .calling(tile::setFeather) - .withRange(0, 201) - .setState((int) (tile.feather * 10)); - y += 22; - density = new ScrollInput(x, y, 28, 18) - .titled(Lang.translate("gui.chromatic_projector.density")) - .withStepFunction(ctx -> step(ctx, 10)) - .calling(tile::setDensity) - .withRange(0, 401) - .setState((int) (tile.density * 100)); - y += 22; - fade = new ScrollInput(x, y, 28, 18) - .titled(Lang.translate("gui.chromatic_projector.fade")) - .withStepFunction(ctx -> step(ctx, 1)) - .calling(tile::setFade) - .withRange(0, 51) - .setState((int) (tile.fade * 10)); - - Collections.addAll(widgets, radius, density, feather, fade); - } - - private void initMetaSettings(int x, int y) { - y += background.height - 23; - - blend = new IconButton(x + 16, y, AllIcons.I_FX_BLEND); - blend.setToolTip(Lang.translate("gui.chromatic_projector.blend")); - - int channelX = x + 39; - rChannel = new IconButton(channelX, y, AllIcons.I_FX_BLEND); - rChannel.setToolTip(new StringTextComponent("R")); - channelX += 18; - gChannel = new IconButton(channelX, y, AllIcons.I_FX_BLEND); - gChannel.setToolTip(new StringTextComponent("G")); - channelX += 18; - bChannel = new IconButton(channelX, y, AllIcons.I_FX_BLEND); - bChannel.setToolTip(new StringTextComponent("B")); - - fieldEffect = new IconButton(x + 135, y, tile.field ? AllIcons.I_FX_FIELD_ON : AllIcons.I_FX_FIELD_OFF); - fieldEffect.setToolTip(Lang.translate("gui.chromatic_projector.field")); - - strength = new ScrollInput(x + 159, y, 25, 18) - .titled(Lang.translate("gui.chromatic_projector.strength")) - .withStepFunction(ctx -> step(ctx, 5)) - .calling(tile::setStrength) - .withRange(-100, 101) - .setState((int) (tile.strength * 100)); - - Collections.addAll(widgets, blend, rChannel, gChannel, bChannel, fieldEffect, strength); - } - - @Override - protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - int x = guiLeft; - int y = guiTop; - - background.draw(ms, this, x, y); - - for (int row = 0; row < stages.capacity(); row++) { - AllGuiTextures toDraw = AllGuiTextures.PROJECTOR_EMPTY; - int yOffset = toDraw.height * row; - if (row >= stages.size()) { - toDraw.draw(ms, x, y + 14 + yOffset); - continue; - } - - FilterStep step = stages.get(row); - ColorEffect def = step.filter; - def.background.draw(ms, x, y + 14 + yOffset); - - if (def != ColorEffect.END) - label(ms, 36, yOffset - 3, Lang.translate(def.translationKey)); - if (def.hasParameter) { - String text = step.filter.formatValue(step.value); - int stringWidth = textRenderer.getStringWidth(text); - label(ms, 118 + (12 - stringWidth / 2), yOffset - 3, new StringTextComponent(text)); - } - } - - renderScroll(ms, radius, 2f); - renderScroll(ms, density, 100f); - renderScroll(ms, feather, 10f); - renderScroll(ms, fade, 10f); - - renderScroll(ms, strength, 100f); - - drawCenteredText(ms, textRenderer, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); - - GuiGameElement.of(renderedItem) - .scale(5) - .at(x + background.width + 6, y + background.height - 56, -200) - .render(ms); - } - - private void renderScroll(MatrixStack matrixStack, ScrollInput input, float divisor) { - String text = String.valueOf(input.getState() / divisor); - -// int stringWidth = textRenderer.getStringWidth(text); - textRenderer.drawWithShadow(matrixStack, text, input.x + 2, input.y + 5, 0xFFFFEE); - } - - private void label(MatrixStack matrixStack, int x, int y, ITextComponent text) { - textRenderer.drawWithShadow(matrixStack, text, guiLeft + x, guiTop + 26 + y, 0xFFFFEE); - } - - private static Integer step(ScrollValueBehaviour.StepContext ctx, int base) { - if (ctx.control) return 1; - return base * (ctx.shift ? 5 : 1) - ctx.currentValue % base; - } - - public void sendPacket() { - AllPackets.channel.sendToServer(new ConfigureProjectorPacket(tile)); - } - - @Override - public void removed() { - sendPacket(); - } - - private void stageUpdated(int x, int y, int index, int state) { - ColorEffect newValue = ColorEffect.all.get(state); - stages.get(index).filter = newValue; - stages.get(index).value = newValue.defaultValue; - updateParamsOfRow(index); - if (newValue == ColorEffect.END) { - for (int i = stages.size() - 1; i > index; i--) { - stages.remove(i); - Vector rowInputs = inputs.get(i); - rowInputs.forEach(widgets::remove); - rowInputs.clear(); - } - } else { - if (index + 1 < stages.capacity() && index + 1 == stages.size()) { - stages.add(new FilterStep(ColorEffect.END)); - initInputsOfRow(x, y, index + 1); - } - } - } - - @Override - public boolean mouseClicked(double x, double y, int button) { - if (confirmButton.isHovered()) { - client.player.closeScreen(); - return true; - } - - if (blend.isHovered()) { - tile.blend = !tile.blend; - return true; - } - - if (fieldEffect.isHovered()) { - tile.field = !tile.field; - - fieldEffect.setIcon(tile.field ? AllIcons.I_FX_FIELD_ON : AllIcons.I_FX_FIELD_OFF); - return fieldEffect.mouseClicked(x, y, button); - } - - if (rChannel.isHovered()) { - tile.rMask = !tile.rMask; - return true; - } - - if (gChannel.isHovered()) { - tile.gMask = !tile.gMask; - return true; - } - - if (bChannel.isHovered()) { - tile.bMask = !tile.bMask; - return true; - } - - return super.mouseClicked(x, y, button); - } - -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorTileEntity.java deleted file mode 100644 index ad80feb79..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/projector/ChromaticProjectorTileEntity.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.simibubi.create.content.curiosities.projector; - -import java.util.Vector; - -import com.jozufozu.flywheel.backend.instancing.IInstanceRendered; -import com.simibubi.create.foundation.render.effects.FilterSphere; -import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; - -import net.minecraft.block.BlockState; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.common.util.Constants; - -public class ChromaticProjectorTileEntity extends SyncedTileEntity implements IInstanceRendered { - - Vector stages = FilterStep.createDefault(); - - float radius = 3f; - - float feather = 1; - float density = 1; - float fade = 1; - boolean blend = true; - - public boolean surface = true; - public boolean field = true; - public float strength = 1; - - public boolean rMask = true; - public boolean gMask = true; - public boolean bMask = true; - - public ChromaticProjectorTileEntity(TileEntityType te) { - super(te); - } - - public FilterSphere getFilter() { - - BlockPos pos = getPos(); - FilterSphere sphere = new FilterSphere(); - - sphere.x = (float) (pos.getX() + 0.5); - sphere.y = (float) (pos.getY() + 0.5); - sphere.z = (float) (pos.getZ() + 0.5); - sphere.radius = radius; - - sphere.feather = feather; - sphere.density = density; - sphere.fade = fade; - sphere.blend = blend; - - sphere.surface = surface; - sphere.field = field; - sphere.strength = strength; - - sphere.rMask = rMask; - sphere.gMask = gMask; - sphere.bMask = bMask; - - sphere.filter = FilterStep.fold(stages); - return sphere; - } - - public ChromaticProjectorTileEntity setRadius(int radius) { - this.radius = radius / 2f; - return this; - } - - public ChromaticProjectorTileEntity setDensity(int density) { - this.density = density / 100f; - return this; - } - - public ChromaticProjectorTileEntity setFeather(int feather) { - this.feather = feather / 10f; - return this; - } - - public ChromaticProjectorTileEntity setFade(int fade) { - this.fade = fade / 10f; - return this; - } - - public ChromaticProjectorTileEntity setBlend(boolean blend) { - this.blend = blend; - return this; - } - - public ChromaticProjectorTileEntity setStrength(int strength) { - this.strength = strength / 100f; - return this; - } - - @Override - public CompoundNBT write(CompoundNBT tag) { - super.write(tag); - - tag.put("filters", FilterStep.writeAll(stages)); - - tag.putFloat("radius", radius); - - tag.putFloat("feather", feather); - tag.putFloat("density", density); - tag.putFloat("fade", fade); - tag.putBoolean("blend", blend); - - tag.putBoolean("surface", surface); - tag.putBoolean("field", field); - tag.putFloat("strength", strength); - - tag.putBoolean("rMask", rMask); - tag.putBoolean("gMask", gMask); - tag.putBoolean("bMask", bMask); - - return tag; - } - - @Override - public void fromTag(BlockState state, CompoundNBT tag) { - super.fromTag(state, tag); - - stages = FilterStep.readAll(tag.getList("filters", Constants.NBT.TAG_COMPOUND)); - - radius = tag.getFloat("radius"); - - feather = tag.getFloat("feather"); - density = tag.getFloat("density"); - fade = tag.getFloat("fade"); - blend = tag.getBoolean("blend"); - - surface = tag.getBoolean("surface"); - field = tag.getBoolean("field"); - strength = tag.getFloat("strength"); - - rMask = tag.getBoolean("rMask"); - gMask = tag.getBoolean("gMask"); - bMask = tag.getBoolean("bMask"); - } -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/projector/ColorEffect.java b/src/main/java/com/simibubi/create/content/curiosities/projector/ColorEffect.java deleted file mode 100644 index d9dd6ca09..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/projector/ColorEffect.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.simibubi.create.content.curiosities.projector; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; - -import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.render.effects.ColorMatrices; -import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; -import com.simibubi.create.foundation.utility.Lang; - -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.text.ITextComponent; - -public class ColorEffect { - static final ArrayList all = new ArrayList<>(); - static final HashMap lookup = new HashMap<>(); - private static int nextId = 0; - - public static final ColorEffect SEPIA = create("sepia", ColorMatrices::sepia); - public static final ColorEffect GRAYSCALE = create("grayscale", ColorMatrices::grayscale); - public static final ColorEffect DARKEN = create("darken", ColorMatrices::darken).setDefaultValue(20); - public static final ColorEffect CONTRAST = create("contrast", ColorMatrices::contrast).setRange(0, 200).setDefaultValue(100); - public static final ColorEffect SATURATE = create("saturate", ColorMatrices::saturate).setRange(0, 200); - public static final ColorEffect HUE_SHIFT = create("hue_shift", ColorMatrices::hueShift).setRange(0, 360).setDivisor(1f).setDefaultValue(120); - public static final ColorEffect INVERT = create("invert", ColorMatrices::invert); - public static final ColorEffect END = create("end", ColorMatrices::identity).setBackground(AllGuiTextures.PROJECTOR_END); - - boolean hasParameter; - AllGuiTextures background; - - int defaultValue = 100; - int minValue = 0; - int maxValue = 100; - float divisor = 100f; - - final int id; - final FilterFactory filter; - final String name; - final String translationKey; - - public ColorEffect(String name, FilterFactory filter) { - this.filter = filter; - this.name = name; - this.translationKey = "gui.chromatic_projector.filter." + Lang.asId(name); - this.id = nextId++; - - lookup.put(name, this); - all.add(this); - } - - public ColorEffect setHasParameter(boolean hasParameter) { - this.hasParameter = hasParameter; - return setBackground(hasParameter ? AllGuiTextures.PROJECTOR_FILTER_STRENGTH : AllGuiTextures.PROJECTOR_FILTER); - } - - public ColorEffect setBackground(AllGuiTextures background) { - this.background = background; - return this; - } - - public ColorEffect setDefaultValue(int defaultValue) { - this.defaultValue = defaultValue; - return this; - } - - public ColorEffect setRange(int minValue, int maxValue) { - this.minValue = minValue; - this.maxValue = maxValue; - return this; - } - - public ColorEffect setDivisor(float divisor) { - this.divisor = divisor; - return this; - } - - public Function step() { - return c -> { - if (c.control) return 1; - if (c.shift) return 20; - return 5; - }; - } - - String formatValue(int value) { - if (this == HUE_SHIFT) - return value + Lang.translate("generic.unit.degrees").getString(); - return "" + value; - } - - static List getOptions() { - List options = new ArrayList<>(); - for (ColorEffect entry : all) - options.add(Lang.translate(entry.translationKey)); - return options; - } - - @FunctionalInterface - public interface FilterFactory { - Matrix4f create(float param); - } - - public static ColorEffect create(String name, Supplier filter) { - return new ColorEffect(name, $ -> filter.get()).setHasParameter(false); - } - - public static ColorEffect create(String name, FilterFactory filter) { - return new ColorEffect(name, filter).setHasParameter(true); - } -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/projector/ConfigureProjectorPacket.java b/src/main/java/com/simibubi/create/content/curiosities/projector/ConfigureProjectorPacket.java deleted file mode 100644 index 89eb463b3..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/projector/ConfigureProjectorPacket.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.simibubi.create.content.curiosities.projector; - -import java.util.Vector; -import java.util.stream.Collectors; - -import com.simibubi.create.foundation.networking.TileEntityConfigurationPacket; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.network.PacketBuffer; - -public class ConfigureProjectorPacket extends TileEntityConfigurationPacket { - - Vector stages; - float radius; - - float feather; - float density; - float fade; - boolean blend; - - public boolean surface; - public boolean field; - public float strength; - - public boolean rMask; - public boolean gMask; - public boolean bMask; - - public ConfigureProjectorPacket(PacketBuffer buffer) { - super(buffer); - } - - public ConfigureProjectorPacket(ChromaticProjectorTileEntity tile) { - super(tile.getPos()); - - stages = tile.stages.stream() - .map(FilterStep::write) - .collect(Collectors.toCollection(Vector::new)); - radius = tile.radius; - - feather = tile.feather; - density = tile.density; - fade = tile.fade; - blend = tile.blend; - - surface = tile.surface; - field = tile.field; - strength = tile.strength; - - rMask = tile.rMask; - gMask = tile.gMask; - bMask = tile.bMask; - } - - @Override - protected void writeSettings(PacketBuffer buffer) { - buffer.writeFloat(radius); - - buffer.writeFloat(feather); - buffer.writeFloat(density); - buffer.writeFloat(fade); - buffer.writeBoolean(blend); - - buffer.writeBoolean(surface); - buffer.writeBoolean(field); - buffer.writeFloat(strength); - - buffer.writeBoolean(rMask); - buffer.writeBoolean(gMask); - buffer.writeBoolean(bMask); - - buffer.writeInt(stages.size()); - for (CompoundNBT stage : stages) { - buffer.writeCompoundTag(stage); - } - } - - @Override - protected void readSettings(PacketBuffer buffer) { - radius = buffer.readFloat(); - - feather = buffer.readFloat(); - density = buffer.readFloat(); - fade = buffer.readFloat(); - blend = buffer.readBoolean(); - - surface = buffer.readBoolean(); - field = buffer.readBoolean(); - strength = buffer.readFloat(); - - rMask = buffer.readBoolean(); - gMask = buffer.readBoolean(); - bMask = buffer.readBoolean(); - - int count = buffer.readInt(); - stages = new Vector<>(FilterStep.MAX_STEPS); - - for (int i = 0; i < count; i++) { - stages.add(buffer.readCompoundTag()); - } - } - - @Override - protected void applySettings(ChromaticProjectorTileEntity tile) { - tile.stages = stages.stream() - .map(FilterStep::new) - .collect(Collectors.toCollection(Vector::new)); - - tile.radius = radius; - - tile.feather = feather; - tile.density = density; - tile.fade = fade; - tile.blend = blend; - - tile.surface = surface; - tile.field = field; - tile.strength = strength; - - tile.rMask = rMask; - tile.gMask = gMask; - tile.bMask = bMask; - - tile.sendData(); - } -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/projector/FilterStep.java b/src/main/java/com/simibubi/create/content/curiosities/projector/FilterStep.java deleted file mode 100644 index 5e745b8af..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/projector/FilterStep.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.simibubi.create.content.curiosities.projector; - -import java.util.Iterator; -import java.util.Vector; - -import com.simibubi.create.foundation.render.effects.ColorMatrices; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.util.math.vector.Matrix4f; - -public class FilterStep { - - public static final int MAX_STEPS = 6; - ColorEffect filter; - int value; - - public FilterStep(ColorEffect filter) { - this.filter = filter; - } - - public FilterStep(ColorEffect filter, int value) { - this.filter = filter; - this.value = value; - } - - public FilterStep(CompoundNBT nbt) { - this.filter = ColorEffect.lookup.get(nbt.getString("id")); - this.value = nbt.getInt("value"); - } - - public Matrix4f createFilter() { - return filter.filter.create(value / filter.divisor); - } - - public CompoundNBT write() { - CompoundNBT nbt = new CompoundNBT(); - - nbt.putString("id", filter.name); - nbt.putInt("value", value); - - return nbt; - } - - public static Vector readAll(ListNBT list) { - Vector steps = new Vector<>(MAX_STEPS); - - for (int i = 0; i < list.size(); i++) { - steps.add(new FilterStep(list.getCompound(i))); - } - - return steps; - } - - public static ListNBT writeAll(Vector filters) { - ListNBT out = new ListNBT(); - - for (FilterStep filter : filters) { - out.add(filter.write()); - } - - return out; - } - - public static Matrix4f fold(Vector filters) { - Iterator stepIterator = filters.stream().filter(it -> it != null && it.filter != ColorEffect.END).iterator(); - - if (stepIterator.hasNext()) { - Matrix4f accum = stepIterator.next().createFilter(); - - stepIterator.forEachRemaining(filterStep -> accum.multiply(filterStep.createFilter())); - - return accum; - } - - return ColorMatrices.identity(); - } - - public static Vector createDefault() { - Vector instructions = new Vector<>(MAX_STEPS); - instructions.add(new FilterStep(ColorEffect.SEPIA, 100)); - instructions.add(new FilterStep(ColorEffect.END)); - return instructions; - } -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryEffectPacket.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryEffectPacket.java index 5ad5d2c63..90609b6a3 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryEffectPacket.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryEffectPacket.java @@ -43,7 +43,7 @@ public class SymmetryEffectPacket extends SimplePacketBase { public void handle(Supplier ctx) { ctx.get().enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - if (Minecraft.getInstance().player.getPositionVec().distanceTo(Vector3d.of(mirror)) > 100) + if (Minecraft.getInstance().player.position().distanceTo(Vector3d.atLowerCornerOf(mirror)) > 100) return; for (BlockPos to : positions) SymmetryHandler.drawEffect(mirror, to); diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java index d21926abf..644999081 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java @@ -46,19 +46,19 @@ public class SymmetryHandler { @SubscribeEvent(priority = EventPriority.LOWEST) public static void onBlockPlaced(EntityPlaceEvent event) { if (event.getWorld() - .isRemote()) + .isClientSide()) return; if (!(event.getEntity() instanceof PlayerEntity)) return; PlayerEntity player = (PlayerEntity) event.getEntity(); PlayerInventory inv = player.inventory; - for (int i = 0; i < PlayerInventory.getHotbarSize(); i++) { - if (!inv.getStackInSlot(i) + for (int i = 0; i < PlayerInventory.getSelectionSize(); i++) { + if (!inv.getItem(i) .isEmpty() - && inv.getStackInSlot(i) + && inv.getItem(i) .getItem() == AllItems.WAND_OF_SYMMETRY.get()) { - SymmetryWandItem.apply(player.world, inv.getStackInSlot(i), player, event.getPos(), + SymmetryWandItem.apply(player.level, inv.getItem(i), player, event.getPos(), event.getPlacedBlock()); } } @@ -67,15 +67,15 @@ public class SymmetryHandler { @SubscribeEvent(priority = EventPriority.LOWEST) public static void onBlockDestroyed(BreakEvent event) { if (event.getWorld() - .isRemote()) + .isClientSide()) return; PlayerEntity player = event.getPlayer(); PlayerInventory inv = player.inventory; - for (int i = 0; i < PlayerInventory.getHotbarSize(); i++) { - if (!inv.getStackInSlot(i) - .isEmpty() && AllItems.WAND_OF_SYMMETRY.isIn(inv.getStackInSlot(i))) { - SymmetryWandItem.remove(player.world, inv.getStackInSlot(i), player, event.getPos()); + for (int i = 0; i < PlayerInventory.getSelectionSize(); i++) { + if (!inv.getItem(i) + .isEmpty() && AllItems.WAND_OF_SYMMETRY.isIn(inv.getItem(i))) { + SymmetryWandItem.remove(player.level, inv.getItem(i), player, event.getPos()); } } } @@ -86,8 +86,8 @@ public class SymmetryHandler { Minecraft mc = Minecraft.getInstance(); ClientPlayerEntity player = mc.player; - for (int i = 0; i < PlayerInventory.getHotbarSize(); i++) { - ItemStack stackInSlot = player.inventory.getStackInSlot(i); + for (int i = 0; i < PlayerInventory.getSelectionSize(); i++) { + ItemStack stackInSlot = player.inventory.getItem(i); if (!AllItems.WAND_OF_SYMMETRY.isIn(stackInSlot)) continue; if (!SymmetryWandItem.isEnabled(stackInSlot)) @@ -103,29 +103,29 @@ public class SymmetryHandler { yShift = MathHelper.sin((float) (AnimationTickHolder.getRenderTime() * speed)) / 5f; IRenderTypeBuffer.Impl buffer = Minecraft.getInstance() - .getBufferBuilders() - .getEntityVertexConsumers(); - ActiveRenderInfo info = mc.gameRenderer.getActiveRenderInfo(); - Vector3d view = info.getProjectedView(); + .renderBuffers() + .bufferSource(); + ActiveRenderInfo info = mc.gameRenderer.getMainCamera(); + Vector3d view = info.getPosition(); MatrixStack ms = event.getMatrixStack(); - ms.push(); - ms.translate(-view.getX(), -view.getY(), -view.getZ()); + ms.pushPose(); + ms.translate(-view.x(), -view.y(), -view.z()); ms.translate(pos.getX(), pos.getY(), pos.getZ()); ms.translate(0, yShift + .2f, 0); mirror.applyModelTransform(ms); IBakedModel model = mirror.getModel() .get(); - IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); + IVertexBuilder builder = buffer.getBuffer(RenderType.solid()); - mc.getBlockRendererDispatcher() - .getBlockModelRenderer() - .renderModel(player.world, model, Blocks.AIR.getDefaultState(), pos, ms, builder, true, - player.world.getRandom(), MathHelper.getPositionRandom(pos), OverlayTexture.DEFAULT_UV, + mc.getBlockRenderer() + .getModelRenderer() + .renderModel(player.level, model, Blocks.AIR.defaultBlockState(), pos, ms, builder, true, + player.level.getRandom(), MathHelper.getSeed(pos), OverlayTexture.NO_OVERLAY, EmptyModelData.INSTANCE); - buffer.draw(); - ms.pop(); + buffer.endBatch(); + ms.popPose(); } } @@ -137,16 +137,16 @@ public class SymmetryHandler { Minecraft mc = Minecraft.getInstance(); ClientPlayerEntity player = mc.player; - if (mc.world == null) + if (mc.level == null) return; - if (mc.isGamePaused()) + if (mc.isPaused()) return; tickCounter++; if (tickCounter % 10 == 0) { - for (int i = 0; i < PlayerInventory.getHotbarSize(); i++) { - ItemStack stackInSlot = player.inventory.getStackInSlot(i); + for (int i = 0; i < PlayerInventory.getSelectionSize(); i++) { + ItemStack stackInSlot = player.inventory.getItem(i); if (stackInSlot != null && AllItems.WAND_OF_SYMMETRY.isIn(stackInSlot) && SymmetryWandItem.isEnabled(stackInSlot)) { @@ -162,7 +162,7 @@ public class SymmetryHandler { Vector3d pos = mirror.getPosition() .add(0.5 + offsetX, 1 / 4d, 0.5 + offsetZ); Vector3d speed = new Vector3d(0, r.nextDouble() * 1 / 8f, 0); - mc.world.addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, speed.x, speed.y, speed.z); + mc.level.addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, speed.x, speed.y, speed.z); } } } @@ -171,8 +171,8 @@ public class SymmetryHandler { public static void drawEffect(BlockPos from, BlockPos to) { double density = 0.8f; - Vector3d start = Vector3d.of(from).add(0.5, 0.5, 0.5); - Vector3d end = Vector3d.of(to).add(0.5, 0.5, 0.5); + Vector3d start = Vector3d.atLowerCornerOf(from).add(0.5, 0.5, 0.5); + Vector3d end = Vector3d.atLowerCornerOf(to).add(0.5, 0.5, 0.5); Vector3d diff = end.subtract(start); Vector3d step = diff.normalize() @@ -184,18 +184,18 @@ public class SymmetryHandler { Vector3d pos = start.add(step.scale(i)); Vector3d speed = new Vector3d(0, r.nextDouble() * -40f, 0); - Minecraft.getInstance().world.addParticle(new RedstoneParticleData(1, 1, 1, 1), pos.x, pos.y, pos.z, + Minecraft.getInstance().level.addParticle(new RedstoneParticleData(1, 1, 1, 1), pos.x, pos.y, pos.z, speed.x, speed.y, speed.z); } Vector3d speed = new Vector3d(0, r.nextDouble() * 1 / 32f, 0); Vector3d pos = start.add(step.scale(2)); - Minecraft.getInstance().world.addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, speed.x, speed.y, + Minecraft.getInstance().level.addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, speed.x, speed.y, speed.z); speed = new Vector3d(0, r.nextDouble() * 1 / 32f, 0); pos = start.add(step.scale(steps)); - Minecraft.getInstance().world.addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, speed.x, speed.y, + Minecraft.getInstance().level.addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, speed.x, speed.y, speed.z); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java index 9ef60eaa1..f912de98b 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java @@ -54,40 +54,40 @@ public class SymmetryWandItem extends Item { private static final String ENABLE = "enable"; public SymmetryWandItem(Properties properties) { - super(properties.maxStackSize(1) + super(properties.stacksTo(1) .rarity(Rarity.UNCOMMON)); } @Nonnull @Override - public ActionResultType onItemUse(ItemUseContext context) { + public ActionResultType useOn(ItemUseContext context) { PlayerEntity player = context.getPlayer(); - BlockPos pos = context.getPos(); + BlockPos pos = context.getClickedPos(); if (player == null) return ActionResultType.PASS; - player.getCooldownTracker() - .setCooldown(this, 5); - ItemStack wand = player.getHeldItem(context.getHand()); + player.getCooldowns() + .addCooldown(this, 5); + ItemStack wand = player.getItemInHand(context.getHand()); checkNBT(wand); // Shift -> open GUI - if (player.isSneaking()) { - if (player.world.isRemote) { + if (player.isShiftKeyDown()) { + if (player.level.isClientSide) { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { openWandGUI(wand, context.getHand()); }); - player.getCooldownTracker() - .setCooldown(this, 5); + player.getCooldowns() + .addCooldown(this, 5); } return ActionResultType.SUCCESS; } - if (context.getWorld().isRemote || context.getHand() != Hand.MAIN_HAND) + if (context.getLevel().isClientSide || context.getHand() != Hand.MAIN_HAND) return ActionResultType.SUCCESS; CompoundNBT compound = wand.getTag() .getCompound(SYMMETRY); - pos = pos.offset(context.getFace()); + pos = pos.relative(context.getClickedFace()); SymmetryMirror previousElement = SymmetryMirror.fromNBT(compound); // No Shift -> Make / Move Mirror @@ -98,7 +98,7 @@ public class SymmetryWandItem extends Item { if (previousElement instanceof EmptyMirror) { newElement.setOrientation( - (player.getHorizontalFacing() == Direction.NORTH || player.getHorizontalFacing() == Direction.SOUTH) + (player.getDirection() == Direction.NORTH || player.getDirection() == Direction.SOUTH) ? PlaneMirror.Align.XY.ordinal() : PlaneMirror.Align.YZ.ordinal()); newElement.enable = true; @@ -110,13 +110,13 @@ public class SymmetryWandItem extends Item { if (previousElement instanceof PlaneMirror) { previousElement.setOrientation( - (player.getHorizontalFacing() == Direction.NORTH || player.getHorizontalFacing() == Direction.SOUTH) + (player.getDirection() == Direction.NORTH || player.getDirection() == Direction.SOUTH) ? PlaneMirror.Align.XY.ordinal() : PlaneMirror.Align.YZ.ordinal()); } if (previousElement instanceof CrossPlaneMirror) { - float rotation = player.getRotationYawHead(); + float rotation = player.getYHeadRot(); float abs = Math.abs(rotation % 90); boolean diagonal = abs > 22 && abs < 45 + 22; previousElement @@ -130,23 +130,23 @@ public class SymmetryWandItem extends Item { wand.getTag() .put(SYMMETRY, compound); - player.setHeldItem(context.getHand(), wand); + player.setItemInHand(context.getHand(), wand); return ActionResultType.SUCCESS; } @Override - public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) { - ItemStack wand = playerIn.getHeldItem(handIn); + public ActionResult use(World worldIn, PlayerEntity playerIn, Hand handIn) { + ItemStack wand = playerIn.getItemInHand(handIn); checkNBT(wand); // Shift -> Open GUI - if (playerIn.isSneaking()) { - if (worldIn.isRemote) { + if (playerIn.isShiftKeyDown()) { + if (worldIn.isClientSide) { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - openWandGUI(playerIn.getHeldItem(handIn), handIn); + openWandGUI(playerIn.getItemInHand(handIn), handIn); }); - playerIn.getCooldownTracker() - .setCooldown(this, 5); + playerIn.getCooldowns() + .addCooldown(this, 5); } return new ActionResult(ActionResultType.SUCCESS, wand); } @@ -189,7 +189,7 @@ public class SymmetryWandItem extends Item { checkNBT(wand); if (!isEnabled(wand)) return; - if (!BlockItem.BLOCK_TO_ITEM.containsKey(block.getBlock())) + if (!BlockItem.BY_BLOCK.containsKey(block.getBlock())) return; Map blockSet = new HashMap<>(); @@ -198,7 +198,7 @@ public class SymmetryWandItem extends Item { .getCompound(SYMMETRY)); Vector3d mirrorPos = symmetry.getPosition(); - if (mirrorPos.distanceTo(Vector3d.of(pos)) > AllConfigs.SERVER.curiosities.maxSymmetryWandRange.get()) + if (mirrorPos.distanceTo(Vector3d.atLowerCornerOf(pos)) > AllConfigs.SERVER.curiosities.maxSymmetryWandRange.get()) return; if (!player.isCreative() && isHoldingBlock(player, block) && BlockHelper.findAndRemoveInInventory(block, player, 1) == 0) @@ -213,14 +213,14 @@ public class SymmetryWandItem extends Item { if (position.equals(pos)) continue; - if (world.canPlace(block, position, ISelectionContext.forEntity(player))) { + if (world.isUnobstructed(block, position, ISelectionContext.of(player))) { BlockState blockState = blockSet.get(position); for (Direction face : Iterate.directions) - blockState = blockState.updatePostPlacement(face, world.getBlockState(position.offset(face)), world, - position, position.offset(face)); + blockState = blockState.updateShape(face, world.getBlockState(position.relative(face)), world, + position, position.relative(face)); if (player.isCreative()) { - world.setBlockState(position, blockState); + world.setBlockAndUpdate(position, blockState); targets.add(position); continue; } @@ -229,7 +229,7 @@ public class SymmetryWandItem extends Item { if (!toReplace.getMaterial() .isReplaceable()) continue; - if (toReplace.getBlockHardness(world, position) == -1) + if (toReplace.getDestroySpeed(world, position) == -1) continue; if (AllBlocks.CART_ASSEMBLER.has(blockState)) { @@ -243,10 +243,10 @@ public class SymmetryWandItem extends Item { continue; } - BlockSnapshot blocksnapshot = BlockSnapshot.create(world.getRegistryKey(), world, position); + BlockSnapshot blocksnapshot = BlockSnapshot.create(world.dimension(), world, position); FluidState ifluidstate = world.getFluidState(position); - world.setBlockState(position, ifluidstate.getBlockState(), BlockFlags.UPDATE_NEIGHBORS); - world.setBlockState(position, blockState); + world.setBlock(position, ifluidstate.createLegacyBlock(), BlockFlags.UPDATE_NEIGHBORS); + world.setBlockAndUpdate(position, blockState); CompoundNBT wandNbt = wand.getOrCreateTag(); wandNbt.putBoolean("Simulate", true); @@ -267,14 +267,14 @@ public class SymmetryWandItem extends Item { private static boolean isHoldingBlock(PlayerEntity player, BlockState block) { ItemStack itemBlock = BlockHelper.getRequiredItem(block); - return player.getHeldItemMainhand() - .isItemEqual(itemBlock) - || player.getHeldItemOffhand() - .isItemEqual(itemBlock); + return player.getMainHandItem() + .sameItem(itemBlock) + || player.getOffhandItem() + .sameItem(itemBlock); } public static void remove(World world, ItemStack wand, PlayerEntity player, BlockPos pos) { - BlockState air = Blocks.AIR.getDefaultState(); + BlockState air = Blocks.AIR.defaultBlockState(); BlockState ogBlock = world.getBlockState(pos); checkNBT(wand); if (!isEnabled(wand)) @@ -286,7 +286,7 @@ public class SymmetryWandItem extends Item { .getCompound(SYMMETRY)); Vector3d mirrorPos = symmetry.getPosition(); - if (mirrorPos.distanceTo(Vector3d.of(pos)) > AllConfigs.SERVER.curiosities.maxSymmetryWandRange.get()) + if (mirrorPos.distanceTo(Vector3d.atLowerCornerOf(pos)) > AllConfigs.SERVER.curiosities.maxSymmetryWandRange.get()) return; symmetry.process(blockSet); @@ -305,16 +305,16 @@ public class SymmetryWandItem extends Item { BlockState blockstate = world.getBlockState(position); if (blockstate.getMaterial() != Material.AIR) { targets.add(position); - world.playEvent(2001, position, Block.getStateId(blockstate)); - world.setBlockState(position, air, 3); + world.levelEvent(2001, position, Block.getId(blockstate)); + world.setBlock(position, air, 3); if (!player.isCreative()) { - if (!player.getHeldItemMainhand() + if (!player.getMainHandItem() .isEmpty()) - player.getHeldItemMainhand() - .onBlockDestroyed(world, blockstate, position, player); - TileEntity tileentity = blockstate.hasTileEntity() ? world.getTileEntity(position) : null; - Block.spawnDrops(blockstate, world, pos, tileentity, player, player.getHeldItemMainhand()); // Add fortune, silk touch and other loot modifiers + player.getMainHandItem() + .mineBlock(world, blockstate, position, player); + TileEntity tileentity = blockstate.hasTileEntity() ? world.getBlockEntity(position) : null; + Block.dropResources(blockstate, world, pos, tileentity, player, player.getMainHandItem()); // Add fortune, silk touch and other loot modifiers } } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java index dd9a4d638..7760f56b2 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java @@ -75,7 +75,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen { int state = currentElement instanceof TriplePlaneMirror ? 2 : currentElement instanceof CrossPlaneMirror ? 1 : 0; areaType = new SelectionScrollInput(x + 45, y + 21, 109, 18).forOptions(SymmetryMirror.getMirrors()) - .titled(mirrorType.copy()) + .titled(mirrorType.plainCopy()) .writingTo(labelType) .setState(state); @@ -111,7 +111,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen { widgets.remove(areaAlign); areaAlign = new SelectionScrollInput(x + 45, y + 43, 109, 18).forOptions(element.getAlignToolTips()) - .titled(orientation.copy()) + .titled(orientation.plainCopy()) .writingTo(labelAlign) .setState(element.getOrientationIndex()) .calling(element::setOrientation); @@ -125,7 +125,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen { int y = guiTop; background.draw(ms, this, x, y); - textRenderer.draw(ms, wand.getDisplayName(), x + 11, y + 4, 0x6B3802); + font.draw(ms, wand.getHoverName(), x + 11, y + 4, 0x6B3802); renderBlock(ms, x, y); GuiGameElement.of(wand) @@ -136,33 +136,33 @@ public class SymmetryWandScreen extends AbstractSimiScreen { } protected void renderBlock(MatrixStack ms, int x, int y) { - ms.push(); + ms.pushPose(); ms.translate(x + 26, y + 39, 20); ms.scale(16, 16, 16); - ms.multiply(new Vector3f(.3f, 1f, 0f).getDegreesQuaternion(-22.5f)); + ms.mulPose(new Vector3f(.3f, 1f, 0f).rotationDegrees(-22.5f)); currentElement.applyModelTransform(ms); // RenderSystem.multMatrix(ms.peek().getModel()); GuiGameElement.of(currentElement.getModel()) .render(ms); - ms.pop(); + ms.popPose(); } @Override public void removed() { - ItemStack heldItem = client.player.getHeldItem(hand); + ItemStack heldItem = minecraft.player.getItemInHand(hand); CompoundNBT compound = heldItem.getTag(); compound.put(SymmetryWandItem.SYMMETRY, currentElement.writeToNbt()); heldItem.setTag(compound); AllPackets.channel.send(PacketDistributor.SERVER.noArg(), new NbtPacket(heldItem, hand)); - client.player.setHeldItem(hand, heldItem); + minecraft.player.setItemInHand(hand, heldItem); super.removed(); } @Override public boolean mouseClicked(double x, double y, int button) { if (confirmButton.isHovered()) { - client.player.closeScreen(); + minecraft.player.closeContainer(); return true; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java index 0c0461daf..0f71a9cde 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java @@ -27,7 +27,7 @@ public class SymmetryWandItemRenderer extends CustomRenderedItemModelRenderer BlueprintItem.assignCompleteRecipe(c.ghostInventory, r)); } }); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintContainer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintContainer.java index eb71d907a..bf08dde69 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintContainer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintContainer.java @@ -60,14 +60,14 @@ public class BlueprintContainer extends GhostItemContainer { } public void onCraftMatrixChanged() { - if (contentHolder.getBlueprintWorld().isRemote) + if (contentHolder.getBlueprintWorld().isClientSide) return; ServerPlayerEntity serverplayerentity = (ServerPlayerEntity) player; CraftingInventory craftingInventory = new BlueprintCraftingInventory(this, ghostInventory); Optional optional = player.getServer() .getRecipeManager() - .getRecipe(IRecipeType.CRAFTING, craftingInventory, player.getEntityWorld()); + .getRecipeFor(IRecipeType.CRAFTING, craftingInventory, player.getCommandSenderWorld()); if (!optional.isPresent()) { if (ghostInventory.getStackInSlot(9) @@ -77,23 +77,23 @@ public class BlueprintContainer extends GhostItemContainer { return; ghostInventory.setStackInSlot(9, ItemStack.EMPTY); - serverplayerentity.connection.sendPacket(new SSetSlotPacket(windowId, 36 + 9, ItemStack.EMPTY)); + serverplayerentity.connection.send(new SSetSlotPacket(containerId, 36 + 9, ItemStack.EMPTY)); contentHolder.inferredIcon = false; return; } ICraftingRecipe icraftingrecipe = optional.get(); - ItemStack itemstack = icraftingrecipe.getCraftingResult(craftingInventory); + ItemStack itemstack = icraftingrecipe.assemble(craftingInventory); ghostInventory.setStackInSlot(9, itemstack); contentHolder.inferredIcon = true; ItemStack toSend = itemstack.copy(); toSend.getOrCreateTag() .putBoolean("InferredFromRecipe", true); - serverplayerentity.connection.sendPacket(new SSetSlotPacket(windowId, 36 + 9, toSend)); + serverplayerentity.connection.send(new SSetSlotPacket(containerId, 36 + 9, toSend)); } @Override - public void putStackInSlot(int p_75141_1_, ItemStack p_75141_2_) { + public void setItem(int p_75141_1_, ItemStack p_75141_2_) { if (p_75141_1_ == 36 + 9) { if (p_75141_2_.hasTag()) { contentHolder.inferredIcon = p_75141_2_.getTag() @@ -103,7 +103,7 @@ public class BlueprintContainer extends GhostItemContainer { } else contentHolder.inferredIcon = false; } - super.putStackInSlot(p_75141_1_, p_75141_2_); + super.setItem(p_75141_1_, p_75141_2_); } @Override @@ -125,7 +125,7 @@ public class BlueprintContainer extends GhostItemContainer { protected BlueprintSection createOnClient(PacketBuffer extraData) { int entityID = extraData.readVarInt(); int section = extraData.readVarInt(); - Entity entityByID = Minecraft.getInstance().world.getEntityByID(entityID); + Entity entityByID = Minecraft.getInstance().level.getEntity(entityID); if (!(entityByID instanceof BlueprintEntity)) return null; BlueprintEntity blueprintEntity = (BlueprintEntity) entityByID; @@ -134,7 +134,7 @@ public class BlueprintContainer extends GhostItemContainer { } @Override - public boolean canInteractWith(PlayerEntity player) { + public boolean stillValid(PlayerEntity player) { return contentHolder != null && contentHolder.canPlayerUse(player); } @@ -145,7 +145,7 @@ public class BlueprintContainer extends GhostItemContainer { for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { ItemStack stack = items.getStackInSlot(y * 3 + x); - setInventorySlotContents(y * 3 + x, stack == null ? ItemStack.EMPTY : stack.copy()); + setItem(y * 3 + x, stack == null ? ItemStack.EMPTY : stack.copy()); } } } @@ -162,12 +162,12 @@ public class BlueprintContainer extends GhostItemContainer { } @Override - public void onSlotChanged() { - super.onSlotChanged(); - if (index == 9 && getHasStack() && !contentHolder.getBlueprintWorld().isRemote) { + public void setChanged() { + super.setChanged(); + if (index == 9 && hasItem() && !contentHolder.getBlueprintWorld().isClientSide) { contentHolder.inferredIcon = false; ServerPlayerEntity serverplayerentity = (ServerPlayerEntity) player; - serverplayerentity.connection.sendPacket(new SSetSlotPacket(windowId, 36 + 9, getStack())); + serverplayerentity.connection.send(new SSetSlotPacket(containerId, 36 + 9, getItem())); } if (index < 9) onCraftMatrixChanged(); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java index fad37fd64..233848c4a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java @@ -87,7 +87,7 @@ public class BlueprintEntity extends HangingEntity for (int size = 3; size > 0; size--) { this.size = size; this.updateFacingWithBoundingBox(facing, verticalOrientation); - if (this.onValidSurface()) + if (this.survives()) break; } } @@ -99,45 +99,45 @@ public class BlueprintEntity extends HangingEntity } @Override - public IPacket createSpawnPacket() { + public IPacket getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } @Override - public void writeAdditional(CompoundNBT p_213281_1_) { - p_213281_1_.putByte("Facing", (byte) this.facingDirection.getIndex()); - p_213281_1_.putByte("Orientation", (byte) this.verticalOrientation.getIndex()); + public void addAdditionalSaveData(CompoundNBT p_213281_1_) { + p_213281_1_.putByte("Facing", (byte) this.direction.get3DDataValue()); + p_213281_1_.putByte("Orientation", (byte) this.verticalOrientation.get3DDataValue()); p_213281_1_.putInt("Size", size); - super.writeAdditional(p_213281_1_); + super.addAdditionalSaveData(p_213281_1_); } @Override - public void readAdditional(CompoundNBT p_70037_1_) { - this.facingDirection = Direction.byIndex(p_70037_1_.getByte("Facing")); - this.verticalOrientation = Direction.byIndex(p_70037_1_.getByte("Orientation")); + public void readAdditionalSaveData(CompoundNBT p_70037_1_) { + this.direction = Direction.from3DDataValue(p_70037_1_.getByte("Facing")); + this.verticalOrientation = Direction.from3DDataValue(p_70037_1_.getByte("Orientation")); this.size = p_70037_1_.getInt("Size"); - super.readAdditional(p_70037_1_); - this.updateFacingWithBoundingBox(this.facingDirection, this.verticalOrientation); + super.readAdditionalSaveData(p_70037_1_); + this.updateFacingWithBoundingBox(this.direction, this.verticalOrientation); } protected void updateFacingWithBoundingBox(Direction facing, Direction verticalOrientation) { Validate.notNull(facing); - this.facingDirection = facing; + this.direction = facing; this.verticalOrientation = verticalOrientation; if (facing.getAxis() .isHorizontal()) { - this.rotationPitch = 0.0F; - this.rotationYaw = (float) (this.facingDirection.getHorizontalIndex() * 90); + this.xRot = 0.0F; + this.yRot = (float) (this.direction.get2DDataValue() * 90); } else { - this.rotationPitch = (float) (-90 * facing.getAxisDirection() - .getOffset()); - this.rotationYaw = verticalOrientation.getAxis() - .isHorizontal() ? 180 + verticalOrientation.getHorizontalAngle() : 0; + this.xRot = (float) (-90 * facing.getAxisDirection() + .getStep()); + this.yRot = verticalOrientation.getAxis() + .isHorizontal() ? 180 + verticalOrientation.toYRot() : 0; } - this.prevRotationPitch = this.rotationPitch; - this.prevRotationYaw = this.rotationYaw; - this.updateBoundingBox(); + this.xRotO = this.xRot; + this.yRotO = this.yRot; + this.recalculateBoundingBox(); } @Override @@ -146,43 +146,43 @@ public class BlueprintEntity extends HangingEntity } @Override - protected void updateBoundingBox() { - if (this.facingDirection == null) + protected void recalculateBoundingBox() { + if (this.direction == null) return; if (this.verticalOrientation == null) return; - Vector3d pos = Vector3d.of(hangingPosition) + Vector3d pos = Vector3d.atLowerCornerOf(blockPosition()) .add(.5, .5, .5) - .subtract(Vector3d.of(facingDirection.getDirectionVec()) + .subtract(Vector3d.atLowerCornerOf(direction.getNormal()) .scale(0.46875)); double d1 = pos.x; double d2 = pos.y; double d3 = pos.z; - this.setPos(d1, d2, d3); + this.setPosRaw(d1, d2, d3); - Axis axis = facingDirection.getAxis(); + Axis axis = direction.getAxis(); if (size == 2) - pos = pos.add(Vector3d.of(axis.isHorizontal() ? facingDirection.rotateYCCW() - .getDirectionVec() - : verticalOrientation.rotateY() - .getDirectionVec()) + pos = pos.add(Vector3d.atLowerCornerOf(axis.isHorizontal() ? direction.getCounterClockWise() + .getNormal() + : verticalOrientation.getClockWise() + .getNormal()) .scale(0.5)) .add(Vector3d - .of(axis.isHorizontal() ? Direction.UP.getDirectionVec() - : facingDirection == Direction.UP ? verticalOrientation.getDirectionVec() + .atLowerCornerOf(axis.isHorizontal() ? Direction.UP.getNormal() + : direction == Direction.UP ? verticalOrientation.getNormal() : verticalOrientation.getOpposite() - .getDirectionVec()) + .getNormal()) .scale(0.5)); d1 = pos.x; d2 = pos.y; d3 = pos.z; - double d4 = (double) this.getWidthPixels(); - double d5 = (double) this.getHeightPixels(); - double d6 = (double) this.getWidthPixels(); - Direction.Axis direction$axis = this.facingDirection.getAxis(); + double d4 = (double) this.getWidth(); + double d5 = (double) this.getHeight(); + double d6 = (double) this.getWidth(); + Direction.Axis direction$axis = this.direction.getAxis(); switch (direction$axis) { case X: d4 = 1.0D; @@ -200,29 +200,30 @@ public class BlueprintEntity extends HangingEntity this.setBoundingBox(new AxisAlignedBB(d1 - d4, d2 - d5, d3 - d6, d1 + d4, d2 + d5, d3 + d6)); } - public boolean onValidSurface() { - if (!world.isSpaceEmpty(this)) + @Override + public boolean survives() { + if (!level.noCollision(this)) return false; - int i = Math.max(1, this.getWidthPixels() / 16); - int j = Math.max(1, this.getHeightPixels() / 16); - BlockPos blockpos = this.hangingPosition.offset(this.facingDirection.getOpposite()); - Direction upDirection = facingDirection.getAxis() + int i = Math.max(1, this.getWidth() / 16); + int j = Math.max(1, this.getHeight() / 16); + BlockPos blockpos = this.pos.relative(this.direction.getOpposite()); + Direction upDirection = direction.getAxis() .isHorizontal() ? Direction.UP - : facingDirection == Direction.UP ? verticalOrientation : verticalOrientation.getOpposite(); - Direction direction = facingDirection.getAxis() - .isVertical() ? verticalOrientation.rotateY() : facingDirection.rotateYCCW(); + : direction == Direction.UP ? verticalOrientation : verticalOrientation.getOpposite(); + Direction newDirection = direction.getAxis() + .isVertical() ? verticalOrientation.getClockWise() : direction.getCounterClockWise(); BlockPos.Mutable blockpos$mutable = new BlockPos.Mutable(); for (int k = 0; k < i; ++k) { for (int l = 0; l < j; ++l) { int i1 = (i - 1) / -2; int j1 = (j - 1) / -2; - blockpos$mutable.setPos(blockpos) - .move(direction, k + i1) + blockpos$mutable.set(blockpos) + .move(newDirection, k + i1) .move(upDirection, l + j1); - BlockState blockstate = this.world.getBlockState(blockpos$mutable); - if (Block.hasEnoughSolidSide(this.world, blockpos$mutable, this.facingDirection)) + BlockState blockstate = this.level.getBlockState(blockpos$mutable); + if (Block.canSupportCenter(this.level, blockpos$mutable, this.direction)) continue; if (!blockstate.getMaterial() .isSolid() && !RedstoneDiodeBlock.isDiode(blockstate)) { @@ -231,44 +232,44 @@ public class BlueprintEntity extends HangingEntity } } - return this.world.getEntitiesInAABBexcluding(this, this.getBoundingBox(), IS_HANGING_ENTITY) + return this.level.getEntities(this, this.getBoundingBox(), HANGING_ENTITY) .isEmpty(); } @Override - public int getWidthPixels() { + public int getWidth() { return 16 * size; } @Override - public int getHeightPixels() { + public int getHeight() { return 16 * size; } @Override - public boolean hitByEntity(Entity source) { - if (!(source instanceof PlayerEntity) || world.isRemote) - return super.hitByEntity(source); + public boolean skipAttackInteraction(Entity source) { + if (!(source instanceof PlayerEntity) || level.isClientSide) + return super.skipAttackInteraction(source); PlayerEntity player = (PlayerEntity) source; double attrib = player.getAttribute(ForgeMod.REACH_DISTANCE.get()) .getValue() + (player.isCreative() ? 0 : -0.5F); Vector3d eyePos = source.getEyePosition(1); - Vector3d look = source.getLook(1); + Vector3d look = source.getViewVector(1); Vector3d target = eyePos.add(look.scale(attrib)); - - Optional rayTrace = getBoundingBox().rayTrace(eyePos, target); + + Optional rayTrace = getBoundingBox().clip(eyePos, target); if (!rayTrace.isPresent()) - return super.hitByEntity(source); - + return super.skipAttackInteraction(source); + Vector3d hitVec = rayTrace.get(); - BlueprintSection sectionAt = getSectionAt(hitVec.subtract(getPositionVec())); + BlueprintSection sectionAt = getSectionAt(hitVec.subtract(position())); ItemStackHandler items = sectionAt.getItems(); if (items.getStackInSlot(9) .isEmpty()) - return super.hitByEntity(source); + return super.skipAttackInteraction(source); for (int i = 0; i < items.getSlots(); i++) items.setStackInSlot(i, ItemStack.EMPTY); sectionAt.save(items); @@ -276,20 +277,20 @@ public class BlueprintEntity extends HangingEntity } @Override - public void onBroken(@Nullable Entity p_110128_1_) { - if (!world.getGameRules() - .getBoolean(GameRules.DO_ENTITY_DROPS)) + public void dropItem(@Nullable Entity p_110128_1_) { + if (!level.getGameRules() + .getBoolean(GameRules.RULE_DOENTITYDROPS)) return; - playSound(SoundEvents.ENTITY_PAINTING_BREAK, 1.0F, 1.0F); + playSound(SoundEvents.PAINTING_BREAK, 1.0F, 1.0F); if (p_110128_1_ instanceof PlayerEntity) { PlayerEntity playerentity = (PlayerEntity) p_110128_1_; - if (playerentity.abilities.isCreativeMode) { + if (playerentity.abilities.instabuild) { return; } } - entityDropItem(AllItems.CRAFTING_BLUEPRINT.asStack()); + spawnAtLocation(AllItems.CRAFTING_BLUEPRINT.asStack()); } @Override @@ -303,49 +304,49 @@ public class BlueprintEntity extends HangingEntity } @Override - public void playPlaceSound() { - this.playSound(SoundEvents.ENTITY_PAINTING_PLACE, 1.0F, 1.0F); + public void playPlacementSound() { + this.playSound(SoundEvents.PAINTING_PLACE, 1.0F, 1.0F); } @Override - public void setLocationAndAngles(double p_70012_1_, double p_70012_3_, double p_70012_5_, float p_70012_7_, + public void moveTo(double p_70012_1_, double p_70012_3_, double p_70012_5_, float p_70012_7_, float p_70012_8_) { - this.setPosition(p_70012_1_, p_70012_3_, p_70012_5_); + this.setPos(p_70012_1_, p_70012_3_, p_70012_5_); } @Override @OnlyIn(Dist.CLIENT) - public void setPositionAndRotationDirect(double p_180426_1_, double p_180426_3_, double p_180426_5_, + public void lerpTo(double p_180426_1_, double p_180426_3_, double p_180426_5_, float p_180426_7_, float p_180426_8_, int p_180426_9_, boolean p_180426_10_) { BlockPos blockpos = - this.hangingPosition.add(p_180426_1_ - this.getX(), p_180426_3_ - this.getY(), p_180426_5_ - this.getZ()); - this.setPosition((double) blockpos.getX(), (double) blockpos.getY(), (double) blockpos.getZ()); + this.pos.offset(p_180426_1_ - this.getX(), p_180426_3_ - this.getY(), p_180426_5_ - this.getZ()); + this.setPos((double) blockpos.getX(), (double) blockpos.getY(), (double) blockpos.getZ()); } @Override public void writeSpawnData(PacketBuffer buffer) { CompoundNBT compound = new CompoundNBT(); - writeAdditional(compound); - buffer.writeCompoundTag(compound); - buffer.writeCompoundTag(getPersistentData()); + addAdditionalSaveData(compound); + buffer.writeNbt(compound); + buffer.writeNbt(getPersistentData()); } @Override public void readSpawnData(PacketBuffer additionalData) { - readAdditional(additionalData.readCompoundTag()); - getPersistentData().merge(additionalData.readCompoundTag()); + readAdditionalSaveData(additionalData.readNbt()); + getPersistentData().merge(additionalData.readNbt()); } @Override - public ActionResultType applyPlayerInteraction(PlayerEntity player, Vector3d vec, Hand hand) { + public ActionResultType interactAt(PlayerEntity player, Vector3d vec, Hand hand) { if (player instanceof FakePlayer) return ActionResultType.PASS; - boolean holdingWrench = AllItems.WRENCH.isIn(player.getHeldItem(hand)); + boolean holdingWrench = AllItems.WRENCH.isIn(player.getItemInHand(hand)); BlueprintSection section = getSectionAt(vec); ItemStackHandler items = section.getItems(); - if (!holdingWrench && !world.isRemote && !items.getStackInSlot(9) + if (!holdingWrench && !level.isClientSide && !items.getStackInSlot(9) .isEmpty()) { IItemHandlerModifiable playerInv = new InvWrapper(player.inventory); @@ -367,7 +368,7 @@ public class BlueprintEntity extends HangingEntity } for (int slot = 0; slot < playerInv.getSlots(); slot++) { - if (!FilterItem.test(world, playerInv.getStackInSlot(slot), requestedItem)) + if (!FilterItem.test(level, playerInv.getStackInSlot(slot), requestedItem)) continue; ItemStack currentItem = playerInv.extractItem(slot, 1, false); if (stacksTaken.containsKey(slot)) @@ -387,10 +388,10 @@ public class BlueprintEntity extends HangingEntity CraftingInventory craftingInventory = new BlueprintCraftingInventory(craftingGrid); if (!recipe.isPresent()) - recipe = world.getRecipeManager() - .getRecipe(IRecipeType.CRAFTING, craftingInventory, world); - ItemStack result = recipe.filter(r -> r.matches(craftingInventory, world)) - .map(r -> r.getCraftingResult(craftingInventory)) + recipe = level.getRecipeManager() + .getRecipeFor(IRecipeType.CRAFTING, craftingInventory, level); + ItemStack result = recipe.filter(r -> r.matches(craftingInventory, level)) + .map(r -> r.assemble(craftingInventory)) .orElse(ItemStack.EMPTY); if (result.isEmpty()) { @@ -399,17 +400,17 @@ public class BlueprintEntity extends HangingEntity success = false; } else { amountCrafted += result.getCount(); - result.onCrafting(player.world, player, 1); + result.onCraftedBy(player.level, player, 1); BasicEventHooks.firePlayerCraftingEvent(player, result, craftingInventory); - NonNullList nonnulllist = world.getRecipeManager() - .getRecipeNonNull(IRecipeType.CRAFTING, craftingInventory, world); + NonNullList nonnulllist = level.getRecipeManager() + .getRemainingItemsFor(IRecipeType.CRAFTING, craftingInventory, level); if (firstPass) - world.playSound(null, player.getBlockPos(), SoundEvents.ENTITY_ITEM_PICKUP, + level.playSound(null, player.blockPosition(), SoundEvents.ITEM_PICKUP, SoundCategory.PLAYERS, .2f, 1f + Create.RANDOM.nextFloat()); - player.inventory.placeItemBackInInventory(world, result); + player.inventory.placeItemBackInInventory(level, result); for (ItemStack itemStack : nonnulllist) - player.inventory.placeItemBackInInventory(world, itemStack); + player.inventory.placeItemBackInInventory(level, itemStack); firstPass = false; } } @@ -420,15 +421,15 @@ public class BlueprintEntity extends HangingEntity break; } - } while (player.isSneaking()); + } while (player.isShiftKeyDown()); ForgeHooks.setCraftingPlayer(null); return ActionResultType.SUCCESS; } int i = section.index; - if (!world.isRemote && player instanceof ServerPlayerEntity) { + if (!level.isClientSide && player instanceof ServerPlayerEntity) { NetworkHooks.openGui((ServerPlayerEntity) player, section, buf -> { - buf.writeVarInt(getEntityId()); + buf.writeVarInt(getId()); buf.writeVarInt(i); }); } @@ -439,8 +440,8 @@ public class BlueprintEntity extends HangingEntity public BlueprintSection getSectionAt(Vector3d vec) { int index = 0; if (size > 1) { - vec = VecHelper.rotate(vec, rotationYaw, Axis.Y); - vec = VecHelper.rotate(vec, -rotationPitch, Axis.X); + vec = VecHelper.rotate(vec, yRot, Axis.Y); + vec = VecHelper.rotate(vec, -xRot, Axis.X); vec = vec.add(0.5, 0.5, 0); if (size == 3) vec = vec.add(1, 1, 0); @@ -456,7 +457,7 @@ public class BlueprintEntity extends HangingEntity static class BlueprintCraftingInventory extends CraftingInventory { private static Container dummyContainer = new Container(null, -1) { - public boolean canInteractWith(PlayerEntity playerIn) { + public boolean stillValid(PlayerEntity playerIn) { return false; } }; @@ -466,7 +467,7 @@ public class BlueprintEntity extends HangingEntity for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { ItemStack stack = items.get(y * 3 + x); - setInventorySlotContents(y * 3 + x, stack == null ? ItemStack.EMPTY : stack.copy()); + setItem(y * 3 + x, stack == null ? ItemStack.EMPTY : stack.copy()); } } } @@ -517,7 +518,7 @@ public class BlueprintEntity extends HangingEntity list.put(index + "", inventory.serializeNBT()); list.putBoolean("InferredIcon", inferredIcon); cachedDisplayItems = null; - if (!world.isRemote) + if (!level.isClientSide) syncPersistentDataWithTracking(BlueprintEntity.this); } @@ -526,7 +527,7 @@ public class BlueprintEntity extends HangingEntity } public World getBlueprintWorld() { - return world; + return level; } @Override @@ -537,7 +538,7 @@ public class BlueprintEntity extends HangingEntity @Override public ITextComponent getDisplayName() { return new TranslationTextComponent(AllItems.CRAFTING_BLUEPRINT.get() - .getTranslationKey()); + .getDescriptionId()); } @Override diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintItem.java index 355df3b30..7e3b069e1 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintItem.java @@ -39,37 +39,37 @@ public class BlueprintItem extends Item { } @Override - public ActionResultType onItemUse(ItemUseContext ctx) { - Direction face = ctx.getFace(); + public ActionResultType useOn(ItemUseContext ctx) { + Direction face = ctx.getClickedFace(); PlayerEntity player = ctx.getPlayer(); - ItemStack stack = ctx.getItem(); - BlockPos pos = ctx.getPos() - .offset(face); + ItemStack stack = ctx.getItemInHand(); + BlockPos pos = ctx.getClickedPos() + .relative(face); - if (player != null && !player.canPlayerEdit(pos, face, stack)) + if (player != null && !player.mayUseItemAt(pos, face, stack)) return ActionResultType.FAIL; - World world = ctx.getWorld(); + World world = ctx.getLevel(); HangingEntity hangingentity = new BlueprintEntity(world, pos, face, face.getAxis() - .isHorizontal() ? Direction.DOWN : ctx.getPlacementHorizontalFacing()); + .isHorizontal() ? Direction.DOWN : ctx.getHorizontalDirection()); CompoundNBT compoundnbt = stack.getTag(); if (compoundnbt != null) - EntityType.applyItemNBT(world, player, hangingentity, compoundnbt); - if (!hangingentity.onValidSurface()) + EntityType.updateCustomEntityTag(world, player, hangingentity, compoundnbt); + if (!hangingentity.survives()) return ActionResultType.CONSUME; - if (!world.isRemote) { - hangingentity.playPlaceSound(); - world.addEntity(hangingentity); + if (!world.isClientSide) { + hangingentity.playPlacementSound(); + world.addFreshEntity(hangingentity); } stack.shrink(1); - return ActionResultType.success(world.isRemote); + return ActionResultType.sidedSuccess(world.isClientSide); } protected boolean canPlace(PlayerEntity p_200127_1_, Direction p_200127_2_, ItemStack p_200127_3_, BlockPos p_200127_4_) { - return p_200127_1_.canPlayerEdit(p_200127_4_, p_200127_2_, p_200127_3_); + return p_200127_1_.mayUseItemAt(p_200127_4_, p_200127_2_, p_200127_3_); } public static void assignCompleteRecipe(ItemStackHandler inv, IRecipe recipe) { @@ -77,7 +77,7 @@ public class BlueprintItem extends Item { for (int i = 0; i < 9; i++) inv.setStackInSlot(i, ItemStack.EMPTY); - inv.setStackInSlot(9, recipe.getRecipeOutput()); + inv.setStackInSlot(9, recipe.getResultItem()); if (recipe instanceof ShapedRecipe) { ShapedRecipe shapedRecipe = (ShapedRecipe) recipe; @@ -93,7 +93,7 @@ public class BlueprintItem extends Item { private static ItemStack convertIngredientToFilter(Ingredient ingredient) { Ingredient.IItemList[] acceptedItems = - ObfuscationReflectionHelper.getPrivateValue(Ingredient.class, ingredient, "field_199807_b"); + ObfuscationReflectionHelper.getPrivateValue(Ingredient.class, ingredient, "field_199807_b"); // values if (acceptedItems == null || acceptedItems.length > 18) return ItemStack.EMPTY; if (acceptedItems.length == 0) @@ -111,14 +111,14 @@ public class BlueprintItem extends Item { } private static ItemStack convertIItemListToFilter(IItemList itemList) { - Collection stacks = itemList.getStacks(); + Collection stacks = itemList.getItems(); if (itemList instanceof SingleItemList) { for (ItemStack itemStack : stacks) return itemStack; } if (itemList instanceof TagList) { - ResourceLocation resourcelocation = new ResourceLocation(JSONUtils.getString(itemList.serialize(), "tag")); + ResourceLocation resourcelocation = new ResourceLocation(JSONUtils.getAsString(itemList.serialize(), "tag")); ItemStack filterItem = AllItems.ATTRIBUTE_FILTER.asStack(); filterItem.getOrCreateTag() .putInt("WhitelistMode", WhitelistMode.WHITELIST_DISJ.ordinal()); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java index da38ffb60..f52ad6750 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java @@ -55,9 +55,9 @@ public class BlueprintOverlayRenderer { public static void tick() { Minecraft mc = Minecraft.getInstance(); - RayTraceResult mouseOver = mc.objectMouseOver; + RayTraceResult mouseOver = mc.hitResult; BlueprintSection last = lastTargetedSection; - boolean sneak = mc.player.isSneaking(); + boolean sneak = mc.player.isShiftKeyDown(); lastTargetedSection = null; active = false; if (mouseOver == null) @@ -70,8 +70,8 @@ public class BlueprintOverlayRenderer { return; BlueprintEntity blueprintEntity = (BlueprintEntity) entityRay.getEntity(); - BlueprintSection sectionAt = blueprintEntity.getSectionAt(entityRay.getHitVec() - .subtract(blueprintEntity.getPositionVec())); + BlueprintSection sectionAt = blueprintEntity.getSectionAt(entityRay.getLocation() + .subtract(blueprintEntity.position())); lastTargetedSection = last; active = true; @@ -104,9 +104,9 @@ public class BlueprintOverlayRenderer { boolean firstPass = true; boolean success = true; Minecraft mc = Minecraft.getInstance(); - ItemStackHandler playerInv = new ItemStackHandler(mc.player.inventory.getSizeInventory()); + ItemStackHandler playerInv = new ItemStackHandler(mc.player.inventory.getContainerSize()); for (int i = 0; i < playerInv.getSlots(); i++) - playerInv.setStackInSlot(i, mc.player.inventory.getStackInSlot(i) + playerInv.setStackInSlot(i, mc.player.inventory.getItem(i) .copy()); int amountCrafted = 0; @@ -132,7 +132,7 @@ public class BlueprintOverlayRenderer { } for (int slot = 0; slot < playerInv.getSlots(); slot++) { - if (!FilterItem.test(mc.world, playerInv.getStackInSlot(slot), requestedItem)) + if (!FilterItem.test(mc.level, playerInv.getStackInSlot(slot), requestedItem)) continue; ItemStack currentItem = playerInv.extractItem(slot, 1, false); craftingGrid.put(i, currentItem); @@ -147,10 +147,10 @@ public class BlueprintOverlayRenderer { if (success) { CraftingInventory craftingInventory = new BlueprintCraftingInventory(craftingGrid); if (!recipe.isPresent()) - recipe = mc.world.getRecipeManager() - .getRecipe(IRecipeType.CRAFTING, craftingInventory, mc.world); - ItemStack resultFromRecipe = recipe.filter(r -> r.matches(craftingInventory, mc.world)) - .map(r -> r.getCraftingResult(craftingInventory)) + recipe = mc.level.getRecipeManager() + .getRecipeFor(IRecipeType.CRAFTING, craftingInventory, mc.level); + ItemStack resultFromRecipe = recipe.filter(r -> r.matches(craftingInventory, mc.level)) + .map(r -> r.assemble(craftingInventory)) .orElse(ItemStack.EMPTY); if (resultFromRecipe.isEmpty()) { @@ -211,9 +211,9 @@ public class BlueprintOverlayRenderer { int w = 30 + 21 * ingredients.size() + 21; int x = (mc.getWindow() - .getScaledWidth() - w) / 2; + .getGuiScaledWidth() - w) / 2; int y = (int) (mc.getWindow() - .getScaledHeight() / 3f * 2); + .getGuiScaledHeight() / 3f * 2); for (Pair pair : ingredients) { RenderSystem.enableBlend(); @@ -243,7 +243,7 @@ public class BlueprintOverlayRenderer { public static void drawItemStack(MatrixStack ms, Minecraft mc, int x, int y, ItemStack itemStack, String count) { if (itemStack.getItem() instanceof FilterItem) { - int step = AnimationTickHolder.getTicks(mc.world) / 10; + int step = AnimationTickHolder.getTicks(mc.level) / 10; ItemStack[] itemsMatchingFilter = getItemsMatchingFilter(itemStack); if (itemsMatchingFilter.length > 0) itemStack = itemsMatchingFilter[step % itemsMatchingFilter.length]; @@ -253,7 +253,7 @@ public class BlueprintOverlayRenderer { .at(x + 3, y + 3) .render(ms); mc.getItemRenderer() - .renderItemOverlayIntoGUI(mc.fontRenderer, itemStack, x + 3, y + 3, count); + .renderGuiItemDecorations(mc.font, itemStack, x + 3, y + 3, count); } private static ItemStack[] getItemsMatchingFilter(ItemStack filter) { @@ -278,12 +278,12 @@ public class BlueprintOverlayRenderer { ItemAttribute fromNBT = ItemAttribute.fromNBT((CompoundNBT) attributes.get(0)); if (fromNBT instanceof ItemAttribute.InTag) { ItemAttribute.InTag inTag = (ItemAttribute.InTag) fromNBT; - ITag itag = TagCollectionManager.getTagManager() + ITag itag = TagCollectionManager.getInstance() .getItems() - .get(inTag.tagName); + .getTag(inTag.tagName); if (itag != null) - return Ingredient.fromTag(itag) - .getMatchingStacks(); + return Ingredient.of(itag) + .getItems(); } } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java index 96b25e805..02474015d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java @@ -1,13 +1,13 @@ package com.simibubi.create.content.curiosities.tools; import com.jozufozu.flywheel.core.PartialModel; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; @@ -33,103 +33,103 @@ public class BlueprintRenderer extends EntityRenderer { int light) { PartialModel partialModel = entity.size == 3 ? AllBlockPartials.CRAFTING_BLUEPRINT_3x3 : entity.size == 2 ? AllBlockPartials.CRAFTING_BLUEPRINT_2x2 : AllBlockPartials.CRAFTING_BLUEPRINT_1x1; - SuperByteBuffer sbb = PartialBufferer.get(partialModel, Blocks.AIR.getDefaultState()); + SuperByteBuffer sbb = PartialBufferer.get(partialModel, Blocks.AIR.defaultBlockState()); sbb.matrixStacker() .rotateY(-yaw) - .rotateX(90.0F + entity.rotationPitch) + .rotateX(90.0F + entity.xRot) .translate(-.5, -1 / 32f, -.5); if (entity.size == 2) sbb.translate(.5, 0, -.5); sbb.forEntityRender() .light(light) - .renderInto(ms, buffer.getBuffer(Atlases.getEntitySolid())); + .renderInto(ms, buffer.getBuffer(Atlases.solidBlockSheet())); super.render(entity, yaw, pt, ms, buffer, light); - ms.push(); + ms.pushPose(); float fakeNormalXRotation = -15; int bl = light >> 4 & 0xf; int sl = light >> 20 & 0xf; - boolean vertical = entity.rotationPitch != 0; - if (entity.rotationPitch == -90) + boolean vertical = entity.xRot != 0; + if (entity.xRot == -90) fakeNormalXRotation = -45; - else if (entity.rotationPitch == 90 || yaw % 180 != 0) { + else if (entity.xRot == 90 || yaw % 180 != 0) { bl /= 1.35; sl /= 1.35; } int itemLight = MathHelper.floor(sl + .5) << 20 | (MathHelper.floor(bl + .5) & 0xf) << 4; - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(vertical ? 0 : -yaw) .rotateX(fakeNormalXRotation); - Matrix3f copy = ms.peek() - .getNormal() + Matrix3f copy = ms.last() + .normal() .copy(); - ms.pop(); - ms.push(); + ms.popPose(); + ms.pushPose(); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(-yaw) - .rotateX(entity.rotationPitch) + .rotateX(entity.xRot) .translate(0, 0, 1 / 32f + .001); if (entity.size == 3) ms.translate(-1, -1, 0); MatrixStack squashedMS = new MatrixStack(); - squashedMS.peek() - .getModel() - .multiply(ms.peek() - .getModel()); + squashedMS.last() + .pose() + .multiply(ms.last() + .pose()); for (int x = 0; x < entity.size; x++) { - squashedMS.push(); + squashedMS.pushPose(); for (int y = 0; y < entity.size; y++) { BlueprintSection section = entity.getSection(x * entity.size + y); Couple displayItems = section.getDisplayItems(); - squashedMS.push(); + squashedMS.pushPose(); squashedMS.scale(.5f, .5f, 1 / 1024f); displayItems.forEachWithContext((stack, primary) -> { if (stack.isEmpty()) return; - squashedMS.push(); + squashedMS.pushPose(); if (!primary) { squashedMS.translate(0.325f, -0.325f, 1); squashedMS.scale(.625f, .625f, 1); } - Matrix3f n = squashedMS.peek() - .getNormal(); - n.a00 = copy.a00; - n.a01 = copy.a01; - n.a02 = copy.a02; - n.a10 = copy.a10; - n.a11 = copy.a11; - n.a12 = copy.a12; - n.a20 = copy.a20; - n.a21 = copy.a21; - n.a22 = copy.a22; + Matrix3f n = squashedMS.last() + .normal(); + n.m00 = copy.m00; + n.m01 = copy.m01; + n.m02 = copy.m02; + n.m10 = copy.m10; + n.m11 = copy.m11; + n.m12 = copy.m12; + n.m20 = copy.m20; + n.m21 = copy.m21; + n.m22 = copy.m22; Minecraft.getInstance() .getItemRenderer() - .renderItem(stack, TransformType.GUI, itemLight, OverlayTexture.DEFAULT_UV, squashedMS, buffer); - squashedMS.pop(); + .renderStatic(stack, TransformType.GUI, itemLight, OverlayTexture.NO_OVERLAY, squashedMS, buffer); + squashedMS.popPose(); }); - squashedMS.pop(); + squashedMS.popPose(); squashedMS.translate(1, 0, 0); } - squashedMS.pop(); + squashedMS.popPose(); squashedMS.translate(0, 1, 0); } - ms.pop(); + ms.popPose(); } @Override - public ResourceLocation getEntityTexture(BlueprintEntity p_110775_1_) { + public ResourceLocation getTextureLocation(BlueprintEntity p_110775_1_) { return null; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java index 5c7150818..5fba8bbbc 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java @@ -45,8 +45,8 @@ public class BlueprintScreen extends AbstractSimiContainerScreenat(x + background.width + 20, y + background.height - 32, 0) @@ -79,21 +79,21 @@ public class BlueprintScreen extends AbstractSimiContainerScreen(), hoveredSlot.getSlotIndex(), true), x, y, - textRenderer); + font); } @Override public List getTooltipFromItem(ItemStack stack) { List list = super.getTooltipFromItem(stack); - if (hoveredSlot.inventory == container.playerInventory) + if (hoveredSlot.container == menu.playerInventory) return list; return hoveredSlot != null ? addToTooltip(list, hoveredSlot.getSlotIndex(), false) : list; } @@ -104,26 +104,26 @@ public class BlueprintScreen extends AbstractSimiContainerScreen d) { + if (sender.distanceToSqr(entityByID) > d) { // TODO log? return; } if (interactionHand == null) - sender.attackTargetEntityWithCurrentItem(entityByID); + sender.attack(entityByID); else if (specificPoint == null) sender.interactOn(entityByID, interactionHand); else - entityByID.applyPlayerInteraction(sender, specificPoint, interactionHand); + entityByID.interactAt(sender, specificPoint, interactionHand); } }); context.get().setPacketHandled(true); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java index 1cf868e5a..4947f3636 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java @@ -71,7 +71,7 @@ public class ExtendoGripItem extends Item { ImmutableMultimap.of(ForgeMod.REACH_DISTANCE.get(), doubleRangeAttributeModifier)); public ExtendoGripItem(Properties properties) { - super(properties.maxStackSize(1) + super(properties.stacksTo(1) .rarity(Rarity.UNCOMMON)); } @@ -86,8 +86,8 @@ public class ExtendoGripItem extends Item { PlayerEntity player = (PlayerEntity) event.getEntityLiving(); CompoundNBT persistentData = player.getPersistentData(); - boolean inOff = AllItems.EXTENDO_GRIP.isIn(player.getHeldItemOffhand()); - boolean inMain = AllItems.EXTENDO_GRIP.isIn(player.getHeldItemMainhand()); + boolean inOff = AllItems.EXTENDO_GRIP.isIn(player.getOffhandItem()); + boolean inMain = AllItems.EXTENDO_GRIP.isIn(player.getMainHandItem()); boolean holdingDualExtendo = inOff && inMain; boolean holdingExtendo = inOff ^ inMain; holdingExtendo &= !holdingDualExtendo; @@ -97,13 +97,13 @@ public class ExtendoGripItem extends Item { if (holdingExtendo != wasHoldingExtendo) { if (!holdingExtendo) { player.getAttributes() - .removeModifiers(rangeModifier.getValue()); + .removeAttributeModifiers(rangeModifier.get()); persistentData.remove(EXTENDO_MARKER); } else { if (player instanceof ServerPlayerEntity) AllTriggers.EXTENDO.trigger((ServerPlayerEntity) player); player.getAttributes() - .addTemporaryModifiers(rangeModifier.getValue()); + .addTransientAttributeModifiers(rangeModifier.get()); persistentData.putBoolean(EXTENDO_MARKER, true); } } @@ -111,13 +111,13 @@ public class ExtendoGripItem extends Item { if (holdingDualExtendo != wasHoldingDualExtendo) { if (!holdingDualExtendo) { player.getAttributes() - .removeModifiers(doubleRangeModifier.getValue()); + .removeAttributeModifiers(doubleRangeModifier.get()); persistentData.remove(DUAL_EXTENDO_MARKER); } else { if (player instanceof ServerPlayerEntity) AllTriggers.GIGA_EXTENDO.trigger((ServerPlayerEntity) player); player.getAttributes() - .addTemporaryModifiers(doubleRangeModifier.getValue()); + .addTransientAttributeModifiers(doubleRangeModifier.get()); persistentData.putBoolean(DUAL_EXTENDO_MARKER, true); } } @@ -131,10 +131,10 @@ public class ExtendoGripItem extends Item { if (persistentData.contains(DUAL_EXTENDO_MARKER)) player.getAttributes() - .addTemporaryModifiers(doubleRangeModifier.getValue()); + .addTransientAttributeModifiers(doubleRangeModifier.get()); else if (persistentData.contains(EXTENDO_MARKER)) player.getAttributes() - .addTemporaryModifiers(rangeModifier.getValue()); + .addTransientAttributeModifiers(rangeModifier.get()); } @SubscribeEvent @@ -142,11 +142,11 @@ public class ExtendoGripItem extends Item { public static void dontMissEntitiesWhenYouHaveHighReachDistance(ClickInputEvent event) { Minecraft mc = Minecraft.getInstance(); ClientPlayerEntity player = mc.player; - if (mc.world == null || player == null) + if (mc.level == null || player == null) return; if (!isHoldingExtendoGrip(player)) return; - if (mc.objectMouseOver instanceof BlockRayTraceResult && mc.objectMouseOver.getType() != Type.MISS) + if (mc.hitResult instanceof BlockRayTraceResult && mc.hitResult.getType() != Type.MISS) return; // Modified version of GameRenderer#getMouseOver @@ -155,23 +155,23 @@ public class ExtendoGripItem extends Item { if (!player.isCreative()) d0 -= 0.5f; Vector3d Vector3d = player.getEyePosition(AnimationTickHolder.getPartialTicks()); - Vector3d Vector3d1 = player.getLook(1.0F); + Vector3d Vector3d1 = player.getViewVector(1.0F); Vector3d Vector3d2 = Vector3d.add(Vector3d1.x * d0, Vector3d1.y * d0, Vector3d1.z * d0); AxisAlignedBB axisalignedbb = player.getBoundingBox() - .expand(Vector3d1.scale(d0)) - .grow(1.0D, 1.0D, 1.0D); + .expandTowards(Vector3d1.scale(d0)) + .inflate(1.0D, 1.0D, 1.0D); EntityRayTraceResult entityraytraceresult = - ProjectileHelper.rayTraceEntities(player, Vector3d, Vector3d2, axisalignedbb, (e) -> { - return !e.isSpectator() && e.canBeCollidedWith(); + ProjectileHelper.getEntityHitResult(player, Vector3d, Vector3d2, axisalignedbb, (e) -> { + return !e.isSpectator() && e.isPickable(); }, d0 * d0); if (entityraytraceresult != null) { Entity entity1 = entityraytraceresult.getEntity(); - Vector3d Vector3d3 = entityraytraceresult.getHitVec(); - double d2 = Vector3d.squareDistanceTo(Vector3d3); - if (d2 < d0 * d0 || mc.objectMouseOver == null || mc.objectMouseOver.getType() == Type.MISS) { - mc.objectMouseOver = entityraytraceresult; + Vector3d Vector3d3 = entityraytraceresult.getLocation(); + double d2 = Vector3d.distanceToSqr(Vector3d3); + if (d2 < d0 * d0 || mc.hitResult == null || mc.hitResult.getType() == Type.MISS) { + mc.hitResult = entityraytraceresult; if (entity1 instanceof LivingEntity || entity1 instanceof ItemFrameEntity) - mc.pointedEntity = entity1; + mc.crosshairPickEntity = entity1; } } } @@ -196,19 +196,19 @@ public class ExtendoGripItem extends Item { private static void findAndDamageExtendoGrip(PlayerEntity player) { if (player == null) return; - if (player.world.isRemote) + if (player.level.isClientSide) return; Hand hand = Hand.MAIN_HAND; - ItemStack extendo = player.getHeldItemMainhand(); + ItemStack extendo = player.getMainHandItem(); if (!AllItems.EXTENDO_GRIP.isIn(extendo)) { - extendo = player.getHeldItemOffhand(); + extendo = player.getOffhandItem(); hand = Hand.OFF_HAND; } if (!AllItems.EXTENDO_GRIP.isIn(extendo)) return; final Hand h = hand; if (!BackTankUtil.canAbsorbDamage(player, maxUses())) - extendo.damageItem(1, player, p -> p.sendBreakAnimation(h)); + extendo.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(h)); } @Override @@ -231,7 +231,7 @@ public class ExtendoGripItem extends Item { } @Override - public boolean isDamageable() { + public boolean canBeDepleted() { return true; } @@ -248,7 +248,7 @@ public class ExtendoGripItem extends Item { DamageSource source = event.getSource(); if (source == null) return; - Entity trueSource = source.getTrueSource(); + Entity trueSource = source.getEntity(); if (trueSource instanceof PlayerEntity) findAndDamageExtendoGrip((PlayerEntity) trueSource); } @@ -257,7 +257,7 @@ public class ExtendoGripItem extends Item { public static void attacksByExtendoGripHaveMoreKnockback(LivingKnockBackEvent event) { if (lastActiveDamageSource == null) return; - Entity entity = lastActiveDamageSource.getImmediateSource(); + Entity entity = lastActiveDamageSource.getDirectEntity(); if (!(entity instanceof PlayerEntity)) return; PlayerEntity player = (PlayerEntity) entity; @@ -268,9 +268,9 @@ public class ExtendoGripItem extends Item { private static boolean isUncaughtClientInteraction(Entity entity, Entity target) { // Server ignores entity interaction further than 6m - if (entity.getDistanceSq(target) < 36) + if (entity.distanceToSqr(target) < 36) return false; - if (!entity.world.isRemote) + if (!entity.level.isClientSide) return false; if (!(entity instanceof PlayerEntity)) return false; @@ -315,8 +315,8 @@ public class ExtendoGripItem extends Item { } public static boolean isHoldingExtendoGrip(PlayerEntity player) { - boolean inOff = AllItems.EXTENDO_GRIP.isIn(player.getHeldItemOffhand()); - boolean inMain = AllItems.EXTENDO_GRIP.isIn(player.getHeldItemMainhand()); + boolean inOff = AllItems.EXTENDO_GRIP.isIn(player.getOffhandItem()); + boolean inMain = AllItems.EXTENDO_GRIP.isIn(player.getMainHandItem()); boolean holdingGrip = inOff || inMain; return holdingGrip; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java index c604eeb3a..7c2078bda 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java @@ -1,11 +1,11 @@ package com.simibubi.create.content.curiosities.tools; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; @@ -21,7 +21,7 @@ public class ExtendoGripItemRenderer extends CustomRenderedItemModelRenderer mainHandAnimation && swingProgress > 0) @@ -86,7 +86,7 @@ public class ExtendoGripRenderHandler { ms.translate(flip * (0.64000005F - .1f), -0.4F + equipProgress * -0.6F, -0.71999997F + .3f); - ms.push(); + ms.pushPose(); msr.rotateY(flip * 75.0F); ms.translate(flip * -1.0F, 3.6F, 3.5F); msr.rotateZ(flip * 120) @@ -96,18 +96,18 @@ public class ExtendoGripRenderHandler { msr.rotateY(flip * 40.0F); ms.translate(flip * 0.05f, -0.3f, -0.3f); - PlayerRenderer playerrenderer = (PlayerRenderer) mc.getRenderManager() + PlayerRenderer playerrenderer = (PlayerRenderer) mc.getEntityRenderDispatcher() .getRenderer(player); if (rightHand) - playerrenderer.renderRightArm(event.getMatrixStack(), event.getBuffers(), event.getLight(), player); + playerrenderer.renderRightHand(event.getMatrixStack(), event.getBuffers(), event.getLight(), player); else - playerrenderer.renderLeftArm(event.getMatrixStack(), event.getBuffers(), event.getLight(), player); - ms.pop(); + playerrenderer.renderLeftHand(event.getMatrixStack(), event.getBuffers(), event.getLight(), player); + ms.popPose(); // Render gun - ms.push(); + ms.pushPose(); ms.translate(flip * -0.1f, 0, -0.3f); - FirstPersonRenderer firstPersonRenderer = mc.getFirstPersonRenderer(); + FirstPersonRenderer firstPersonRenderer = mc.getItemInHandRenderer(); TransformType transform = rightHand ? TransformType.FIRST_PERSON_RIGHT_HAND : TransformType.FIRST_PERSON_LEFT_HAND; firstPersonRenderer.renderItem(mc.player, notInOffhand ? heldItem : offhandItem, transform, !rightHand, @@ -115,11 +115,11 @@ public class ExtendoGripRenderHandler { if (!notInOffhand) { ForgeHooksClient.handleCameraTransforms(ms, mc.getItemRenderer() - .getItemModelWithOverrides(offhandItem, null, null), transform, !rightHand); + .getModel(offhandItem, null, null), transform, !rightHand); ms.translate(flip * -.05f, .15f, -1.2f); ms.translate(0, 0, -animation * 2.25f); if (blockItem && mc.getItemRenderer() - .getItemModelWithOverrides(heldItem, null, null) + .getModel(heldItem, null, null) .isGui3d()) { msr.rotateY(flip * 45); ms.translate(flip * 0.15f, -0.15f, -.05f); @@ -130,18 +130,18 @@ public class ExtendoGripRenderHandler { event.getBuffers(), event.getLight()); } - ms.pop(); + ms.popPose(); } - ms.pop(); + ms.popPose(); event.setCanceled(true); } private static ItemStack getRenderedMainHandStack() { - return Minecraft.getInstance().getFirstPersonRenderer().itemStackMainHand; + return Minecraft.getInstance().getItemInHandRenderer().mainHandItem; } private static ItemStack getRenderedOffHandStack() { - return Minecraft.getInstance().getFirstPersonRenderer().itemStackOffHand; + return Minecraft.getInstance().getItemInHandRenderer().offHandItem; } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItem.java index 676b36d80..5ee736091 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItem.java @@ -32,55 +32,55 @@ import net.minecraftforge.common.util.FakePlayer; public class SandPaperItem extends Item { public SandPaperItem(Properties properties) { - super(properties.maxDamage(8)); + super(properties.durability(8)); } @Override - public UseAction getUseAction(ItemStack stack) { + public UseAction getUseAnimation(ItemStack stack) { return UseAction.EAT; } @Override - public ActionResultType onItemUse(ItemUseContext context) { + public ActionResultType useOn(ItemUseContext context) { return ActionResultType.PASS; } @Override - public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) { - ItemStack itemstack = playerIn.getHeldItem(handIn); + public ActionResult use(World worldIn, PlayerEntity playerIn, Hand handIn) { + ItemStack itemstack = playerIn.getItemInHand(handIn); ActionResult FAIL = new ActionResult<>(ActionResultType.FAIL, itemstack); if (itemstack.getOrCreateTag() .contains("Polishing")) { - playerIn.setActiveHand(handIn); + playerIn.startUsingItem(handIn); return new ActionResult<>(ActionResultType.PASS, itemstack); } Hand otherHand = handIn == Hand.MAIN_HAND ? Hand.OFF_HAND : Hand.MAIN_HAND; - ItemStack itemInOtherHand = playerIn.getHeldItem(otherHand); + ItemStack itemInOtherHand = playerIn.getItemInHand(otherHand); if (SandPaperPolishingRecipe.canPolish(worldIn, itemInOtherHand)) { ItemStack item = itemInOtherHand.copy(); ItemStack toPolish = item.split(1); - playerIn.setActiveHand(handIn); + playerIn.startUsingItem(handIn); itemstack.getOrCreateTag() .put("Polishing", toPolish.serializeNBT()); - playerIn.setHeldItem(otherHand, item); + playerIn.setItemInHand(otherHand, item); return new ActionResult<>(ActionResultType.SUCCESS, itemstack); } - RayTraceResult raytraceresult = rayTrace(worldIn, playerIn, RayTraceContext.FluidMode.NONE); + RayTraceResult raytraceresult = getPlayerPOVHitResult(worldIn, playerIn, RayTraceContext.FluidMode.NONE); if (!(raytraceresult instanceof BlockRayTraceResult)) return FAIL; BlockRayTraceResult ray = (BlockRayTraceResult) raytraceresult; - Vector3d hitVec = ray.getHitVec(); + Vector3d hitVec = ray.getLocation(); - AxisAlignedBB bb = new AxisAlignedBB(hitVec, hitVec).grow(1f); + AxisAlignedBB bb = new AxisAlignedBB(hitVec, hitVec).inflate(1f); ItemEntity pickUp = null; - for (ItemEntity itemEntity : worldIn.getEntitiesWithinAABB(ItemEntity.class, bb)) { + for (ItemEntity itemEntity : worldIn.getEntitiesOfClass(ItemEntity.class, bb)) { if (!itemEntity.isAlive()) continue; - if (itemEntity.getPositionVec() - .distanceTo(playerIn.getPositionVec()) > 3) + if (itemEntity.position() + .distanceTo(playerIn.position()) > 3) continue; ItemStack stack = itemEntity.getItem(); if (!SandPaperPolishingRecipe.canPolish(worldIn, stack)) @@ -96,9 +96,9 @@ public class SandPaperItem extends Item { .copy(); ItemStack toPolish = item.split(1); - playerIn.setActiveHand(handIn); + playerIn.startUsingItem(handIn); - if (!worldIn.isRemote) { + if (!worldIn.isClientSide) { itemstack.getOrCreateTag() .put("Polishing", toPolish.serializeNBT()); if (item.isEmpty()) @@ -121,19 +121,19 @@ public class SandPaperItem extends Item { } @Override - public ItemStack onItemUseFinish(ItemStack stack, World worldIn, LivingEntity entityLiving) { + public ItemStack finishUsingItem(ItemStack stack, World worldIn, LivingEntity entityLiving) { if (!(entityLiving instanceof PlayerEntity)) return stack; PlayerEntity player = (PlayerEntity) entityLiving; CompoundNBT tag = stack.getOrCreateTag(); if (tag.contains("Polishing")) { - ItemStack toPolish = ItemStack.read(tag.getCompound("Polishing")); + ItemStack toPolish = ItemStack.of(tag.getCompound("Polishing")); ItemStack polished = - SandPaperPolishingRecipe.applyPolish(worldIn, entityLiving.getPositionVec(), toPolish, stack); + SandPaperPolishingRecipe.applyPolish(worldIn, entityLiving.position(), toPolish, stack); - if (worldIn.isRemote) { + if (worldIn.isClientSide) { spawnParticles(entityLiving.getEyePosition(1) - .add(entityLiving.getLookVec() + .add(entityLiving.getLookAngle() .scale(.5f)), toPolish, worldIn); return stack; @@ -141,13 +141,13 @@ public class SandPaperItem extends Item { if (!polished.isEmpty()) { if (player instanceof FakePlayer) { - player.dropItem(polished, false, false); + player.drop(polished, false, false); } else { player.inventory.placeItemBackInInventory(worldIn, polished); } } tag.remove("Polishing"); - stack.damageItem(1, entityLiving, p -> p.sendBreakAnimation(p.getActiveHand())); + stack.hurtAndBreak(1, entityLiving, p -> p.broadcastBreakEvent(p.getUsedItemHand())); } return stack; @@ -155,20 +155,20 @@ public class SandPaperItem extends Item { public static void spawnParticles(Vector3d location, ItemStack polishedStack, World world) { for (int i = 0; i < 20; i++) { - Vector3d motion = VecHelper.offsetRandomly(Vector3d.ZERO, world.rand, 1 / 8f); + Vector3d motion = VecHelper.offsetRandomly(Vector3d.ZERO, world.random, 1 / 8f); world.addParticle(new ItemParticleData(ParticleTypes.ITEM, polishedStack), location.x, location.y, location.z, motion.x, motion.y, motion.z); } } @Override - public void onPlayerStoppedUsing(ItemStack stack, World worldIn, LivingEntity entityLiving, int timeLeft) { + public void releaseUsing(ItemStack stack, World worldIn, LivingEntity entityLiving, int timeLeft) { if (!(entityLiving instanceof PlayerEntity)) return; PlayerEntity player = (PlayerEntity) entityLiving; CompoundNBT tag = stack.getOrCreateTag(); if (tag.contains("Polishing")) { - ItemStack toPolish = ItemStack.read(tag.getCompound("Polishing")); + ItemStack toPolish = ItemStack.of(tag.getCompound("Polishing")); player.inventory.placeItemBackInInventory(worldIn, toPolish); tag.remove("Polishing"); } @@ -180,7 +180,7 @@ public class SandPaperItem extends Item { } @Override - public int getItemEnchantability() { + public int getEnchantmentValue() { return 5; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java index fca6a5c45..bdc8946f5 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java @@ -19,34 +19,34 @@ import net.minecraft.util.math.vector.Vector3f; public class SandPaperItemRenderer extends ItemStackTileEntityRenderer { @Override - public void render(ItemStack stack, TransformType transformType, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + public void renderByItem(ItemStack stack, TransformType transformType, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); ClientPlayerEntity player = Minecraft.getInstance().player; - SandPaperModel mainModel = (SandPaperModel) itemRenderer.getItemModelWithOverrides(stack, Minecraft.getInstance().world, null); + SandPaperModel mainModel = (SandPaperModel) itemRenderer.getModel(stack, Minecraft.getInstance().level, null); float partialTicks = AnimationTickHolder.getPartialTicks(); boolean leftHand = transformType == TransformType.FIRST_PERSON_LEFT_HAND; boolean firstPerson = leftHand || transformType == TransformType.FIRST_PERSON_RIGHT_HAND; - ms.push(); + ms.pushPose(); ms.translate(.5f, .5f, .5f); CompoundNBT tag = stack.getOrCreateTag(); boolean jeiMode = tag.contains("JEI"); if (tag.contains("Polishing")) { - ms.push(); + ms.pushPose(); if (transformType == TransformType.GUI) { ms.translate(0.0F, .2f, 1.0F); ms.scale(.75f, .75f, .75f); } else { int modifier = leftHand ? -1 : 1; - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(modifier * 40)); + ms.mulPose(Vector3f.YP.rotationDegrees(modifier * 40)); } // Reverse bobbing - float time = (float) (!jeiMode ? player.getItemInUseCount() + float time = (float) (!jeiMode ? player.getUseItemRemainingTicks() : (-AnimationTickHolder.getTicks()) % stack.getUseDuration()) - partialTicks + 1.0F; if (time / (float) stack.getUseDuration() < 0.8F) { float bobbing = -MathHelper.abs(MathHelper.cos(time / 4.0F * (float) Math.PI) * 0.1F); @@ -57,26 +57,26 @@ public class SandPaperItemRenderer extends ItemStackTileEntityRenderer { ms.translate(0.0f, bobbing, 0.0F); } - ItemStack toPolish = ItemStack.read(tag.getCompound("Polishing")); - itemRenderer.renderItem(toPolish, TransformType.NONE, light, overlay, ms, buffer); + ItemStack toPolish = ItemStack.of(tag.getCompound("Polishing")); + itemRenderer.renderStatic(toPolish, TransformType.NONE, light, overlay, ms, buffer); - ms.pop(); + ms.popPose(); } if (firstPerson) { - int itemInUseCount = player.getItemInUseCount(); + int itemInUseCount = player.getUseItemRemainingTicks(); if (itemInUseCount > 0) { int modifier = leftHand ? -1 : 1; ms.translate(modifier * .5f, 0, -.25f); - ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(modifier * 40)); - ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(modifier * 10)); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(modifier * 90)); + ms.mulPose(Vector3f.ZP.rotationDegrees(modifier * 40)); + ms.mulPose(Vector3f.XP.rotationDegrees(modifier * 10)); + ms.mulPose(Vector3f.YP.rotationDegrees(modifier * 90)); } } - itemRenderer.renderItem(stack, TransformType.NONE, false, ms, buffer, light, overlay, mainModel.getOriginalModel()); + itemRenderer.render(stack, TransformType.NONE, false, ms, buffer, light, overlay, mainModel.getOriginalModel()); - ms.pop(); + ms.popPose(); } public static class SandPaperModel extends CustomRenderedItemModel { diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperPolishingRecipe.java b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperPolishingRecipe.java index b949f1f94..8ef830a4f 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperPolishingRecipe.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperPolishingRecipe.java @@ -26,7 +26,7 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe { @Override public boolean matches(SandPaperInv inv, World worldIn) { return ingredients.get(0) - .test(inv.getStackInSlot(0)); + .test(inv.getItem(0)); } @Override @@ -47,14 +47,14 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe { List> matchingRecipes = getMatchingRecipes(world, stack); if (!matchingRecipes.isEmpty()) return matchingRecipes.get(0) - .getCraftingResult(new SandPaperInv(stack)) + .assemble(new SandPaperInv(stack)) .copy(); return stack; } public static List> getMatchingRecipes(World world, ItemStack stack) { return world.getRecipeManager() - .getRecipes(AllRecipeTypes.SANDPAPER_POLISHING.getType(), new SandPaperInv(stack), world); + .getRecipesFor(AllRecipeTypes.SANDPAPER_POLISHING.getType(), new SandPaperInv(stack), world); } public static class SandPaperInv extends RecipeWrapper { diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItem.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItem.java index 578378447..7c7db65a1 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItem.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Optional; import java.util.function.Predicate; +import com.simibubi.create.AllEnchantments; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.Create; import com.simibubi.create.CreateClient; @@ -11,12 +12,16 @@ import com.simibubi.create.content.curiosities.armor.BackTankUtil; import com.simibubi.create.content.curiosities.zapper.ShootableGadgetItemMethods; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; @@ -25,9 +30,12 @@ import net.minecraft.item.ShootableItem; import net.minecraft.item.UseAction; import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.text.IFormattableTextComponent; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; @@ -46,14 +54,29 @@ public class PotatoCannonItem extends ShootableItem { } @Override - public boolean canPlayerBreakBlockWhileHolding(BlockState p_195938_1_, World p_195938_2_, BlockPos p_195938_3_, + public boolean canAttackBlock(BlockState p_195938_1_, World p_195938_2_, BlockPos p_195938_3_, PlayerEntity p_195938_4_) { return false; } @Override - public ActionResultType onItemUse(ItemUseContext context) { - return onItemRightClick(context.getWorld(), context.getPlayer(), context.getHand()).getType(); + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + if (enchantment == Enchantments.POWER_ARROWS) + return true; + if (enchantment == Enchantments.PUNCH_ARROWS) + return true; + if (enchantment == Enchantments.FLAMING_ARROWS) + return true; + if (enchantment == Enchantments.MOB_LOOTING) + return true; + if (enchantment == AllEnchantments.POTATO_RECOVERY.get()) + return true; + return super.canApplyAtEnchantingTable(stack, enchantment); + } + + @Override + public ActionResultType useOn(ItemUseContext context) { + return use(context.getLevel(), context.getPlayer(), context.getHand()).getResult(); } @Override @@ -81,7 +104,7 @@ public class PotatoCannonItem extends ShootableItem { } @Override - public boolean isDamageable() { + public boolean canBeDepleted() { return true; } @@ -95,52 +118,67 @@ public class PotatoCannonItem extends ShootableItem { } @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); + public ActionResult use(World world, PlayerEntity player, Hand hand) { + ItemStack stack = player.getItemInHand(hand); return findAmmoInInventory(world, player, stack).map(itemStack -> { if (ShootableGadgetItemMethods.shouldSwap(player, stack, hand, this::isCannon)) return ActionResult.fail(stack); - if (world.isRemote) { + if (world.isClientSide) { CreateClient.POTATO_CANNON_RENDER_HANDLER.dontAnimateItem(hand); return ActionResult.success(stack); } Vector3d barrelPos = ShootableGadgetItemMethods.getGunBarrelVec(player, hand == Hand.MAIN_HAND, - new Vector3d(.75f, -0.3f, 1.5f)); + new Vector3d(.75f, -0.15f, 1.5f)); Vector3d correction = ShootableGadgetItemMethods.getGunBarrelVec(player, hand == Hand.MAIN_HAND, new Vector3d(-.05f, 0, 0)) - .subtract(player.getPositionVec() + .subtract(player.position() .add(0, player.getEyeHeight(), 0)); - - Vector3d lookVec = player.getLookVec(); PotatoCannonProjectileTypes projectileType = PotatoCannonProjectileTypes.getProjectileTypeOf(itemStack) .orElse(PotatoCannonProjectileTypes.FALLBACK); + Vector3d lookVec = player.getLookAngle(); + Vector3d motion = lookVec.add(correction) + .normalize() + .scale(projectileType.getVelocityMultiplier()); + float soundPitch = projectileType.getSoundPitch() + (Create.RANDOM.nextFloat() - .5f) / 4f; + boolean spray = projectileType.getSplit() > 1; + Vector3d sprayBase = VecHelper.rotate(new Vector3d(0, 0.1, 0), 360 * Create.RANDOM.nextFloat(), Axis.Z); + float sprayChange = 360f / projectileType.getSplit(); + for (int i = 0; i < projectileType.getSplit(); i++) { PotatoProjectileEntity projectile = AllEntityTypes.POTATO_PROJECTILE.create(world); projectile.setItem(itemStack); - Vector3d motion = lookVec.scale(projectileType.getVelocityMultiplier()) - .add(correction); - if (spray) - motion = VecHelper.offsetRandomly(motion, Create.RANDOM, 0.25f); - projectile.setPosition(barrelPos.x, barrelPos.y, barrelPos.z); - projectile.setMotion(motion); - projectile.setShooter(player); - world.addEntity(projectile); + projectile.setEnchantmentEffectsFromCannon(stack); + + Vector3d splitMotion = motion; + if (spray) { + float imperfection = 40 * (Create.RANDOM.nextFloat() - 0.5f); + Vector3d sprayOffset = VecHelper.rotate(sprayBase, i * sprayChange + imperfection, Axis.Z); + splitMotion = splitMotion.add(VecHelper.lookAt(sprayOffset, motion)); + } + + if (i != 0) + projectile.recoveryChance = 0; + + projectile.setPos(barrelPos.x, barrelPos.y, barrelPos.z); + projectile.setDeltaMovement(splitMotion); + projectile.setOwner(player); + world.addFreshEntity(projectile); } if (!player.isCreative()) { itemStack.shrink(1); if (itemStack.isEmpty()) - player.inventory.deleteStack(itemStack); + player.inventory.removeItem(itemStack); } if (!BackTankUtil.canAbsorbDamage(player, maxUses())) - stack.damageItem(1, player, p -> p.sendBreakAnimation(hand)); + stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(hand)); Integer cooldown = findAmmoInInventory(world, player, stack).flatMap(PotatoCannonProjectileTypes::getProjectileTypeOf) @@ -161,7 +199,7 @@ public class PotatoCannonItem extends ShootableItem { } private Optional findAmmoInInventory(World world, PlayerEntity player, ItemStack held) { - ItemStack findAmmo = player.findAmmo(held); + ItemStack findAmmo = player.getProjectile(held); return PotatoCannonProjectileTypes.getProjectileTypeOf(findAmmo) .map($ -> findAmmo); } @@ -176,7 +214,7 @@ public class PotatoCannonItem extends ShootableItem { CLIENT_CURRENT_AMMO = ItemStack.EMPTY; if (player == null) return Optional.empty(); - ItemStack findAmmo = player.findAmmo(cannon); + ItemStack findAmmo = player.getProjectile(cannon); Optional found = PotatoCannonProjectileTypes.getProjectileTypeOf(findAmmo) .map($ -> findAmmo); found.ifPresent(stack -> CLIENT_CURRENT_AMMO = stack); @@ -185,33 +223,58 @@ public class PotatoCannonItem extends ShootableItem { @Override @OnlyIn(Dist.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { + public void appendHoverText(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { + int power = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.POWER_ARROWS, stack); + int punch = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.PUNCH_ARROWS, stack); + final float additionalDamageMult = 1 + power * .2f; + final float additionalKnockback = punch * .5f; + getAmmoforPreview(stack).ifPresent(ammo -> { + String _attack = "potato_cannon.ammo.attack_damage"; + String _reload = "potato_cannon.ammo.reload_ticks"; + String _knockback = "potato_cannon.ammo.knockback"; + tooltip.add(new StringTextComponent("")); - tooltip.add(new TranslationTextComponent(ammo.getTranslationKey()).append(new StringTextComponent(":")) - .formatted(TextFormatting.GRAY)); + tooltip.add(new TranslationTextComponent(ammo.getDescriptionId()).append(new StringTextComponent(":")) + .withStyle(TextFormatting.GRAY)); PotatoCannonProjectileTypes type = PotatoCannonProjectileTypes.getProjectileTypeOf(ammo) .get(); StringTextComponent spacing = new StringTextComponent(" "); + TextFormatting green = TextFormatting.GREEN; TextFormatting darkGreen = TextFormatting.DARK_GREEN; - tooltip.add(spacing.copy() - .append(new StringTextComponent(type.getDamage() + " Attack Damage").formatted(darkGreen))); - tooltip.add(spacing.copy() - .append(new StringTextComponent(type.getReloadTicks() + " Reload Ticks").formatted(darkGreen))); - tooltip.add(spacing.copy() - .append(new StringTextComponent(type.getKnockback() + " Knockback").formatted(darkGreen))); + + float damageF = type.getDamage() * additionalDamageMult; + IFormattableTextComponent damage = new StringTextComponent( + damageF == MathHelper.floor(damageF) ? "" + MathHelper.floor(damageF) : "" + damageF); + IFormattableTextComponent reloadTicks = new StringTextComponent("" + type.getReloadTicks()); + IFormattableTextComponent knockback = + new StringTextComponent("" + (type.getKnockback() + additionalKnockback)); + + damage = damage.withStyle(additionalDamageMult > 1 ? green : darkGreen); + knockback = knockback.withStyle(additionalKnockback > 0 ? green : darkGreen); + reloadTicks = reloadTicks.withStyle(darkGreen); + + tooltip.add(spacing.plainCopy() + .append(Lang.translate(_attack, damage) + .withStyle(darkGreen))); + tooltip.add(spacing.plainCopy() + .append(Lang.translate(_reload, reloadTicks) + .withStyle(darkGreen))); + tooltip.add(spacing.plainCopy() + .append(Lang.translate(_knockback, knockback) + .withStyle(darkGreen))); }); - super.addInformation(stack, world, tooltip, flag); + super.appendHoverText(stack, world, tooltip, flag); } @Override - public Predicate getInventoryAmmoPredicate() { + public Predicate getAllSupportedProjectiles() { return stack -> PotatoCannonProjectileTypes.getProjectileTypeOf(stack) .isPresent(); } @Override - public int getItemEnchantability() { + public int getEnchantmentValue() { return 1; } @@ -221,12 +284,12 @@ public class PotatoCannonItem extends ShootableItem { } @Override - public UseAction getUseAction(ItemStack stack) { + public UseAction getUseAnimation(ItemStack stack) { return UseAction.NONE; } @Override - public int getRange() { + public int getDefaultProjectileRange() { return 15; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItemRenderer.java index 35ad66a50..25911adbc 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItemRenderer.java @@ -1,11 +1,11 @@ package com.simibubi.create.content.curiosities.weapons; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; @@ -27,9 +27,9 @@ public class PotatoCannonItemRenderer extends CustomRenderedItemModelRenderer ZOMBIE_CONVERTERS = + new WorldAttached<>(w -> new FakePlayer((ServerWorld) w, ZOMBIE_CONVERTER_NAME)); + public static final Map ALL = new HashMap<>(); public static final Map, PotatoCannonProjectileTypes> ITEM_MAP = new HashMap<>(); public static final PotatoCannonProjectileTypes @@ -46,7 +64,7 @@ public class PotatoCannonProjectileTypes { FALLBACK = create("fallback").damage(0) .register(), - POTATO = create("potato").damage(4) + POTATO = create("potato").damage(5) .reloadTicks(15) .velocity(1.25f) .knockback(1.5f) @@ -54,32 +72,32 @@ public class PotatoCannonProjectileTypes { .onBlockHit(plantCrop(Blocks.POTATOES.delegate)) .registerAndAssign(Items.POTATO), - BAKED_POTATO = create("baked_potato").damage(3) + BAKED_POTATO = create("baked_potato").damage(5) .reloadTicks(15) - .velocity(1.05f) + .velocity(1.25f) .knockback(0.5f) .renderTumbling() - .onEntityHit(ray -> ray.getEntity() - .setFireTicks(10)) + .onEntityHit(setFire(3)) .registerAndAssign(Items.BAKED_POTATO), - CARROT = create("carrot").damage(3) - .renderTowardMotion(140, 1) + CARROT = create("carrot").damage(4) + .reloadTicks(12) .velocity(1.45f) - .knockback(0.5f) - .soundPitch(1.25f) + .knockback(0.3f) + .renderTowardMotion(140, 1) + .soundPitch(1.5f) .onBlockHit(plantCrop(Blocks.CARROTS.delegate)) .registerAndAssign(Items.CARROT), - GOLDEN_CARROT = create("golden_carrot").damage(8) - .reloadTicks(20) - .knockback(0.5f) + GOLDEN_CARROT = create("golden_carrot").damage(12) + .reloadTicks(15) .velocity(1.45f) + .knockback(0.5f) .renderTowardMotion(140, 2) - .soundPitch(1.25f) + .soundPitch(1.5f) .registerAndAssign(Items.GOLDEN_CARROT), - SWEET_BERRIES = create("sweet_berry").damage(1) + SWEET_BERRIES = create("sweet_berry").damage(3) .reloadTicks(10) .knockback(0.1f) .velocity(1.05f) @@ -88,22 +106,150 @@ public class PotatoCannonProjectileTypes { .soundPitch(1.25f) .registerAndAssign(Items.SWEET_BERRIES), + CHOCOLATE_BERRIES = create("chocolate_berry").damage(4) + .reloadTicks(10) + .knockback(0.2f) + .velocity(1.05f) + .renderTumbling() + .splitInto(3) + .soundPitch(1.25f) + .registerAndAssign(AllItems.CHOCOLATE_BERRIES.get()), + POISON_POTATO = create("poison_potato").damage(5) .reloadTicks(15) .knockback(0.05f) .velocity(1.25f) .renderTumbling() - .onEntityHit(potion(Effects.POISON, 4)) + .onEntityHit(potion(Effects.POISON, 1,160, true)) .registerAndAssign(Items.POISONOUS_POTATO), - CHORUS_FRUIT = create("chorus_fruit").damage(2) + CHORUS_FRUIT = create("chorus_fruit").damage(3) .reloadTicks(15) .velocity(1.20f) .knockback(0.05f) .renderTumbling() .onEntityHit(chorusTeleport(20)) - .registerAndAssign(Items.CHORUS_FRUIT) + .registerAndAssign(Items.CHORUS_FRUIT), + APPLE = create("apple").damage(5) + .reloadTicks(10) + .velocity(1.45f) + .knockback(0.5f) + .renderTumbling() + .soundPitch(1.1f) + .registerAndAssign(Items.APPLE), + + HONEYED_APPLE = create("honeyed_apple").damage(6) + .reloadTicks(15) + .velocity(1.35f) + .knockback(0.1f) + .renderTumbling() + .soundPitch(1.1f) + .onEntityHit(potion(Effects.MOVEMENT_SLOWDOWN, 2,160, true)) + .registerAndAssign(AllItems.HONEYED_APPLE.get()), + + GOLDEN_APPLE = create("golden_apple").damage(1) + .reloadTicks(100) + .velocity(1.45f) + .knockback(0.05f) + .renderTumbling() + .soundPitch(1.1f) + .onEntityHit(ray -> { + Entity entity = ray.getEntity(); + World world = entity.level; + + if (!(entity instanceof ZombieVillagerEntity) + || !((ZombieVillagerEntity) entity).hasEffect(Effects.WEAKNESS)) + return foodEffects(Foods.GOLDEN_APPLE, false).test(ray); + if (world.isClientSide) + return false; + + FakePlayer dummy = ZOMBIE_CONVERTERS.get(world); + dummy.setItemInHand(Hand.MAIN_HAND, new ItemStack(Items.GOLDEN_APPLE, 1)); + ((ZombieVillagerEntity) entity).mobInteract(dummy, Hand.MAIN_HAND); + return true; + }) + .registerAndAssign(Items.GOLDEN_APPLE), + + ENCHANTED_GOLDEN_APPLE = create("enchanted_golden_apple").damage(1) + .reloadTicks(100) + .velocity(1.45f) + .knockback(0.05f) + .renderTumbling() + .soundPitch(1.1f) + .onEntityHit(foodEffects(Foods.ENCHANTED_GOLDEN_APPLE, false)) + .registerAndAssign(Items.ENCHANTED_GOLDEN_APPLE), + + BEETROOT = create("beetroot").damage(2) + .reloadTicks(5) + .velocity(1.6f) + .knockback(0.1f) + .renderTowardMotion(140, 2) + .soundPitch(1.6f) + .registerAndAssign(Items.BEETROOT), + + MELON_SLICE = create("melon_slice").damage(3) + .reloadTicks(8) + .knockback(0.1f) + .velocity(1.45f) + .renderTumbling() + .soundPitch(1.5f) + .registerAndAssign(Items.MELON_SLICE), + + GLISTENING_MELON = create("glistening_melon").damage(5) + .reloadTicks(8) + .knockback(0.1f) + .velocity(1.45f) + .renderTumbling() + .soundPitch(1.5f) + .onEntityHit(potion(Effects.GLOWING, 1, 100, true)) + .registerAndAssign(Items.GLISTERING_MELON_SLICE), + + MELON_BLOCK = create("melon_block").damage(8) + .reloadTicks(20) + .knockback(2.0f) + .velocity(0.95f) + .renderTumbling() + .soundPitch(0.9f) + .onBlockHit(placeBlockOnGround(Blocks.MELON.delegate)) + .registerAndAssign(Blocks.MELON), + + PUMPKIN_BLOCK = create("pumpkin_block").damage(6) + .reloadTicks(15) + .knockback(2.0f) + .velocity(0.95f) + .renderTumbling() + .soundPitch(0.9f) + .onBlockHit(placeBlockOnGround(Blocks.PUMPKIN.delegate)) + .registerAndAssign(Blocks.PUMPKIN), + + PUMPKIN_PIE = create("pumpkin_pie").damage(7) + .reloadTicks(15) + .knockback(0.05f) + .velocity(1.1f) + .renderTumbling() + .sticky() + .soundPitch(1.1f) + .registerAndAssign(Items.PUMPKIN_PIE), + + CAKE = create("cake").damage(8) + .reloadTicks(15) + .knockback(0.1f) + .velocity(1.1f) + .renderTumbling() + .sticky() + .soundPitch(1.0f) + .registerAndAssign(Items.CAKE), + + BLAZE_CAKE = create("blaze_cake").damage(15) + .reloadTicks(20) + .knockback(0.3f) + .velocity(1.1f) + .renderTumbling() + .sticky() + .onEntityHit(setFire(12)) + .soundPitch(1.0f) + .registerAndAssign(AllItems.BLAZE_CAKE.get()) ; public static void registerType(ResourceLocation resLoc, PotatoCannonProjectileTypes type) { @@ -134,11 +280,10 @@ public class PotatoCannonProjectileTypes { private int damage = 1; private int split = 1; private float fwoompPitch = 1; + private boolean sticky = false; private PotatoProjectileRenderMode renderMode = new PotatoProjectileRenderMode.Billboard(); - private Consumer onEntityHit = e -> { - }; - private BiConsumer onBlockHit = (w, ray) -> { - }; + private Predicate onEntityHit = e -> false; + private BiPredicate onBlockHit = (w, ray) -> false; public float getGravityMultiplier() { return gravityMultiplier; @@ -176,49 +321,123 @@ public class PotatoCannonProjectileTypes { return damage; } - public void onEntityHit(EntityRayTraceResult ray) { - onEntityHit.accept(ray); + public boolean isSticky() { return sticky; } + + public boolean onEntityHit(EntityRayTraceResult ray) { + return onEntityHit.test(ray); } - public void onBlockHit(IWorld world, BlockRayTraceResult ray) { - onBlockHit.accept(world, ray); + public boolean onBlockHit(IWorld world, BlockRayTraceResult ray) { + return onBlockHit.test(world, ray); } - private static Consumer potion(Effect effect, int seconds) { + private static Predicate setFire(int seconds) { return ray -> { - Entity entity = ray.getEntity(); - if (entity instanceof LivingEntity) - ((LivingEntity) entity).addPotionEffect(new EffectInstance(effect, seconds)); + ray.getEntity().setSecondsOnFire(seconds); + return false; }; } - private static BiConsumer plantCrop(IRegistryDelegate cropBlock) { + private static Predicate potion(Effect effect, int level, int ticks, boolean recoverable) { + return ray -> { + Entity entity = ray.getEntity(); + if (entity.level.isClientSide) + return true; + if (entity instanceof LivingEntity) + applyEffect((LivingEntity) entity, new EffectInstance(effect, ticks, level - 1)); + return !recoverable; + }; + } + + private static Predicate foodEffects(Food food, boolean recoverable) { + return ray -> { + Entity entity = ray.getEntity(); + if (entity.level.isClientSide) + return true; + + if (entity instanceof LivingEntity) { + for (Pair effect : food.getEffects()) { + if (Create.RANDOM.nextFloat() < effect.getSecond()) + applyEffect((LivingEntity) entity, new EffectInstance(effect.getFirst())); + } + } + return !recoverable; + }; + } + + public static void applyEffect(LivingEntity entity, EffectInstance effect) { + if (effect.getEffect().isInstantenous()) + effect.getEffect().applyInstantenousEffect(null, null, entity, effect.getDuration(), 1.0); + else + entity.addEffect(effect); + } + + private static BiPredicate plantCrop(IRegistryDelegate cropBlock) { return (world, ray) -> { - BlockPos pos = ray.getPos(); - if (!world.isAreaLoaded(pos, 1)) - return; - BlockState blockState = world.getBlockState(pos); - if (!world.getBlockState(pos.up()) + if (world.isClientSide()) + return true; + + BlockPos hitPos = ray.getBlockPos(); + if (!world.isAreaLoaded(hitPos, 1)) + return true; + Direction face = ray.getDirection(); + BlockPos placePos = hitPos.relative(face); + if (!world.getBlockState(placePos) .getMaterial() .isReplaceable()) - return; + return false; if (!(cropBlock.get() instanceof IPlantable)) - return; - if (!blockState.canSustainPlant(world, pos, Direction.UP, (IPlantable) cropBlock.get())) - return; - world.setBlockState(pos.up(), cropBlock.get() - .getDefaultState(), 3); + return false; + BlockState blockState = world.getBlockState(hitPos); + if (!blockState.canSustainPlant(world, hitPos, face, (IPlantable) cropBlock.get())) + return false; + world.setBlock(placePos, cropBlock.get().defaultBlockState(), 3); + return true; }; } - private static Consumer chorusTeleport(double teleportDiameter) { + private static BiPredicate placeBlockOnGround(IRegistryDelegate block) { + return (world, ray) -> { + if (world.isClientSide()) + return true; + + BlockPos hitPos = ray.getBlockPos(); + if (!world.isAreaLoaded(hitPos, 1)) + return true; + Direction face = ray.getDirection(); + BlockPos placePos = hitPos.relative(face); + if (!world.getBlockState(placePos) + .getMaterial() + .isReplaceable()) + return false; + + if (face == Direction.UP) { + world.setBlock(placePos, block.get().defaultBlockState(), 3); + } else if (world instanceof World) { + double y = ray.getLocation().y - 0.5; + if (!world.isEmptyBlock(placePos.above())) + y = Math.min(y, placePos.getY()); + if (!world.isEmptyBlock(placePos.below())) + y = Math.max(y, placePos.getY()); + + FallingBlockEntity falling = new FallingBlockEntity((World) world, placePos.getX() + 0.5, y, + placePos.getZ() + 0.5, block.get().defaultBlockState()); + falling.time = 1; + world.addFreshEntity(falling); + } + + return true; + }; + } + + private static Predicate chorusTeleport(double teleportDiameter) { return ray -> { Entity entity = ray.getEntity(); - World world = entity.getEntityWorld(); - if (world.isRemote) - return; + World world = entity.getCommandSenderWorld(); + if (world.isClientSide) + return true; if (!(entity instanceof LivingEntity)) - return; + return false; LivingEntity livingEntity = (LivingEntity) entity; double entityX = livingEntity.getX(); @@ -226,24 +445,26 @@ public class PotatoCannonProjectileTypes { double entityZ = livingEntity.getZ(); for (int teleportTry = 0; teleportTry < 16; ++teleportTry) { - double teleportX = entityX + (livingEntity.getRNG().nextDouble() - 0.5D) * teleportDiameter; - double teleportY = MathHelper.clamp(entityY + (livingEntity.getRNG().nextInt((int) teleportDiameter) - (int) (teleportDiameter / 2)), 0.0D, world.getDimensionHeight() - 1); - double teleportZ = entityZ + (livingEntity.getRNG().nextDouble() - 0.5D) * teleportDiameter; + double teleportX = entityX + (livingEntity.getRandom().nextDouble() - 0.5D) * teleportDiameter; + double teleportY = MathHelper.clamp(entityY + (livingEntity.getRandom().nextInt((int) teleportDiameter) - (int) (teleportDiameter / 2)), 0.0D, world.getHeight() - 1); + double teleportZ = entityZ + (livingEntity.getRandom().nextDouble() - 0.5D) * teleportDiameter; EntityTeleportEvent.ChorusFruit event = ForgeEventFactory.onChorusFruitTeleport(livingEntity, teleportX, teleportY, teleportZ); if (event.isCanceled()) - return; - - if (livingEntity.attemptTeleport(event.getTargetX(), event.getTargetY(), event.getTargetZ(), true)) { + return false; + if (livingEntity.randomTeleport(event.getTargetX(), event.getTargetY(), event.getTargetZ(), true)) { if (livingEntity.isPassenger()) livingEntity.stopRiding(); - SoundEvent soundevent = livingEntity instanceof FoxEntity ? SoundEvents.ENTITY_FOX_TELEPORT : SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT; + SoundEvent soundevent = livingEntity instanceof FoxEntity ? SoundEvents.FOX_TELEPORT : SoundEvents.CHORUS_FRUIT_TELEPORT; world.playSound(null, entityX, entityY, entityZ, soundevent, SoundCategory.PLAYERS, 1.0F, 1.0F); livingEntity.playSound(soundevent, 1.0F, 1.0F); - break; + livingEntity.setDeltaMovement(Vector3d.ZERO); + return true; } } + + return false; }; } @@ -312,12 +533,17 @@ public class PotatoCannonProjectileTypes { return this; } - public Builder onEntityHit(Consumer callback) { + public Builder sticky() { + result.sticky = true; + return this; + } + + public Builder onEntityHit(Predicate callback) { result.onEntityHit = callback; return this; } - public Builder onBlockHit(BiConsumer callback) { + public Builder onBlockHit(BiPredicate callback) { result.onBlockHit = callback; return this; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonRenderHandler.java index 0cdf10d4a..9f19f3ee6 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonRenderHandler.java @@ -1,11 +1,11 @@ package com.simibubi.create.content.curiosities.weapons; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.particle.AirParticleData; import com.simibubi.create.content.curiosities.zapper.ShootableGadgetRenderHandler; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; @@ -22,7 +22,7 @@ public class PotatoCannonRenderHandler extends ShootableGadgetRenderHandler { @Override protected void playSound(Hand hand, Vector3d position) { - PotatoProjectileEntity.playLaunchSound(Minecraft.getInstance().world, position, nextPitch); + PotatoProjectileEntity.playLaunchSound(Minecraft.getInstance().level, position, nextPitch); } @Override @@ -35,7 +35,7 @@ public class PotatoCannonRenderHandler extends ShootableGadgetRenderHandler { this.nextPitch = nextPitch; if (stack.isEmpty()) return; - ClientWorld world = Minecraft.getInstance().world; + ClientWorld world = Minecraft.getInstance().level; for (int i = 0; i < 2; i++) { Vector3d m = VecHelper.offsetRandomly(motion.scale(0.1f), Create.RANDOM, .025f); world.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), location.x, location.y, location.z, m.x, @@ -50,14 +50,14 @@ public class PotatoCannonRenderHandler extends ShootableGadgetRenderHandler { protected void transformTool(MatrixStack ms, float flip, float equipProgress, float recoil, float pt) { ms.translate(flip * -.1f, 0, .14f); ms.scale(.75f, .75f, .75f); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateX(recoil * 80); } @Override protected void transformHand(MatrixStack ms, float flip, float equipProgress, float recoil, float pt) { ms.translate(flip * -.09, -.275, -.25); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateZ(flip * -10); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileEntity.java index be80dd36d..982773df5 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileEntity.java +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileEntity.java @@ -2,16 +2,19 @@ package com.simibubi.create.content.curiosities.weapons; import javax.annotation.Nullable; +import com.simibubi.create.AllEnchantments; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.particle.AirParticleData; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityClassification; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.boss.WitherEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.projectile.DamagingProjectileEntity; @@ -28,15 +31,26 @@ import net.minecraft.util.IndirectEntityDamageSource; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.EntityRayTraceResult; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.items.ItemHandlerHelper; public class PotatoProjectileEntity extends DamagingProjectileEntity implements IEntityAdditionalSpawnData { - ItemStack stack = ItemStack.EMPTY; PotatoCannonProjectileTypes type; + ItemStack stack = ItemStack.EMPTY; + + Entity stuckEntity; + Vector3d stuckOffset; + PotatoProjectileRenderMode stuckRenderer; + double stuckFallSpeed; + + float additionalDamageMult = 1; + float additionalKnockback = 0; + float recoveryChance = 0; public PotatoProjectileEntity(EntityType type, World world) { super(type, world); @@ -57,67 +71,135 @@ public class PotatoProjectileEntity extends DamagingProjectileEntity implements return type; } - @Override - public void readAdditional(CompoundNBT nbt) { - stack = ItemStack.read(nbt.getCompound("Item")); - super.readAdditional(nbt); + public void setEnchantmentEffectsFromCannon(ItemStack cannon) { + int power = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.POWER_ARROWS, cannon); + int punch = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.PUNCH_ARROWS, cannon); + int flame = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.FLAMING_ARROWS, cannon); + int recovery = EnchantmentHelper.getItemEnchantmentLevel(AllEnchantments.POTATO_RECOVERY.get(), cannon); + + if (power > 0) + additionalDamageMult = 1 + power * .2f; + if (punch > 0) + additionalKnockback = punch * .5f; + if (flame > 0) + setSecondsOnFire(100); + if (recovery > 0) + recoveryChance = .125f + recovery * .125f; } @Override - public void writeAdditional(CompoundNBT nbt) { + public void readAdditionalSaveData(CompoundNBT nbt) { + stack = ItemStack.of(nbt.getCompound("Item")); + additionalDamageMult = nbt.getFloat("AdditionalDamage"); + additionalKnockback = nbt.getFloat("AdditionalKnockback"); + recoveryChance = nbt.getFloat("Recovery"); + super.readAdditionalSaveData(nbt); + } + + @Override + public void addAdditionalSaveData(CompoundNBT nbt) { nbt.put("Item", stack.serializeNBT()); - super.writeAdditional(nbt); + nbt.putFloat("AdditionalDamage", additionalDamageMult); + nbt.putFloat("AdditionalKnockback", additionalKnockback); + nbt.putFloat("Recovery", recoveryChance); + super.addAdditionalSaveData(nbt); + } + + public Entity getStuckEntity() { + if (stuckEntity == null) + return null; + if (!stuckEntity.isAlive()) + return null; + return stuckEntity; + } + + public void setStuckEntity(Entity stuckEntity) { + this.stuckEntity = stuckEntity; + this.stuckOffset = position().subtract(stuckEntity.position()); + this.stuckRenderer = new PotatoProjectileRenderMode.StuckToEntity(stuckOffset); + this.stuckFallSpeed = 0.0; + setDeltaMovement(Vector3d.ZERO); + } + + public PotatoProjectileRenderMode getRenderMode() { + if (getStuckEntity() != null) + return stuckRenderer; + + return getProjectileType().getRenderMode(); } public void tick() { PotatoCannonProjectileTypes projectileType = getProjectileType(); - setMotion(getMotion().add(0, -.05 * projectileType.getGravityMultiplier(), 0) - .scale(projectileType.getDrag())); + + Entity stuckEntity = getStuckEntity(); + if (stuckEntity != null) { + if (getY() < stuckEntity.getY() - 0.1) { + pop(position()); + remove(); + } else { + stuckFallSpeed += 0.007 * projectileType.getGravityMultiplier(); + stuckOffset = stuckOffset.add(0, -stuckFallSpeed, 0); + Vector3d pos = stuckEntity.position() + .add(stuckOffset); + setPos(pos.x, pos.y, pos.z); + } + } else { + setDeltaMovement(getDeltaMovement().add(0, -0.05 * projectileType.getGravityMultiplier(), 0) + .scale(projectileType.getDrag())); + } + super.tick(); } @Override - protected float getMotionFactor() { + protected float getInertia() { return 1; } @Override - protected IParticleData getParticle() { + protected IParticleData getTrailParticle() { return new AirParticleData(1, 10); } @Override - protected boolean isFireballFiery() { + protected boolean shouldBurn() { return false; } @Override - protected void onEntityHit(EntityRayTraceResult ray) { - super.onEntityHit(ray); + protected void onHitEntity(EntityRayTraceResult ray) { + super.onHitEntity(ray); - Vector3d hit = ray.getHitVec(); + if (getStuckEntity() != null) + return; + + Vector3d hit = ray.getLocation(); Entity target = ray.getEntity(); PotatoCannonProjectileTypes projectileType = getProjectileType(); - int damage = projectileType.getDamage(); - float knockback = projectileType.getKnockback(); + float damage = projectileType.getDamage() * additionalDamageMult; + float knockback = projectileType.getKnockback() + additionalKnockback; Entity owner = this.getOwner(); if (!target.isAlive()) return; if (owner instanceof LivingEntity) - ((LivingEntity) owner).setLastAttackedEntity(target); - if (target instanceof PotatoProjectileEntity && ticksExisted < 10 && target.ticksExisted < 10) + ((LivingEntity) owner).setLastHurtMob(target); + if (target instanceof PotatoProjectileEntity && tickCount < 10 && target.tickCount < 10) return; pop(hit); - boolean targetIsEnderman = target.getType() == EntityType.ENDERMAN; - int k = target.getFireTimer(); - if (this.isBurning() && !targetIsEnderman) - target.setFire(5); + if (target instanceof WitherEntity && ((WitherEntity) target).isPowered()) + return; - if (!target.attackEntityFrom(causePotatoDamage(), (float) damage)) { - target.setFireTicks(k); + boolean targetIsEnderman = target.getType() == EntityType.ENDERMAN; + int k = target.getRemainingFireTicks(); + if (this.isOnFire() && !targetIsEnderman) + target.setSecondsOnFire(5); + + boolean onServer = !level.isClientSide; + if (onServer && !target.hurt(causePotatoDamage(), damage)) { + target.setRemainingFireTicks(k); remove(); return; } @@ -125,45 +207,60 @@ public class PotatoProjectileEntity extends DamagingProjectileEntity implements if (targetIsEnderman) return; - projectileType.onEntityHit(ray); + if (!projectileType.onEntityHit(ray) && onServer) + if (random.nextDouble() <= recoveryChance) + recoverItem(); if (!(target instanceof LivingEntity)) { - playHitSound(world, getPositionVec()); + playHitSound(level, position()); remove(); return; } LivingEntity livingentity = (LivingEntity) target; + + if (type.getReloadTicks() < 10) + livingentity.invulnerableTime = type.getReloadTicks() + 10; + if (knockback > 0) { - Vector3d appliedMotion = this.getMotion() - .mul(1.0D, 0.0D, 1.0D) + Vector3d appliedMotion = this.getDeltaMovement() + .multiply(1.0D, 0.0D, 1.0D) .normalize() .scale(knockback * 0.6); - if (appliedMotion.lengthSquared() > 0.0D) - livingentity.addVelocity(appliedMotion.x, 0.1D, appliedMotion.z); + if (appliedMotion.lengthSqr() > 0.0D) + livingentity.push(appliedMotion.x, 0.1D, appliedMotion.z); } - boolean onServer = !world.isRemote; if (onServer && owner instanceof LivingEntity) { - EnchantmentHelper.applyThornEnchantments(livingentity, owner); - EnchantmentHelper.applyArthropodEnchantments((LivingEntity) owner, livingentity); + EnchantmentHelper.doPostHurtEffects(livingentity, owner); + EnchantmentHelper.doPostDamageEffects((LivingEntity) owner, livingentity); } - if (owner != null && livingentity != owner && livingentity instanceof PlayerEntity - && owner instanceof ServerPlayerEntity && !this.isSilent()) { + if (livingentity != owner && livingentity instanceof PlayerEntity && owner instanceof ServerPlayerEntity + && !this.isSilent()) { ((ServerPlayerEntity) owner).connection - .sendPacket(new SChangeGameStatePacket(SChangeGameStatePacket.PROJECTILE_HIT_PLAYER, 0.0F)); + .send(new SChangeGameStatePacket(SChangeGameStatePacket.ARROW_HIT_PLAYER, 0.0F)); } if (onServer && owner instanceof ServerPlayerEntity) { ServerPlayerEntity serverplayerentity = (ServerPlayerEntity) owner; if (!target.isAlive() && target.getType() - .getClassification() == EntityClassification.MONSTER + .getCategory() == EntityClassification.MONSTER || (target instanceof PlayerEntity && target != owner)) AllTriggers.POTATO_KILL.trigger(serverplayerentity); } - remove(); + if (type.isSticky() && target.isAlive()) { + setStuckEntity(target); + } else { + remove(); + } + + } + + private void recoverItem() { + if (!stack.isEmpty()) + spawnAtLocation(ItemHandlerHelper.copyStackWithSize(stack, 1)); } public static void playHitSound(World world, Vector3d location) { @@ -175,19 +272,23 @@ public class PotatoProjectileEntity extends DamagingProjectileEntity implements } @Override - protected void onBlockHit(BlockRayTraceResult ray) { - Vector3d hit = ray.getHitVec(); + protected void onHitBlock(BlockRayTraceResult ray) { + Vector3d hit = ray.getLocation(); pop(hit); - getProjectileType().onBlockHit(world, ray); - super.onBlockHit(ray); + if (!getProjectileType().onBlockHit(level, ray) && !level.isClientSide) + if (random.nextDouble() <= recoveryChance) + recoverItem(); + super.onHitBlock(ray); remove(); } @Override - public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_) { - if (this.isInvulnerableTo(p_70097_1_)) + public boolean hurt(DamageSource source, float amt) { + if (source == DamageSource.IN_FIRE || source == DamageSource.ON_FIRE) return false; - pop(getPositionVec()); + if (this.isInvulnerableTo(source)) + return false; + pop(position()); remove(); return true; } @@ -195,12 +296,12 @@ public class PotatoProjectileEntity extends DamagingProjectileEntity implements private void pop(Vector3d hit) { if (!stack.isEmpty()) { for (int i = 0; i < 7; i++) { - Vector3d m = VecHelper.offsetRandomly(Vector3d.ZERO, this.rand, .25f); - world.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), hit.x, hit.y, hit.z, m.x, m.y, m.z); + Vector3d m = VecHelper.offsetRandomly(Vector3d.ZERO, this.random, .25f); + level.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), hit.x, hit.y, hit.z, m.x, m.y, m.z); } } - if (!world.isRemote) - playHitSound(world, getPositionVec()); + if (!level.isClientSide) + playHitSound(level, position()); } private DamageSource causePotatoDamage() { @@ -218,24 +319,24 @@ public class PotatoProjectileEntity extends DamagingProjectileEntity implements @SuppressWarnings("unchecked") public static EntityType.Builder build(EntityType.Builder builder) { EntityType.Builder entityBuilder = (EntityType.Builder) builder; - return entityBuilder.size(.25f, .25f); + return entityBuilder.sized(.25f, .25f); } @Override - public IPacket createSpawnPacket() { + public IPacket getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } @Override public void writeSpawnData(PacketBuffer buffer) { CompoundNBT compound = new CompoundNBT(); - writeAdditional(compound); - buffer.writeCompoundTag(compound); + addAdditionalSaveData(compound); + buffer.writeNbt(compound); } @Override public void readSpawnData(PacketBuffer additionalData) { - readAdditional(additionalData.readCompoundTag()); + readAdditionalSaveData(additionalData.readNbt()); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderMode.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderMode.java index 9fb0c04e3..14908086d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderMode.java +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderMode.java @@ -1,8 +1,10 @@ package com.simibubi.create.content.curiosities.weapons; +import static com.simibubi.create.content.curiosities.weapons.PotatoProjectileRenderMode.entityRandom; + +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; @@ -11,24 +13,24 @@ import net.minecraft.util.math.vector.Vector3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public abstract class PotatoProjectileRenderMode { +public interface PotatoProjectileRenderMode { @OnlyIn(Dist.CLIENT) - public abstract void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt); + void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt); - public static class Billboard extends PotatoProjectileRenderMode { + public static class Billboard implements PotatoProjectileRenderMode { @Override @OnlyIn(Dist.CLIENT) public void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt) { Minecraft mc = Minecraft.getInstance(); - Vector3d p1 = mc.getRenderViewEntity() + Vector3d p1 = mc.getCameraEntity() .getEyePosition(pt); Vector3d diff = entity.getBoundingBox() .getCenter() .subtract(p1); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(AngleHelper.deg(MathHelper.atan2(diff.x, diff.z))) .rotateX(180 + AngleHelper.deg(MathHelper.atan2(diff.y, -MathHelper.sqrt(diff.x * diff.x + diff.z * diff.z)))); @@ -41,13 +43,13 @@ public abstract class PotatoProjectileRenderMode { @OnlyIn(Dist.CLIENT) public void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt) { super.transform(ms, entity, pt); - MatrixStacker.of(ms) - .rotateZ((entity.ticksExisted + pt) * 2 * entityRandom(entity, 16)) - .rotateX((entity.ticksExisted + pt) * entityRandom(entity, 32)); + MatrixTransformStack.of(ms) + .rotateZ((entity.tickCount + pt) * 2 * entityRandom(entity, 16)) + .rotateX((entity.tickCount + pt) * entityRandom(entity, 32)); } } - public static class TowardMotion extends PotatoProjectileRenderMode { + public static class TowardMotion implements PotatoProjectileRenderMode { private int spriteAngleOffset; private float spin; @@ -60,18 +62,34 @@ public abstract class PotatoProjectileRenderMode { @Override @OnlyIn(Dist.CLIENT) public void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt) { - Vector3d diff = entity.getMotion(); - MatrixStacker.of(ms) + Vector3d diff = entity.getDeltaMovement(); + MatrixTransformStack.of(ms) .rotateY(AngleHelper.deg(MathHelper.atan2(diff.x, diff.z))) .rotateX(270 + AngleHelper.deg(MathHelper.atan2(diff.y, -MathHelper.sqrt(diff.x * diff.x + diff.z * diff.z)))); - MatrixStacker.of(ms) - .rotateY((entity.ticksExisted + pt) * 20 * spin + entityRandom(entity, 360)) + MatrixTransformStack.of(ms) + .rotateY((entity.tickCount + pt) * 20 * spin + entityRandom(entity, 360)) .rotateZ(-spriteAngleOffset); } } + public static class StuckToEntity implements PotatoProjectileRenderMode { + + private Vector3d offset; + + public StuckToEntity(Vector3d offset) { + this.offset = offset; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt) { + MatrixTransformStack.of(ms).rotateY(AngleHelper.deg(MathHelper.atan2(offset.x, offset.z))); + } + + } + public static int entityRandom(Entity entity, int maxValue) { return (System.identityHashCode(entity) * 31) % maxValue; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderer.java index 4a234782a..48138d20b 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderer.java @@ -23,21 +23,20 @@ public class PotatoProjectileRenderer extends EntityRenderer createSpawnPacket() { + public IPacket getAddEntityPacket() { // TODO Auto-generated method stub return null; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootGadgetPacket.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootGadgetPacket.java index 12a204775..8226cc221 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootGadgetPacket.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootGadgetPacket.java @@ -57,10 +57,10 @@ public abstract class ShootGadgetPacket extends SimplePacketBase { context.get() .enqueueWork(() -> { Entity renderViewEntity = Minecraft.getInstance() - .getRenderViewEntity(); + .getCameraEntity(); if (renderViewEntity == null) return; - if (renderViewEntity.getPositionVec() + if (renderViewEntity.position() .distanceTo(location) > 100) return; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootableGadgetItemMethods.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootableGadgetItemMethods.java index cefdd485f..a403f6ef0 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootableGadgetItemMethods.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootableGadgetItemMethods.java @@ -18,9 +18,9 @@ public class ShootableGadgetItemMethods { public static void applyCooldown(PlayerEntity player, ItemStack item, Hand hand, Predicate predicate, int cooldown) { boolean gunInOtherHand = - predicate.test(player.getHeldItem(hand == Hand.MAIN_HAND ? Hand.OFF_HAND : Hand.MAIN_HAND)); - player.getCooldownTracker() - .setCooldown(item.getItem(), gunInOtherHand ? cooldown * 2 / 3 : cooldown); + predicate.test(player.getItemInHand(hand == Hand.MAIN_HAND ? Hand.OFF_HAND : Hand.MAIN_HAND)); + player.getCooldowns() + .addCooldown(item.getItem(), gunInOtherHand ? cooldown * 2 / 3 : cooldown); } public static void sendPackets(PlayerEntity player, Function factory) { @@ -34,7 +34,7 @@ public class ShootableGadgetItemMethods { boolean isSwap = item.getTag() .contains("_Swap"); boolean mainHand = hand == Hand.MAIN_HAND; - boolean gunInOtherHand = predicate.test(player.getHeldItem(mainHand ? Hand.OFF_HAND : Hand.MAIN_HAND)); + boolean gunInOtherHand = predicate.test(player.getItemInHand(mainHand ? Hand.OFF_HAND : Hand.MAIN_HAND)); // Pass To Offhand if (mainHand && isSwap && gunInOtherHand) @@ -46,22 +46,22 @@ public class ShootableGadgetItemMethods { item.getTag() .remove("_Swap"); if (!mainHand && gunInOtherHand) - player.getHeldItem(Hand.MAIN_HAND) + player.getItemInHand(Hand.MAIN_HAND) .getTag() .remove("_Swap"); - player.setActiveHand(hand); + player.startUsingItem(hand); return false; } public static Vector3d getGunBarrelVec(PlayerEntity player, boolean mainHand, Vector3d rightHandForward) { - Vector3d start = player.getPositionVec() + Vector3d start = player.position() .add(0, player.getEyeHeight(), 0); - float yaw = (float) ((player.rotationYaw) / -180 * Math.PI); - float pitch = (float) ((player.rotationPitch) / -180 * Math.PI); - int flip = mainHand == (player.getPrimaryHand() == HandSide.RIGHT) ? -1 : 1; + float yaw = (float) ((player.yRot) / -180 * Math.PI); + float pitch = (float) ((player.xRot) / -180 * Math.PI); + int flip = mainHand == (player.getMainArm() == HandSide.RIGHT) ? -1 : 1; Vector3d barrelPosNoTransform = new Vector3d(flip * rightHandForward.x, rightHandForward.y, rightHandForward.z); - Vector3d barrelPos = start.add(barrelPosNoTransform.rotatePitch(pitch) - .rotateYaw(yaw)); + Vector3d barrelPos = start.add(barrelPosNoTransform.xRot(pitch) + .yRot(yaw)); return barrelPos; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootableGadgetRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootableGadgetRenderHandler.java index 11b7c2b5e..ae67e4cfd 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootableGadgetRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ShootableGadgetRenderHandler.java @@ -46,7 +46,7 @@ public abstract class ShootableGadgetRenderHandler { public void shoot(Hand hand, Vector3d location) { ClientPlayerEntity player = Minecraft.getInstance().player; - boolean rightHand = hand == Hand.MAIN_HAND ^ player.getPrimaryHand() == HandSide.LEFT; + boolean rightHand = hand == Hand.MAIN_HAND ^ player.getMainArm() == HandSide.LEFT; if (rightHand) { rightHandAnimation = .2f; dontReequipRight = false; @@ -77,16 +77,16 @@ public abstract class ShootableGadgetRenderHandler { Minecraft mc = Minecraft.getInstance(); AbstractClientPlayerEntity player = mc.player; TextureManager textureManager = mc.getTextureManager(); - PlayerRenderer playerrenderer = (PlayerRenderer) mc.getRenderManager() + PlayerRenderer playerrenderer = (PlayerRenderer) mc.getEntityRenderDispatcher() .getRenderer(player); - FirstPersonRenderer firstPersonRenderer = mc.getFirstPersonRenderer(); + FirstPersonRenderer firstPersonRenderer = mc.getItemInHandRenderer(); MatrixStack ms = event.getMatrixStack(); IRenderTypeBuffer buffer = event.getBuffers(); int light = event.getLight(); float pt = event.getPartialTicks(); - boolean rightHand = event.getHand() == Hand.MAIN_HAND ^ mc.player.getPrimaryHand() == HandSide.LEFT; + boolean rightHand = event.getHand() == Hand.MAIN_HAND ^ mc.player.getMainArm() == HandSide.LEFT; float recoil = rightHand ? MathHelper.lerp(pt, lastRightHandAnimation, rightHandAnimation) : MathHelper.lerp(pt, lastLeftHandAnimation, leftHandAnimation); float equipProgress = event.getEquipProgress(); @@ -97,8 +97,8 @@ public abstract class ShootableGadgetRenderHandler { equipProgress = 0; // Render arm - ms.push(); - textureManager.bindTexture(player.getLocationSkin()); + ms.pushPose(); + textureManager.bind(player.getSkinTextureLocation()); float flip = rightHand ? 1.0F : -1.0F; float f1 = MathHelper.sqrt(event.getSwingProgress()); @@ -109,40 +109,40 @@ public abstract class ShootableGadgetRenderHandler { float f6 = MathHelper.sin(f1 * (float) Math.PI); ms.translate(flip * (f2 + 0.64F - .1f), f3 + -0.4F + equipProgress * -0.6F, f4 + -0.72F + .3f + recoil); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(flip * 75.0F)); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(flip * f6 * 70.0F)); - ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(flip * f5 * -20.0F)); + ms.mulPose(Vector3f.YP.rotationDegrees(flip * 75.0F)); + ms.mulPose(Vector3f.YP.rotationDegrees(flip * f6 * 70.0F)); + ms.mulPose(Vector3f.ZP.rotationDegrees(flip * f5 * -20.0F)); ms.translate(flip * -1.0F, 3.6F, 3.5F); - ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(flip * 120.0F)); - ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(200.0F)); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(flip * -135.0F)); + ms.mulPose(Vector3f.ZP.rotationDegrees(flip * 120.0F)); + ms.mulPose(Vector3f.XP.rotationDegrees(200.0F)); + ms.mulPose(Vector3f.YP.rotationDegrees(flip * -135.0F)); ms.translate(flip * 5.6F, 0.0F, 0.0F); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(flip * 40.0F)); + ms.mulPose(Vector3f.YP.rotationDegrees(flip * 40.0F)); transformHand(ms, flip, equipProgress, recoil, pt); if (rightHand) - playerrenderer.renderRightArm(ms, buffer, light, player); + playerrenderer.renderRightHand(ms, buffer, light, player); else - playerrenderer.renderLeftArm(ms, buffer, light, player); - ms.pop(); + playerrenderer.renderLeftHand(ms, buffer, light, player); + ms.popPose(); // Render gadget - ms.push(); + ms.pushPose(); ms.translate(flip * (f2 + 0.64F - .1f), f3 + -0.4F + equipProgress * -0.6F, f4 + -0.72F - 0.1f + recoil); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(flip * f6 * 70.0F)); - ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(flip * f5 * -20.0F)); + ms.mulPose(Vector3f.YP.rotationDegrees(flip * f6 * 70.0F)); + ms.mulPose(Vector3f.ZP.rotationDegrees(flip * f5 * -20.0F)); transformTool(ms, flip, equipProgress, recoil, pt); firstPersonRenderer.renderItem(mc.player, heldItem, rightHand ? ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND : ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND, !rightHand, ms, buffer, light); - ms.pop(); + ms.popPose(); event.setCanceled(true); } public void dontAnimateItem(Hand hand) { ClientPlayerEntity player = Minecraft.getInstance().player; - boolean rightHand = hand == Hand.MAIN_HAND ^ player.getPrimaryHand() == HandSide.LEFT; + boolean rightHand = hand == Hand.MAIN_HAND ^ player.getMainArm() == HandSide.LEFT; dontReequipRight |= rightHand; dontReequipLeft |= !rightHand; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java index c56d86a0e..7a7ba0e59 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java @@ -30,10 +30,10 @@ public class ZapperInteractionHandler { @SubscribeEvent public static void leftClickingBlocksWithTheZapperSelectsTheBlock(PlayerInteractEvent.LeftClickBlock event) { - if (event.getWorld().isRemote) + if (event.getWorld().isClientSide) return; ItemStack heldItem = event.getPlayer() - .getHeldItemMainhand(); + .getMainHandItem(); if (heldItem.getItem() instanceof ZapperItem && trySelect(heldItem, event.getPlayer())) { event.setCancellationResult(ActionResultType.FAIL); event.setCanceled(true); @@ -41,46 +41,46 @@ public class ZapperInteractionHandler { } public static boolean trySelect(ItemStack stack, PlayerEntity player) { - if (player.isSneaking()) + if (player.isShiftKeyDown()) return false; - Vector3d start = player.getPositionVec() + Vector3d start = player.position() .add(0, player.getEyeHeight(), 0); - Vector3d range = player.getLookVec() + Vector3d range = player.getLookAngle() .scale(getRange(stack)); - BlockRayTraceResult raytrace = player.world - .rayTraceBlocks(new RayTraceContext(start, start.add(range), BlockMode.OUTLINE, FluidMode.NONE, player)); - BlockPos pos = raytrace.getPos(); + BlockRayTraceResult raytrace = player.level + .clip(new RayTraceContext(start, start.add(range), BlockMode.OUTLINE, FluidMode.NONE, player)); + BlockPos pos = raytrace.getBlockPos(); if (pos == null) return false; - player.world.sendBlockBreakProgress(player.getEntityId(), pos, -1); - BlockState newState = player.world.getBlockState(pos); + player.level.destroyBlockProgress(player.getId(), pos, -1); + BlockState newState = player.level.getBlockState(pos); if (BlockHelper.getRequiredItem(newState) .isEmpty()) return false; if (newState.hasTileEntity() && !AllBlockTags.SAFE_NBT.matches(newState)) return false; - if (newState.contains(BlockStateProperties.DOUBLE_BLOCK_HALF)) + if (newState.hasProperty(BlockStateProperties.DOUBLE_BLOCK_HALF)) return false; - if (newState.contains(BlockStateProperties.ATTACHED)) + if (newState.hasProperty(BlockStateProperties.ATTACHED)) return false; - if (newState.contains(BlockStateProperties.HANGING)) + if (newState.hasProperty(BlockStateProperties.HANGING)) return false; - if (newState.contains(BlockStateProperties.BED_PART)) + if (newState.hasProperty(BlockStateProperties.BED_PART)) return false; - if (newState.contains(BlockStateProperties.STAIRS_SHAPE)) - newState = newState.with(BlockStateProperties.STAIRS_SHAPE, StairsShape.STRAIGHT); - if (newState.contains(BlockStateProperties.PERSISTENT)) - newState = newState.with(BlockStateProperties.PERSISTENT, true); - if (newState.contains(BlockStateProperties.WATERLOGGED)) - newState = newState.with(BlockStateProperties.WATERLOGGED, false); + if (newState.hasProperty(BlockStateProperties.STAIRS_SHAPE)) + newState = newState.setValue(BlockStateProperties.STAIRS_SHAPE, StairsShape.STRAIGHT); + if (newState.hasProperty(BlockStateProperties.PERSISTENT)) + newState = newState.setValue(BlockStateProperties.PERSISTENT, true); + if (newState.hasProperty(BlockStateProperties.WATERLOGGED)) + newState = newState.setValue(BlockStateProperties.WATERLOGGED, false); CompoundNBT data = null; - TileEntity tile = player.world.getTileEntity(pos); + TileEntity tile = player.level.getBlockEntity(pos); if (tile != null) { - data = tile.write(new CompoundNBT()); + data = tile.save(new CompoundNBT()); data.remove("x"); data.remove("y"); data.remove("z"); @@ -98,7 +98,7 @@ public class ZapperInteractionHandler { else tag.put("BlockData", data); - AllSoundEvents.CONFIRM.playOnServer(player.world, player.getBlockPos()); + AllSoundEvents.CONFIRM.playOnServer(player.level, player.blockPosition()); return true; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java index 3d2f209e4..c8f895948 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java @@ -45,22 +45,22 @@ import net.minecraftforge.fml.DistExecutor; public abstract class ZapperItem extends Item { public ZapperItem(Properties properties) { - super(properties.maxStackSize(1)); + super(properties.stacksTo(1)); } @Override @OnlyIn(Dist.CLIENT) - public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { if (stack.hasTag() && stack.getTag() .contains("BlockUsed")) { String usedblock = NBTUtil.readBlockState(stack.getTag() .getCompound("BlockUsed")) .getBlock() - .getTranslationKey(); + .getDescriptionId(); ItemDescription.add(tooltip, Lang.translate("terrainzapper.usingBlock", - new TranslationTextComponent(usedblock).formatted(TextFormatting.GRAY)) - .formatted(TextFormatting.DARK_GRAY)); + new TranslationTextComponent(usedblock).withStyle(TextFormatting.GRAY)) + .withStyle(TextFormatting.DARK_GRAY)); } } @@ -84,38 +84,38 @@ public abstract class ZapperItem extends Item { @Nonnull @Override - public ActionResultType onItemUse(ItemUseContext context) { + public ActionResultType useOn(ItemUseContext context) { // Shift -> open GUI if (context.getPlayer() != null && context.getPlayer() - .isSneaking()) { - if (context.getWorld().isRemote) { + .isShiftKeyDown()) { + if (context.getLevel().isClientSide) { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - openHandgunGUI(context.getItem(), context.getHand() == Hand.OFF_HAND); + openHandgunGUI(context.getItemInHand(), context.getHand() == Hand.OFF_HAND); }); context.getPlayer() - .getCooldownTracker() - .setCooldown(context.getItem() + .getCooldowns() + .addCooldown(context.getItemInHand() .getItem(), 10); } return ActionResultType.SUCCESS; } - return super.onItemUse(context); + return super.useOn(context); } @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack item = player.getHeldItem(hand); + public ActionResult use(World world, PlayerEntity player, Hand hand) { + ItemStack item = player.getItemInHand(hand); CompoundNBT nbt = item.getOrCreateTag(); boolean mainHand = hand == Hand.MAIN_HAND; // Shift -> Open GUI - if (player.isSneaking()) { - if (world.isRemote) { + if (player.isShiftKeyDown()) { + if (world.isClientSide) { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { openHandgunGUI(item, hand == Hand.OFF_HAND); }); - player.getCooldownTracker() - .setCooldown(item.getItem(), 10); + player.getCooldowns() + .addCooldown(item.getItem(), 10); } return new ActionResult<>(ActionResultType.SUCCESS, item); } @@ -126,13 +126,13 @@ public abstract class ZapperItem extends Item { // Check if can be used ITextComponent msg = validateUsage(item); if (msg != null) { - AllSoundEvents.DENY.play(world, player, player.getBlockPos()); - player.sendStatusMessage(msg.copy() - .formatted(TextFormatting.RED), true); + AllSoundEvents.DENY.play(world, player, player.blockPosition()); + player.displayClientMessage(msg.plainCopy() + .withStyle(TextFormatting.RED), true); return new ActionResult<>(ActionResultType.FAIL, item); } - BlockState stateToUse = Blocks.AIR.getDefaultState(); + BlockState stateToUse = Blocks.AIR.defaultBlockState(); if (nbt.contains("BlockUsed")) stateToUse = NBTUtil.readBlockState(nbt.getCompound("BlockUsed")); stateToUse = BlockHelper.setZeroAge(stateToUse); @@ -142,13 +142,13 @@ public abstract class ZapperItem extends Item { } // Raytrace - Find the target - Vector3d start = player.getPositionVec() + Vector3d start = player.position() .add(0, player.getEyeHeight(), 0); - Vector3d range = player.getLookVec() + Vector3d range = player.getLookAngle() .scale(getZappingRange(item)); BlockRayTraceResult raytrace = world - .rayTraceBlocks(new RayTraceContext(start, start.add(range), BlockMode.OUTLINE, FluidMode.NONE, player)); - BlockPos pos = raytrace.getPos(); + .clip(new RayTraceContext(start, start.add(range), BlockMode.OUTLINE, FluidMode.NONE, player)); + BlockPos pos = raytrace.getBlockPos(); BlockState stateReplaced = world.getBlockState(pos); // No target @@ -161,7 +161,7 @@ public abstract class ZapperItem extends Item { Vector3d barrelPos = ShootableGadgetItemMethods.getGunBarrelVec(player, mainHand, new Vector3d(.35f, -0.1f, 1)); // Client side - if (world.isRemote) { + if (world.isClientSide) { CreateClient.ZAPPER_RENDER_HANDLER.dontAnimateItem(hand); return new ActionResult<>(ActionResultType.SUCCESS, item); } @@ -170,7 +170,7 @@ public abstract class ZapperItem extends Item { if (activate(world, player, item, stateToUse, raytrace, data)) { ShootableGadgetItemMethods.applyCooldown(player, item, hand, this::isZapper, getCooldownDelay(item)); ShootableGadgetItemMethods.sendPackets(player, - b -> new ZapperBeamPacket(barrelPos, raytrace.getHitVec(), hand, b)); + b -> new ZapperBeamPacket(barrelPos, raytrace.getLocation(), hand, b)); } return new ActionResult<>(ActionResultType.SUCCESS, item); @@ -203,18 +203,18 @@ public abstract class ZapperItem extends Item { } @Override - public boolean canPlayerBreakBlockWhileHolding(BlockState state, World worldIn, BlockPos pos, PlayerEntity player) { + public boolean canAttackBlock(BlockState state, World worldIn, BlockPos pos, PlayerEntity player) { return false; } @Override - public UseAction getUseAction(ItemStack stack) { + public UseAction getUseAnimation(ItemStack stack) { return UseAction.NONE; } public static void setTileData(World world, BlockPos pos, BlockState state, CompoundNBT data, PlayerEntity player) { if (data != null && AllBlockTags.SAFE_NBT.matches(state)) { - TileEntity tile = world.getTileEntity(pos); + TileEntity tile = world.getBlockEntity(pos); if (tile != null) { data = NBTProcessors.process(tile, data, !player.isCreative()); if (data == null) @@ -222,7 +222,7 @@ public abstract class ZapperItem extends Item { data.putInt("x", pos.getX()); data.putInt("y", pos.getY()); data.putInt("z", pos.getZ()); - tile.fromTag(state, data); + tile.load(state, data); } } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItemRenderer.java index 91f05d0b0..4b6aa2dcc 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItemRenderer.java @@ -31,23 +31,23 @@ public abstract class ZapperItemRenderer exte BlockState state = NBTUtil.readBlockState(stack.getTag() .getCompound("BlockUsed")); - ms.push(); + ms.pushPose(); ms.translate(-0.3F, -0.45F, -0.0F); ms.scale(0.25F, 0.25F, 0.25F); IBakedModel modelForState = Minecraft.getInstance() - .getBlockRendererDispatcher() - .getModelForState(state); + .getBlockRenderer() + .getBlockModel(state); if (state.getBlock() instanceof FourWayBlock) modelForState = Minecraft.getInstance() .getItemRenderer() - .getItemModelWithOverrides(new ItemStack(state.getBlock()), Minecraft.getInstance().world, null); + .getModel(new ItemStack(state.getBlock()), Minecraft.getInstance().level, null); Minecraft.getInstance() .getItemRenderer() - .renderItem(new ItemStack(state.getBlock()), TransformType.NONE, false, ms, buffer, light, overlay, + .render(new ItemStack(state.getBlock()), TransformType.NONE, false, ms, buffer, light, overlay, modelForState); - ms.pop(); + ms.popPose(); } protected float getAnimationProgress(float pt, boolean leftHanded, boolean mainHand) { diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperLog.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperLog.java index 99955c390..6aa5be7bc 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperLog.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperLog.java @@ -35,7 +35,7 @@ public class ZapperLog { activeWorld = world; List blocks = positions.stream().map(pos -> { - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); return new BlockInfo(pos, world.getBlockState(pos), tileEntity == null ? null : tileEntity.serializeNBT()); }).collect(Collectors.toList()); diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java index 5d370e8de..d04acb1e4 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java @@ -50,7 +50,7 @@ public class ZapperRenderHandler extends ShootableGadgetRenderHandler { @Override protected void transformTool(MatrixStack ms, float flip, float equipProgress, float recoil, float pt) { ms.translate(flip * -0.1f, 0.1f, -0.4f); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(flip * 5.0F)); + ms.mulPose(Vector3f.YP.rotationDegrees(flip * 5.0F)); } @Override @@ -60,7 +60,7 @@ public class ZapperRenderHandler extends ShootableGadgetRenderHandler { protected void playSound(Hand hand, Vector3d position) { float pitch = hand == Hand.MAIN_HAND ? 0.1f : 0.9f; Minecraft mc = Minecraft.getInstance(); - AllSoundEvents.WORLDSHAPER_PLACE.play(mc.world, mc.player, position, 0.1f, pitch); + AllSoundEvents.WORLDSHAPER_PLACE.play(mc.level, mc.player, position, 0.1f, pitch); } public void addBeam(LaserBeam beam) { @@ -68,7 +68,7 @@ public class ZapperRenderHandler extends ShootableGadgetRenderHandler { double x = beam.end.x; double y = beam.end.y; double z = beam.end.z; - ClientWorld world = Minecraft.getInstance().world; + ClientWorld world = Minecraft.getInstance().level; Supplier randomSpeed = () -> (r.nextDouble() - .5d) * .2f; Supplier randomOffset = () -> (r.nextDouble() - .5d) * .2f; for (int i = 0; i < 10; i++) { diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java index 58b43fe45..a546067d2 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java @@ -97,7 +97,7 @@ public class ZapperScreen extends AbstractSimiScreen { } protected void drawOnBackground(MatrixStack ms, int x, int y) { - textRenderer.draw(ms, title, x + 11, y + 4, 0x54214F); + font.draw(ms, title, x + 11, y + 4, 0x54214F); } @Override @@ -121,7 +121,7 @@ public class ZapperScreen extends AbstractSimiScreen { if (patternButton.isHovered()) { patternButtons.forEach(b -> b.active = true); patternButton.active = false; - patternButton.playDownSound(client.getSoundHandler()); + patternButton.playDownSound(minecraft.getSoundManager()); nbt.putString("Pattern", PlacementPatterns.values()[patternButtons.indexOf(patternButton)].name()); } } @@ -142,13 +142,13 @@ public class ZapperScreen extends AbstractSimiScreen { } protected void renderBlock(MatrixStack ms, int x, int y) { - ms.push(); + ms.pushPose(); ms.translate(x + 32, y + 42, 120); - ms.multiply(new Vector3f(1f, 0, 0).getDegreesQuaternion(-25f)); - ms.multiply(new Vector3f(0, 1f, 0).getDegreesQuaternion(-45f)); + ms.mulPose(new Vector3f(1f, 0, 0).rotationDegrees(-25f)); + ms.mulPose(new Vector3f(0, 1f, 0).rotationDegrees(-45f)); ms.scale(20, 20, 20); - BlockState state = Blocks.AIR.getDefaultState(); + BlockState state = Blocks.AIR.defaultBlockState(); if (zapper.hasTag() && zapper.getTag() .contains("BlockUsed")) state = NBTUtil.readBlockState(zapper.getTag() @@ -156,7 +156,7 @@ public class ZapperScreen extends AbstractSimiScreen { GuiGameElement.of(state) .render(ms); - ms.pop(); + ms.popPose(); } protected void writeAdditionalOptions(CompoundNBT nbt) {} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CuboidBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CuboidBrush.java index af409cc5a..f7c5d7f45 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CuboidBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CuboidBrush.java @@ -26,8 +26,8 @@ public class CuboidBrush extends ShapedBrush { if (updateShape) { BlockPos zero = BlockPos.ZERO; positions = BlockPos - .getAllInBox(zero.add((param0 - 1) / -2, (param1 - 1) / -2, (param2 - 1) / -2), - zero.add((param0) / 2, (param1) / 2, (param2) / 2)) + .betweenClosedStream(zero.offset((param0 - 1) / -2, (param1 - 1) / -2, (param2 - 1) / -2), + zero.offset((param0) / 2, (param1) / 2, (param2) / 2)) .map(BlockPos::new) .collect(Collectors.toList()); } @@ -54,8 +54,8 @@ public class CuboidBrush extends ShapedBrush { int y = (param1 + (param1 == 0 ? 0 : offset)) / 2; int z = (param2 + (param2 == 0 ? 0 : offset)) / 2; - return BlockPos.ZERO.offset(face, face.getAxis() - .getCoordinate(x, y, z) * (option == PlacementOptions.Attached ? 1 : -1)); + return BlockPos.ZERO.relative(face, face.getAxis() + .choose(x, y, z) * (option == PlacementOptions.Attached ? 1 : -1)); } @Override diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java index 0ec8b4f99..9ca87ced9 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java @@ -30,7 +30,7 @@ public class CylinderBrush extends ShapedBrush { for (int i = 0; i <= MAX_RADIUS; i++) { int radius = i; List positions = - BlockPos.getAllInBox(BlockPos.ZERO.add(-i - 1, 0, -i - 1), BlockPos.ZERO.add(i + 1, 0, i + 1)) + BlockPos.betweenClosedStream(BlockPos.ZERO.offset(-i - 1, 0, -i - 1), BlockPos.ZERO.offset(i + 1, 0, i + 1)) .map(BlockPos::new) .filter(p -> VecHelper.getCenterOf(p) .distanceTo(VecHelper.getCenterOf(BlockPos.ZERO)) < radius + .42f) @@ -40,7 +40,7 @@ public class CylinderBrush extends ShapedBrush { for (int layer = 0; layer < h; layer++) { int yOffset = layer - h / 2; for (BlockPos p : positions) - stackedPositions.add(p.up(yOffset)); + stackedPositions.add(p.above(yOffset)); } cachedBrushes.put(Pair.of(i, h), stackedPositions); } @@ -58,7 +58,7 @@ public class CylinderBrush extends ShapedBrush { int r = (param0 + 1 + offset); int y = (param1 + (param1 == 0 ? 0 : yOffset)) / 2; - return BlockPos.ZERO.offset(face, (face.getAxis() + return BlockPos.ZERO.relative(face, (face.getAxis() .isVertical() ? y : r) * (option == PlacementOptions.Attached ? 1 : -1)); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java index 5305a65e5..7e262093d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java @@ -83,10 +83,10 @@ public class DynamicBrush extends Brush { for (int z = -1; z <= 1; z++) if (Math.abs(x) + Math.abs(y) + Math.abs(z) < 2 || searchDiagonals) if (targetFace.getAxis() - .getCoordinate(x, y, z) == 0 || !surface) + .choose(x, y, z) == 0 || !surface) offsets.add(new BlockPos(x, y, z)); - BlockPos startPos = replace ? targetPos : targetPos.offset(targetFace); + BlockPos startPos = replace ? targetPos : targetPos.relative(targetFace); frontier.add(startPos); while (!frontier.isEmpty()) { @@ -94,36 +94,36 @@ public class DynamicBrush extends Brush { if (visited.contains(currentPos)) continue; visited.add(currentPos); - if (!currentPos.withinDistance(startPos, searchRange)) + if (!currentPos.closerThan(startPos, searchRange)) continue; // Replace Mode if (replace) { BlockState stateToReplace = world.getBlockState(currentPos); - BlockState stateAboveStateToReplace = world.getBlockState(currentPos.offset(targetFace)); + BlockState stateAboveStateToReplace = world.getBlockState(currentPos.relative(targetFace)); // Criteria - if (stateToReplace.getBlockHardness(world, currentPos) == -1) + if (stateToReplace.getDestroySpeed(world, currentPos) == -1) continue; if (stateToReplace.getBlock() != state.getBlock() && !fuzzy) continue; if (stateToReplace.getMaterial() .isReplaceable()) continue; - if (BlockHelper.hasBlockSolidSide(stateAboveStateToReplace, world, currentPos.offset(targetFace), + if (BlockHelper.hasBlockSolidSide(stateAboveStateToReplace, world, currentPos.relative(targetFace), targetFace.getOpposite()) && surface) continue; affectedPositions.add(currentPos); // Search adjacent spaces for (BlockPos offset : offsets) - frontier.add(currentPos.add(offset)); + frontier.add(currentPos.offset(offset)); continue; } // Place Mode BlockState stateToPlaceAt = world.getBlockState(currentPos); - BlockState stateToPlaceOn = world.getBlockState(currentPos.offset(targetFace.getOpposite())); + BlockState stateToPlaceOn = world.getBlockState(currentPos.relative(targetFace.getOpposite())); // Criteria if (stateToPlaceOn.getMaterial() @@ -138,7 +138,7 @@ public class DynamicBrush extends Brush { // Search adjacent spaces for (BlockPos offset : offsets) - frontier.add(currentPos.add(offset)); + frontier.add(currentPos.offset(offset)); continue; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/FlattenTool.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/FlattenTool.java index eb11bd942..fc7287ca7 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/FlattenTool.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/FlattenTool.java @@ -56,7 +56,7 @@ public class FlattenTool { public static void apply(World world, List targetPositions, Direction facing) { List surfaces = new ArrayList<>(); Map, Integer> heightMap = new HashMap<>(); - int offset = facing.getAxisDirection().getOffset(); + int offset = facing.getAxisDirection().getStep(); int minEntry = Integer.MAX_VALUE; int minCoord1 = Integer.MAX_VALUE; @@ -80,7 +80,7 @@ public class FlattenTool { continue; } - p = p.offset(facing); + p = p.relative(facing); BlockState surface = world.getBlockState(p); if (!TerrainTools.isReplaceable(surface)) { @@ -90,7 +90,7 @@ public class FlattenTool { } surfaces.add(p); - int coordinate = facing.getAxis().getCoordinate(p.getX(), p.getY(), p.getZ()); + int coordinate = facing.getAxis().choose(p.getX(), p.getY(), p.getZ()); if (!heightMap.containsKey(coords) || heightMap.get(coords).equals(Integer.MAX_VALUE) || heightMap.get(coords).equals(Integer.MIN_VALUE) || heightMap.get(coords) * offset < coordinate * offset) { @@ -130,7 +130,7 @@ public class FlattenTool { for (BlockPos p : surfaces) { Pair coords = getCoords(p, facing); - int surfaceCoord = facing.getAxis().getCoordinate(p.getX(), p.getY(), p.getZ()) * offset; + int surfaceCoord = facing.getAxis().choose(p.getX(), p.getY(), p.getZ()) * offset; int targetCoord = heightMapArray[coords.getKey() - minCoord1][coords.getValue() - minCoord2] * offset; // Keep surface @@ -141,10 +141,10 @@ public class FlattenTool { BlockState blockState = world.getBlockState(p); int timeOut = 1000; while (surfaceCoord > targetCoord) { - BlockPos below = p.offset(facing.getOpposite()); - world.setBlockState(below, blockState); - world.setBlockState(p, blockState.getFluidState().getBlockState()); - p = p.offset(facing.getOpposite()); + BlockPos below = p.relative(facing.getOpposite()); + world.setBlockAndUpdate(below, blockState); + world.setBlockAndUpdate(p, blockState.getFluidState().createLegacyBlock()); + p = p.relative(facing.getOpposite()); surfaceCoord--; if (timeOut-- <= 0) break; @@ -152,11 +152,11 @@ public class FlattenTool { // Raise surface while (surfaceCoord < targetCoord) { - BlockPos above = p.offset(facing); + BlockPos above = p.relative(facing); if (!(blockState.getBlock() instanceof FlowingFluidBlock)) - world.setBlockState(above, blockState); - world.setBlockState(p, world.getBlockState(p.offset(facing.getOpposite()))); - p = p.offset(facing); + world.setBlockAndUpdate(above, blockState); + world.setBlockAndUpdate(p, world.getBlockState(p.relative(facing.getOpposite()))); + p = p.relative(facing); surfaceCoord++; if (timeOut-- <= 0) break; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/ShapedBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/ShapedBrush.java index f0e67f3c2..c89e5c7a3 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/ShapedBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/ShapedBrush.java @@ -20,7 +20,7 @@ public abstract class ShapedBrush extends Brush { if (includedPositions == null) return affectedPositions; for (BlockPos blockPos : includedPositions) - affectedPositions.add(targetPos.add(blockPos)); + affectedPositions.add(targetPos.offset(blockPos)); return affectedPositions; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java index be7657398..544e70d1d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java @@ -25,7 +25,7 @@ public class SphereBrush extends ShapedBrush { for (int i = 0; i <= MAX_RADIUS; i++) { int radius = i; List positions = - BlockPos.getAllInBox(BlockPos.ZERO.add(-i - 1, -i - 1, -i - 1), BlockPos.ZERO.add(i + 1, i + 1, i + 1)) + BlockPos.betweenClosedStream(BlockPos.ZERO.offset(-i - 1, -i - 1, -i - 1), BlockPos.ZERO.offset(i + 1, i + 1, i + 1)) .map(BlockPos::new).filter(p -> VecHelper.getCenterOf(p) .distanceTo(VecHelper.getCenterOf(BlockPos.ZERO)) < radius + .5f) .collect(Collectors.toList()); @@ -41,7 +41,7 @@ public class SphereBrush extends ShapedBrush { int offset = option == PlacementOptions.Attached ? 0 : -1; int r = (param0 + 1 + offset); - return BlockPos.ZERO.offset(face, r * (option == PlacementOptions.Attached ? 1 : -1)); + return BlockPos.ZERO.relative(face, r * (option == PlacementOptions.Attached ? 1 : -1)); } @Override diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java index 43ba4e9f5..1c51a6883 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java @@ -42,14 +42,14 @@ public enum TerrainTools { public void run(World world, List targetPositions, Direction facing, @Nullable BlockState paintedState, @Nullable CompoundNBT data, PlayerEntity player) { switch (this) { case Clear: - targetPositions.forEach(p -> world.setBlockState(p, Blocks.AIR.getDefaultState())); + targetPositions.forEach(p -> world.setBlockAndUpdate(p, Blocks.AIR.defaultBlockState())); break; case Fill: targetPositions.forEach(p -> { BlockState toReplace = world.getBlockState(p); if (!isReplaceable(toReplace)) return; - world.setBlockState(p, paintedState); + world.setBlockAndUpdate(p, paintedState); ZapperItem.setTileData(world, p, paintedState, data, player); }); break; @@ -64,18 +64,18 @@ public enum TerrainTools { if (toOverlay == paintedState) return; - p = p.up(); + p = p.above(); BlockState toReplace = world.getBlockState(p); if (!isReplaceable(toReplace)) return; - world.setBlockState(p, paintedState); + world.setBlockAndUpdate(p, paintedState); ZapperItem.setTileData(world, p, paintedState, data, player); }); break; case Place: targetPositions.forEach(p -> { - world.setBlockState(p, paintedState); + world.setBlockAndUpdate(p, paintedState); ZapperItem.setTileData(world, p, paintedState, data, player); }); break; @@ -84,7 +84,7 @@ public enum TerrainTools { BlockState toReplace = world.getBlockState(p); if (isReplaceable(toReplace)) return; - world.setBlockState(p, paintedState); + world.setBlockAndUpdate(p, paintedState); ZapperItem.setTileData(world, p, paintedState, data, player); }); break; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java index 86d74a5c6..107aa9a8b 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java @@ -62,7 +62,7 @@ public class WorldshaperItem extends ZapperItem { protected boolean activate(World world, PlayerEntity player, ItemStack stack, BlockState stateToUse, BlockRayTraceResult raytrace, CompoundNBT data) { - BlockPos targetPos = raytrace.getPos(); + BlockPos targetPos = raytrace.getBlockPos(); List affectedPositions = new ArrayList<>(); CompoundNBT tag = stack.getOrCreateTag(); @@ -73,11 +73,11 @@ public class WorldshaperItem extends ZapperItem { TerrainTools tool = NBTHelper.readEnum(tag, "Tool", TerrainTools.class); brush.set(params.getX(), params.getY(), params.getZ()); - targetPos = targetPos.add(brush.getOffset(player.getLookVec(), raytrace.getFace(), option)); - brush.addToGlobalPositions(world, targetPos, raytrace.getFace(), affectedPositions, tool); + targetPos = targetPos.offset(brush.getOffset(player.getLookAngle(), raytrace.getDirection(), option)); + brush.addToGlobalPositions(world, targetPos, raytrace.getDirection(), affectedPositions, tool); PlacementPatterns.applyPattern(affectedPositions, stack); brush.redirectTool(tool) - .run(world, affectedPositions, raytrace.getFace(), stateToUse, data, player); + .run(world, affectedPositions, raytrace.getDirection(), stateToUse, data, player); return true; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java index 3b5886bab..d7f6fb113 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java @@ -31,9 +31,9 @@ public class WorldshaperItemRenderer extends ZapperItemRenderer brush.addToGlobalPositions(player.world, pos, raytrace.getFace(), new ArrayList<>(), tool); + () -> brush.addToGlobalPositions(player.level, pos, raytrace.getDirection(), new ArrayList<>(), tool); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java index d578b551a..2203efdca 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java @@ -48,7 +48,7 @@ public class WorldshaperScreen extends ZapperScreen { public WorldshaperScreen(ItemStack zapper, boolean offhand) { super(AllGuiTextures.TERRAINZAPPER, zapper, offhand); fontColor = 0x767676; - title = zapper.getDisplayName(); + title = zapper.getHoverName(); nbt = zapper.getOrCreateTag(); } @@ -100,9 +100,9 @@ public class WorldshaperScreen extends ZapperScreen { .withRange(currentBrush.getMin(index), currentBrush.getMax(index) + 1) .writingTo(label) .titled(currentBrush.getParamLabel(index) - .copy()) + .plainCopy()) .calling(state -> { - label.x = x + 65 + 20 * indexFinal - textRenderer.getWidth(label.text) / 2; + label.x = x + 65 + 20 * indexFinal - font.width(label.text) / 2; }); input.setState(params[index]); input.onChanged(); @@ -218,7 +218,7 @@ public class WorldshaperScreen extends ZapperScreen { placementButtons.forEach(b -> b.active = true); placementButton.active = false; placementButton.playDownSound(Minecraft.getInstance() - .getSoundHandler()); + .getSoundManager()); nbt.putString("Placement", PlacementOptions.values()[placementButtons.indexOf(placementButton)].name()); } @@ -230,7 +230,7 @@ public class WorldshaperScreen extends ZapperScreen { toolButtons.forEach(b -> b.active = true); toolButton.active = false; toolButton.playDownSound(Minecraft.getInstance() - .getSoundHandler()); + .getSoundManager()); nbt.putString("Tool", supportedTools[toolButtons.indexOf(toolButton)].name()); } } @@ -251,9 +251,9 @@ public class WorldshaperScreen extends ZapperScreen { for (int index = 2; index >= currentBrush.amtParams; index--) AllGuiTextures.TERRAINZAPPER_INACTIVE_PARAM.draw(matrixStack, x + 56 + 20 * index, y + 40); - textRenderer.draw(matrixStack, toolSection, x + 7, y + 69, fontColor); + font.draw(matrixStack, toolSection, x + 7, y + 69, fontColor); if (currentBrush.hasPlacementOptions()) - textRenderer.draw(matrixStack, placementSection, x + 136, y + 69, fontColor); + font.draw(matrixStack, placementSection, x + 136, y + 69, fontColor); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java b/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java index 38ab8b08c..d16baef0e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java @@ -42,7 +42,7 @@ public class RedstoneLinkNetworkHandler { private Frequency(ItemStack stack) { this.stack = stack; item = stack.getItem(); - CompoundNBT displayTag = stack.getChildTag("display"); + CompoundNBT displayTag = stack.getTagElement("display"); color = displayTag != null && displayTag.contains("color") ? displayTag.getInt("color") : -1; } @@ -138,7 +138,7 @@ public class RedstoneLinkNetworkHandler { if (from == to) return true; return from.getLocation() - .withinDistance(to.getLocation(), AllConfigs.SERVER.logistics.linkRange.get()); + .closerThan(to.getLocation(), AllConfigs.SERVER.logistics.linkRange.get()); } public Map, Set> networksIn(IWorld world) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/FlapData.java b/src/main/java/com/simibubi/create/content/logistics/block/FlapData.java index 73ca73d70..5dfe87e95 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/FlapData.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/FlapData.java @@ -40,15 +40,7 @@ public class FlapData extends InstanceData implements IFlatLight { } public FlapData setPosition(Vector3f pos) { - return setPosition(pos.getX(), pos.getY(), pos.getZ()); - } - - public FlapData setPosition(int x, int y, int z) { - Vector3i origin = owner.originCoordinate.get(); - - return setPosition((float) (x - origin.getX()), - (float) (y - origin.getY()), - (float) (z - origin.getZ())); + return setPosition(pos.x(), pos.y(), pos.z()); } public FlapData setPosition(float x, float y, float z) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java index b16763bf2..561ed4619 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java @@ -42,14 +42,14 @@ public class BeltTunnelBlock extends Block implements ITE, public BeltTunnelBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(SHAPE, Shape.STRAIGHT)); + registerDefaultState(defaultBlockState().setValue(SHAPE, Shape.STRAIGHT)); } public enum Shape implements IStringSerializable { STRAIGHT, WINDOW, CLOSED, T_LEFT, T_RIGHT, CROSS; @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } } @@ -70,58 +70,58 @@ public class BeltTunnelBlock extends Block implements ITE, } @Override - public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { - BlockState blockState = worldIn.getBlockState(pos.down()); + public boolean canSurvive(BlockState state, IWorldReader worldIn, BlockPos pos) { + BlockState blockState = worldIn.getBlockState(pos.below()); if (!isValidPositionForPlacement(state, worldIn, pos)) return false; - if (!blockState.get(BeltBlock.CASING)) + if (!blockState.getValue(BeltBlock.CASING)) return false; return true; } public boolean isValidPositionForPlacement(BlockState state, IWorldReader worldIn, BlockPos pos) { - BlockState blockState = worldIn.getBlockState(pos.down()); + BlockState blockState = worldIn.getBlockState(pos.below()); if (!AllBlocks.BELT.has(blockState)) return false; - if (blockState.get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) + if (blockState.getValue(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) return false; return true; } public static boolean hasWindow(BlockState state) { - return state.get(SHAPE) == Shape.WINDOW || state.get(SHAPE) == Shape.CLOSED; + return state.getValue(SHAPE) == Shape.WINDOW || state.getValue(SHAPE) == Shape.CLOSED; } public static boolean isStraight(BlockState state) { - return hasWindow(state) || state.get(SHAPE) == Shape.STRAIGHT; + return hasWindow(state) || state.getValue(SHAPE) == Shape.STRAIGHT; } public static boolean isJunction(BlockState state) { - Shape shape = state.get(SHAPE); + Shape shape = state.getValue(SHAPE); return shape == Shape.CROSS || shape == Shape.T_LEFT || shape == Shape.T_RIGHT; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return getTunnelState(context.getWorld(), context.getPos()); + return getTunnelState(context.getLevel(), context.getClickedPos()); } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState p_220082_4_, boolean p_220082_5_) { - if (!(world instanceof WrappedWorld) && !world.isRemote()) + public void onPlace(BlockState state, World world, BlockPos pos, BlockState p_220082_4_, boolean p_220082_5_) { + if (!(world instanceof WrappedWorld) && !world.isClientSide()) withTileEntityDo(world, pos, BeltTunnelTileEntity::updateTunnelConnections); } @Override - public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld worldIn, + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) { if (facing.getAxis() .isVertical()) return state; - if (!(worldIn instanceof WrappedWorld) && !worldIn.isRemote()) + if (!(worldIn instanceof WrappedWorld) && !worldIn.isClientSide()) withTileEntityDo(worldIn, currentPos, BeltTunnelTileEntity::updateTunnelConnections); BlockState tunnelState = getTunnelState(worldIn, currentPos); - if (tunnelState.get(HORIZONTAL_AXIS) == state.get(HORIZONTAL_AXIS)) { + if (tunnelState.getValue(HORIZONTAL_AXIS) == state.getValue(HORIZONTAL_AXIS)) { if (hasWindow(tunnelState) == hasWindow(state)) return state; } @@ -132,55 +132,55 @@ public class BeltTunnelBlock extends Block implements ITE, public void updateTunnel(IWorld world, BlockPos pos) { BlockState tunnel = world.getBlockState(pos); BlockState newTunnel = getTunnelState(world, pos); - if (tunnel != newTunnel && !world.isRemote()) { - world.setBlockState(pos, newTunnel, 3); - TileEntity te = world.getTileEntity(pos); + if (tunnel != newTunnel && !world.isClientSide()) { + world.setBlock(pos, newTunnel, 3); + TileEntity te = world.getBlockEntity(pos); if (te != null && (te instanceof BeltTunnelTileEntity)) ((BeltTunnelTileEntity) te).updateTunnelConnections(); } } private BlockState getTunnelState(IBlockReader reader, BlockPos pos) { - BlockState state = getDefaultState(); - BlockState belt = reader.getBlockState(pos.down()); + BlockState state = defaultBlockState(); + BlockState belt = reader.getBlockState(pos.below()); if (AllBlocks.BELT.has(belt)) - state = state.with(HORIZONTAL_AXIS, belt.get(BeltBlock.HORIZONTAL_FACING) + state = state.setValue(HORIZONTAL_AXIS, belt.getValue(BeltBlock.HORIZONTAL_FACING) .getAxis()); - Axis axis = state.get(HORIZONTAL_AXIS); + Axis axis = state.getValue(HORIZONTAL_AXIS); // T and Cross - Direction left = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis) - .rotateY(); - boolean onLeft = hasValidOutput(reader, pos.down(), left); - boolean onRight = hasValidOutput(reader, pos.down(), left.getOpposite()); + Direction left = Direction.get(AxisDirection.POSITIVE, axis) + .getClockWise(); + boolean onLeft = hasValidOutput(reader, pos.below(), left); + boolean onRight = hasValidOutput(reader, pos.below(), left.getOpposite()); if (onLeft && onRight) - state = state.with(SHAPE, Shape.CROSS); + state = state.setValue(SHAPE, Shape.CROSS); else if (onLeft) - state = state.with(SHAPE, Shape.T_LEFT); + state = state.setValue(SHAPE, Shape.T_LEFT); else if (onRight) - state = state.with(SHAPE, Shape.T_RIGHT); + state = state.setValue(SHAPE, Shape.T_RIGHT); - if (state.get(SHAPE) == Shape.STRAIGHT) { + if (state.getValue(SHAPE) == Shape.STRAIGHT) { boolean canHaveWindow = canHaveWindow(reader, pos, axis); if (canHaveWindow) - state = state.with(SHAPE, Shape.WINDOW); + state = state.setValue(SHAPE, Shape.WINDOW); } return state; } protected boolean canHaveWindow(IBlockReader reader, BlockPos pos, Axis axis) { - Direction fw = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); - BlockState blockState1 = reader.getBlockState(pos.offset(fw)); - BlockState blockState2 = reader.getBlockState(pos.offset(fw.getOpposite())); + Direction fw = Direction.get(AxisDirection.POSITIVE, axis); + BlockState blockState1 = reader.getBlockState(pos.relative(fw)); + BlockState blockState2 = reader.getBlockState(pos.relative(fw.getOpposite())); boolean funnel1 = blockState1.getBlock() instanceof BeltFunnelBlock - && blockState1.get(BeltFunnelBlock.SHAPE) == BeltFunnelBlock.Shape.EXTENDED - && blockState1.get(BeltFunnelBlock.HORIZONTAL_FACING) == fw.getOpposite(); + && blockState1.getValue(BeltFunnelBlock.SHAPE) == BeltFunnelBlock.Shape.EXTENDED + && blockState1.getValue(BeltFunnelBlock.HORIZONTAL_FACING) == fw.getOpposite(); boolean funnel2 = blockState2.getBlock() instanceof BeltFunnelBlock - && blockState2.get(BeltFunnelBlock.SHAPE) == BeltFunnelBlock.Shape.EXTENDED - && blockState2.get(BeltFunnelBlock.HORIZONTAL_FACING) == fw; + && blockState2.getValue(BeltFunnelBlock.SHAPE) == BeltFunnelBlock.Shape.EXTENDED + && blockState2.getValue(BeltFunnelBlock.HORIZONTAL_FACING) == fw; boolean valid1 = blockState1.getBlock() instanceof BeltTunnelBlock || funnel1; boolean valid2 = blockState2.getBlock() instanceof BeltTunnelBlock || funnel2; @@ -189,12 +189,12 @@ public class BeltTunnelBlock extends Block implements ITE, } private boolean hasValidOutput(IBlockReader world, BlockPos pos, Direction side) { - BlockState blockState = world.getBlockState(pos.offset(side)); + BlockState blockState = world.getBlockState(pos.relative(side)); if (AllBlocks.BELT.has(blockState)) - return blockState.get(BeltBlock.HORIZONTAL_FACING) + return blockState.getValue(BeltBlock.HORIZONTAL_FACING) .getAxis() == side.getAxis(); DirectBeltInputBehaviour behaviour = - TileEntityBehaviour.get(world, pos.offset(side), DirectBeltInputBehaviour.TYPE); + TileEntityBehaviour.get(world, pos.relative(side), DirectBeltInputBehaviour.TYPE); return behaviour != null && behaviour.canInsertFromSide(side); } @@ -204,30 +204,30 @@ public class BeltTunnelBlock extends Block implements ITE, return ActionResultType.PASS; // Toggle windows - Shape shape = state.get(SHAPE); + Shape shape = state.getValue(SHAPE); shape = shape == Shape.CLOSED ? Shape.WINDOW : Shape.CLOSED; - World world = context.getWorld(); - if (!world.isRemote) - world.setBlockState(context.getPos(), state.with(SHAPE, shape), 2); + World world = context.getLevel(); + if (!world.isClientSide) + world.setBlock(context.getClickedPos(), state.setValue(SHAPE, shape), 2); return ActionResultType.SUCCESS; } @Override public BlockState rotate(BlockState state, Rotation rotation) { - Direction fromAxis = Direction.getFacingFromAxis(AxisDirection.POSITIVE, state.get(HORIZONTAL_AXIS)); + Direction fromAxis = Direction.get(AxisDirection.POSITIVE, state.getValue(HORIZONTAL_AXIS)); Direction rotated = rotation.rotate(fromAxis); - return state.with(HORIZONTAL_AXIS, rotated.getAxis()); + return state.setValue(HORIZONTAL_AXIS, rotated.getAxis()); } @Override public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; - if (fromPos.equals(pos.down())) { - if (!isValidPosition(state, worldIn, pos)) { + if (fromPos.equals(pos.below())) { + if (!canSurvive(state, worldIn, pos)) { worldIn.destroyBlock(pos, true); return; } @@ -235,9 +235,9 @@ public class BeltTunnelBlock extends Block implements ITE, } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(HORIZONTAL_AXIS, SHAPE); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java index e40dfdff0..05b4a1f78 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java @@ -8,7 +8,7 @@ import java.util.Map; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.InstanceData; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.logistics.block.FlapData; @@ -28,17 +28,18 @@ public class BeltTunnelInstance extends TileEntityInstance tunnelFlaps = new EnumMap<>(Direction.class); - Instancer model = modelManager.getMaterial(AllMaterialSpecs.FLAPS) + Instancer model = modelManager.defaultSolid() + .material(AllMaterialSpecs.FLAPS) .getModel(AllBlockPartials.BELT_TUNNEL_FLAP, blockState); - int blockLight = world.getLightLevel(LightType.BLOCK, pos); - int skyLight = world.getLightLevel(LightType.SKY, pos); + int blockLight = world.getBrightness(LightType.BLOCK, pos); + int skyLight = world.getBrightness(LightType.SKY, pos); tile.flaps.forEach((direction, flapValue) -> { float flapness = flapValue.get(AnimationTickHolder.getPartialTicks()); - float horizontalAngle = direction.getOpposite().getHorizontalAngle(); + float horizontalAngle = direction.getOpposite().toYRot(); float flapScale = direction.getAxis() == Direction.Axis.X ? 1 : -1; @@ -50,7 +51,7 @@ public class BeltTunnelInstance extends TileEntityInstance FlapData key = model.createInstance(); - key.setPosition(pos) + key.setPosition(getInstancePosition()) .setSegmentOffset(segmentOffset, 0, 0) .setBlockLight(blockLight) .setSkyLight(skyLight) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelItem.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelItem.java index 3f7a44fc5..5bcb5aac3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelItem.java @@ -26,19 +26,19 @@ public class BeltTunnelItem extends BlockItem { protected boolean canPlace(BlockItemUseContext ctx, BlockState state) { PlayerEntity playerentity = ctx.getPlayer(); ISelectionContext iselectioncontext = - playerentity == null ? ISelectionContext.dummy() : ISelectionContext.forEntity(playerentity); - World world = ctx.getWorld(); - BlockPos pos = ctx.getPos(); - return (!this.checkPosition() || AllBlocks.ANDESITE_TUNNEL.get() - .isValidPositionForPlacement(state, world, pos)) && world.canPlace(state, pos, iselectioncontext); + playerentity == null ? ISelectionContext.empty() : ISelectionContext.of(playerentity); + World world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + return (!this.mustSurvive() || AllBlocks.ANDESITE_TUNNEL.get() + .isValidPositionForPlacement(state, world, pos)) && world.isUnobstructed(state, pos, iselectioncontext); } @Override - protected boolean onBlockPlaced(BlockPos pos, World world, PlayerEntity p_195943_3_, ItemStack p_195943_4_, + protected boolean updateCustomBlockEntityTag(BlockPos pos, World world, PlayerEntity p_195943_3_, ItemStack p_195943_4_, BlockState state) { - boolean flag = super.onBlockPlaced(pos, world, p_195943_3_, p_195943_4_, state); - if (!world.isRemote) { - BeltTileEntity belt = BeltHelper.getSegmentTE(world, pos.down()); + boolean flag = super.updateCustomBlockEntityTag(pos, world, p_195943_3_, p_195943_4_, state); + if (!world.isClientSide) { + BeltTileEntity belt = BeltHelper.getSegmentTE(world, pos.below()); if (belt != null) { AllTriggers.triggerFor(AllTriggers.PLACE_TUNNEL, p_195943_3_); if (belt.casing == CasingType.NONE) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java index 920d64259..bd9f4348b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import com.jozufozu.flywheel.backend.Backend; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; @@ -9,7 +10,6 @@ import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -31,12 +31,12 @@ public class BeltTunnelRenderer extends SmartTileEntityRenderer { + if (!(te instanceof BrassTunnelTileEntity)) + return ActionResultType.PASS; + BrassTunnelTileEntity bte = (BrassTunnelTileEntity) te; + List stacksOfGroup = bte.grabAllStacksOfGroup(world.isClientSide); + if (stacksOfGroup.isEmpty()) + return ActionResultType.PASS; + if (world.isClientSide) + return ActionResultType.SUCCESS; + for (ItemStack itemStack : stacksOfGroup) + player.inventory.placeItemBackInInventory(world, itemStack.copy()); + world.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundCategory.PLAYERS, .2f, + 1f + Create.RANDOM.nextFloat()); + return ActionResultType.SUCCESS; + }); + } + @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return AllTileEntities.BRASS_TUNNEL.create(); } @Override - public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld worldIn, + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) { - return super.updatePostPlacement(state, facing, facingState, worldIn, currentPos, facingPos); + return super.updateShape(state, facing, facingState, worldIn, currentPos, facingPos); } @Override - public void onReplaced(BlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, + public void onRemove(BlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, boolean p_196243_5_) { if (p_196243_1_.hasTileEntity() && (p_196243_1_.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasTileEntity())) { TileEntityBehaviour.destroy(p_196243_2_, p_196243_3_, FilteringBehaviour.TYPE); withTileEntityDo(p_196243_2_, p_196243_3_, te -> { if (te instanceof BrassTunnelTileEntity) - Block.spawnAsEntity(p_196243_2_, p_196243_3_, ((BrassTunnelTileEntity) te).stackToDistribute); + Block.popResource(p_196243_2_, p_196243_3_, ((BrassTunnelTileEntity) te).stackToDistribute); }); - p_196243_2_.removeTileEntity(p_196243_3_); + p_196243_2_.removeBlockEntity(p_196243_3_); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java index ede331c95..2c8196db3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java @@ -25,7 +25,7 @@ public class BrassTunnelCTBehaviour extends ConnectedTextureBehaviour { if (yDiff != 0) return false; - TileEntity te = reader.getTileEntity(pos); + TileEntity te = reader.getBlockEntity(pos); if (!(te instanceof BrassTunnelTileEntity)) return false; BrassTunnelTileEntity tunnelTE = (BrassTunnelTileEntity) te; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java index fd1e51fe1..e86042119 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java @@ -14,6 +14,7 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; @@ -43,6 +44,9 @@ import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.LazyOptional; @@ -50,7 +54,7 @@ import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; -public class BrassTunnelTileEntity extends BeltTunnelTileEntity { +public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHaveGoggleInformation { SidedFilteringBehaviour filtering; @@ -107,7 +111,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { @Override public void tick() { super.tick(); - BeltTileEntity beltBelow = BeltHelper.getSegmentTE(world, pos.down()); + BeltTileEntity beltBelow = BeltHelper.getSegmentTE(level, worldPosition.below()); if (distributionProgress > 0) distributionProgress--; @@ -115,7 +119,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return; if (stackToDistribute.isEmpty() && !syncedOutputActive) return; - if (world.isRemote && !isVirtual()) + if (level.isClientSide && !isVirtual()) return; if (distributionProgress == -1) { @@ -149,8 +153,8 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null) continue; distributionTargets.get(!tunnel.flapFilterEmpty(output)) - .add(Pair.of(tunnel.pos, output)); - int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ(); + .add(Pair.of(tunnel.worldPosition, output)); + int distance = tunnel.worldPosition.getX() + tunnel.worldPosition.getZ() - worldPosition.getX() - worldPosition.getZ(); if (distance < 0) distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance); else @@ -180,7 +184,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { for (Pair pair : list) { BlockPos tunnelPos = pair.getKey(); Direction output = pair.getValue(); - TileEntity te = world.getTileEntity(tunnelPos); + TileEntity te = level.getBlockEntity(tunnelPos); if (!(te instanceof BrassTunnelTileEntity)) continue; validTargets.add(Pair.of((BrassTunnelTileEntity) te, output)); @@ -312,13 +316,43 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { stackToDistribute = stack; distributionProgress = -1; sendData(); - markDirty(); + setChanged(); } public ItemStack getStackToDistribute() { return stackToDistribute; } + public List grabAllStacksOfGroup(boolean simulate) { + List list = new ArrayList<>(); + + ItemStack own = getStackToDistribute(); + if (!own.isEmpty()) { + list.add(own); + if (!simulate) + setStackToDistribute(ItemStack.EMPTY); + } + + for (boolean left : Iterate.trueAndFalse) { + BrassTunnelTileEntity adjacent = this; + while (adjacent != null) { + if (!level.isAreaLoaded(adjacent.getBlockPos(), 1)) + return null; + adjacent = adjacent.getAdjacent(left); + if (adjacent == null) + continue; + ItemStack other = adjacent.getStackToDistribute(); + if (other.isEmpty()) + continue; + list.add(other); + if (!simulate) + adjacent.setStackToDistribute(ItemStack.EMPTY); + } + } + + return list; + } + @Nullable protected ItemStack insertIntoTunnel(BrassTunnelTileEntity tunnel, Direction side, ItemStack stack, boolean simulate) { @@ -327,13 +361,13 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { if (!tunnel.testFlapFilter(side, stack)) return null; - BeltTileEntity below = BeltHelper.getSegmentTE(world, tunnel.pos.down()); + BeltTileEntity below = BeltHelper.getSegmentTE(level, tunnel.worldPosition.below()); if (below == null) return null; - BlockPos offset = tunnel.getPos() - .down() - .offset(side); - DirectBeltInputBehaviour sideOutput = TileEntityBehaviour.get(world, offset, DirectBeltInputBehaviour.TYPE); + BlockPos offset = tunnel.getBlockPos() + .below() + .relative(side); + DirectBeltInputBehaviour sideOutput = TileEntityBehaviour.get(level, offset, DirectBeltInputBehaviour.TYPE); if (sideOutput != null) { if (!sideOutput.canInsertFromSide(side)) return null; @@ -345,7 +379,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { Direction movementFacing = below.getMovementFacing(); if (side == movementFacing) - if (!BlockHelper.hasBlockSolidSide(world.getBlockState(offset), world, offset, side.getOpposite())) { + if (!BlockHelper.hasBlockSolidSide(level.getBlockState(offset), level, offset, side.getOpposite())) { BeltTileEntity controllerTE = below.getControllerTE(); if (controllerTE == null) return null; @@ -357,14 +391,15 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { float movementSpeed = Math.max(Math.abs(beltMovementSpeed), 1 / 8f); int additionalOffset = beltMovementSpeed > 0 ? 1 : 0; Vector3d outPos = BeltHelper.getVectorForOffset(controllerTE, below.index + additionalOffset); - Vector3d outMotion = Vector3d.of(side.getDirectionVec()).scale(movementSpeed) + Vector3d outMotion = Vector3d.atLowerCornerOf(side.getNormal()) + .scale(movementSpeed) .add(0, 1 / 8f, 0); outPos.add(outMotion.normalize()); - ItemEntity entity = new ItemEntity(world, outPos.x, outPos.y + 6 / 16f, outPos.z, ejected); - entity.setMotion(outMotion); - entity.setDefaultPickupDelay(); - entity.velocityChanged = true; - world.addEntity(entity); + ItemEntity entity = new ItemEntity(level, outPos.x, outPos.y + 6 / 16f, outPos.z, ejected); + entity.setDeltaMovement(outMotion); + entity.setDefaultPickUpDelay(); + entity.hurtMarked = true; + level.addFreshEntity(entity); } return ItemStack.EMPTY; @@ -378,7 +413,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return false; if (filtering.get(side) == null) { FilteringBehaviour adjacentFilter = - TileEntityBehaviour.get(world, pos.offset(side), FilteringBehaviour.TYPE); + TileEntityBehaviour.get(level, worldPosition.relative(side), FilteringBehaviour.TYPE); if (adjacentFilter == null) return true; return adjacentFilter.test(stack); @@ -391,7 +426,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return false; if (filtering.get(side) == null) { FilteringBehaviour adjacentFilter = - TileEntityBehaviour.get(world, pos.offset(side), FilteringBehaviour.TYPE); + TileEntityBehaviour.get(level, worldPosition.relative(side), FilteringBehaviour.TYPE); if (adjacentFilter == null) return true; return adjacentFilter.getFilter() @@ -428,7 +463,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { BlockState blockState = getBlockState(); if (!AllBlocks.BRASS_TUNNEL.has(blockState)) return false; - Axis axis = blockState.get(BrassTunnelBlock.HORIZONTAL_AXIS); + Axis axis = blockState.getValue(BrassTunnelBlock.HORIZONTAL_AXIS); for (Direction direction : flaps.keySet()) if (direction.getAxis() != axis) return true; @@ -443,7 +478,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { for (boolean left : Iterate.trueAndFalse) { BrassTunnelTileEntity adjacent = this; while (adjacent != null) { - if (!world.isAreaLoaded(adjacent.getPos(), 1)) + if (!level.isAreaLoaded(adjacent.getBlockPos(), 1)) return null; adjacent = adjacent.getAdjacent(left); if (adjacent == null) @@ -460,7 +495,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { private void addValidOutputsOf(BrassTunnelTileEntity tunnelTE, List> validOutputs) { syncSet.add(tunnelTE); - BeltTileEntity below = BeltHelper.getSegmentTE(world, tunnelTE.pos.down()); + BeltTileEntity below = BeltHelper.getSegmentTE(level, tunnelTE.worldPosition.below()); if (below == null) return; Direction movementFacing = below.getMovementFacing(); @@ -481,13 +516,13 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { if (direction == movementFacing.getOpposite()) continue; if (tunnelTE.sides.contains(direction)) { - BlockPos offset = tunnelTE.pos.down() - .offset(direction); + BlockPos offset = tunnelTE.worldPosition.below() + .relative(direction); DirectBeltInputBehaviour inputBehaviour = - TileEntityBehaviour.get(world, offset, DirectBeltInputBehaviour.TYPE); + TileEntityBehaviour.get(level, offset, DirectBeltInputBehaviour.TYPE); if (inputBehaviour == null) { if (direction == movementFacing) - if (!BlockHelper.hasBlockSolidSide(world.getBlockState(offset), world, offset, + if (!BlockHelper.hasBlockSolidSide(level.getBlockState(offset), level, offset, direction.getOpposite())) validOutputs.add(Pair.of(tunnelTE, direction)); continue; @@ -537,7 +572,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { CompoundNBT nbt = new CompoundNBT(); nbt.put("Pos", NBTUtil.writeBlockPos(pair.getKey())); nbt.putInt("Face", pair.getValue() - .getIndex()); + .get3DDataValue()); return nbt; })); } @@ -553,7 +588,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { syncedOutputActive = compound.getBoolean("SyncedOutput"); connectedLeft = compound.getBoolean("ConnectedLeft"); connectedRight = compound.getBoolean("ConnectedRight"); - stackToDistribute = ItemStack.read(compound.getCompound("StackToDistribute")); + stackToDistribute = ItemStack.of(compound.getCompound("StackToDistribute")); distributionProgress = compound.getFloat("DistributionProgress"); previousOutputIndex = compound.getInt("PreviousIndex"); distributionDistanceLeft = compound.getInt("DistanceLeft"); @@ -563,7 +598,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { distributionTargets.set(filtered, NBTHelper .readCompoundList(compound.getList(filtered ? "FilteredTargets" : "Targets", NBT.TAG_COMPOUND), nbt -> { BlockPos pos = NBTUtil.readBlockPos(nbt.getCompound("Pos")); - Direction face = Direction.byIndex(nbt.getInt("Face")); + Direction face = Direction.from3DDataValue(nbt.getInt("Face")); return Pair.of(pos, face); })); } @@ -574,8 +609,8 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return; if (wasConnectedLeft != connectedLeft || wasConnectedRight != connectedRight) { requestModelDataUpdate(); - if (hasWorld()) - world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16); + if (hasLevel()) + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 16); } filtering.updateFilterPresence(); } @@ -595,10 +630,10 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { connectedLeft = nowConnectedLeft; connectivityChanged = true; BrassTunnelTileEntity adjacent = getAdjacent(true); - if (adjacent != null && !world.isRemote) { + if (adjacent != null && !level.isClientSide) { adjacent.updateTunnelConnections(); adjacent.selectionMode.setValue(selectionMode.getValue()); - AllTriggers.triggerForNearbyPlayers(AllTriggers.CONNECT_TUNNEL, world, pos, 4); + AllTriggers.triggerForNearbyPlayers(AllTriggers.CONNECT_TUNNEL, level, worldPosition, 4); } } @@ -606,7 +641,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { connectedRight = nowConnectedRight; connectivityChanged = true; BrassTunnelTileEntity adjacent = getAdjacent(false); - if (adjacent != null && !world.isRemote) { + if (adjacent != null && !level.isClientSide) { adjacent.updateTunnelConnections(); adjacent.selectionMode.setValue(selectionMode.getValue()); } @@ -627,24 +662,24 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { @Nullable protected BrassTunnelTileEntity getAdjacent(boolean leftSide) { - if (!hasWorld()) + if (!hasLevel()) return null; BlockState blockState = getBlockState(); if (!AllBlocks.BRASS_TUNNEL.has(blockState)) return null; - Axis axis = blockState.get(BrassTunnelBlock.HORIZONTAL_AXIS); - Direction baseDirection = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); - Direction direction = leftSide ? baseDirection.rotateYCCW() : baseDirection.rotateY(); - BlockPos adjacentPos = pos.offset(direction); - BlockState adjacentBlockState = world.getBlockState(adjacentPos); + Axis axis = blockState.getValue(BrassTunnelBlock.HORIZONTAL_AXIS); + Direction baseDirection = Direction.get(AxisDirection.POSITIVE, axis); + Direction direction = leftSide ? baseDirection.getCounterClockWise() : baseDirection.getClockWise(); + BlockPos adjacentPos = worldPosition.relative(direction); + BlockState adjacentBlockState = level.getBlockState(adjacentPos); if (!AllBlocks.BRASS_TUNNEL.has(adjacentBlockState)) return null; - if (adjacentBlockState.get(BrassTunnelBlock.HORIZONTAL_AXIS) != axis) + if (adjacentBlockState.getValue(BrassTunnelBlock.HORIZONTAL_AXIS) != axis) return null; - TileEntity adjacentTE = world.getTileEntity(adjacentPos); + TileEntity adjacentTE = level.getBlockEntity(adjacentPos); if (adjacentTE.isRemoved()) return null; if (!(adjacentTE instanceof BrassTunnelTileEntity)) @@ -653,9 +688,9 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { } @Override - public void remove() { + public void setRemoved() { tunnelCapability.invalidate(); - super.remove(); + super.setRemoved(); } @Override @@ -667,7 +702,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { public LazyOptional getBeltCapability() { if (!beltCapability.isPresent()) { - TileEntity tileEntity = world.getTileEntity(pos.down()); + TileEntity tileEntity = level.getBlockEntity(worldPosition.below()); if (tileEntity != null) beltCapability = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); } @@ -708,4 +743,26 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return stackToDistribute.isEmpty() && !syncedOutputActive; } + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + List allStacks = grabAllStacksOfGroup(true); + if (allStacks.isEmpty()) + return false; + + tooltip.add(componentSpacing.plainCopy() + .append(Lang.translate("tooltip.brass_tunnel.contains")) + .withStyle(TextFormatting.WHITE)); + for (ItemStack item : allStacks) { + tooltip.add(componentSpacing.plainCopy() + .append(Lang.translate("tooltip.brass_tunnel.contains_entry", new TranslationTextComponent(item.getItem() + .getDescriptionId(item)).getString(), item.getCount())) + .withStyle(TextFormatting.GRAY)); + } + tooltip.add(componentSpacing.plainCopy() + .append(Lang.translate("tooltip.brass_tunnel.retrieve")) + .withStyle(TextFormatting.DARK_GRAY)); + + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java index 34e2a3976..5e142fc13 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java @@ -76,16 +76,16 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I public abstract TileEntity createTileEntity(BlockState state, IBlockReader world); @Override - public void onLanded(IBlockReader worldIn, Entity entityIn) { - super.onLanded(worldIn, entityIn); + public void updateEntityAfterFallOn(IBlockReader worldIn, Entity entityIn) { + super.updateEntityAfterFallOn(worldIn, entityIn); if (!(entityIn instanceof ItemEntity)) return; - if (entityIn.world.isRemote) + if (entityIn.level.isClientSide) return; if (!entityIn.isAlive()) return; - DirectBeltInputBehaviour input = TileEntityBehaviour.get(entityIn.world, new BlockPos(entityIn.getPositionVec() - .add(0, 0.5f, 0)).down(), DirectBeltInputBehaviour.TYPE); + DirectBeltInputBehaviour input = TileEntityBehaviour.get(entityIn.level, new BlockPos(entityIn.position() + .add(0, 0.5f, 0)).below(), DirectBeltInputBehaviour.TYPE); if (input == null) return; if (!input.canInsertFromSide(Direction.UP)) @@ -102,7 +102,7 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState p_220082_4_, boolean p_220082_5_) { + public void onPlace(BlockState state, World world, BlockPos pos, BlockState p_220082_4_, boolean p_220082_5_) { withTileEntityDo(world, pos, ChuteTileEntity::onAdded); if (p_220082_5_) return; @@ -114,24 +114,24 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I return; AbstractChuteBlock block = (AbstractChuteBlock) state.getBlock(); Direction facing = block.getFacing(state); - BlockPos toUpdate = pos.down(); + BlockPos toUpdate = pos.below(); if (facing.getAxis() .isHorizontal()) - toUpdate = toUpdate.offset(facing.getOpposite()); + toUpdate = toUpdate.relative(facing.getOpposite()); BlockState stateToUpdate = world.getBlockState(toUpdate); - BlockState updated = updateChuteState(stateToUpdate, world.getBlockState(toUpdate.up()), world, toUpdate); - if (stateToUpdate != updated && !world.isRemote) - world.setBlockState(toUpdate, updated); + BlockState updated = updateChuteState(stateToUpdate, world.getBlockState(toUpdate.above()), world, toUpdate); + if (stateToUpdate != updated && !world.isClientSide) + world.setBlockAndUpdate(toUpdate, updated); } @Override - public void onReplaced(BlockState state, World world, BlockPos pos, BlockState p_196243_4_, boolean p_196243_5_) { + public void onRemove(BlockState state, World world, BlockPos pos, BlockState p_196243_4_, boolean p_196243_5_) { boolean differentBlock = state.getBlock() != p_196243_4_.getBlock(); if (state.hasTileEntity() && (differentBlock || !p_196243_4_.hasTileEntity())) { TileEntityBehaviour.destroy(world, pos, FilteringBehaviour.TYPE); withTileEntityDo(world, pos, c -> c.onRemoved(state)); - world.removeTileEntity(pos); + world.removeBlockEntity(pos); } if (p_196243_5_ || !differentBlock) return; @@ -139,20 +139,20 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I updateDiagonalNeighbour(state, world, pos); for (Direction direction : Iterate.horizontalDirections) { - BlockPos toUpdate = pos.up() - .offset(direction); + BlockPos toUpdate = pos.above() + .relative(direction); BlockState stateToUpdate = world.getBlockState(toUpdate); if (!isChute(stateToUpdate)) continue; BlockState updated = ((AbstractChuteBlock) stateToUpdate.getBlock()).updateChuteState(stateToUpdate, - world.getBlockState(toUpdate.up()), world, toUpdate); - if (stateToUpdate != updated && !world.isRemote) - world.setBlockState(toUpdate, updated); + world.getBlockState(toUpdate.above()), world, toUpdate); + if (stateToUpdate != updated && !world.isClientSide) + world.setBlockAndUpdate(toUpdate, updated); } } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState above, IWorld world, + public BlockState updateShape(BlockState state, Direction direction, BlockState above, IWorld world, BlockPos pos, BlockPos p_196271_6_) { if (direction != Direction.UP) return state; @@ -162,10 +162,10 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I @Override public void neighborChanged(BlockState p_220069_1_, World world, BlockPos pos, Block p_220069_4_, BlockPos neighbourPos, boolean p_220069_6_) { - if (pos.down() + if (pos.below() .equals(neighbourPos)) withTileEntityDo(world, pos, ChuteTileEntity::blockBelowChanged); - else if (pos.up() + else if (pos.above() .equals(neighbourPos)) withTileEntityDo(world, pos, chute -> chute.capAbove = LazyOptional.empty()); } @@ -197,12 +197,12 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I } @Override - public ActionResultType onUse(BlockState p_225533_1_, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState p_225533_1_, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult p_225533_6_) { - if (!player.getHeldItem(hand) + if (!player.getItemInHand(hand) .isEmpty()) return ActionResultType.PASS; - if (world.isRemote) + if (world.isClientSide) return ActionResultType.SUCCESS; return onTileEntityUse(world, pos, te -> { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java index 9926f4ba4..fb885f469 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java @@ -30,19 +30,19 @@ import net.minecraft.world.World; public class ChuteBlock extends AbstractChuteBlock { public static final Property SHAPE = EnumProperty.create("shape", Shape.class); - public static final DirectionProperty FACING = BlockStateProperties.FACING_EXCEPT_UP; + public static final DirectionProperty FACING = BlockStateProperties.FACING_HOPPER; public ChuteBlock(Properties p_i48440_1_) { super(p_i48440_1_); - setDefaultState(getDefaultState().with(SHAPE, Shape.NORMAL) - .with(FACING, Direction.DOWN)); + registerDefaultState(defaultBlockState().setValue(SHAPE, Shape.NORMAL) + .setValue(FACING, Direction.DOWN)); } public enum Shape implements IStringSerializable { INTERSECTION, WINDOW, NORMAL; @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } } @@ -54,27 +54,27 @@ public class ChuteBlock extends AbstractChuteBlock { @Override public Direction getFacing(BlockState state) { - return state.get(FACING); + return state.getValue(FACING); } @Override public boolean isOpen(BlockState state) { - return state.get(FACING) == Direction.DOWN || state.get(SHAPE) == Shape.INTERSECTION; + return state.getValue(FACING) == Direction.DOWN || state.getValue(SHAPE) == Shape.INTERSECTION; } @Override public boolean isTransparent(BlockState state) { - return state.get(SHAPE) == Shape.WINDOW; + return state.getValue(SHAPE) == Shape.WINDOW; } @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - Shape shape = state.get(SHAPE); - boolean down = state.get(FACING) == Direction.DOWN; - if (!context.getWorld().isRemote && down && shape != Shape.INTERSECTION) { - context.getWorld() - .setBlockState(context.getPos(), - state.with(SHAPE, shape == Shape.WINDOW ? Shape.NORMAL : Shape.WINDOW)); + Shape shape = state.getValue(SHAPE); + boolean down = state.getValue(FACING) == Direction.DOWN; + if (!context.getLevel().isClientSide && down && shape != Shape.INTERSECTION) { + context.getLevel() + .setBlockAndUpdate(context.getClickedPos(), + state.setValue(SHAPE, shape == Shape.WINDOW ? Shape.NORMAL : Shape.WINDOW)); } return ActionResultType.SUCCESS; } @@ -82,24 +82,24 @@ public class ChuteBlock extends AbstractChuteBlock { @Override public BlockState getStateForPlacement(BlockItemUseContext ctx) { BlockState state = super.getStateForPlacement(ctx); - Direction face = ctx.getFace(); + Direction face = ctx.getClickedFace(); if (face.getAxis() - .isHorizontal() && !ctx.shouldCancelInteraction()) { - World world = ctx.getWorld(); - BlockPos pos = ctx.getPos(); - return updateChuteState(state.with(FACING, face), world.getBlockState(pos.up()), world, pos); + .isHorizontal() && !ctx.isSecondaryUseActive()) { + World world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + return updateChuteState(state.setValue(FACING, face), world.getBlockState(pos.above()), world, pos); } return state; } @Override - protected void fillStateContainer(Builder p_206840_1_) { - super.fillStateContainer(p_206840_1_.add(SHAPE, FACING)); + protected void createBlockStateDefinition(Builder p_206840_1_) { + super.createBlockStateDefinition(p_206840_1_.add(SHAPE, FACING)); } @Override - public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { - BlockState above = world.getBlockState(pos.up()); + public boolean canSurvive(BlockState state, IWorldReader world, BlockPos pos) { + BlockState above = world.getBlockState(pos.above()); return !isChute(above) || getChuteFacing(above) == Direction.DOWN; } @@ -110,22 +110,22 @@ public class ChuteBlock extends AbstractChuteBlock { Map connections = new HashMap<>(); int amtConnections = 0; - Direction facing = state.get(FACING); + Direction facing = state.getValue(FACING); boolean vertical = facing == Direction.DOWN; if (!vertical) { - BlockState target = world.getBlockState(pos.down() - .offset(facing.getOpposite())); + BlockState target = world.getBlockState(pos.below() + .relative(facing.getOpposite())); if (!isChute(target)) - return state.with(FACING, Direction.DOWN) - .with(SHAPE, Shape.NORMAL); + return state.setValue(FACING, Direction.DOWN) + .setValue(SHAPE, Shape.NORMAL); } for (Direction direction : Iterate.horizontalDirections) { - BlockState diagonalInputChute = world.getBlockState(pos.up() - .offset(direction)); + BlockState diagonalInputChute = world.getBlockState(pos.above() + .relative(direction)); boolean value = - diagonalInputChute.getBlock() instanceof ChuteBlock && diagonalInputChute.get(FACING) == direction; + diagonalInputChute.getBlock() instanceof ChuteBlock && diagonalInputChute.getValue(FACING) == direction; connections.put(direction, value); if (value) amtConnections++; @@ -133,22 +133,22 @@ public class ChuteBlock extends AbstractChuteBlock { boolean noConnections = amtConnections == 0; if (vertical) - return state.with(SHAPE, - noConnections ? state.get(SHAPE) == Shape.WINDOW ? Shape.WINDOW : Shape.NORMAL : Shape.INTERSECTION); + return state.setValue(SHAPE, + noConnections ? state.getValue(SHAPE) == Shape.WINDOW ? Shape.WINDOW : Shape.NORMAL : Shape.INTERSECTION); if (noConnections) - return state.with(SHAPE, Shape.INTERSECTION); + return state.setValue(SHAPE, Shape.INTERSECTION); if (connections.get(Direction.NORTH) && connections.get(Direction.SOUTH)) - return state.with(SHAPE, Shape.INTERSECTION); + return state.setValue(SHAPE, Shape.INTERSECTION); if (connections.get(Direction.EAST) && connections.get(Direction.WEST)) - return state.with(SHAPE, Shape.INTERSECTION); + return state.setValue(SHAPE, Shape.INTERSECTION); if (amtConnections == 1 && connections.get(facing) && !(getChuteFacing(above) == Direction.DOWN) && !(above.getBlock() instanceof FunnelBlock && FunnelBlock.getFunnelFacing(above) == Direction.DOWN)) - return state.with(SHAPE, Shape.NORMAL); - return state.with(SHAPE, Shape.INTERSECTION); + return state.setValue(SHAPE, Shape.NORMAL); + return state.setValue(SHAPE, Shape.INTERSECTION); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteGenerator.java index 5b07d8328..641bfde5e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteGenerator.java @@ -20,14 +20,14 @@ public class ChuteGenerator extends SpecialBlockStateGen { @Override protected int getYRotation(BlockState state) { - return horizontalAngle(state.get(ChuteBlock.FACING)); + return horizontalAngle(state.getValue(ChuteBlock.FACING)); } @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - boolean horizontal = state.get(ChuteBlock.FACING) != Direction.DOWN; - ChuteBlock.Shape shape = state.get(ChuteBlock.SHAPE); + boolean horizontal = state.getValue(ChuteBlock.FACING) != Direction.DOWN; + ChuteBlock.Shape shape = state.getValue(ChuteBlock.SHAPE); if (!horizontal) return shape == Shape.NORMAL ? AssetLookup.partialBaseModel(ctx, prov) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItem.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItem.java index 9cc13fc30..6a279ae18 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteItem.java @@ -16,39 +16,39 @@ public class ChuteItem extends BlockItem { } @Override - public ActionResultType tryPlace(BlockItemUseContext context) { - Direction face = context.getFace(); - BlockPos placedOnPos = context.getPos() - .offset(face.getOpposite()); - World world = context.getWorld(); + public ActionResultType place(BlockItemUseContext context) { + Direction face = context.getClickedFace(); + BlockPos placedOnPos = context.getClickedPos() + .relative(face.getOpposite()); + World world = context.getLevel(); BlockState placedOnState = world.getBlockState(placedOnPos); - if (!AbstractChuteBlock.isChute(placedOnState) || context.shouldCancelInteraction()) - return super.tryPlace(context); + if (!AbstractChuteBlock.isChute(placedOnState) || context.isSecondaryUseActive()) + return super.place(context); if (face.getAxis() .isVertical()) - return super.tryPlace(context); + return super.place(context); - BlockPos correctPos = context.getPos() - .up(); + BlockPos correctPos = context.getClickedPos() + .above(); BlockState blockState = world.getBlockState(correctPos); if (blockState.getMaterial() .isReplaceable()) - context = BlockItemUseContext.func_221536_a(context, correctPos, face); + context = BlockItemUseContext.at(context, correctPos, face); else { - if (!(blockState.getBlock() instanceof ChuteBlock) || world.isRemote) + if (!(blockState.getBlock() instanceof ChuteBlock) || world.isClientSide) return ActionResultType.FAIL; AbstractChuteBlock block = (AbstractChuteBlock) blockState.getBlock(); if (block.getFacing(blockState) == Direction.DOWN) { - world.setBlockState(correctPos, block.updateChuteState(blockState.with(ChuteBlock.FACING, face), - world.getBlockState(correctPos.up()), world, correctPos)); + world.setBlockAndUpdate(correctPos, block.updateChuteState(blockState.setValue(ChuteBlock.FACING, face), + world.getBlockState(correctPos.above()), world, correctPos)); return ActionResultType.SUCCESS; } return ActionResultType.FAIL; } - return super.tryPlace(context); + return super.place(context); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java index 4d1540b68..cb6a65b88 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.logistics.block.chute; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.logistics.block.chute.ChuteBlock.Shape; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -25,9 +25,9 @@ public class ChuteRenderer extends SafeTileEntityRenderer { if (te.item.isEmpty()) return; BlockState blockState = te.getBlockState(); - if (blockState.get(ChuteBlock.FACING) != Direction.DOWN) + if (blockState.getValue(ChuteBlock.FACING) != Direction.DOWN) return; - if (blockState.get(ChuteBlock.SHAPE) != Shape.WINDOW + if (blockState.getValue(ChuteBlock.SHAPE) != Shape.WINDOW && (te.bottomPullDistance == 0 || te.itemPosition.get(partialTicks) > .5f)) return; @@ -38,8 +38,8 @@ public class ChuteRenderer extends SafeTileEntityRenderer { int light, int overlay) { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); - MatrixStacker msr = MatrixStacker.of(ms); - ms.push(); + MatrixTransformStack msr = MatrixTransformStack.of(ms); + ms.pushPose(); msr.centre(); float itemScale = .5f; float itemPosition = te.itemPosition.get(partialTicks); @@ -47,8 +47,8 @@ public class ChuteRenderer extends SafeTileEntityRenderer { ms.scale(itemScale, itemScale, itemScale); msr.rotateX(itemPosition * 180); msr.rotateY(itemPosition * 180); - itemRenderer.renderItem(te.item, TransformType.FIXED, light, overlay, ms, buffer); - ms.pop(); + itemRenderer.renderStatic(te.item, TransformType.FIXED, light, overlay, ms, buffer); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java index 6e069aeae..e70ed6621 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteShapes.java @@ -19,24 +19,24 @@ public class ChuteShapes { static Map cache = new HashMap<>(); static Map collisionCache = new HashMap<>(); - public static final VoxelShape INTERSECTION_MASK = Block.makeCuboidShape(0, -16, 0, 16, 16, 16); - public static final VoxelShape COLLISION_MASK = Block.makeCuboidShape(0, 0, 0, 16, 24, 16); + public static final VoxelShape INTERSECTION_MASK = Block.box(0, -16, 0, 16, 16, 16); + public static final VoxelShape COLLISION_MASK = Block.box(0, 0, 0, 16, 24, 16); public static VoxelShape createShape(BlockState state) { if (AllBlocks.SMART_CHUTE.has(state)) return AllShapes.SMART_CHUTE; - Direction direction = state.get(ChuteBlock.FACING); - Shape shape = state.get(ChuteBlock.SHAPE); + Direction direction = state.getValue(ChuteBlock.FACING); + Shape shape = state.getValue(ChuteBlock.SHAPE); boolean intersection = shape == Shape.INTERSECTION; if (direction == Direction.DOWN) - return intersection ? VoxelShapes.fullCube() : AllShapes.CHUTE; + return intersection ? VoxelShapes.block() : AllShapes.CHUTE; - VoxelShape combineWith = intersection ? VoxelShapes.fullCube() : VoxelShapes.empty(); + VoxelShape combineWith = intersection ? VoxelShapes.block() : VoxelShapes.empty(); VoxelShape result = VoxelShapes.or(combineWith, AllShapes.CHUTE_SLOPE.get(direction)); if (intersection) - result = VoxelShapes.combine(INTERSECTION_MASK, result, IBooleanFunction.AND); + result = VoxelShapes.joinUnoptimized(INTERSECTION_MASK, result, IBooleanFunction.AND); return result; } @@ -51,18 +51,18 @@ public class ChuteShapes { public static VoxelShape getCollisionShape(BlockState state) { if (collisionCache.containsKey(state)) return collisionCache.get(state); - VoxelShape createdShape = VoxelShapes.combine(COLLISION_MASK, getShape(state), IBooleanFunction.AND); + VoxelShape createdShape = VoxelShapes.joinUnoptimized(COLLISION_MASK, getShape(state), IBooleanFunction.AND); collisionCache.put(state, createdShape); return createdShape; } - public static final VoxelShape PANEL = Block.makeCuboidShape(1, -15, 0, 15, 4, 1); + public static final VoxelShape PANEL = Block.box(1, -15, 0, 15, 4, 1); public static VoxelShape createSlope() { VoxelShape shape = VoxelShapes.empty(); for (int i = 0; i < 16; i++) { float offset = i / 16f; - shape = VoxelShapes.combineAndSimplify(shape, PANEL.withOffset(0, offset, offset), IBooleanFunction.OR); + shape = VoxelShapes.join(shape, PANEL.move(0, offset, offset), IBooleanFunction.OR); } return shape; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java index fbbffa98f..f18679690 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -110,7 +110,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor private boolean canDirectlyInsert() { BlockState blockState = getBlockState(); - BlockState blockStateAbove = world.getBlockState(pos.up()); + BlockState blockStateAbove = level.getBlockState(worldPosition.above()); if (!AbstractChuteBlock.isChute(blockState)) return false; if (AbstractChuteBlock.getChuteFacing(blockStateAbove) == Direction.DOWN) @@ -128,18 +128,18 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor @Override public AxisAlignedBB getRenderBoundingBox() { - return new AxisAlignedBB(pos).expand(0, -3, 0); + return new AxisAlignedBB(worldPosition).expandTowards(0, -3, 0); } @Override public void tick() { super.tick(); - if (!world.isRemote) + if (!level.isClientSide) canPickUpItems = canDirectlyInsert(); float itemMotion = getItemMotion(); - if (itemMotion != 0 && world != null && world.isRemote) + if (itemMotion != 0 && level != null && level.isClientSide) spawnParticles(itemMotion); tickAirStreams(itemMotion); @@ -158,7 +158,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (!handleDownwardOutput(true)) nextOffset = .5f; else if (nextOffset < 0) { - handleDownwardOutput(world.isRemote && !isVirtual()); + handleDownwardOutput(level.isClientSide && !isVirtual()); nextOffset = itemPosition.value; } } @@ -167,7 +167,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (!handleUpwardOutput(true)) nextOffset = .5f; else if (nextOffset > 1) { - handleUpwardOutput(world.isRemote && !isVirtual()); + handleUpwardOutput(level.isClientSide && !isVirtual()); nextOffset = itemPosition.value; } } @@ -179,7 +179,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor private void updateAirFlow(float itemSpeed) { updateAirFlow = false; // airCurrent.rebuild(); - if (itemSpeed > 0 && world != null && !world.isRemote) { + if (itemSpeed > 0 && level != null && !level.isClientSide) { float speed = pull - push; beltBelow = null; @@ -193,15 +193,15 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor else maxPullDistance = MathHelper.lerp(speed / 32, 0, 1); - if (AbstractChuteBlock.isChute(world.getBlockState(pos.down()))) + if (AbstractChuteBlock.isChute(level.getBlockState(worldPosition.below()))) maxPullDistance = 0; float flowLimit = maxPullDistance; if (flowLimit > 0) - flowLimit = AirCurrent.getFlowLimit(world, pos, maxPullDistance, Direction.DOWN); + flowLimit = AirCurrent.getFlowLimit(level, worldPosition, maxPullDistance, Direction.DOWN); for (int i = 1; i <= flowLimit + 1; i++) { TransportedItemStackHandlerBehaviour behaviour = - TileEntityBehaviour.get(world, pos.down(i), TransportedItemStackHandlerBehaviour.TYPE); + TileEntityBehaviour.get(level, worldPosition.below(i), TransportedItemStackHandlerBehaviour.TYPE); if (behaviour == null) continue; beltBelow = behaviour; @@ -216,29 +216,29 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor private void findEntities(float itemSpeed) { // if (getSpeed() != 0) // airCurrent.findEntities(); - if (bottomPullDistance <= 0 && !getItem().isEmpty() || itemSpeed <= 0 || world == null || world.isRemote) + if (bottomPullDistance <= 0 && !getItem().isEmpty() || itemSpeed <= 0 || level == null || level.isClientSide) return; if (!canCollectItemsFromBelow()) return; - Vector3d center = VecHelper.getCenterOf(pos); + Vector3d center = VecHelper.getCenterOf(worldPosition); AxisAlignedBB searchArea = - new AxisAlignedBB(center.add(0, -bottomPullDistance - 0.5, 0), center.add(0, -0.5, 0)).grow(.45f); - for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class, searchArea)) { + new AxisAlignedBB(center.add(0, -bottomPullDistance - 0.5, 0), center.add(0, -0.5, 0)).inflate(.45f); + for (ItemEntity itemEntity : level.getEntitiesOfClass(ItemEntity.class, searchArea)) { if (!itemEntity.isAlive()) continue; ItemStack entityItem = itemEntity.getItem(); if (!canAcceptItem(entityItem)) continue; setItem(entityItem.copy(), (float) (itemEntity.getBoundingBox() - .getCenter().y - pos.getY())); + .getCenter().y - worldPosition.getY())); itemEntity.remove(); - AllTriggers.triggerForNearbyPlayers(AllTriggers.UPWARD_CHUTE, world, pos, 5); + AllTriggers.triggerForNearbyPlayers(AllTriggers.UPWARD_CHUTE, level, worldPosition, 5); break; } } private void extractFromBelt(float itemSpeed) { - if (itemSpeed <= 0 || world == null || world.isRemote) + if (itemSpeed <= 0 || level == null || level.isClientSide) return; if (getItem().isEmpty() && beltBelow != null) { beltBelow.handleCenteredProcessingOnAllItems(.5f, ts -> { @@ -252,7 +252,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor } private void tickAirStreams(float itemSpeed) { - if (!world.isRemote && airCurrentUpdateCooldown-- <= 0) { + if (!level.isClientSide && airCurrentUpdateCooldown-- <= 0) { airCurrentUpdateCooldown = AllConfigs.SERVER.kinetics.fanBlockCheckRate.get(); updateAirFlow = true; } @@ -278,7 +278,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor private void spawnParticles(float itemMotion) { // todo: reduce the amount of particles - if (world == null) + if (level == null) return; BlockState blockState = getBlockState(); boolean up = itemMotion > 0; @@ -288,7 +288,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (push == 0 && pull == 0) return; - if (up && AbstractChuteBlock.isOpenChute(blockState) && BlockHelper.noCollisionInSpace(world, pos.up())) + if (up && AbstractChuteBlock.isOpenChute(blockState) && BlockHelper.noCollisionInSpace(level, worldPosition.above())) spawnAirFlow(1, 2, absMotion, .5f); if (AbstractChuteBlock.getChuteFacing(blockState) != Direction.DOWN) @@ -297,7 +297,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (AbstractChuteBlock.isTransparentChute(blockState)) spawnAirFlow(up ? 0 : 1, up ? 1 : 0, absMotion, 1); - if (!up && BlockHelper.noCollisionInSpace(world, pos.down())) + if (!up && BlockHelper.noCollisionInSpace(level, worldPosition.below())) spawnAirFlow(0, -1, absMotion, .5f); if (up && canCollectItemsFromBelow() && bottomPullDistance > 0) { @@ -307,17 +307,17 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor } private void spawnAirFlow(float verticalStart, float verticalEnd, float motion, float drag) { - if (world == null) + if (level == null) return; AirParticleData airParticleData = new AirParticleData(drag, motion); - Vector3d origin = Vector3d.of(pos); + Vector3d origin = Vector3d.atLowerCornerOf(worldPosition); float xOff = Create.RANDOM.nextFloat() * .5f + .25f; float zOff = Create.RANDOM.nextFloat() * .5f + .25f; Vector3d v = origin.add(xOff, verticalStart, zOff); Vector3d d = origin.add(xOff, verticalEnd, zOff) .subtract(v); if (Create.RANDOM.nextFloat() < 2 * motion) - world.addOptionalParticle(airParticleData, v.x, v.y, v.z, d.x, d.y, d.z); + level.addAlwaysVisibleParticle(airParticleData, v.x, v.y, v.z, d.x, d.y, d.z); } private void handleInputFromAbove() { @@ -350,12 +350,12 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor ChuteTileEntity targetChute = getTargetChute(blockState); Direction direction = AbstractChuteBlock.getChuteFacing(blockState); - if (world == null) + if (level == null) return false; if (!capBelow.isPresent()) capBelow = grabCapability(Direction.DOWN); if (capBelow.isPresent()) { - if (world.isRemote && !isVirtual()) + if (level.isClientSide && !isVirtual()) return false; ItemStack remainder = ItemHandlerHelper.insertItemStacked(capBelow.orElse(null), item, simulate); ItemStack held = getItem(); @@ -381,18 +381,18 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor .isHorizontal()) return false; - if (FunnelBlock.getFunnelFacing(world.getBlockState(pos.down())) == Direction.DOWN) + if (FunnelBlock.getFunnelFacing(level.getBlockState(worldPosition.below())) == Direction.DOWN) return false; - if (Block.hasSolidSideOnTop(world, pos.down())) + if (Block.canSupportRigidBlock(level, worldPosition.below())) return false; if (!simulate) { - Vector3d dropVec = VecHelper.getCenterOf(pos) + Vector3d dropVec = VecHelper.getCenterOf(worldPosition) .add(0, -12 / 16f, 0); - ItemEntity dropped = new ItemEntity(world, dropVec.x, dropVec.y, dropVec.z, item.copy()); - dropped.setDefaultPickupDelay(); - dropped.setMotion(0, -.25f, 0); - world.addEntity(dropped); + ItemEntity dropped = new ItemEntity(level, dropVec.x, dropVec.y, dropVec.z, item.copy()); + dropped.setDefaultPickUpDelay(); + dropped.setDeltaMovement(0, -.25f, 0); + level.addFreshEntity(dropped); setItem(ItemStack.EMPTY); } @@ -400,16 +400,16 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor } private boolean handleUpwardOutput(boolean simulate) { - BlockState stateAbove = world.getBlockState(pos.up()); + BlockState stateAbove = level.getBlockState(worldPosition.above()); - if (world == null) + if (level == null) return false; if (AbstractChuteBlock.isOpenChute(getBlockState())) { if (!capAbove.isPresent()) capAbove = grabCapability(Direction.UP); if (capAbove.isPresent()) { - if (world.isRemote && !isVirtual() && !ChuteBlock.isChute(stateAbove)) + if (level.isClientSide && !isVirtual() && !ChuteBlock.isChute(stateAbove)) return false; int countBefore = item.getCount(); ItemStack remainder = ItemHandlerHelper.insertItemStacked(capAbove.orElse(null), item, simulate); @@ -440,20 +440,20 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor return true; } - if (FunnelBlock.getFunnelFacing(world.getBlockState(pos.up())) == Direction.UP) + if (FunnelBlock.getFunnelFacing(level.getBlockState(worldPosition.above())) == Direction.UP) return false; - if (BlockHelper.hasBlockSolidSide(stateAbove, world, pos.up(), Direction.DOWN)) + if (BlockHelper.hasBlockSolidSide(stateAbove, level, worldPosition.above(), Direction.DOWN)) return false; if (!inputChutes.isEmpty()) return false; if (!simulate) { - Vector3d dropVec = VecHelper.getCenterOf(pos) + Vector3d dropVec = VecHelper.getCenterOf(worldPosition) .add(0, 8 / 16f, 0); - ItemEntity dropped = new ItemEntity(world, dropVec.x, dropVec.y, dropVec.z, item.copy()); - dropped.setDefaultPickupDelay(); - dropped.setMotion(0, getItemMotion() * 2, 0); - world.addEntity(dropped); + ItemEntity dropped = new ItemEntity(level, dropVec.x, dropVec.y, dropVec.z, item.copy()); + dropped.setDefaultPickUpDelay(); + dropped.setDeltaMovement(0, getItemMotion() * 2, 0); + level.addFreshEntity(dropped); setItem(ItemStack.EMPTY); } return true; @@ -476,10 +476,10 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor } private LazyOptional grabCapability(Direction side) { - BlockPos pos = this.pos.offset(side); - if (world == null) + BlockPos pos = this.worldPosition.relative(side); + if (level == null) return LazyOptional.empty(); - TileEntity te = world.getTileEntity(pos); + TileEntity te = level.getBlockEntity(pos); if (te == null) return LazyOptional.empty(); if (te instanceof ChuteTileEntity) { @@ -496,13 +496,13 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor public void setItem(ItemStack stack, float insertionPos) { item = stack; itemPosition.lastValue = itemPosition.value = insertionPos; - markDirty(); + setChanged(); sendData(); } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); if (lazyHandler != null) lazyHandler.invalidate(); } @@ -520,7 +520,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor @Override protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { ItemStack previousItem = item; - item = ItemStack.read(compound.getCompound("Item")); + item = ItemStack.of(compound.getCompound("Item")); itemPosition.lastValue = itemPosition.value = compound.getFloat("ItemPosition"); pull = compound.getFloat("Pull"); push = compound.getFloat("Push"); @@ -529,13 +529,13 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor // if (clientPacket) // airCurrent.rebuild(); - if (hasWorld() && world != null && world.isRemote && !previousItem.equals(item, false) && !item.isEmpty()) { - if (world.rand.nextInt(3) != 0) + if (hasLevel() && level != null && level.isClientSide && !previousItem.equals(item, false) && !item.isEmpty()) { + if (level.random.nextInt(3) != 0) return; - Vector3d p = VecHelper.getCenterOf(pos); - p = VecHelper.offsetRandomly(p, world.rand, .5f); + Vector3d p = VecHelper.getCenterOf(worldPosition); + p = VecHelper.offsetRandomly(p, level.random, .5f); Vector3d m = Vector3d.ZERO; - world.addParticle(new ItemParticleData(ParticleTypes.ITEM, item), p.x, p.y, p.z, m.x, m.y, m.z); + level.addParticle(new ItemParticleData(ParticleTypes.ITEM, item), p.x, p.y, p.z, m.x, m.y, m.z); } } @@ -552,9 +552,9 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor public void onRemoved(BlockState chuteState) { ChuteTileEntity targetChute = getTargetChute(chuteState); List inputChutes = getInputChutes(); - if (!item.isEmpty() && world != null) - InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), item); - remove(); + if (!item.isEmpty() && level != null) + InventoryHelper.dropItemStack(level, worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), item); + setRemoved(); if (targetChute != null) { targetChute.updatePull(); targetChute.propagatePush(); @@ -563,7 +563,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor } public void onAdded() { - updateContainingBlockInfo(); + clearCache(); updatePull(); ChuteTileEntity targetChute = getTargetChute(getBlockState()); if (targetChute != null) @@ -600,10 +600,10 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor } protected float calculatePull() { - BlockState blockStateAbove = world.getBlockState(pos.up()); + BlockState blockStateAbove = level.getBlockState(worldPosition.above()); if (AllBlocks.ENCASED_FAN.has(blockStateAbove) - && blockStateAbove.get(EncasedFanBlock.FACING) == Direction.DOWN) { - TileEntity te = world.getTileEntity(pos.up()); + && blockStateAbove.getValue(EncasedFanBlock.FACING) == Direction.DOWN) { + TileEntity te = level.getBlockEntity(worldPosition.above()); if (te instanceof EncasedFanTileEntity && !te.isRemoved()) { EncasedFanTileEntity fan = (EncasedFanTileEntity) te; return fan.getSpeed(); @@ -621,11 +621,11 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor } protected float calculatePush(int branchCount) { - if (world == null) + if (level == null) return 0; - BlockState blockStateBelow = world.getBlockState(pos.down()); - if (AllBlocks.ENCASED_FAN.has(blockStateBelow) && blockStateBelow.get(EncasedFanBlock.FACING) == Direction.UP) { - TileEntity te = world.getTileEntity(pos.down()); + BlockState blockStateBelow = level.getBlockState(worldPosition.below()); + if (AllBlocks.ENCASED_FAN.has(blockStateBelow) && blockStateBelow.getValue(EncasedFanBlock.FACING) == Direction.UP) { + TileEntity te = level.getBlockEntity(worldPosition.below()); if (te instanceof EncasedFanTileEntity && !te.isRemoved()) { EncasedFanTileEntity fan = (EncasedFanTileEntity) te; return fan.getSpeed(); @@ -640,19 +640,19 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor @Nullable private ChuteTileEntity getTargetChute(BlockState state) { - if (world == null) + if (level == null) return null; Direction targetDirection = AbstractChuteBlock.getChuteFacing(state); if (targetDirection == null) return null; - BlockPos chutePos = pos.down(); + BlockPos chutePos = worldPosition.below(); if (targetDirection.getAxis() .isHorizontal()) - chutePos = chutePos.offset(targetDirection.getOpposite()); - BlockState chuteState = world.getBlockState(chutePos); + chutePos = chutePos.relative(targetDirection.getOpposite()); + BlockState chuteState = level.getBlockState(chutePos); if (!AbstractChuteBlock.isChute(chuteState)) return null; - TileEntity te = world.getTileEntity(chutePos); + TileEntity te = level.getBlockEntity(chutePos); if (te instanceof ChuteTileEntity) return (ChuteTileEntity) te; return null; @@ -671,18 +671,18 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor @Nullable private ChuteTileEntity getInputChute(Direction direction) { - if (world == null || direction == Direction.DOWN) + if (level == null || direction == Direction.DOWN) return null; direction = direction.getOpposite(); - BlockPos chutePos = pos.up(); + BlockPos chutePos = worldPosition.above(); if (direction.getAxis() .isHorizontal()) - chutePos = chutePos.offset(direction); - BlockState chuteState = world.getBlockState(chutePos); + chutePos = chutePos.relative(direction); + BlockState chuteState = level.getBlockState(chutePos); Direction chuteFacing = AbstractChuteBlock.getChuteFacing(chuteState); if (chuteFacing != direction) return null; - TileEntity te = world.getTileEntity(chutePos); + TileEntity te = level.getBlockEntity(chutePos); if (te instanceof ChuteTileEntity && !te.isRemoved()) return (ChuteTileEntity) te; return null; @@ -690,29 +690,29 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { boolean downward = getItemMotion() < 0; - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("tooltip.chute.header"))); if (pull == 0 && push == 0) - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("tooltip.chute.no_fans_attached")) - .formatted(TextFormatting.GRAY)); + .withStyle(TextFormatting.GRAY)); if (pull != 0) - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("tooltip.chute.fans_" + (pull > 0 ? "pull_up" : "push_down")) - .formatted(TextFormatting.GRAY))); + .withStyle(TextFormatting.GRAY))); if (push != 0) - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("tooltip.chute.fans_" + (push > 0 ? "push_up" : "pull_down")) - .formatted(TextFormatting.GRAY))); - tooltip.add(componentSpacing.copy() + .withStyle(TextFormatting.GRAY))); + tooltip.add(componentSpacing.plainCopy() .append("-> ") .append(Lang.translate("tooltip.chute.items_move_" + (downward ? "down" : "up")) - .formatted(TextFormatting.YELLOW))); + .withStyle(TextFormatting.YELLOW))); if (!item.isEmpty()) { - tooltip.add(componentSpacing.copy() + tooltip.add(componentSpacing.plainCopy() .append(Lang.translate("tooltip.chute.contains", new TranslationTextComponent(item.getItem() - .getTranslationKey(item)).getString(), item.getCount())) - .formatted(TextFormatting.GREEN)); + .getDescriptionId(item)).getString(), item.getCount())) + .withStyle(TextFormatting.GREEN)); } return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java index 55b0b2d52..14e6f209f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java @@ -21,7 +21,7 @@ public class SmartChuteBlock extends AbstractChuteBlock { public SmartChuteBlock(Properties p_i48440_1_) { super(p_i48440_1_); - setDefaultState(getDefaultState().with(POWERED, true)); + registerDefaultState(defaultBlockState().setValue(POWERED, true)); } public static final BooleanProperty POWERED = BlockStateProperties.POWERED; @@ -30,29 +30,29 @@ public class SmartChuteBlock extends AbstractChuteBlock { public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving); - if (worldIn.isRemote) + if (worldIn.isClientSide) return; - if (!worldIn.getPendingBlockTicks() - .isTickPending(pos, this)) - worldIn.getPendingBlockTicks() + if (!worldIn.getBlockTicks() + .willTickThisTick(pos, this)) + worldIn.getBlockTicks() .scheduleTick(pos, this, 0); } @Override - public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { - boolean previouslyPowered = state.get(POWERED); - if (previouslyPowered != worldIn.isBlockPowered(pos)) - worldIn.setBlockState(pos, state.cycle(POWERED), 2); + public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { + boolean previouslyPowered = state.getValue(POWERED); + if (previouslyPowered != worldIn.hasNeighborSignal(pos)) + worldIn.setBlock(pos, state.cycle(POWERED), 2); } @Override public BlockState getStateForPlacement(BlockItemUseContext p_196258_1_) { - return super.getStateForPlacement(p_196258_1_).with(POWERED, p_196258_1_.getWorld() - .isBlockPowered(p_196258_1_.getPos())); + return super.getStateForPlacement(p_196258_1_).setValue(POWERED, p_196258_1_.getLevel() + .hasNeighborSignal(p_196258_1_.getClickedPos())); } @Override - public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { + public boolean canSurvive(BlockState state, IWorldReader world, BlockPos pos) { return true; } @@ -62,8 +62,8 @@ public class SmartChuteBlock extends AbstractChuteBlock { } @Override - protected void fillStateContainer(Builder p_206840_1_) { - super.fillStateContainer(p_206840_1_.add(POWERED)); + protected void createBlockStateDefinition(Builder p_206840_1_) { + super.createBlockStateDefinition(p_206840_1_.add(POWERED)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteTileEntity.java index 585c7f10b..da88a5a24 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteTileEntity.java @@ -39,7 +39,7 @@ public class SmartChuteTileEntity extends ChuteTileEntity { @Override protected boolean canCollectItemsFromBelow() { BlockState blockState = getBlockState(); - return blockState.contains(SmartChuteBlock.POWERED) && !blockState.get(SmartChuteBlock.POWERED); + return blockState.hasProperty(SmartChuteBlock.POWERED) && !blockState.getValue(SmartChuteBlock.POWERED); } @Override @@ -51,8 +51,8 @@ public class SmartChuteTileEntity extends ChuteTileEntity { private boolean isExtracting() { boolean up = getItemMotion() < 0; - BlockPos chutePos = pos.offset(up ? Direction.UP : Direction.DOWN); - BlockState blockState = world.getBlockState(chutePos); + BlockPos chutePos = worldPosition.relative(up ? Direction.UP : Direction.DOWN); + BlockState blockState = level.getBlockState(chutePos); return !AbstractChuteBlock.isChute(blockState) && !blockState.getMaterial() .isReplaceable(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java index ecac9759c..8c8d29659 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java @@ -76,20 +76,20 @@ public class DepotBehaviour extends TileEntityBehaviour { public void tick() { super.tick(); - World world = tileEntity.getWorld(); + World world = tileEntity.getLevel(); for (Iterator iterator = incoming.iterator(); iterator.hasNext();) { TransportedItemStack ts = iterator.next(); if (!tick(ts)) continue; - if (world.isRemote && !tileEntity.isVirtual()) + if (world.isClientSide && !tileEntity.isVirtual()) continue; if (heldItem == null) { heldItem = ts; } else { if (!ItemHelper.canItemStackAmountsStack(heldItem.stack, ts.stack)) { - Vector3d vec = VecHelper.getCenterOf(tileEntity.getPos()); - InventoryHelper.spawnItemStack(tileEntity.getWorld(), vec.x, vec.y + .5f, vec.z, ts.stack); + Vector3d vec = VecHelper.getCenterOf(tileEntity.getBlockPos()); + InventoryHelper.dropItemStack(tileEntity.getLevel(), vec.x, vec.y + .5f, vec.z, ts.stack); } else { heldItem.stack.grow(ts.stack.getCount()); } @@ -103,15 +103,15 @@ public class DepotBehaviour extends TileEntityBehaviour { if (!tick(heldItem)) return; - BlockPos pos = tileEntity.getPos(); + BlockPos pos = tileEntity.getBlockPos(); - if (world.isRemote) + if (world.isClientSide) return; if (handleBeltFunnelOutput()) return; BeltProcessingBehaviour processingBehaviour = - TileEntityBehaviour.get(world, pos.up(2), BeltProcessingBehaviour.TYPE); + TileEntityBehaviour.get(world, pos.above(2), BeltProcessingBehaviour.TYPE); if (processingBehaviour == null) return; if (!heldItem.locked && BeltProcessingBehaviour.isBlocked(world, pos)) @@ -145,7 +145,7 @@ public class DepotBehaviour extends TileEntityBehaviour { } private boolean handleBeltFunnelOutput() { - BlockState funnel = getWorld().getBlockState(getPos().up()); + BlockState funnel = getWorld().getBlockState(getPos().above()); Direction funnelFacing = AbstractFunnelBlock.getFunnelFacing(funnel); if (funnelFacing == null || !canFunnelsPullFrom.test(funnelFacing.getOpposite())) return false; @@ -356,8 +356,8 @@ public class DepotBehaviour extends TileEntityBehaviour { continue; } ItemStack remainder = ItemHandlerHelper.insertItemStacked(processingOutputBuffer, added.stack, false); - Vector3d vec = VecHelper.getCenterOf(tileEntity.getPos()); - InventoryHelper.spawnItemStack(tileEntity.getWorld(), vec.x, vec.y + .5f, vec.z, remainder); + Vector3d vec = VecHelper.getCenterOf(tileEntity.getBlockPos()); + InventoryHelper.dropItemStack(tileEntity.getLevel(), vec.x, vec.y + .5f, vec.z, remainder); } if (dirty) @@ -378,7 +378,7 @@ public class DepotBehaviour extends TileEntityBehaviour { private Vector3d getWorldPositionOf(TransportedItemStack transported) { Vector3d offsetVec = new Vector3d(.5f, 14 / 16f, .5f); - return offsetVec.add(Vector3d.of(tileEntity.getPos())); + return offsetVec.add(Vector3d.atLowerCornerOf(tileEntity.getBlockPos())); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java index b9852efb9..eaaf0b0e9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java @@ -53,34 +53,34 @@ public class DepotBlock extends Block implements ITE, IWrenchab } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { return SharedDepotBlockMethods.onUse(state, world, pos, player, hand, ray); } @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { SharedDepotBlockMethods.onReplaced(state, worldIn, pos, newState, isMoving); } @Override - public void onLanded(IBlockReader worldIn, Entity entityIn) { - super.onLanded(worldIn, entityIn); + public void updateEntityAfterFallOn(IBlockReader worldIn, Entity entityIn) { + super.updateEntityAfterFallOn(worldIn, entityIn); SharedDepotBlockMethods.onLanded(worldIn, entityIn); } @Override - public boolean hasComparatorInputOverride(BlockState state) { + public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override - public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { + public int getAnalogOutputSignal(BlockState blockState, World worldIn, BlockPos pos) { return SharedDepotBlockMethods.getComparatorInputOverride(blockState, worldIn, pos); } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java index 6afe2734a..f22a1f0cb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java @@ -2,12 +2,12 @@ package com.simibubi.create.content.logistics.block.depot; import java.util.Random; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; @@ -38,10 +38,10 @@ public class DepotRenderer extends SafeTileEntityRenderer { int light, int overlay, DepotBehaviour depotBehaviour) { TransportedItemStack transported = depotBehaviour.heldItem; - MatrixStacker msr = MatrixStacker.of(ms); - Vector3d itemPosition = VecHelper.getCenterOf(te.getPos()); + MatrixTransformStack msr = MatrixTransformStack.of(ms); + Vector3d itemPosition = VecHelper.getCenterOf(te.getBlockPos()); - ms.push(); + ms.pushPose(); ms.translate(.5f, 15 / 16f, .5f); if (transported != null) @@ -49,17 +49,17 @@ public class DepotRenderer extends SafeTileEntityRenderer { // Render main items for (TransportedItemStack tis : depotBehaviour.incoming) { - ms.push(); + ms.pushPose(); msr.nudge(0); float offset = MathHelper.lerp(partialTicks, tis.prevBeltPosition, tis.beltPosition); float sideOffset = MathHelper.lerp(partialTicks, tis.prevSideOffset, tis.sideOffset); if (tis.insertedFrom.getAxis() .isHorizontal()) { - Vector3d offsetVec = Vector3d.of(tis.insertedFrom.getOpposite() - .getDirectionVec()).scale(.5f - offset); + Vector3d offsetVec = Vector3d.atLowerCornerOf(tis.insertedFrom.getOpposite() + .getNormal()).scale(.5f - offset); ms.translate(offsetVec.x, offsetVec.y, offsetVec.z); - boolean alongX = tis.insertedFrom.rotateY() + boolean alongX = tis.insertedFrom.getClockWise() .getAxis() == Axis.X; if (!alongX) sideOffset *= -1; @@ -70,7 +70,7 @@ public class DepotRenderer extends SafeTileEntityRenderer { int angle = tis.angle; Random r = new Random(0); renderItem(ms, buffer, light, overlay, itemStack, angle, r, itemPosition); - ms.pop(); + ms.popPose(); } if (transported != null) @@ -81,7 +81,7 @@ public class DepotRenderer extends SafeTileEntityRenderer { ItemStack stack = depotBehaviour.processingOutputBuffer.getStackInSlot(i); if (stack.isEmpty()) continue; - ms.push(); + ms.pushPose(); msr.nudge(i); boolean renderUpright = BeltHelper.isItemUpright(stack); @@ -92,39 +92,39 @@ public class DepotRenderer extends SafeTileEntityRenderer { Random r = new Random(i + 1); int angle = (int) (360 * r.nextFloat()); renderItem(ms, buffer, light, overlay, stack, renderUpright ? angle + 90 : angle, r, itemPosition); - ms.pop(); + ms.popPose(); } - ms.pop(); + ms.popPose(); } public static void renderItem(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, ItemStack itemStack, int angle, Random r, Vector3d itemPosition) { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); int count = (int) (MathHelper.log2((int) (itemStack.getCount()))) / 2; boolean renderUpright = BeltHelper.isItemUpright(itemStack); - boolean blockItem = itemRenderer.getItemModelWithOverrides(itemStack, null, null) + boolean blockItem = itemRenderer.getModel(itemStack, null, null) .isGui3d(); - ms.push(); + ms.pushPose(); msr.rotateY(angle); if (renderUpright) { - Entity renderViewEntity = Minecraft.getInstance().renderViewEntity; + Entity renderViewEntity = Minecraft.getInstance().cameraEntity; if (renderViewEntity != null) { - Vector3d positionVec = renderViewEntity.getPositionVec(); + Vector3d positionVec = renderViewEntity.position(); Vector3d vectorForOffset = itemPosition; Vector3d diff = vectorForOffset.subtract(positionVec); - float yRot = (float) MathHelper.atan2(diff.z, -diff.x); - ms.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion((float) (yRot - Math.PI / 2))); + float yRot = (float) -MathHelper.atan2(diff.z, diff.x); + ms.mulPose(Vector3f.YP.rotation((float) (yRot - Math.PI / 2))); } - ms.translate(0, 3 / 32d, 1 / 16f); + ms.translate(0, 3 / 32d, -1 / 16f); } for (int i = 0; i <= count; i++) { - ms.push(); + ms.pushPose(); if (blockItem) ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); ms.scale(.5f, .5f, .5f); @@ -132,8 +132,8 @@ public class DepotRenderer extends SafeTileEntityRenderer { ms.translate(0, -3 / 16f, 0); msr.rotateX(90); } - itemRenderer.renderItem(itemStack, TransformType.FIXED, light, overlay, ms, buffer); - ms.pop(); + itemRenderer.renderStatic(itemStack, TransformType.FIXED, light, overlay, ms, buffer); + ms.popPose(); if (!renderUpright) { if (!blockItem) @@ -143,7 +143,7 @@ public class DepotRenderer extends SafeTileEntityRenderer { ms.translate(0, 0, -1 / 16f); } - ms.pop(); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java index fcdc894a7..ad96c1481 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java @@ -58,24 +58,24 @@ public class EjectorBlock extends HorizontalKineticBlock implements ITE tileEntityOptional = getTileEntityOptional(p_180658_1_, p_180658_2_); - if (tileEntityOptional.isPresent() && !p_180658_3_.bypassesLandingEffects()) { - p_180658_3_.handleFallDamage(p_180658_4_, 0.0F); + if (tileEntityOptional.isPresent() && !p_180658_3_.isSuppressingBounce()) { + p_180658_3_.causeFallDamage(p_180658_4_, 0.0F); return; } - super.onFallenUpon(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_); + super.fallOn(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_); } @Override - public void onLanded(IBlockReader worldIn, Entity entityIn) { - super.onLanded(worldIn, entityIn); - BlockPos position = entityIn.getBlockPos(); + public void updateEntityAfterFallOn(IBlockReader worldIn, Entity entityIn) { + super.updateEntityAfterFallOn(worldIn, entityIn); + BlockPos position = entityIn.blockPosition(); if (!AllBlocks.WEIGHTED_EJECTOR.has(worldIn.getBlockState(position))) return; if (!entityIn.isAlive()) return; - if (entityIn.bypassesLandingEffects()) + if (entityIn.isSuppressingBounce()) return; if (entityIn instanceof ItemEntity) { SharedDepotBlockMethods.onLanded(worldIn, entityIn); @@ -98,41 +98,41 @@ public class EjectorBlock extends HorizontalKineticBlock implements ITE 4 / 16f) { - entityIn.setPosition(vec.x, vec.y, vec.z); + entityIn.setPos(vec.x, vec.y, vec.z); return; } } ejectorTileEntity.activate(); ejectorTileEntity.notifyUpdate(); - if (entityIn.world.isRemote) - AllPackets.channel.sendToServer(new EjectorTriggerPacket(ejectorTileEntity.getPos())); + if (entityIn.level.isClientSide) + AllPackets.channel.sendToServer(new EjectorTriggerPacket(ejectorTileEntity.getBlockPos())); } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { - if (AllItems.WRENCH.isIn(player.getHeldItem(hand))) + if (AllItems.WRENCH.isIn(player.getItemInHand(hand))) return ActionResultType.PASS; return SharedDepotBlockMethods.onUse(state, world, pos, player, hand, ray); } @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { withTileEntityDo(worldIn, pos, EjectorTileEntity::dropFlyingItems); SharedDepotBlockMethods.onReplaced(state, worldIn, pos, newState, isMoving); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(HORIZONTAL_FACING) - .rotateY() + return state.getValue(HORIZONTAL_FACING) + .getClockWise() .getAxis(); } @@ -152,17 +152,17 @@ public class EjectorBlock extends HorizontalKineticBlock implements ITE () -> EjectorTargetHandler.flushSettings(pos)); - return super.onBlockPlaced(pos, world, p_195943_3_, p_195943_4_, p_195943_5_); + return super.updateCustomBlockEntityTag(pos, world, p_195943_3_, p_195943_4_, p_195943_5_); } @Override - public boolean canPlayerBreakBlockWhileHolding(BlockState state, World world, BlockPos pos, + public boolean canAttackBlock(BlockState state, World world, BlockPos pos, PlayerEntity p_195938_4_) { - return !p_195938_4_.isSneaking(); + return !p_195938_4_.isShiftKeyDown(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorPlacementPacket.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorPlacementPacket.java index 3cb0bfc71..54c8e6198 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorPlacementPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorPlacementPacket.java @@ -31,7 +31,7 @@ public class EjectorPlacementPacket extends SimplePacketBase { h = buffer.readInt(); v = buffer.readInt(); pos = buffer.readBlockPos(); - facing = Direction.byIndex(buffer.readVarInt()); + facing = Direction.from3DDataValue(buffer.readVarInt()); } @Override @@ -39,7 +39,7 @@ public class EjectorPlacementPacket extends SimplePacketBase { buffer.writeInt(h); buffer.writeInt(v); buffer.writeBlockPos(pos); - buffer.writeVarInt(facing.getIndex()); + buffer.writeVarInt(facing.get3DDataValue()); } @Override @@ -50,15 +50,15 @@ public class EjectorPlacementPacket extends SimplePacketBase { .getSender(); if (player == null) return; - World world = player.world; - if (world == null || !world.isBlockPresent(pos)) + World world = player.level; + if (world == null || !world.isLoaded(pos)) return; - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); BlockState state = world.getBlockState(pos); if (tileEntity instanceof EjectorTileEntity) ((EjectorTileEntity) tileEntity).setTarget(h, v); if (AllBlocks.WEIGHTED_EJECTOR.has(state)) - world.setBlockState(pos, state.with(EjectorBlock.HORIZONTAL_FACING, facing)); + world.setBlockAndUpdate(pos, state.setValue(EjectorBlock.HORIZONTAL_FACING, facing)); }); context.get() .setPacketHandled(true); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorRenderer.java index 1ddf7bfa7..1f3d6a402 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorRenderer.java @@ -1,6 +1,8 @@ package com.simibubi.create.content.logistics.block.depot; import com.jozufozu.flywheel.backend.Backend; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; +import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; @@ -10,7 +12,6 @@ import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -31,7 +32,7 @@ public class EjectorRenderer extends KineticTileEntityRenderer { } @Override - public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) { + public boolean shouldRenderOffScreen(KineticTileEntity p_188185_1_) { return true; } @@ -41,18 +42,18 @@ public class EjectorRenderer extends KineticTileEntityRenderer { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); EjectorTileEntity ejector = (EjectorTileEntity) te; - IVertexBuilder vertexBuilder = buffer.getBuffer(RenderType.getSolid()); + IVertexBuilder vertexBuilder = buffer.getBuffer(RenderType.solid()); float lidProgress = ((EjectorTileEntity) te).getLidProgress(partialTicks); float angle = lidProgress * 70; - if (!Backend.getInstance().canUseInstancing(te.getWorld())) { + if (!Backend.getInstance().canUseInstancing(te.getLevel())) { SuperByteBuffer model = PartialBufferer.get(AllBlockPartials.EJECTOR_TOP, te.getBlockState()); applyLidAngle(te, angle, model.matrixStacker()); model.light(light) .renderInto(ms, vertexBuilder); } - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); float maxTime = (float) (ejector.earlyTarget != null ? ejector.earlyTargetTime : ejector.launcher.getTotalFlyingTicks()); @@ -61,9 +62,9 @@ public class EjectorRenderer extends KineticTileEntityRenderer { if (time > maxTime) continue; - ms.push(); + ms.pushPose(); Vector3d launchedItemLocation = ejector.getLaunchedItemLocation(time); - msr.translate(launchedItemLocation.subtract(Vector3d.of(te.getPos()))); + msr.translate(launchedItemLocation.subtract(Vector3d.atLowerCornerOf(te.getBlockPos()))); Vector3d itemRotOffset = VecHelper.voxelSpace(0, 3, 0); msr.translate(itemRotOffset); msr.rotateY(AngleHelper.horizontalAngle(ejector.getFacing())); @@ -71,32 +72,32 @@ public class EjectorRenderer extends KineticTileEntityRenderer { msr.translateBack(itemRotOffset); Minecraft.getInstance() .getItemRenderer() - .renderItem(intAttached.getValue(), TransformType.GROUND, light, overlay, ms, buffer); - ms.pop(); + .renderStatic(intAttached.getValue(), TransformType.GROUND, light, overlay, ms, buffer); + ms.popPose(); } DepotBehaviour behaviour = te.getBehaviour(DepotBehaviour.TYPE); if (behaviour == null || behaviour.isEmpty()) return; - ms.push(); + ms.pushPose(); applyLidAngle(te, angle, msr); msr.centre() .rotateY(-180 - AngleHelper.horizontalAngle(te.getBlockState() - .get(EjectorBlock.HORIZONTAL_FACING))) + .getValue(EjectorBlock.HORIZONTAL_FACING))) .unCentre(); DepotRenderer.renderItemsOf(te, partialTicks, ms, buffer, light, overlay, behaviour); - ms.pop(); + ms.popPose(); } - static void applyLidAngle(KineticTileEntity te, float angle, MatrixStacker matrixStacker) { + static void applyLidAngle(KineticTileEntity te, float angle, TransformStack matrixStacker) { applyLidAngle(te, pivot, angle, matrixStacker); } - static void applyLidAngle(KineticTileEntity te, Vector3d rotationOffset, float angle, MatrixStacker matrixStacker) { + static void applyLidAngle(KineticTileEntity te, Vector3d rotationOffset, float angle, TransformStack matrixStacker) { matrixStacker.centre() .rotateY(180 + AngleHelper.horizontalAngle(te.getBlockState() - .get(EjectorBlock.HORIZONTAL_FACING))) + .getValue(EjectorBlock.HORIZONTAL_FACING))) .unCentre() .translate(rotationOffset) .rotateX(-angle) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTargetHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTargetHandler.java index 6fc1c45fc..3d254871b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTargetHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTargetHandler.java @@ -50,15 +50,15 @@ public class EjectorTargetHandler { return; BlockPos pos = event.getPos(); World world = event.getWorld(); - if (!world.isRemote) + if (!world.isClientSide) return; PlayerEntity player = event.getPlayer(); - if (player == null || player.isSpectator() || !player.isSneaking()) + if (player == null || player.isSpectator() || !player.isShiftKeyDown()) return; String key = "weighted_ejector.target_set"; TextFormatting colour = TextFormatting.GOLD; - player.sendStatusMessage(Lang.translate(key).formatted(colour), true); + player.displayClientMessage(Lang.translate(key).withStyle(colour), true); currentSelection = pos; launcher = null; event.setCanceled(true); @@ -69,10 +69,10 @@ public class EjectorTargetHandler { public static void leftClickingBlocksDeselectsThem(PlayerInteractEvent.LeftClickBlock event) { if (currentItem == null) return; - if (!event.getWorld().isRemote) + if (!event.getWorld().isClientSide) return; if (!event.getPlayer() - .isSneaking()) + .isShiftKeyDown()) return; BlockPos pos = event.getPos(); if (pos.equals(currentSelection)) { @@ -99,7 +99,7 @@ public class EjectorTargetHandler { Direction validTargetDirection = getValidTargetDirection(pos); if (validTargetDirection == null) { - player.sendStatusMessage(Lang.translate(key).formatted(colour), true); + player.displayClientMessage(Lang.translate(key).withStyle(colour), true); currentItem = null; currentSelection = null; return; @@ -108,9 +108,9 @@ public class EjectorTargetHandler { key = "weighted_ejector.targeting"; colour = TextFormatting.GREEN; - player.sendStatusMessage( + player.displayClientMessage( Lang.translate(key, currentSelection.getX(), currentSelection.getY(), currentSelection.getZ()) - .formatted(colour), + .withStyle(colour), true); BlockPos diff = pos.subtract(currentSelection); @@ -137,9 +137,9 @@ public class EjectorTargetHandler { return null; if (xDiff == 0) - return Direction.getFacingFromAxis(zDiff < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE, Axis.Z); + return Direction.get(zDiff < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE, Axis.Z); if (zDiff == 0) - return Direction.getFacingFromAxis(xDiff < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE, Axis.X); + return Direction.get(xDiff < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE, Axis.X); return null; } @@ -150,7 +150,7 @@ public class EjectorTargetHandler { if (player == null) return; - ItemStack heldItemMainhand = player.getHeldItemMainhand(); + ItemStack heldItemMainhand = player.getMainHandItem(); if (!AllBlocks.WEIGHTED_EJECTOR.isIn(heldItemMainhand)) { currentItem = null; } else { @@ -167,23 +167,23 @@ public class EjectorTargetHandler { protected static void drawArc() { Minecraft mc = Minecraft.getInstance(); - boolean wrench = AllItems.WRENCH.isIn(mc.player.getHeldItemMainhand()); + boolean wrench = AllItems.WRENCH.isIn(mc.player.getMainHandItem()); if (currentSelection == null) return; if (currentItem == null && !wrench) return; - RayTraceResult objectMouseOver = mc.objectMouseOver; + RayTraceResult objectMouseOver = mc.hitResult; if (!(objectMouseOver instanceof BlockRayTraceResult)) return; BlockRayTraceResult blockRayTraceResult = (BlockRayTraceResult) objectMouseOver; if (blockRayTraceResult.getType() == Type.MISS) return; - BlockPos pos = blockRayTraceResult.getPos(); + BlockPos pos = blockRayTraceResult.getBlockPos(); if (!wrench) - pos = pos.offset(blockRayTraceResult.getFace()); + pos = pos.relative(blockRayTraceResult.getDirection()); int xDiff = currentSelection.getX() - pos.getX(); int yDiff = currentSelection.getY() - pos.getY(); @@ -191,12 +191,12 @@ public class EjectorTargetHandler { int validX = Math.abs(zDiff) > Math.abs(xDiff) ? 0 : xDiff; int validZ = Math.abs(zDiff) < Math.abs(xDiff) ? 0 : zDiff; - BlockPos validPos = currentSelection.add(validX, yDiff, validZ); + BlockPos validPos = currentSelection.offset(validX, yDiff, validZ); Direction d = getValidTargetDirection(validPos); if (d == null) return; - if (launcher == null || lastHoveredBlockPos != pos.toLong()) { - lastHoveredBlockPos = pos.toLong(); + if (launcher == null || lastHoveredBlockPos != pos.asLong()) { + lastHoveredBlockPos = pos.asLong(); launcher = new EntityLauncher(Math.abs(validX + validZ), yDiff); } @@ -207,9 +207,9 @@ public class EjectorTargetHandler { int intColor = valid ? 0x9ede73 : 0xff7171; Vector3d color = ColorHelper.getRGB(intColor); RedstoneParticleData data = new RedstoneParticleData((float) color.x, (float) color.y, (float) color.z, 1); - ClientWorld world = mc.world; + ClientWorld world = mc.level; - AxisAlignedBB bb = new AxisAlignedBB(0, 0, 0, 1, 0, 1).offset(currentSelection.add(-validX, -yDiff, -validZ)); + AxisAlignedBB bb = new AxisAlignedBB(0, 0, 0, 1, 0, 1).move(currentSelection.offset(-validX, -yDiff, -validZ)); CreateClient.OUTLINER.chaseAABB("valid", bb) .colored(intColor) .lineWidth(1 / 16f); @@ -225,25 +225,25 @@ public class EjectorTargetHandler { private static void checkForWrench(ItemStack heldItem) { if (!AllItems.WRENCH.isIn(heldItem)) return; - RayTraceResult objectMouseOver = Minecraft.getInstance().objectMouseOver; + RayTraceResult objectMouseOver = Minecraft.getInstance().hitResult; if (!(objectMouseOver instanceof BlockRayTraceResult)) return; BlockRayTraceResult result = (BlockRayTraceResult) objectMouseOver; - BlockPos pos = result.getPos(); + BlockPos pos = result.getBlockPos(); - TileEntity te = Minecraft.getInstance().world.getTileEntity(pos); + TileEntity te = Minecraft.getInstance().level.getBlockEntity(pos); if (!(te instanceof EjectorTileEntity)) { lastHoveredBlockPos = -1; currentSelection = null; return; } - if (lastHoveredBlockPos == -1 || lastHoveredBlockPos != pos.toLong()) { + if (lastHoveredBlockPos == -1 || lastHoveredBlockPos != pos.asLong()) { EjectorTileEntity ejector = (EjectorTileEntity) te; if (!ejector.getTargetPosition() - .equals(ejector.getPos())) + .equals(ejector.getBlockPos())) currentSelection = ejector.getTargetPosition(); - lastHoveredBlockPos = pos.toLong(); + lastHoveredBlockPos = pos.asLong(); launcher = null; } @@ -252,15 +252,15 @@ public class EjectorTargetHandler { } private static void drawOutline(BlockPos selection) { - World world = Minecraft.getInstance().world; + World world = Minecraft.getInstance().level; if (currentSelection == null) return; BlockPos pos = currentSelection; BlockState state = world.getBlockState(pos); VoxelShape shape = state.getShape(world, pos); - AxisAlignedBB boundingBox = shape.isEmpty() ? new AxisAlignedBB(BlockPos.ZERO) : shape.getBoundingBox(); - CreateClient.OUTLINER.showAABB("target", boundingBox.offset(pos)) + AxisAlignedBB boundingBox = shape.isEmpty() ? new AxisAlignedBB(BlockPos.ZERO) : shape.bounds(); + CreateClient.OUTLINER.showAABB("target", boundingBox.move(pos)) .colored(0xffcb74) .lineWidth(1 / 16f); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTileEntity.java index e99dfe741..bec57a369 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTileEntity.java @@ -6,6 +6,7 @@ import java.util.List; import javax.annotation.Nullable; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -19,8 +20,8 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputB import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.IntAttached; +import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; @@ -28,6 +29,7 @@ import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.block.BlockState; +import net.minecraft.block.ObserverBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.item.ItemEntity; @@ -124,7 +126,7 @@ public class EjectorTileEntity extends KineticTileEntity { } protected boolean cannotLaunch() { - return state != State.CHARGED && !(world.isRemote && state == State.LAUNCHING); + return state != State.CHARGED && !(level.isClientSide && state == State.LAUNCHING); } public void activateDeferred() { @@ -132,10 +134,10 @@ public class EjectorTileEntity extends KineticTileEntity { return; Direction facing = getFacing(); List entities = - world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(pos).grow(-1 / 16f, 0, -1 / 16f)); + level.getEntitiesOfClass(Entity.class, new AxisAlignedBB(worldPosition).inflate(-1 / 16f, 0, -1 / 16f)); // Launch Items - boolean doLogic = !world.isRemote || isVirtual(); + boolean doLogic = !level.isClientSide || isVirtual(); if (doLogic) launchItems(); @@ -149,33 +151,33 @@ public class EjectorTileEntity extends KineticTileEntity { entity.onGround = false; - if (isPlayerEntity != world.isRemote) + if (isPlayerEntity != level.isClientSide) continue; - entity.setPosition(pos.getX() + .5f, pos.getY() + 1, pos.getZ() + .5f); + entity.setPos(worldPosition.getX() + .5f, worldPosition.getY() + 1, worldPosition.getZ() + .5f); launcher.applyMotion(entity, facing); if (!isPlayerEntity) continue; PlayerEntity playerEntity = (PlayerEntity) entity; - if (!(playerEntity.getItemStackFromSlot(EquipmentSlotType.CHEST) + if (!(playerEntity.getItemBySlot(EquipmentSlotType.CHEST) .getItem() instanceof ElytraItem)) continue; - playerEntity.rotationYaw = facing.getHorizontalAngle(); - playerEntity.rotationPitch = -35; - playerEntity.setMotion(playerEntity.getMotion() + playerEntity.yRot = facing.toYRot(); + playerEntity.xRot = -35; + playerEntity.setDeltaMovement(playerEntity.getDeltaMovement() .scale(.75f)); deployElytra(playerEntity); - AllPackets.channel.sendToServer(new EjectorElytraPacket(pos)); + AllPackets.channel.sendToServer(new EjectorElytraPacket(worldPosition)); } if (doLogic) { lidProgress.chase(1, .8f, Chaser.EXP); state = State.LAUNCHING; - if (!world.isRemote) { - world.playSound(null, pos, SoundEvents.BLOCK_WOODEN_TRAPDOOR_CLOSE, SoundCategory.BLOCKS, .35f, 1f); - world.playSound(null, pos, SoundEvents.BLOCK_CHEST_OPEN, SoundCategory.BLOCKS, .1f, 1.4f); + if (!level.isClientSide) { + level.playSound(null, worldPosition, SoundEvents.WOODEN_TRAPDOOR_CLOSE, SoundCategory.BLOCKS, .35f, 1f); + level.playSound(null, worldPosition, SoundEvents.CHEST_OPEN, SoundCategory.BLOCKS, .1f, 1.4f); } } } @@ -188,7 +190,7 @@ public class EjectorTileEntity extends KineticTileEntity { ItemStack heldItemStack = depotBehaviour.getHeldItemStack(); Direction funnelFacing = getFacing().getOpposite(); - if (AbstractFunnelBlock.getFunnelFacing(world.getBlockState(pos.up())) == funnelFacing) { + if (AbstractFunnelBlock.getFunnelFacing(level.getBlockState(worldPosition.above())) == funnelFacing) { DirectBeltInputBehaviour directOutput = getBehaviour(DirectBeltInputBehaviour.TYPE); if (depotBehaviour.heldItem != null) { @@ -197,7 +199,7 @@ public class EjectorTileEntity extends KineticTileEntity { ; else if (remainder.isEmpty()) depotBehaviour.removeHeldItem(); - else if (!remainder.isItemEqual(heldItemStack)) + else if (!remainder.sameItem(heldItemStack)) depotBehaviour.heldItem.stack = remainder; } @@ -209,7 +211,7 @@ public class EjectorTileEntity extends KineticTileEntity { ; else if (remainder.isEmpty()) iterator.remove(); - else if (!remainder.isItemEqual(stack)) + else if (!remainder.sameItem(stack)) transportedItemStack.stack = remainder; } @@ -223,8 +225,15 @@ public class EjectorTileEntity extends KineticTileEntity { return; } - if (!world.isRemote) - world.markAndNotifyBlock(pos, world.getChunkAt(pos), getBlockState(), getBlockState(), 0, 512); + if (!level.isClientSide) + for (Direction d : Iterate.directions) { + BlockState blockState = level.getBlockState(worldPosition.relative(d)); + if (!(blockState.getBlock() instanceof ObserverBlock)) + continue; + if (blockState.getValue(ObserverBlock.FACING) != d.getOpposite()) + continue; + blockState.updateShape(d.getOpposite(), blockState, level, worldPosition.relative(d), worldPosition); + } if (depotBehaviour.heldItem != null) { addToLaunchedItems(heldItemStack); @@ -244,7 +253,7 @@ public class EjectorTileEntity extends KineticTileEntity { } protected boolean addToLaunchedItems(ItemStack stack) { - if ((!world.isRemote || isVirtual()) && trackedItem == null && scanCooldown == 0) { + if ((!level.isClientSide || isVirtual()) && trackedItem == null && scanCooldown == 0) { scanCooldown = AllConfigs.SERVER.kinetics.ejectorScanInterval.get(); trackedItem = stack; } @@ -255,7 +264,7 @@ public class EjectorTileEntity extends KineticTileEntity { BlockState blockState = getBlockState(); if (!AllBlocks.WEIGHTED_EJECTOR.has(blockState)) return Direction.UP; - Direction facing = blockState.get(EjectorBlock.HORIZONTAL_FACING); + Direction facing = blockState.getValue(EjectorBlock.HORIZONTAL_FACING); return facing; } @@ -263,7 +272,7 @@ public class EjectorTileEntity extends KineticTileEntity { public void tick() { super.tick(); - boolean doLogic = !world.isRemote || isVirtual(); + boolean doLogic = !level.isClientSide || isVirtual(); State prevState = state; float totalTime = Math.max(3, (float) launcher.getTotalFlyingTicks()); @@ -322,8 +331,8 @@ public class EjectorTileEntity extends KineticTileEntity { int soundRate = (int) (1 / (getWindUpSpeed() * 5)) + 1; float volume = .125f; float pitch = 1.5f - lidProgress.getValue(); - if (((int) world.getGameTime()) % soundRate == 0 && doLogic) - world.playSound(null, pos, SoundEvents.BLOCK_WOODEN_BUTTON_CLICK_OFF, SoundCategory.BLOCKS, volume, + if (((int) level.getGameTime()) % soundRate == 0 && doLogic) + level.playSound(null, worldPosition, SoundEvents.WOODEN_BUTTON_CLICK_OFF, SoundCategory.BLOCKS, volume, pitch); } } @@ -340,7 +349,7 @@ public class EjectorTileEntity extends KineticTileEntity { Vector3d target = getLaunchedItemLocation(time + 1); BlockRayTraceResult rayTraceBlocks = - world.rayTraceBlocks(new RayTraceContext(source, target, BlockMode.COLLIDER, FluidMode.NONE, null)); + level.clip(new RayTraceContext(source, target, BlockMode.COLLIDER, FluidMode.NONE, null)); if (rayTraceBlocks.getType() == Type.MISS) { if (earlyTarget != null && earlyTargetTime < time + 1) { earlyTarget = null; @@ -349,19 +358,19 @@ public class EjectorTileEntity extends KineticTileEntity { return false; } - Vector3d vec = rayTraceBlocks.getHitVec(); - earlyTarget = Pair.of(vec.add(Vector3d.of(rayTraceBlocks.getFace() - .getDirectionVec()).scale(.25f)), rayTraceBlocks.getPos()); + Vector3d vec = rayTraceBlocks.getLocation(); + earlyTarget = Pair.of(vec.add(Vector3d.atLowerCornerOf(rayTraceBlocks.getDirection() + .getNormal()).scale(.25f)), rayTraceBlocks.getBlockPos()); earlyTargetTime = (float) (time + (source.distanceTo(vec) / source.distanceTo(target))); sendData(); return true; } protected void nudgeEntities() { - for (Entity entity : world.getEntitiesWithinAABB(Entity.class, - new AxisAlignedBB(pos).grow(-1 / 16f, 0, -1 / 16f))) + for (Entity entity : level.getEntitiesOfClass(Entity.class, + new AxisAlignedBB(worldPosition).inflate(-1 / 16f, 0, -1 / 16f))) if (!(entity instanceof PlayerEntity)) - entity.setPosition(entity.getX(), entity.getY() + .125f, entity.getZ()); + entity.setPos(entity.getX(), entity.getY() + .125f, entity.getZ()); } protected void ejectIfTriggered() { @@ -377,7 +386,7 @@ public class EjectorTileEntity extends KineticTileEntity { Direction funnelFacing = getFacing().getOpposite(); ItemStack held = depotBehaviour.getHeldItemStack(); - if (AbstractFunnelBlock.getFunnelFacing(world.getBlockState(pos.up())) == funnelFacing) { + if (AbstractFunnelBlock.getFunnelFacing(level.getBlockState(worldPosition.above())) == funnelFacing) { DirectBeltInputBehaviour directOutput = getBehaviour(DirectBeltInputBehaviour.TYPE); if (depotBehaviour.heldItem != null) { ItemStack tryFunnel = directOutput.tryExportingToBeltFunnel(held, funnelFacing, true); @@ -416,25 +425,25 @@ public class EjectorTileEntity extends KineticTileEntity { Vector3d ejectVec = earlyTarget != null ? earlyTarget.getFirst() : getLaunchedItemLocation(maxTime); Vector3d ejectMotionVec = getLaunchedItemMotion(maxTime); - ItemEntity item = new ItemEntity(world, ejectVec.x, ejectVec.y, ejectVec.z, intAttached.getValue()); - item.setMotion(ejectMotionVec); - item.setDefaultPickupDelay(); - world.addEntity(item); + ItemEntity item = new ItemEntity(level, ejectVec.x, ejectVec.y, ejectVec.z, intAttached.getValue()); + item.setDeltaMovement(ejectMotionVec); + item.setDefaultPickUpDelay(); + level.addFreshEntity(item); } public DirectBeltInputBehaviour getTargetOpenInv() { BlockPos targetPos = earlyTarget != null ? earlyTarget.getSecond() - : pos.up(launcher.getVerticalDistance()) - .offset(getFacing(), Math.max(1, launcher.getHorizontalDistance())); - return TileEntityBehaviour.get(world, targetPos, DirectBeltInputBehaviour.TYPE); + : worldPosition.above(launcher.getVerticalDistance()) + .relative(getFacing(), Math.max(1, launcher.getHorizontalDistance())); + return TileEntityBehaviour.get(level, targetPos, DirectBeltInputBehaviour.TYPE); } public Vector3d getLaunchedItemLocation(float time) { - return launcher.getGlobalPos(time, getFacing().getOpposite(), pos); + return launcher.getGlobalPos(time, getFacing().getOpposite(), worldPosition); } public Vector3d getLaunchedItemMotion(float time) { - return launcher.getGlobalVelocity(time, getFacing().getOpposite(), pos) + return launcher.getGlobalVelocity(time, getFacing().getOpposite(), worldPosition) .scale(.5f); } @@ -442,11 +451,11 @@ public class EjectorTileEntity extends KineticTileEntity { for (IntAttached intAttached : launchedItems) { Vector3d ejectVec = getLaunchedItemLocation(intAttached.getFirst()); Vector3d ejectMotionVec = getLaunchedItemMotion(intAttached.getFirst()); - ItemEntity item = new ItemEntity(world, 0, 0, 0, intAttached.getValue()); - item.setPos(ejectVec.x, ejectVec.y, ejectVec.z); - item.setMotion(ejectMotionVec); - item.setDefaultPickupDelay(); - world.addEntity(item); + ItemEntity item = new ItemEntity(level, 0, 0, 0, intAttached.getValue()); + item.setPosRaw(ejectVec.x, ejectVec.y, ejectVec.z); + item.setDeltaMovement(ejectMotionVec); + item.setDefaultPickUpDelay(); + level.addFreshEntity(item); } launchedItems.clear(); } @@ -505,7 +514,7 @@ public class EjectorTileEntity extends KineticTileEntity { state = NBTHelper.readEnum(compound, "State", State.class); lidProgress.readNBT(compound.getCompound("Lid"), false); launchedItems = NBTHelper.readCompoundList(compound.getList("LaunchedItems", NBT.TAG_COMPOUND), - nbt -> IntAttached.read(nbt, ItemStack::read)); + nbt -> IntAttached.read(nbt, ItemStack::of)); earlyTarget = null; earlyTargetTime = 0; @@ -520,7 +529,7 @@ public class EjectorTileEntity extends KineticTileEntity { } public void updateSignal() { - boolean shoudPower = world.isBlockPowered(pos); + boolean shoudPower = level.hasNeighborSignal(worldPosition); if (shoudPower == powered) return; powered = shoudPower; @@ -535,10 +544,10 @@ public class EjectorTileEntity extends KineticTileEntity { public BlockPos getTargetPosition() { BlockState blockState = getBlockState(); if (!AllBlocks.WEIGHTED_EJECTOR.has(blockState)) - return pos; - Direction facing = blockState.get(EjectorBlock.HORIZONTAL_FACING); - return pos.offset(facing, launcher.getHorizontalDistance()) - .up(launcher.getVerticalDistance()); + return worldPosition; + Direction facing = blockState.getValue(EjectorBlock.HORIZONTAL_FACING); + return worldPosition.relative(facing, launcher.getHorizontalDistance()) + .above(launcher.getVerticalDistance()); } @Override @@ -569,8 +578,8 @@ public class EjectorTileEntity extends KineticTileEntity { @Override @OnlyIn(Dist.CLIENT) - public double getMaxRenderDistanceSquared() { - return super.getMaxRenderDistanceSquared() * 16; + public double getViewDistance() { + return super.getViewDistance() * 16; } private static abstract class EntityHack extends Entity { @@ -580,8 +589,8 @@ public class EjectorTileEntity extends KineticTileEntity { } public static void setElytraFlying(Entity e) { - EntityDataManager data = e.getDataManager(); - data.set(FLAGS, (byte) (data.get(FLAGS) | 1 << 7)); + EntityDataManager data = e.getEntityData(); + data.set(DATA_SHARED_FLAGS_ID, (byte) (data.get(DATA_SHARED_FLAGS_ID) | 1 << 7)); } } @@ -595,14 +604,14 @@ public class EjectorTileEntity extends KineticTileEntity { @Override protected void rotate(BlockState state, MatrixStack ms) { - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(angle(state)) .rotateX(90); } protected float angle(BlockState state) { float horizontalAngle = AllBlocks.WEIGHTED_EJECTOR.has(state) - ? AngleHelper.horizontalAngle(state.get(EjectorBlock.HORIZONTAL_FACING)) + ? AngleHelper.horizontalAngle(state.getValue(EjectorBlock.HORIZONTAL_FACING)) : 0; return horizontalAngle; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EntityLauncher.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EntityLauncher.java index a2ae91d02..281d248ee 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EntityLauncher.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EntityLauncher.java @@ -24,7 +24,7 @@ public class EntityLauncher { public void clamp(int max) { set(Math.min(horizontalDistance, max), - MathHelper.signum(verticalDistance) * Math.min(Math.abs(verticalDistance), max)); + MathHelper.sign(verticalDistance) * Math.min(Math.abs(verticalDistance), max)); } public void set(int horizontalDistance, int verticalDistance) { @@ -36,7 +36,7 @@ public class EntityLauncher { public void applyMotion(Entity entity, Direction facing) { Vector3d motionVec = new Vector3d(0, yMotion, xMotion); motionVec = VecHelper.rotate(motionVec, AngleHelper.horizontalAngle(facing), Axis.Y); - entity.setMotion(motionVec.x * .91, motionVec.y * .98, motionVec.z * .91); + entity.setDeltaMovement(motionVec.x * .91, motionVec.y * .98, motionVec.z * .91); } public int getHorizontalDistance() { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java index 55ba80aad..4d630916d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java @@ -33,9 +33,9 @@ public class SharedDepotBlockMethods { public static ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { - if (ray.getFace() != Direction.UP) + if (ray.getDirection() != Direction.UP) return ActionResultType.PASS; - if (world.isRemote) + if (world.isClientSide) return ActionResultType.SUCCESS; DepotBehaviour behaviour = get(world, pos); @@ -44,7 +44,7 @@ public class SharedDepotBlockMethods { if (!behaviour.canAcceptItems.get()) return ActionResultType.SUCCESS; - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); boolean wasEmptyHanded = heldItem.isEmpty(); boolean shouldntPlaceItem = AllBlocks.MECHANICAL_ARM.isIn(heldItem); @@ -52,7 +52,7 @@ public class SharedDepotBlockMethods { if (!mainItemStack.isEmpty()) { player.inventory.placeItemBackInInventory(world, mainItemStack); behaviour.removeHeldItem(); - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, .2f, + world.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundCategory.PLAYERS, .2f, 1f + Create.RANDOM.nextFloat()); } ItemStackHandler outputs = behaviour.processingOutputBuffer; @@ -61,11 +61,11 @@ public class SharedDepotBlockMethods { if (!wasEmptyHanded && !shouldntPlaceItem) { TransportedItemStack transported = new TransportedItemStack(heldItem); - transported.insertedFrom = player.getHorizontalFacing(); + transported.insertedFrom = player.getDirection(); transported.prevBeltPosition = .25f; transported.beltPosition = .25f; behaviour.setHeldItem(transported); - player.setHeldItem(hand, ItemStack.EMPTY); + player.setItemInHand(hand, ItemStack.EMPTY); AllSoundEvents.DEPOT_SLIDE.playOnServer(world, pos); } @@ -82,11 +82,11 @@ public class SharedDepotBlockMethods { return; ItemHelper.dropContents(worldIn, pos, behaviour.processingOutputBuffer); for (TransportedItemStack transportedItemStack : behaviour.incoming) - InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), transportedItemStack.stack); + InventoryHelper.dropItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), transportedItemStack.stack); if (!behaviour.getHeldItemStack() .isEmpty()) - InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), behaviour.getHeldItemStack()); - worldIn.removeTileEntity(pos); + InventoryHelper.dropItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), behaviour.getHeldItemStack()); + worldIn.removeBlockEntity(pos); } public static void onLanded(IBlockReader worldIn, Entity entityIn) { @@ -94,12 +94,12 @@ public class SharedDepotBlockMethods { return; if (!entityIn.isAlive()) return; - if (entityIn.world.isRemote) + if (entityIn.level.isClientSide) return; ItemEntity itemEntity = (ItemEntity) entityIn; DirectBeltInputBehaviour inputBehaviour = - TileEntityBehaviour.get(worldIn, entityIn.getBlockPos(), DirectBeltInputBehaviour.TYPE); + TileEntityBehaviour.get(worldIn, entityIn.blockPosition(), DirectBeltInputBehaviour.TYPE); if (inputBehaviour == null) return; ItemStack remainder = inputBehaviour.handleInsertion(itemEntity.getItem(), Direction.DOWN, false); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AbstractDiodeBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AbstractDiodeBlock.java index 4d43d897f..433b637d6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AbstractDiodeBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AbstractDiodeBlock.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.block.diodes; import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import net.minecraft.block.BlockState; import net.minecraft.block.RedstoneDiodeBlock; public abstract class AbstractDiodeBlock extends RedstoneDiodeBlock implements IWrenchable { @@ -9,5 +10,9 @@ public abstract class AbstractDiodeBlock extends RedstoneDiodeBlock implements I public AbstractDiodeBlock(Properties builder) { super(builder); } - + + @Override + public boolean isSignalSource(BlockState state) { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AbstractDiodeGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AbstractDiodeGenerator.java index 7093f3d29..348b2e0e6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AbstractDiodeGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AbstractDiodeGenerator.java @@ -42,7 +42,7 @@ public abstract class AbstractDiodeGenerator extends SpecialBlockStateGen { @Override protected final int getYRotation(BlockState state) { - return horizontalAngle(state.get(AbstractDiodeBlock.HORIZONTAL_FACING)); + return horizontalAngle(state.getValue(AbstractDiodeBlock.FACING)); } abstract Vector createModels(DataGenContext ctx, BlockModelProvider prov); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustablePulseRepeaterTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustablePulseRepeaterTileEntity.java index a3639fd05..4620d7393 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustablePulseRepeaterTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustablePulseRepeaterTileEntity.java @@ -17,12 +17,12 @@ public class AdjustablePulseRepeaterTileEntity extends AdjustableRepeaterTileEnt if (charging && atMax) { if (powering) { - world.setBlockState(pos, getBlockState().with(POWERING, false)); + level.setBlockAndUpdate(worldPosition, getBlockState().setValue(POWERING, false)); charging = false; return; } - if (!powering && !world.isRemote) - world.setBlockState(pos, getBlockState().with(POWERING, true)); + if (!powering && !level.isClientSide) + level.setBlockAndUpdate(worldPosition, getBlockState().setValue(POWERING, true)); return; } @@ -30,8 +30,8 @@ public class AdjustablePulseRepeaterTileEntity extends AdjustableRepeaterTileEnt return; if (!charging && !atMin) { - if (!world.isRemote) - world.setBlockState(pos, getBlockState().with(POWERING, false)); + if (!level.isClientSide) + level.setBlockAndUpdate(worldPosition, getBlockState().setValue(POWERING, false)); state = 0; return; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterBlock.java index 3ba865ded..f17b34785 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterBlock.java @@ -18,14 +18,14 @@ public class AdjustableRepeaterBlock extends AbstractDiodeBlock { public AdjustableRepeaterBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(POWERED, false) - .with(POWERING, false)); + registerDefaultState(defaultBlockState().setValue(POWERED, false) + .setValue(POWERING, false)); } @Override - protected void fillStateContainer(Builder builder) { - builder.add(POWERED, POWERING, HORIZONTAL_FACING); - super.fillStateContainer(builder); + protected void createBlockStateDefinition(Builder builder) { + builder.add(POWERED, POWERING, FACING); + super.createBlockStateDefinition(builder); } @Override @@ -40,13 +40,13 @@ public class AdjustableRepeaterBlock extends AbstractDiodeBlock { } @Override - protected int getActiveSignal(IBlockReader worldIn, BlockPos pos, BlockState state) { - return state.get(POWERING) ? 15 : 0; + protected int getOutputSignal(IBlockReader worldIn, BlockPos pos, BlockState state) { + return state.getValue(POWERING) ? 15 : 0; } @Override - public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { - return blockState.get(HORIZONTAL_FACING) == side ? this.getActiveSignal(blockAccess, pos, blockState) : 0; + public int getSignal(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { + return blockState.getValue(FACING) == side ? this.getOutputSignal(blockAccess, pos, blockState) : 0; } @Override @@ -58,7 +58,7 @@ public class AdjustableRepeaterBlock extends AbstractDiodeBlock { public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, Direction side) { if (side == null) return false; - return side.getAxis() == state.get(HORIZONTAL_FACING) + return side.getAxis() == state.getValue(FACING) .getAxis(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterGenerator.java index 201675c68..ada44ac84 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterGenerator.java @@ -33,7 +33,7 @@ public class AdjustableRepeaterGenerator extends AbstractDiodeGenerator { @Override int getModelIndex(BlockState state) { - return (state.get(AdjustableRepeaterBlock.POWERING) ? 2 : 0) + (state.get(AdjustableRepeaterBlock.POWERED) ? 1 : 0); + return (state.getValue(AdjustableRepeaterBlock.POWERING) ? 2 : 0) + (state.getValue(AdjustableRepeaterBlock.POWERED) ? 1 : 0); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterInstance.java index 4d278d0b5..4bdb50b04 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterInstance.java @@ -1,13 +1,14 @@ package com.simibubi.create.content.logistics.block.diodes; import com.jozufozu.flywheel.backend.instancing.ITickableInstance; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; +import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.ModelData; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; public class AdjustableRepeaterInstance extends TileEntityInstance implements ITickableInstance { @@ -18,10 +19,12 @@ public class AdjustableRepeaterInstance extends TileEntityInstance modelManager, AdjustableRepeaterTileEntity tile) { super(modelManager, tile); - indicator = modelManager.getTransformMaterial().getModel(AllBlockPartials.FLEXPEATER_INDICATOR, blockState).createInstance(); + indicator = modelManager.defaultSolid() + .material(Materials.TRANSFORMED) + .getModel(AllBlockPartials.FLEXPEATER_INDICATOR, blockState).createInstance(); MatrixStack ms = new MatrixStack(); - MatrixStacker.of(ms).translate(getInstancePosition()); + MatrixTransformStack.of(ms).translate(getInstancePosition()); indicator .setTransform(ms) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterScrollSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterScrollSlot.java index 54d084788..5684ab080 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterScrollSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterScrollSlot.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.logistics.block.diodes; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -19,8 +19,8 @@ public class AdjustableRepeaterScrollSlot extends ValueBoxTransform { @Override protected void rotate(BlockState state, MatrixStack ms) { - float yRot = AngleHelper.horizontalAngle(state.get(BlockStateProperties.HORIZONTAL_FACING)) + 180; - MatrixStacker.of(ms) + float yRot = AngleHelper.horizontalAngle(state.getValue(BlockStateProperties.HORIZONTAL_FACING)) + 180; + MatrixTransformStack.of(ms) .rotateY(yRot) .rotateX(90); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterTileEntity.java index c678c6085..e21121bdc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterTileEntity.java @@ -90,8 +90,8 @@ public class AdjustableRepeaterTileEntity extends SmartTileEntity implements IIn @Override public void tick() { super.tick(); - boolean powered = getBlockState().get(POWERED); - boolean powering = getBlockState().get(POWERING); + boolean powered = getBlockState().getValue(POWERED); + boolean powering = getBlockState().getValue(POWERING); boolean atMax = state >= maxState.getValue(); boolean atMin = state <= 0; updateState(powered, powering, atMax, atMin); @@ -102,16 +102,16 @@ public class AdjustableRepeaterTileEntity extends SmartTileEntity implements IIn charging = true; if (charging && atMax) { - if (!powering && !world.isRemote) - world.setBlockState(pos, getBlockState().with(POWERING, true)); + if (!powering && !level.isClientSide) + level.setBlockAndUpdate(worldPosition, getBlockState().setValue(POWERING, true)); if (!powered) charging = false; return; } if (!charging && atMin) { - if (powering && !world.isRemote) - world.setBlockState(pos, getBlockState().with(POWERING, false)); + if (powering && !level.isClientSide) + level.setBlockAndUpdate(worldPosition, getBlockState().setValue(POWERING, false)); return; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/PoweredLatchBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/PoweredLatchBlock.java index 81f4670ae..f5a27b6a5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/PoweredLatchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/PoweredLatchBlock.java @@ -22,84 +22,84 @@ public class PoweredLatchBlock extends ToggleLatchBlock { public PoweredLatchBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(POWERED_SIDE, false)); + registerDefaultState(defaultBlockState().setValue(POWERED_SIDE, false)); } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(POWERED_SIDE)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(POWERED_SIDE)); } @Override - protected void updateState(World worldIn, BlockPos pos, BlockState state) { - boolean back = state.get(POWERED); - boolean shouldBack = shouldBePowered(worldIn, pos, state); - boolean side = state.get(POWERED_SIDE); + protected void checkTickOnNeighbor(World worldIn, BlockPos pos, BlockState state) { + boolean back = state.getValue(POWERED); + boolean shouldBack = shouldTurnOn(worldIn, pos, state); + boolean side = state.getValue(POWERED_SIDE); boolean shouldSide = isPoweredOnSides(worldIn, pos, state); TickPriority tickpriority = TickPriority.HIGH; - if (this.isFacingTowardsRepeater(worldIn, pos, state)) + if (this.shouldPrioritize(worldIn, pos, state)) tickpriority = TickPriority.EXTREMELY_HIGH; else if (side || back) tickpriority = TickPriority.VERY_HIGH; - if (worldIn.getPendingBlockTicks().isTickPending(pos, this)) + if (worldIn.getBlockTicks().willTickThisTick(pos, this)) return; if (back != shouldBack || side != shouldSide) - worldIn.getPendingBlockTicks().scheduleTick(pos, this, this.getDelay(state), tickpriority); + worldIn.getBlockTicks().scheduleTick(pos, this, this.getDelay(state), tickpriority); } protected boolean isPoweredOnSides(World worldIn, BlockPos pos, BlockState state) { - Direction direction = state.get(HORIZONTAL_FACING); - Direction left = direction.rotateY(); - Direction right = direction.rotateYCCW(); + Direction direction = state.getValue(FACING); + Direction left = direction.getClockWise(); + Direction right = direction.getCounterClockWise(); for (Direction d : new Direction[] { left, right }) { - BlockPos blockpos = pos.offset(d); - int i = worldIn.getRedstonePower(blockpos, d); + BlockPos blockpos = pos.relative(d); + int i = worldIn.getSignal(blockpos, d); if (i > 0) return true; BlockState blockstate = worldIn.getBlockState(blockpos); - if (blockstate.getBlock() == Blocks.REDSTONE_WIRE && blockstate.get(RedstoneWireBlock.POWER) > 0) + if (blockstate.getBlock() == Blocks.REDSTONE_WIRE && blockstate.getValue(RedstoneWireBlock.POWER) > 0) return true; } return false; } @Override - public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { - boolean back = state.get(POWERED); - boolean shouldBack = this.shouldBePowered(worldIn, pos, state); - boolean side = state.get(POWERED_SIDE); + public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { + boolean back = state.getValue(POWERED); + boolean shouldBack = this.shouldTurnOn(worldIn, pos, state); + boolean side = state.getValue(POWERED_SIDE); boolean shouldSide = isPoweredOnSides(worldIn, pos, state); BlockState stateIn = state; if (back != shouldBack) { - state = state.with(POWERED, shouldBack); + state = state.setValue(POWERED, shouldBack); if (shouldBack) - state = state.with(POWERING, true); + state = state.setValue(POWERING, true); else if (side) - state = state.with(POWERING, false); + state = state.setValue(POWERING, false); } if (side != shouldSide) { - state = state.with(POWERED_SIDE, shouldSide); + state = state.setValue(POWERED_SIDE, shouldSide); if (shouldSide) - state = state.with(POWERING, false); + state = state.setValue(POWERING, false); else if (back) - state = state.with(POWERING, true); + state = state.setValue(POWERING, true); } if (state != stateIn) - worldIn.setBlockState(pos, state, 2); + worldIn.setBlock(pos, state, 2); } @Override protected ActionResultType activated(World worldIn, BlockPos pos, BlockState state) { - if (state.get(POWERED) != state.get(POWERED_SIDE)) + if (state.getValue(POWERED) != state.getValue(POWERED_SIDE)) return ActionResultType.PASS; - if (!worldIn.isRemote) - worldIn.setBlockState(pos, state.cycle(POWERING), 2); + if (!worldIn.isClientSide) + worldIn.setBlock(pos, state.cycle(POWERING), 2); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/PoweredLatchGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/PoweredLatchGenerator.java index 305c3e724..e09fabc11 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/PoweredLatchGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/PoweredLatchGenerator.java @@ -29,7 +29,7 @@ public class PoweredLatchGenerator extends AbstractDiodeGenerator { @Override int getModelIndex(BlockState state) { - return state.get(PoweredLatchBlock.POWERING)? 1 : 0; + return state.getValue(PoweredLatchBlock.POWERING)? 1 : 0; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/PulseRepeaterBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/PulseRepeaterBlock.java index d15a129ad..51a04bb4a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/PulseRepeaterBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/PulseRepeaterBlock.java @@ -18,7 +18,7 @@ public class PulseRepeaterBlock extends AbstractDiodeBlock { public PulseRepeaterBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(PULSING, false).with(POWERED, false)); + registerDefaultState(defaultBlockState().setValue(PULSING, false).setValue(POWERED, false)); } @Override @@ -30,35 +30,35 @@ public class PulseRepeaterBlock extends AbstractDiodeBlock { public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, Direction side) { if (side == null) return false; - return side.getAxis() == state.get(HORIZONTAL_FACING).getAxis(); + return side.getAxis() == state.getValue(FACING).getAxis(); } @Override - public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { - boolean powered = state.get(POWERED); - boolean pulsing = state.get(PULSING); - boolean shouldPower = shouldBePowered(worldIn, pos, state); + public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { + boolean powered = state.getValue(POWERED); + boolean pulsing = state.getValue(PULSING); + boolean shouldPower = shouldTurnOn(worldIn, pos, state); if (pulsing) { - worldIn.setBlockState(pos, state.with(POWERED, shouldPower).with(PULSING, false), 2); + worldIn.setBlock(pos, state.setValue(POWERED, shouldPower).setValue(PULSING, false), 2); } else if (powered && !shouldPower) { - worldIn.setBlockState(pos, state.with(POWERED, false).with(PULSING, false), 2); + worldIn.setBlock(pos, state.setValue(POWERED, false).setValue(PULSING, false), 2); } else if (!powered) { - worldIn.setBlockState(pos, state.with(POWERED, true).with(PULSING, true), 2); - worldIn.getPendingBlockTicks().scheduleTick(pos, this, this.getDelay(state), TickPriority.HIGH); + worldIn.setBlock(pos, state.setValue(POWERED, true).setValue(PULSING, true), 2); + worldIn.getBlockTicks().scheduleTick(pos, this, this.getDelay(state), TickPriority.HIGH); } } @Override - protected int getActiveSignal(IBlockReader worldIn, BlockPos pos, BlockState state) { - return state.get(PULSING) ? 15 : 0; + protected int getOutputSignal(IBlockReader worldIn, BlockPos pos, BlockState state) { + return state.getValue(PULSING) ? 15 : 0; } @Override - protected void fillStateContainer(Builder builder) { - builder.add(HORIZONTAL_FACING, POWERED, PULSING); - super.fillStateContainer(builder); + protected void createBlockStateDefinition(Builder builder) { + builder.add(FACING, POWERED, PULSING); + super.createBlockStateDefinition(builder); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/PulseRepeaterGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/PulseRepeaterGenerator.java index fd61ed1a8..c301ec552 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/PulseRepeaterGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/PulseRepeaterGenerator.java @@ -30,7 +30,7 @@ public class PulseRepeaterGenerator extends AbstractDiodeGenerator { @Override int getModelIndex(BlockState state) { - return state.get(PulseRepeaterBlock.PULSING) ? 2 : state.get(PulseRepeaterBlock.POWERED) ? 1 : 0; + return state.getValue(PulseRepeaterBlock.PULSING) ? 2 : state.getValue(PulseRepeaterBlock.POWERED) ? 1 : 0; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/ToggleLatchBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/ToggleLatchBlock.java index 4f378f8cb..fc07e4a61 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/ToggleLatchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/ToggleLatchBlock.java @@ -24,18 +24,18 @@ public class ToggleLatchBlock extends AbstractDiodeBlock { public ToggleLatchBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(POWERING, false) - .with(POWERED, false)); + registerDefaultState(defaultBlockState().setValue(POWERING, false) + .setValue(POWERED, false)); } @Override - protected void fillStateContainer(Builder builder) { - builder.add(POWERED, POWERING, HORIZONTAL_FACING); + protected void createBlockStateDefinition(Builder builder) { + builder.add(POWERED, POWERING, FACING); } @Override - public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { - return blockState.get(HORIZONTAL_FACING) == side ? this.getActiveSignal(blockAccess, pos, blockState) : 0; + public int getSignal(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { + return blockState.getValue(FACING) == side ? this.getOutputSignal(blockAccess, pos, blockState) : 0; } @Override @@ -44,34 +44,34 @@ public class ToggleLatchBlock extends AbstractDiodeBlock { } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - if (!player.isAllowEdit()) + if (!player.mayBuild()) return ActionResultType.PASS; - if (player.isSneaking()) + if (player.isShiftKeyDown()) return ActionResultType.PASS; - if (AllItems.WRENCH.isIn(player.getHeldItem(handIn))) + if (AllItems.WRENCH.isIn(player.getItemInHand(handIn))) return ActionResultType.PASS; return activated(worldIn, pos, state); } @Override - protected int getActiveSignal(IBlockReader worldIn, BlockPos pos, BlockState state) { - return state.get(POWERING) ? 15 : 0; + protected int getOutputSignal(IBlockReader worldIn, BlockPos pos, BlockState state) { + return state.getValue(POWERING) ? 15 : 0; } @Override - public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { - boolean poweredPreviously = state.get(POWERED); - super.scheduledTick(state, worldIn, pos, random); + public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { + boolean poweredPreviously = state.getValue(POWERED); + super.tick(state, worldIn, pos, random); BlockState newState = worldIn.getBlockState(pos); - if (newState.get(POWERED) && !poweredPreviously) - worldIn.setBlockState(pos, newState.cycle(POWERING), 2); + if (newState.getValue(POWERED) && !poweredPreviously) + worldIn.setBlock(pos, newState.cycle(POWERING), 2); } protected ActionResultType activated(World worldIn, BlockPos pos, BlockState state) { - if (!worldIn.isRemote) - worldIn.setBlockState(pos, state.cycle(POWERING), 2); + if (!worldIn.isClientSide) + worldIn.setBlock(pos, state.cycle(POWERING), 2); return ActionResultType.SUCCESS; } @@ -79,7 +79,7 @@ public class ToggleLatchBlock extends AbstractDiodeBlock { public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, Direction side) { if (side == null) return false; - return side.getAxis() == state.get(HORIZONTAL_FACING) + return side.getAxis() == state.getValue(FACING) .getAxis(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/ToggleLatchGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/ToggleLatchGenerator.java index 3bcae9dcd..eda899142 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/ToggleLatchGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/ToggleLatchGenerator.java @@ -31,7 +31,7 @@ public class ToggleLatchGenerator extends AbstractDiodeGenerator { @Override int getModelIndex(BlockState state) { - return (state.get(ToggleLatchBlock.POWERING) ? 2 : 0) + (state.get(ToggleLatchBlock.POWERED) ? 1 : 0); + return (state.getValue(ToggleLatchBlock.POWERING) ? 2 : 0) + (state.getValue(ToggleLatchBlock.POWERED) ? 1 : 0); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractDirectionalFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractDirectionalFunnelBlock.java index 43dd71869..58b376395 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractDirectionalFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractDirectionalFunnelBlock.java @@ -18,23 +18,23 @@ public class AbstractDirectionalFunnelBlock extends AbstractFunnelBlock { } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(FACING)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(FACING)); } @Override protected Direction getFacing(BlockState state) { - return state.get(FACING); + return state.getValue(FACING); } @Override public BlockState rotate(BlockState state, Rotation rot) { - return state.with(FACING, rot.rotate(state.get(FACING))); + return state.setValue(FACING, rot.rotate(state.getValue(FACING))); } @Override public BlockState mirror(BlockState state, Mirror mirrorIn) { - return state.rotate(mirrorIn.toRotation(state.get(FACING))); + return state.rotate(mirrorIn.getRotation(state.getValue(FACING))); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java index b71846b3a..4084b5b24 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java @@ -37,23 +37,23 @@ public abstract class AbstractFunnelBlock extends Block implements ITE builder) { - super.fillStateContainer(builder.add(POWERED)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(POWERED)); } @Override @@ -66,22 +66,22 @@ public abstract class AbstractFunnelBlock extends Block implements ITE builder) { - super.fillStateContainer(builder.add(HORIZONTAL_FACING)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(HORIZONTAL_FACING)); } @Override protected Direction getFacing(BlockState state) { - return state.get(HORIZONTAL_FACING); + return state.getValue(HORIZONTAL_FACING); } @Override public BlockState rotate(BlockState p_185499_1_, Rotation p_185499_2_) { - return p_185499_1_.with(HORIZONTAL_FACING, p_185499_2_.rotate(p_185499_1_.get(HORIZONTAL_FACING))); + return p_185499_1_.setValue(HORIZONTAL_FACING, p_185499_2_.rotate(p_185499_1_.getValue(HORIZONTAL_FACING))); } @Override public BlockState mirror(BlockState p_185471_1_, Mirror p_185471_2_) { - return p_185471_1_.rotate(p_185471_2_.toRotation(p_185471_1_.get(HORIZONTAL_FACING))); + return p_185471_1_.rotate(p_185471_2_.getRotation(p_185471_1_.getValue(HORIZONTAL_FACING))); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java index 2dc92c421..af1104706 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java @@ -17,8 +17,8 @@ public class AndesiteFunnelBlock extends FunnelBlock { public BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state) { Direction facing = getFunnelFacing(state); return AllBlocks.ANDESITE_BELT_FUNNEL.getDefaultState() - .with(BeltFunnelBlock.HORIZONTAL_FACING, facing) - .with(POWERED, state.get(POWERED)); + .setValue(BeltFunnelBlock.HORIZONTAL_FACING, facing) + .setValue(POWERED, state.getValue(POWERED)); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java index 56de5730e..46a5d6412 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java @@ -54,7 +54,7 @@ public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements IS } @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } } @@ -62,25 +62,25 @@ public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements IS public BeltFunnelBlock(BlockEntry parent, Properties p_i48377_1_) { super(p_i48377_1_); this.parent = parent; - setDefaultState(getDefaultState().with(SHAPE, Shape.RETRACTED)); + registerDefaultState(defaultBlockState().setValue(SHAPE, Shape.RETRACTED)); } @Override - protected void fillStateContainer(Builder p_206840_1_) { - super.fillStateContainer(p_206840_1_.add(SHAPE)); + protected void createBlockStateDefinition(Builder p_206840_1_) { + super.createBlockStateDefinition(p_206840_1_.add(SHAPE)); } @Override public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - return state.get(SHAPE).shaper.get(state.get(HORIZONTAL_FACING)); + return state.getValue(SHAPE).shaper.get(state.getValue(HORIZONTAL_FACING)); } @Override public VoxelShape getCollisionShape(BlockState p_220071_1_, IBlockReader p_220071_2_, BlockPos p_220071_3_, ISelectionContext p_220071_4_) { if (p_220071_4_.getEntity() instanceof ItemEntity - && (p_220071_1_.get(SHAPE) == Shape.PULLING || p_220071_1_.get(SHAPE) == Shape.PUSHING)) + && (p_220071_1_.getValue(SHAPE) == Shape.PULLING || p_220071_1_.getValue(SHAPE) == Shape.PUSHING)) return AllShapes.FUNNEL_COLLISION.get(getFacing(p_220071_1_)); return getShape(p_220071_1_, p_220071_2_, p_220071_3_, p_220071_4_); } @@ -88,25 +88,25 @@ public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements IS @Override public BlockState getStateForPlacement(BlockItemUseContext ctx) { BlockState stateForPlacement = super.getStateForPlacement(ctx); - BlockPos pos = ctx.getPos(); - World world = ctx.getWorld(); - Direction facing = ctx.getFace() + BlockPos pos = ctx.getClickedPos(); + World world = ctx.getLevel(); + Direction facing = ctx.getClickedFace() .getAxis() - .isHorizontal() ? ctx.getFace() : ctx.getPlacementHorizontalFacing(); + .isHorizontal() ? ctx.getClickedFace() : ctx.getHorizontalDirection(); - BlockState state = stateForPlacement.with(HORIZONTAL_FACING, facing); + BlockState state = stateForPlacement.setValue(HORIZONTAL_FACING, facing); boolean sneaking = ctx.getPlayer() != null && ctx.getPlayer() - .isSneaking(); - return state.with(SHAPE, getShapeForPosition(world, pos, facing, !sneaking)); + .isShiftKeyDown(); + return state.setValue(SHAPE, getShapeForPosition(world, pos, facing, !sneaking)); } public static Shape getShapeForPosition(IBlockReader world, BlockPos pos, Direction facing, boolean extracting) { - BlockPos posBelow = pos.down(); + BlockPos posBelow = pos.below(); BlockState stateBelow = world.getBlockState(posBelow); Shape perpendicularState = extracting ? Shape.PUSHING : Shape.PULLING; if (!AllBlocks.BELT.has(stateBelow)) return perpendicularState; - Direction movementFacing = stateBelow.get(BeltBlock.HORIZONTAL_FACING); + Direction movementFacing = stateBelow.getValue(BeltBlock.HORIZONTAL_FACING); return movementFacing.getAxis() != facing.getAxis() ? perpendicularState : Shape.RETRACTED; } @@ -117,19 +117,19 @@ public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements IS } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world, + public BlockState updateShape(BlockState state, Direction direction, BlockState neighbour, IWorld world, BlockPos pos, BlockPos p_196271_6_) { if (!isOnValidBelt(state, world, pos)) { BlockState parentState = parent.getDefaultState(); - if (state.method_28500(POWERED).orElse(false)) - parentState = parentState.with(POWERED, true); - if (state.get(SHAPE) == Shape.PUSHING) - parentState = parentState.with(FunnelBlock.EXTRACTING, true); - return parentState.with(FunnelBlock.FACING, state.get(HORIZONTAL_FACING)); + if (state.getOptionalValue(POWERED).orElse(false)) + parentState = parentState.setValue(POWERED, true); + if (state.getValue(SHAPE) == Shape.PUSHING) + parentState = parentState.setValue(FunnelBlock.EXTRACTING, true); + return parentState.setValue(FunnelBlock.FACING, state.getValue(HORIZONTAL_FACING)); } Shape updatedShape = - getShapeForPosition(world, pos, state.get(HORIZONTAL_FACING), state.get(SHAPE) == Shape.PUSHING); - Shape currentShape = state.get(SHAPE); + getShapeForPosition(world, pos, state.getValue(HORIZONTAL_FACING), state.getValue(SHAPE) == Shape.PUSHING); + Shape currentShape = state.getValue(SHAPE); if (updatedShape == currentShape) return state; @@ -139,15 +139,15 @@ public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements IS if (updatedShape == Shape.RETRACTED && currentShape == Shape.EXTENDED) return state; - return state.with(SHAPE, updatedShape); + return state.setValue(SHAPE, updatedShape); } public static boolean isOnValidBelt(BlockState state, IWorldReader world, BlockPos pos) { - BlockState stateBelow = world.getBlockState(pos.down()); + BlockState stateBelow = world.getBlockState(pos.below()); if ((stateBelow.getBlock() instanceof BeltBlock)) return BeltBlock.canTransportObjects(stateBelow); DirectBeltInputBehaviour directBeltInputBehaviour = - TileEntityBehaviour.get(world, pos.down(), DirectBeltInputBehaviour.TYPE); + TileEntityBehaviour.get(world, pos.below(), DirectBeltInputBehaviour.TYPE); if (directBeltInputBehaviour == null) return false; return directBeltInputBehaviour.canSupportBeltFunnels(); @@ -155,11 +155,11 @@ public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements IS @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - if (world.isRemote) + World world = context.getLevel(); + if (world.isClientSide) return ActionResultType.SUCCESS; - Shape shape = state.get(SHAPE); + Shape shape = state.getValue(SHAPE); Shape newShape = shape; if (shape == Shape.PULLING) newShape = Shape.PUSHING; @@ -168,9 +168,9 @@ public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements IS else if (shape == Shape.EXTENDED) newShape = Shape.RETRACTED; else if (shape == Shape.RETRACTED) { - BlockState belt = world.getBlockState(context.getPos() - .down()); - if (belt.getBlock() instanceof BeltBlock && belt.get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) + BlockState belt = world.getBlockState(context.getClickedPos() + .below()); + if (belt.getBlock() instanceof BeltBlock && belt.getValue(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) newShape = Shape.RETRACTED; else newShape = Shape.EXTENDED; @@ -179,14 +179,14 @@ public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements IS if (newShape == shape) return ActionResultType.SUCCESS; - world.setBlockState(context.getPos(), state.with(SHAPE, newShape)); + world.setBlockAndUpdate(context.getClickedPos(), state.setValue(SHAPE, newShape)); if (newShape == Shape.EXTENDED) { - Direction facing = state.get(HORIZONTAL_FACING); - BlockState opposite = world.getBlockState(context.getPos() - .offset(facing)); - if (opposite.getBlock() instanceof BeltFunnelBlock && opposite.get(SHAPE) == Shape.EXTENDED - && opposite.get(HORIZONTAL_FACING) == facing.getOpposite()) + Direction facing = state.getValue(HORIZONTAL_FACING); + BlockState opposite = world.getBlockState(context.getClickedPos() + .relative(facing)); + if (opposite.getBlock() instanceof BeltFunnelBlock && opposite.getValue(SHAPE) == Shape.EXTENDED + && opposite.getValue(HORIZONTAL_FACING) == facing.getOpposite()) AllTriggers.triggerFor(AllTriggers.BELT_FUNNEL_KISS, context.getPlayer()); } return ActionResultType.SUCCESS; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java index 792fbe5c4..2fe07b546 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java @@ -27,15 +27,15 @@ public class BeltFunnelGenerator extends SpecialBlockStateGen { @Override protected int getYRotation(BlockState state) { - return horizontalAngle(state.get(BeltFunnelBlock.HORIZONTAL_FACING)) + 180; + return horizontalAngle(state.getValue(BeltFunnelBlock.HORIZONTAL_FACING)) + 180; } @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - boolean powered = state.method_28500(BlockStateProperties.POWERED).orElse(false); - String shapeName = state.get(BeltFunnelBlock.SHAPE) - .getString(); + boolean powered = state.getOptionalValue(BlockStateProperties.POWERED).orElse(false); + String shapeName = state.getValue(BeltFunnelBlock.SHAPE) + .getSerializedName(); String poweredSuffix = powered ? "_powered" : ""; String name = ctx.getName() + "_" + poweredSuffix; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java index e44c2aa4d..df3f1a297 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java @@ -17,8 +17,8 @@ public class BrassFunnelBlock extends FunnelBlock { public BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state) { Direction facing = getFacing(state); return AllBlocks.BRASS_BELT_FUNNEL.getDefaultState() - .with(BeltFunnelBlock.HORIZONTAL_FACING, facing) - .with(POWERED, state.get(POWERED)); + .setValue(BeltFunnelBlock.HORIZONTAL_FACING, facing) + .setValue(POWERED, state.getValue(POWERED)); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java index 747414130..dae2ff98e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java @@ -34,7 +34,7 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { public FunnelBlock(Properties p_i48415_1_) { super(p_i48415_1_); - setDefaultState(getDefaultState().with(EXTRACTING, false)); + registerDefaultState(defaultBlockState().setValue(EXTRACTING, false)); } public abstract BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state); @@ -44,40 +44,40 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { BlockState state = super.getStateForPlacement(context); boolean sneak = context.getPlayer() != null && context.getPlayer() - .isSneaking(); - state = state.with(EXTRACTING, !sneak); + .isShiftKeyDown(); + state = state.setValue(EXTRACTING, !sneak); for (Direction direction : context.getNearestLookingDirections()) { - BlockState blockstate = state.with(FACING, direction.getOpposite()); - if (blockstate.isValidPosition(context.getWorld(), context.getPos())) - return blockstate.with(POWERED, state.get(POWERED)); + BlockState blockstate = state.setValue(FACING, direction.getOpposite()); + if (blockstate.canSurvive(context.getLevel(), context.getClickedPos())) + return blockstate.setValue(POWERED, state.getValue(POWERED)); } return state; } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(EXTRACTING)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(EXTRACTING)); } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - ItemStack heldItem = player.getHeldItem(handIn); + ItemStack heldItem = player.getItemInHand(handIn); boolean shouldntInsertItem = AllBlocks.MECHANICAL_ARM.isIn(heldItem) || !canInsertIntoFunnel(state); if (AllItems.WRENCH.isIn(heldItem)) return ActionResultType.PASS; - if (hit.getFace() == getFunnelFacing(state) && !shouldntInsertItem) { - if (!worldIn.isRemote) + if (hit.getDirection() == getFunnelFacing(state) && !shouldntInsertItem) { + if (!worldIn.isClientSide) withTileEntityDo(worldIn, pos, te -> { ItemStack toInsert = heldItem.copy(); ItemStack remainder = tryInsert(worldIn, pos, toInsert, false); - if (!ItemStack.areItemStacksEqual(remainder, toInsert)) - player.setHeldItem(handIn, remainder); + if (!ItemStack.matches(remainder, toInsert)) + player.setItemInHand(handIn, remainder); }); return ActionResultType.SUCCESS; } @@ -87,15 +87,15 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - if (!world.isRemote) - world.setBlockState(context.getPos(), state.cycle(EXTRACTING)); + World world = context.getLevel(); + if (!world.isClientSide) + world.setBlockAndUpdate(context.getClickedPos(), state.cycle(EXTRACTING)); return ActionResultType.SUCCESS; } @Override - public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { - if (worldIn.isRemote) + public void entityInside(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { + if (worldIn.isClientSide) return; if (!(entityIn instanceof ItemEntity)) return; @@ -106,11 +106,11 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { ItemEntity itemEntity = (ItemEntity) entityIn; Direction direction = getFunnelFacing(state); - Vector3d diff = entityIn.getPositionVec() + Vector3d diff = entityIn.position() .subtract(VecHelper.getCenterOf(pos) - .add(Vector3d.of(direction.getDirectionVec()).scale(-.325f))); + .add(Vector3d.atLowerCornerOf(direction.getNormal()).scale(-.325f))); double projectedDiff = direction.getAxis() - .getCoordinate(diff.x, diff.y, diff.z); + .choose(diff.x, diff.y, diff.z); if (projectedDiff < 0 == (direction.getAxisDirection() == AxisDirection.POSITIVE)) return; @@ -124,12 +124,12 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { } protected boolean canInsertIntoFunnel(BlockState state) { - return !state.get(POWERED) && !state.get(EXTRACTING); + return !state.getValue(POWERED) && !state.getValue(EXTRACTING); } @Override public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { - Direction facing = state.get(FACING); + Direction facing = state.getValue(FACING); return facing == Direction.DOWN ? AllShapes.FUNNEL_CEILING : facing == Direction.UP ? AllShapes.FUNNEL_FLOOR : AllShapes.FUNNEL_WALL.get(facing); } @@ -143,15 +143,15 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { } @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState p_196271_3_, IWorld world, + public BlockState updateShape(BlockState state, Direction direction, BlockState p_196271_3_, IWorld world, BlockPos pos, BlockPos p_196271_6_) { if (getFacing(state).getAxis() .isVertical() || direction != Direction.DOWN) return state; BlockState equivalentFunnel = getEquivalentBeltFunnel(null, null, state); if (BeltFunnelBlock.isOnValidBelt(equivalentFunnel, world, pos)) - return equivalentFunnel.with(BeltFunnelBlock.SHAPE, - BeltFunnelBlock.getShapeForPosition(world, pos, getFacing(state), state.get(EXTRACTING))); + return equivalentFunnel.setValue(BeltFunnelBlock.SHAPE, + BeltFunnelBlock.getShapeForPosition(world, pos, getFacing(state), state.getValue(EXTRACTING))); return state; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java index 927296f0a..f05f96b68 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java @@ -1,10 +1,10 @@ package com.simibubi.create.content.logistics.block.funnel; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -22,7 +22,7 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { float stateAngle = AngleHelper.horizontalAngle(funnelFacing); if (state.getBlock() instanceof BeltFunnelBlock) { - switch (state.get(BeltFunnelBlock.SHAPE)) { + switch (state.getValue(BeltFunnelBlock.SHAPE)) { case EXTENDED: return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 15.5f, 13), stateAngle, Axis.Y); @@ -55,25 +55,25 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { } boolean isBeltFunnel = state.getBlock() instanceof BeltFunnelBlock; - if (isBeltFunnel && state.get(BeltFunnelBlock.SHAPE) != Shape.EXTENDED) { - Shape shape = state.get(BeltFunnelBlock.SHAPE); + if (isBeltFunnel && state.getValue(BeltFunnelBlock.SHAPE) != Shape.EXTENDED) { + Shape shape = state.getValue(BeltFunnelBlock.SHAPE); super.rotate(state, ms); if (shape == Shape.PULLING || shape == Shape.PUSHING) - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateX(-22.5f); return; } if (state.getBlock() instanceof FunnelBlock) { super.rotate(state, ms); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateX(-22.5f); return; } float yRot = AngleHelper.horizontalAngle(AbstractFunnelBlock.getFunnelFacing(state)) + (facing == Direction.DOWN ? 180 : 0); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(yRot) .rotateX(facing == Direction.DOWN ? -90 : 90); } @@ -88,7 +88,7 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { .isVertical()) return direction.getAxis() .isHorizontal(); - if (state.getBlock() instanceof BeltFunnelBlock && state.get(BeltFunnelBlock.SHAPE) == Shape.EXTENDED) + if (state.getBlock() instanceof BeltFunnelBlock && state.getValue(BeltFunnelBlock.SHAPE) == Shape.EXTENDED) return direction == Direction.UP; return direction == facing; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelGenerator.java index b41d3384f..3681ed623 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelGenerator.java @@ -29,21 +29,21 @@ public class FunnelGenerator extends SpecialBlockStateGen { @Override protected int getXRotation(BlockState state) { - return state.get(FunnelBlock.FACING) == Direction.DOWN ? 180 : 0; + return state.getValue(FunnelBlock.FACING) == Direction.DOWN ? 180 : 0; } @Override protected int getYRotation(BlockState state) { - return horizontalAngle(state.get(FunnelBlock.FACING)) + 180; + return horizontalAngle(state.getValue(FunnelBlock.FACING)) + 180; } @Override public ModelFile getModel(DataGenContext c, RegistrateBlockstateProvider p, BlockState s) { - String powered = s.get(FunnelBlock.POWERED) ? "_powered" : ""; - String closed = s.get(FunnelBlock.POWERED) ? "_closed" : "_open"; - String extracting = s.get(FunnelBlock.EXTRACTING) ? "_push" : "_pull"; - Direction facing = s.get(FunnelBlock.FACING); + String powered = s.getValue(FunnelBlock.POWERED) ? "_powered" : ""; + String closed = s.getValue(FunnelBlock.POWERED) ? "_closed" : "_open"; + String extracting = s.getValue(FunnelBlock.EXTRACTING) ? "_push" : "_pull"; + Direction facing = s.getValue(FunnelBlock.FACING); boolean horizontal = facing.getAxis() .isHorizontal(); String parent = horizontal ? "horizontal" : hasFilter ? "vertical" : "vertical_filterless"; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java index 26a975859..470e56bda 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.InstanceData; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllBlockPartials; @@ -29,16 +29,17 @@ public class FunnelInstance extends TileEntityInstance impleme PartialModel flapPartial = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP : AllBlockPartials.BELT_FUNNEL_FLAP); - Instancer model = modelManager.getMaterial(AllMaterialSpecs.FLAPS) + Instancer model = modelManager.defaultSolid() + .material(AllMaterialSpecs.FLAPS) .getModel(flapPartial, blockState); - int blockLight = world.getLightLevel(LightType.BLOCK, pos); - int skyLight = world.getLightLevel(LightType.SKY, pos); + int blockLight = world.getBrightness(LightType.BLOCK, pos); + int skyLight = world.getBrightness(LightType.SKY, pos); Direction direction = FunnelBlock.getFunnelFacing(blockState); float flapness = tile.flap.get(AnimationTickHolder.getPartialTicks()); - float horizontalAngle = direction.getOpposite().getHorizontalAngle(); + float horizontalAngle = direction.getOpposite().toYRot(); for (int segment = 0; segment <= 3; segment++) { float intensity = segment == 3 ? 1.5f : segment + 1; @@ -46,7 +47,7 @@ public class FunnelInstance extends TileEntityInstance impleme FlapData key = model.createInstance(); - key.setPosition(pos) + key.setPosition(getInstancePosition()) .setSegmentOffset(segmentOffset, 0, -tile.getFlapOffset()) .setBlockLight(blockLight) .setSkyLight(skyLight) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java index f127a2b3c..3aa9d83b3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java @@ -29,25 +29,25 @@ public class FunnelItem extends BlockItem { } @Override - protected BlockState getStateForPlacement(BlockItemUseContext ctx) { - World world = ctx.getWorld(); - BlockPos pos = ctx.getPos(); - BlockState state = super.getStateForPlacement(ctx); + protected BlockState getPlacementState(BlockItemUseContext ctx) { + World world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + BlockState state = super.getPlacementState(ctx); if (state == null) return state; if (!(state.getBlock() instanceof FunnelBlock)) return state; - if (state.get(FunnelBlock.FACING) + if (state.getValue(FunnelBlock.FACING) .getAxis() .isVertical()) return state; - Direction direction = state.get(FunnelBlock.FACING); + Direction direction = state.getValue(FunnelBlock.FACING); FunnelBlock block = (FunnelBlock) getBlock(); Block beltFunnelBlock = block.getEquivalentBeltFunnel(world, pos, state) .getBlock(); BlockState equivalentBeltFunnel = beltFunnelBlock.getStateForPlacement(ctx) - .with(BeltFunnelBlock.HORIZONTAL_FACING, direction); + .setValue(BeltFunnelBlock.HORIZONTAL_FACING, direction); if (BeltFunnelBlock.isOnValidBelt(equivalentBeltFunnel, world, pos)) { AllTriggers.triggerFor(AllTriggers.BELT_FUNNEL, ctx.getPlayer()); return equivalentBeltFunnel; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java index 78d537c64..b5951638e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java @@ -38,9 +38,9 @@ public class FunnelMovementBehaviour extends MovementBehaviour { @Override public Vector3d getActiveAreaOffset(MovementContext context) { Direction facing = FunnelBlock.getFunnelFacing(context.state); - Vector3d vec = Vector3d.of(facing.getDirectionVec()); + Vector3d vec = Vector3d.atLowerCornerOf(facing.getNormal()); if (facing != Direction.UP) - return vec.scale(context.state.get(FunnelBlock.EXTRACTING) ? .15 : .65); + return vec.scale(context.state.getValue(FunnelBlock.EXTRACTING) ? .15 : .65); return vec.scale(.65); } @@ -49,7 +49,7 @@ public class FunnelMovementBehaviour extends MovementBehaviour { public void visitNewPosition(MovementContext context, BlockPos pos) { super.visitNewPosition(context, pos); - if (context.state.get(FunnelBlock.EXTRACTING)) + if (context.state.getValue(FunnelBlock.EXTRACTING)) extract(context, pos); else succ(context, pos); @@ -61,13 +61,13 @@ public class FunnelMovementBehaviour extends MovementBehaviour { World world = context.world; Vector3d entityPos = context.position; - if (context.state.get(FunnelBlock.FACING) != Direction.DOWN) + if (context.state.getValue(FunnelBlock.FACING) != Direction.DOWN) entityPos = entityPos.add(0, -.5f, 0); if (!world.getBlockState(pos).getCollisionShape(world, pos).isEmpty()) return;//only drop items if the target block is a empty space - if (!world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(new BlockPos(entityPos))).isEmpty()) + if (!world.getEntitiesOfClass(ItemEntity.class, new AxisAlignedBB(new BlockPos(entityPos))).isEmpty()) return;//don't drop items if there already are any in the target block space ItemStack filter = getFilter(context); @@ -85,21 +85,21 @@ public class FunnelMovementBehaviour extends MovementBehaviour { if (extract.isEmpty()) return; - if (world.isRemote) + if (world.isClientSide) return; ItemEntity entity = new ItemEntity(world, entityPos.x, entityPos.y, entityPos.z, extract); - entity.setMotion(Vector3d.ZERO); - entity.setPickupDelay(5); - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, 1/16f, .1f); - world.addEntity(entity); + entity.setDeltaMovement(Vector3d.ZERO); + entity.setPickUpDelay(5); + world.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundCategory.BLOCKS, 1/16f, .1f); + world.addFreshEntity(entity); } private void succ(MovementContext context, BlockPos pos) { World world = context.world; - List items = world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(pos)); + List items = world.getEntitiesOfClass(ItemEntity.class, new AxisAlignedBB(pos)); ItemStack filter = getFilter(context); for (ItemEntity item : items) { @@ -122,7 +122,7 @@ public class FunnelMovementBehaviour extends MovementBehaviour { } private ItemStack getFilter(MovementContext context) { - return hasFilter ? ItemStack.read(context.tileData.getCompound("Filter")) : ItemStack.EMPTY; + return hasFilter ? ItemStack.of(context.tileData.getCompound("Filter")) : ItemStack.EMPTY; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java index 7416c18ba..5a920e52d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.block.funnel; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.core.PartialModel; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; @@ -9,7 +10,6 @@ import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -30,29 +30,29 @@ public class FunnelRenderer extends SmartTileEntityRenderer { int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); - if (!te.hasFlap() || Backend.getInstance().canUseInstancing(te.getWorld())) + if (!te.hasFlap() || Backend.getInstance().canUseInstancing(te.getLevel())) return; BlockState blockState = te.getBlockState(); - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + IVertexBuilder vb = buffer.getBuffer(RenderType.solid()); PartialModel partialModel = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP : AllBlockPartials.BELT_FUNNEL_FLAP); SuperByteBuffer flapBuffer = PartialBufferer.get(partialModel, blockState); Vector3d pivot = VecHelper.voxelSpace(0, 10, 9.5f); - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); float horizontalAngle = AngleHelper.horizontalAngle(FunnelBlock.getFunnelFacing(blockState) .getOpposite()); float f = te.flap.get(partialTicks); - ms.push(); + ms.pushPose(); msr.centre() .rotateY(horizontalAngle) .unCentre(); ms.translate(0, 0, -te.getFlapOffset()); for (int segment = 0; segment <= 3; segment++) { - ms.push(); + ms.pushPose(); float intensity = segment == 3 ? 1.5f : segment + 1; float abs = Math.abs(f); @@ -67,10 +67,10 @@ public class FunnelRenderer extends SmartTileEntityRenderer { flapBuffer.light(light) .renderInto(ms, vb); - ms.pop(); + ms.popPose(); ms.translate(-3 / 16f, 0, 0); } - ms.pop(); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index 116d74468..d6e7773bd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -62,24 +62,24 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn BlockState state = getBlockState(); if (!FunnelBlock.isFunnel(state)) return Mode.INVALID; - if (state.method_28500(BlockStateProperties.POWERED) + if (state.getOptionalValue(BlockStateProperties.POWERED) .orElse(false)) return Mode.PAUSED; if (state.getBlock() instanceof BeltFunnelBlock) { - Shape shape = state.get(BeltFunnelBlock.SHAPE); + Shape shape = state.getValue(BeltFunnelBlock.SHAPE); if (shape == Shape.PULLING) return Mode.TAKING_FROM_BELT; if (shape == Shape.PUSHING) return Mode.PUSHING_TO_BELT; - BeltTileEntity belt = BeltHelper.getSegmentTE(world, pos.down()); + BeltTileEntity belt = BeltHelper.getSegmentTE(level, worldPosition.below()); if (belt != null) - return belt.getMovementFacing() == state.get(BeltFunnelBlock.HORIZONTAL_FACING) ? Mode.PUSHING_TO_BELT + return belt.getMovementFacing() == state.getValue(BeltFunnelBlock.HORIZONTAL_FACING) ? Mode.PUSHING_TO_BELT : Mode.TAKING_FROM_BELT; return Mode.INVALID; } if (state.getBlock() instanceof FunnelBlock) - return state.get(FunnelBlock.EXTRACTING) ? Mode.EXTRACT : Mode.COLLECT; + return state.getValue(FunnelBlock.EXTRACTING) ? Mode.EXTRACT : Mode.COLLECT; return Mode.INVALID; } @@ -89,7 +89,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn super.tick(); flap.tick(); Mode mode = determineCurrentMode(); - if (world.isRemote) + if (level.isClientSide) return; // Redstone resets the extraction cooldown @@ -140,7 +140,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn .extract(amountToExtract); if (stack.isEmpty()) return; - for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class, area)) { + for (ItemEntity itemEntity : level.getEntitiesOfClass(ItemEntity.class, area)) { lastObserved = new WeakReference<>(itemEntity); return; } @@ -153,12 +153,12 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn flap(false); onTransfer(stack); - Vector3d outputPos = VecHelper.getCenterOf(pos); + Vector3d outputPos = VecHelper.getCenterOf(worldPosition); boolean vertical = facing.getAxis() .isVertical(); boolean up = facing == Direction.UP; - outputPos = outputPos.add(Vector3d.of(facing.getDirectionVec()) + outputPos = outputPos.add(Vector3d.atLowerCornerOf(facing.getNormal()) .scale(vertical ? up ? .15f : .5f : .25f)); if (!vertical) outputPos = outputPos.subtract(0, .45f, 0); @@ -167,31 +167,31 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn if (up) motion = new Vector3d(0, 4 / 16f, 0); - ItemEntity item = new ItemEntity(world, outputPos.x, outputPos.y, outputPos.z, stack.copy()); - item.setDefaultPickupDelay(); - item.setMotion(motion); - world.addEntity(item); + ItemEntity item = new ItemEntity(level, outputPos.x, outputPos.y, outputPos.z, stack.copy()); + item.setDefaultPickUpDelay(); + item.setDeltaMovement(motion); + level.addFreshEntity(item); lastObserved = new WeakReference<>(item); startCooldown(); } static final AxisAlignedBB coreBB = - new AxisAlignedBB(VecHelper.CENTER_OF_ORIGIN, VecHelper.CENTER_OF_ORIGIN).grow(.75f); + new AxisAlignedBB(VecHelper.CENTER_OF_ORIGIN, VecHelper.CENTER_OF_ORIGIN).inflate(.75f); private AxisAlignedBB getEntityOverflowScanningArea() { Direction facing = AbstractFunnelBlock.getFunnelFacing(getBlockState()); - AxisAlignedBB bb = coreBB.offset(pos); + AxisAlignedBB bb = coreBB.move(worldPosition); if (facing == null || facing == Direction.UP) return bb; - return bb.expand(0, -1, 0); + return bb.expandTowards(0, -1, 0); } private void activateExtractingBeltFunnel() { BlockState blockState = getBlockState(); - Direction facing = blockState.get(BeltFunnelBlock.HORIZONTAL_FACING); + Direction facing = blockState.getValue(BeltFunnelBlock.HORIZONTAL_FACING); DirectBeltInputBehaviour inputBehaviour = - TileEntityBehaviour.get(world, pos.down(), DirectBeltInputBehaviour.TYPE); + TileEntityBehaviour.get(level, worldPosition.below(), DirectBeltInputBehaviour.TYPE); if (inputBehaviour == null) return; @@ -242,13 +242,13 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn BlockState blockState = getBlockState(); boolean beltFunnelsupportsAmount = false; if (blockState.getBlock() instanceof BeltFunnelBlock) { - Shape shape = blockState.get(BeltFunnelBlock.SHAPE); + Shape shape = blockState.getValue(BeltFunnelBlock.SHAPE); if (shape == Shape.PUSHING) beltFunnelsupportsAmount = true; else - beltFunnelsupportsAmount = BeltHelper.getSegmentTE(world, pos.down()) != null; + beltFunnelsupportsAmount = BeltHelper.getSegmentTE(level, worldPosition.below()) != null; } - boolean extractor = blockState.getBlock() instanceof FunnelBlock && blockState.get(FunnelBlock.EXTRACTING); + boolean extractor = blockState.getBlock() instanceof FunnelBlock && blockState.getValue(FunnelBlock.EXTRACTING); return beltFunnelsupportsAmount || extractor; } @@ -258,7 +258,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn return false; if (!(blockState.getBlock() instanceof FunnelBlock)) return false; - if (blockState.get(FunnelBlock.EXTRACTING)) + if (blockState.getValue(FunnelBlock.EXTRACTING)) return false; return FunnelBlock.getFunnelFacing(blockState) == Direction.UP; } @@ -282,11 +282,11 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn } public void flap(boolean inward) { - if (!world.isRemote) { + if (!level.isClientSide) { AllPackets.channel.send(packetTarget(), new FunnelFlapPacket(this, inward)); } else { flap.set(inward ? 1 : -1); - AllSoundEvents.FUNNEL_FLAP.playAt(world, pos, 1, 1, true); + AllSoundEvents.FUNNEL_FLAP.playAt(level, worldPosition, 1, 1, true); } } @@ -303,7 +303,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof BeltFunnelBlock)) return -1 / 16f; - switch (blockState.get(BeltFunnelBlock.SHAPE)) { + switch (blockState.getValue(BeltFunnelBlock.SHAPE)) { default: case RETRACTED: return 0; @@ -331,13 +331,13 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn } @Override - public double getMaxRenderDistanceSquared() { - return hasFlap() ? super.getMaxRenderDistanceSquared() : 64; + public double getViewDistance() { + return hasFlap() ? super.getViewDistance() : 64; } public void onTransfer(ItemStack stack) { AllBlocks.CONTENT_OBSERVER.get() - .onFunnelTransfer(world, pos, stack); + .onFunnelTransfer(level, worldPosition, stack); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateBlock.java index 54af02825..fc50c07f1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateBlock.java @@ -35,10 +35,10 @@ public class AdjustableCrateBlock extends CrateBlock { } @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { - if (oldState.getBlock() != state.getBlock() && state.hasTileEntity() && state.get(DOUBLE) - && state.get(FACING).getAxisDirection() == AxisDirection.POSITIVE) { - TileEntity tileEntity = worldIn.getTileEntity(pos); + public void onPlace(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { + if (oldState.getBlock() != state.getBlock() && state.hasTileEntity() && state.getValue(DOUBLE) + && state.getValue(FACING).getAxisDirection() == AxisDirection.POSITIVE) { + TileEntity tileEntity = worldIn.getBlockEntity(pos); if (!(tileEntity instanceof AdjustableCrateTileEntity)) return; @@ -57,13 +57,13 @@ public class AdjustableCrateBlock extends CrateBlock { } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - if (worldIn.isRemote) { + if (worldIn.isClientSide) { return ActionResultType.SUCCESS; } else { - TileEntity te = worldIn.getTileEntity(pos); + TileEntity te = worldIn.getBlockEntity(pos); if (te instanceof AdjustableCrateTileEntity) { AdjustableCrateTileEntity fte = (AdjustableCrateTileEntity) te; fte = fte.getMainCrate(); @@ -77,39 +77,39 @@ public class AdjustableCrateBlock extends CrateBlock { BlockState state = world.getBlockState(pos); if (!AllBlocks.ADJUSTABLE_CRATE.has(state)) return; - if (!state.get(DOUBLE)) + if (!state.getValue(DOUBLE)) return; - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (!(te instanceof AdjustableCrateTileEntity)) return; AdjustableCrateTileEntity crateTe = (AdjustableCrateTileEntity) te; crateTe.onSplit(); - world.setBlockState(pos, state.with(DOUBLE, false)); - world.setBlockState(crateTe.getOtherCrate().getPos(), state.with(DOUBLE, false)); + world.setBlockAndUpdate(pos, state.setValue(DOUBLE, false)); + world.setBlockAndUpdate(crateTe.getOtherCrate().getBlockPos(), state.setValue(DOUBLE, false)); } @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (!(worldIn.getTileEntity(pos) instanceof AdjustableCrateTileEntity)) + public void onRemove(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + if (!(worldIn.getBlockEntity(pos) instanceof AdjustableCrateTileEntity)) return; if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - AdjustableCrateTileEntity te = (AdjustableCrateTileEntity) worldIn.getTileEntity(pos); + AdjustableCrateTileEntity te = (AdjustableCrateTileEntity) worldIn.getBlockEntity(pos); if (!isMoving) te.onDestroyed(); - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } } @Override - public boolean hasComparatorInputOverride(BlockState state) { + public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override - public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { - TileEntity te = worldIn.getTileEntity(pos); + public int getAnalogOutputSignal(BlockState blockState, World worldIn, BlockPos pos) { + TileEntity te = worldIn.getBlockEntity(pos); if (te instanceof AdjustableCrateTileEntity) { AdjustableCrateTileEntity flexcrateTileEntity = ((AdjustableCrateTileEntity) te).getMainCrate(); return ItemHelper.calcRedstoneFromInventory(flexcrateTileEntity.inventory); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateContainer.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateContainer.java index 20139c8d8..1df87b977 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateContainer.java @@ -22,12 +22,12 @@ public class AdjustableCrateContainer extends Container { public AdjustableCrateContainer(ContainerType type, int id, PlayerInventory inv, PacketBuffer extraData) { super(type, id); - ClientWorld world = Minecraft.getInstance().world; - TileEntity tileEntity = world.getTileEntity(extraData.readBlockPos()); + ClientWorld world = Minecraft.getInstance().level; + TileEntity tileEntity = world.getBlockEntity(extraData.readBlockPos()); this.playerInventory = inv; if (tileEntity instanceof AdjustableCrateTileEntity) { this.te = (AdjustableCrateTileEntity) tileEntity; - this.te.handleUpdateTag(te.getBlockState(), extraData.readCompoundTag()); + this.te.handleUpdateTag(te.getBlockState(), extraData.readNbt()); init(); } } @@ -66,28 +66,28 @@ public class AdjustableCrateContainer extends Container { this.addSlot(new Slot(playerInventory, hotbarSlot, xOffset + hotbarSlot * 18, yOffset + 58)); } - detectAndSendChanges(); + broadcastChanges(); } @Override - public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { + public ItemStack quickMoveStack(PlayerEntity playerIn, int index) { Slot clickedSlot = getSlot(index); - if (!clickedSlot.getHasStack()) + if (!clickedSlot.hasItem()) return ItemStack.EMPTY; - ItemStack stack = clickedSlot.getStack(); + ItemStack stack = clickedSlot.getItem(); int crateSize = doubleCrate ? 32 : 16; if (index < crateSize) { - mergeItemStack(stack, crateSize, inventorySlots.size(), false); + moveItemStackTo(stack, crateSize, slots.size(), false); te.inventory.onContentsChanged(index); } else - mergeItemStack(stack, 0, crateSize - 1, false); + moveItemStackTo(stack, 0, crateSize - 1, false); return ItemStack.EMPTY; } @Override - public boolean canInteractWith(PlayerEntity player) { + public boolean stillValid(PlayerEntity player) { return te != null && te.canPlayerUse(player); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java index f977b7b61..b77d93a1b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java @@ -52,21 +52,21 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen slot * 64) continue; - int slotsPerRow = (container.doubleCrate ? 8 : 4); + int slotsPerRow = (menu.doubleCrate ? 8 : 4); int slotX = x + 22 + (slot % slotsPerRow) * 18; int slotY = y + 19 + (slot / slotsPerRow) * 18; AllGuiTextures.ADJUSTABLE_CRATE_LOCKED_SLOT.draw(ms, this, slotX, slotY); @@ -112,26 +112,26 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen= 0) lastModification++; if (lastModification >= 15) { lastModification = -1; - AllPackets.channel.sendToServer(new ConfigureFlexcratePacket(te.getPos(), allowedItems.getState())); + AllPackets.channel.sendToServer(new ConfigureFlexcratePacket(te.getBlockPos(), allowedItems.getState())); } - if (container.doubleCrate != te.isDoubleCrate()) - container.playerInventory.player.closeScreen(); + if (menu.doubleCrate != te.isDoubleCrate()) + menu.playerInventory.player.closeContainer(); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateTileEntity.java index 0840fe8a4..9ec1fbf31 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateTileEntity.java @@ -48,7 +48,7 @@ public class AdjustableCrateTileEntity extends CrateTileEntity implements INamed @Override protected void onContentsChanged(int slot) { super.onContentsChanged(slot); - markDirty(); + setChanged(); itemCount = 0; for (int i = 0; i < getSlots(); i++) { @@ -78,7 +78,7 @@ public class AdjustableCrateTileEntity extends CrateTileEntity implements INamed public AdjustableCrateTileEntity getOtherCrate() { if (!AllBlocks.ADJUSTABLE_CRATE.has(getBlockState())) return null; - TileEntity tileEntity = world.getTileEntity(pos.offset(getFacing())); + TileEntity tileEntity = level.getBlockEntity(worldPosition.relative(getFacing())); if (tileEntity instanceof AdjustableCrateTileEntity) return (AdjustableCrateTileEntity) tileEntity; return null; @@ -139,7 +139,7 @@ public class AdjustableCrateTileEntity extends CrateTileEntity implements INamed } private void drop(int slot) { - InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), inventory.getStackInSlot(slot)); + InventoryHelper.dropItemStack(level, worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), inventory.getStackInSlot(slot)); } @Override @@ -163,13 +163,13 @@ public class AdjustableCrateTileEntity extends CrateTileEntity implements INamed } public void sendToContainer(PacketBuffer buffer) { - buffer.writeBlockPos(getPos()); - buffer.writeCompoundTag(getUpdateTag()); + buffer.writeBlockPos(getBlockPos()); + buffer.writeNbt(getUpdateTag()); } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); invHandler.invalidate(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java index 0cc52ac21..659a49aff 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java @@ -25,8 +25,8 @@ public class CrateBlock extends ProperDirectionalBlock implements IWrenchable { public CrateBlock(Properties p_i48415_1_) { super(p_i48415_1_); - setDefaultState(getDefaultState().with(FACING, Direction.UP) - .with(DOUBLE, false)); + registerDefaultState(defaultBlockState().setValue(FACING, Direction.UP) + .setValue(DOUBLE, false)); } @Override @@ -35,56 +35,56 @@ public class CrateBlock extends ProperDirectionalBlock implements IWrenchable { } @Override - public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + public boolean isPathfindable(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } @Override - public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, + public BlockState updateShape(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) { - boolean isDouble = stateIn.get(DOUBLE); - Direction blockFacing = stateIn.get(FACING); - boolean isFacingOther = facingState.getBlock() == this && facingState.get(DOUBLE) - && facingState.get(FACING) == facing.getOpposite(); + boolean isDouble = stateIn.getValue(DOUBLE); + Direction blockFacing = stateIn.getValue(FACING); + boolean isFacingOther = facingState.getBlock() == this && facingState.getValue(DOUBLE) + && facingState.getValue(FACING) == facing.getOpposite(); if (!isDouble) { if (!isFacingOther) return stateIn; - return stateIn.with(DOUBLE, true) - .with(FACING, facing); + return stateIn.setValue(DOUBLE, true) + .setValue(FACING, facing); } if (facing != blockFacing) return stateIn; if (!isFacingOther) - return stateIn.with(DOUBLE, false); + return stateIn.setValue(DOUBLE, false); return stateIn; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockPos pos = context.getPos(); - World world = context.getWorld(); + BlockPos pos = context.getClickedPos(); + World world = context.getLevel(); if (context.getPlayer() == null || !context.getPlayer() - .isSneaking()) { + .isShiftKeyDown()) { for (Direction d : Iterate.directions) { - BlockState state = world.getBlockState(pos.offset(d)); - if (state.getBlock() == this && !state.get(DOUBLE)) - return getDefaultState().with(FACING, d) - .with(DOUBLE, true); + BlockState state = world.getBlockState(pos.relative(d)); + if (state.getBlock() == this && !state.getValue(DOUBLE)) + return defaultBlockState().setValue(FACING, d) + .setValue(DOUBLE, true); } } - Direction placedOnFace = context.getFace() + Direction placedOnFace = context.getClickedFace() .getOpposite(); - BlockState state = world.getBlockState(pos.offset(placedOnFace)); - if (state.getBlock() == this && !state.get(DOUBLE)) - return getDefaultState().with(FACING, placedOnFace) - .with(DOUBLE, true); - return getDefaultState(); + BlockState state = world.getBlockState(pos.relative(placedOnFace)); + if (state.getBlock() == this && !state.getValue(DOUBLE)) + return defaultBlockState().setValue(FACING, placedOnFace) + .setValue(DOUBLE, true); + return defaultBlockState(); } @Override @@ -93,8 +93,8 @@ public class CrateBlock extends ProperDirectionalBlock implements IWrenchable { } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(DOUBLE)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(DOUBLE)); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateTileEntity.java index b4602f230..427afa31f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateTileEntity.java @@ -19,11 +19,11 @@ public abstract class CrateTileEntity extends SmartTileEntity { public void addBehaviours(List behaviours) {} public boolean isDoubleCrate() { - return getBlockState().get(AdjustableCrateBlock.DOUBLE); + return getBlockState().getValue(AdjustableCrateBlock.DOUBLE); } public boolean isSecondaryCrate() { - if (!hasWorld()) + if (!hasLevel()) return false; if (!(getBlockState().getBlock() instanceof CrateBlock)) return false; @@ -31,7 +31,7 @@ public abstract class CrateTileEntity extends SmartTileEntity { } public Direction getFacing() { - return getBlockState().get(AdjustableCrateBlock.FACING); + return getBlockState().getValue(AdjustableCrateBlock.FACING); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateBlock.java index f83ba35db..b7831cfe9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateBlock.java @@ -26,7 +26,7 @@ public class CreativeCrateBlock extends CrateBlock implements ITE, ICogWh public ArmBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(CEILING, false)); + registerDefaultState(defaultBlockState().setValue(CEILING, false)); } @Override - protected void fillStateContainer(Builder p_206840_1_) { - super.fillStateContainer(p_206840_1_.add(CEILING)); + protected void createBlockStateDefinition(Builder p_206840_1_) { + super.createBlockStateDefinition(p_206840_1_.add(CEILING)); } @Override public BlockState getStateForPlacement(BlockItemUseContext ctx) { - return getDefaultState().with(CEILING, ctx.getFace() == Direction.DOWN); + return defaultBlockState().setValue(CEILING, ctx.getClickedFace() == Direction.DOWN); } @Override public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - return state.get(CEILING) ? AllShapes.MECHANICAL_ARM_CEILING : AllShapes.MECHANICAL_ARM; + return state.getValue(CEILING) ? AllShapes.MECHANICAL_ARM_CEILING : AllShapes.MECHANICAL_ARM; } @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { - super.onBlockAdded(state, world, pos, oldState, isMoving); + public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) { + super.onPlace(state, world, pos, oldState, isMoving); withTileEntityDo(world, pos, ArmTileEntity::redstoneUpdate); } @@ -82,32 +82,32 @@ public class ArmBlock extends KineticBlock implements ITE, ICogWh } @Override - public void onReplaced(BlockState p_196243_1_, World world, BlockPos pos, BlockState p_196243_4_, + public void onRemove(BlockState p_196243_1_, World world, BlockPos pos, BlockState p_196243_4_, boolean p_196243_5_) { if (p_196243_1_.hasTileEntity() && (p_196243_1_.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasTileEntity())) { withTileEntityDo(world, pos, te -> { if (!te.heldItem.isEmpty()) - InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), te.heldItem); + InventoryHelper.dropItemStack(world, pos.getX(), pos.getY(), pos.getZ(), te.heldItem); }); - world.removeTileEntity(pos); + world.removeBlockEntity(pos); } } @Override - public ActionResultType onUse(BlockState p_225533_1_, World world, BlockPos pos, PlayerEntity player, + public ActionResultType use(BlockState p_225533_1_, World world, BlockPos pos, PlayerEntity player, Hand p_225533_5_, BlockRayTraceResult p_225533_6_) { MutableBoolean success = new MutableBoolean(false); withTileEntityDo(world, pos, te -> { if (te.heldItem.isEmpty()) return; success.setTrue(); - if (world.isRemote) + if (world.isClientSide) return; player.inventory.placeItemBackInInventory(world, te.heldItem); te.heldItem = ItemStack.EMPTY; te.phase = Phase.SEARCH_INPUTS; - te.markDirty(); + te.setChanged(); te.sendData(); }); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index 3f0f4b12b..0c7a15933 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -5,10 +5,11 @@ import java.util.ArrayList; import com.google.common.collect.Lists; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.instancing.InstanceMaterial; +import com.jozufozu.flywheel.backend.material.InstanceMaterial; import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.core.materials.ModelData; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.RotatingData; @@ -16,7 +17,6 @@ import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemRenderer; @@ -62,7 +62,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta clawGrips = Lists.newArrayList(clawGrip1, clawGrip2); models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2); arm = tile; - ceiling = blockState.get(ArmBlock.CEILING); + ceiling = blockState.getValue(ArmBlock.CEILING); animateArm(false); } @@ -82,10 +82,10 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta float upperArmAngleNow = this.arm.upperArmAngle.get(pt); float headAngleNow = this.arm.headAngle.get(pt); - boolean settled = MathHelper.epsilonEquals(baseAngle, baseAngleNow) - && MathHelper.epsilonEquals(lowerArmAngle, lowerArmAngleNow) - && MathHelper.epsilonEquals(upperArmAngle, upperArmAngleNow) - && MathHelper.epsilonEquals(headAngle, headAngleNow); + boolean settled = MathHelper.equal(baseAngle, baseAngleNow) + && MathHelper.equal(lowerArmAngle, lowerArmAngleNow) + && MathHelper.equal(upperArmAngle, upperArmAngleNow) + && MathHelper.equal(headAngle, headAngleNow); this.baseAngle = baseAngleNow; this.lowerArmAngle = lowerArmAngleNow; @@ -107,7 +107,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta int color; if (rave) { - float renderTick = AnimationTickHolder.getRenderTime(this.arm.getWorld()) + (tile.hashCode() % 64); + float renderTick = AnimationTickHolder.getRenderTime(this.arm.getLevel()) + (tile.hashCode() % 64); baseAngle = (renderTick * 10) % 360; lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15); upperArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 8) + 1) / 4, -45, 95); @@ -122,7 +122,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta } MatrixStack msLocal = new MatrixStack(); - MatrixStacker msr = MatrixStacker.of(msLocal); + MatrixTransformStack msr = MatrixTransformStack.of(msLocal); msr.translate(getInstancePosition()); msr.centre(); @@ -151,15 +151,15 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta .getItemRenderer(); boolean hasItem = !item.isEmpty(); boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem) - && itemRenderer.getItemModelWithOverrides(item, Minecraft.getInstance().world, null) + && itemRenderer.getModel(item, Minecraft.getInstance().level, null) .isGui3d(); for (int index : Iterate.zeroAndOne) { - msLocal.push(); + msLocal.pushPose(); int flip = index * 2 - 1; ArmRenderer.transformClawHalf(msr, hasItem, isBlockItem, flip); clawGrips.get(index).setTransform(msLocal); - msLocal.pop(); + msLocal.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index 2a0398b38..fd31b69db 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -1,21 +1,23 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; +import java.util.HashMap; import java.util.function.Supplier; import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableBoolean; -import com.google.common.collect.ImmutableMap; import com.jozufozu.flywheel.core.PartialModel; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity; import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock; import com.simibubi.create.content.contraptions.components.saw.SawBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; @@ -65,74 +67,80 @@ import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.InvWrapper; public abstract class ArmInteractionPoint { - - enum Mode { + public enum Mode { DEPOSIT, TAKE } - BlockPos pos; - BlockState state; - Mode mode; + protected BlockPos pos; + protected BlockState state; + protected Mode mode; - private LazyOptional cachedHandler; - private ArmAngleTarget cachedAngles; + protected LazyOptional cachedHandler; + protected ArmAngleTarget cachedAngles; - private static ImmutableMap> POINTS = - ImmutableMap.>builder() - .put(new Saw(), Saw::new) - .put(new Belt(), Belt::new) - .put(new Depot(), Depot::new) - .put(new Chute(), Chute::new) - .put(new Basin(), Basin::new) - .put(new Funnel(), Funnel::new) - .put(new Jukebox(), Jukebox::new) - .put(new Crafter(), Crafter::new) - .put(new Deployer(), Deployer::new) - .put(new Composter(), Composter::new) - .put(new Millstone(), Millstone::new) - .put(new BlazeBurner(), BlazeBurner::new) - .put(new CrushingWheels(), CrushingWheels::new) - .build(); + protected static final HashMap> POINTS = new HashMap<>(); + + static { + addPoint(new Saw(), Saw::new); + addPoint(new Belt(), Belt::new); + addPoint(new Depot(), Depot::new); + addPoint(new Chute(), Chute::new); + addPoint(new Basin(), Basin::new); + addPoint(new Funnel(), Funnel::new); + addPoint(new Jukebox(), Jukebox::new); + addPoint(new Crafter(), Crafter::new); + addPoint(new Deployer(), Deployer::new); + addPoint(new Composter(), Composter::new); + addPoint(new Millstone(), Millstone::new); + addPoint(new BlazeBurner(), BlazeBurner::new); + addPoint(new CrushingWheels(), CrushingWheels::new); + } + + public static void addPoint(ArmInteractionPoint instance, Supplier factory) { + if (POINTS.containsKey(instance)) + Create.LOGGER.warn("Point for " + instance.getClass().getSimpleName() + " was overridden"); + POINTS.put(instance, factory); + } public ArmInteractionPoint() { cachedHandler = LazyOptional.empty(); } @OnlyIn(Dist.CLIENT) - void transformFlag(MatrixStack stack) {} + protected void transformFlag(MatrixStack stack) {} - PartialModel getFlagType() { + protected PartialModel getFlagType() { return mode == Mode.TAKE ? AllBlockPartials.FLAG_LONG_OUT : AllBlockPartials.FLAG_LONG_IN; } - void cycleMode() { + protected void cycleMode() { mode = mode == Mode.DEPOSIT ? Mode.TAKE : Mode.DEPOSIT; } - Vector3d getInteractionPositionVector() { + protected Vector3d getInteractionPositionVector() { return VecHelper.getCenterOf(pos); } - Direction getInteractionDirection() { + protected Direction getInteractionDirection() { return Direction.DOWN; } - boolean isStillValid(IBlockReader reader) { + protected boolean isStillValid(IBlockReader reader) { return isValid(reader, pos, reader.getBlockState(pos)); } - void keepAlive(IWorld world) {} + protected void keepAlive(IWorld world) {} - abstract boolean isValid(IBlockReader reader, BlockPos pos, BlockState state); + protected abstract boolean isValid(IBlockReader reader, BlockPos pos, BlockState state); - static boolean isInteractable(IBlockReader reader, BlockPos pos, BlockState state) { + protected static boolean isInteractable(IBlockReader reader, BlockPos pos, BlockState state) { for (ArmInteractionPoint armInteractionPoint : POINTS.keySet()) if (armInteractionPoint.isValid(reader, pos, state)) return true; return false; } - ArmAngleTarget getTargetAngles(BlockPos armPos, boolean ceiling) { + protected ArmAngleTarget getTargetAngles(BlockPos armPos, boolean ceiling) { if (cachedAngles == null) cachedAngles = new ArmAngleTarget(armPos, getInteractionPositionVector(), getInteractionDirection(), ceiling); @@ -141,9 +149,9 @@ public abstract class ArmInteractionPoint { } @Nullable - IItemHandler getHandler(World world) { + protected IItemHandler getHandler(World world) { if (!cachedHandler.isPresent()) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (te == null) return null; cachedHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.UP); @@ -151,25 +159,25 @@ public abstract class ArmInteractionPoint { return cachedHandler.orElse(null); } - ItemStack insert(World world, ItemStack stack, boolean simulate) { + protected ItemStack insert(World world, ItemStack stack, boolean simulate) { IItemHandler handler = getHandler(world); if (handler == null) return stack; return ItemHandlerHelper.insertItem(handler, stack, simulate); } - ItemStack extract(World world, int slot, int amount, boolean simulate) { + protected ItemStack extract(World world, int slot, int amount, boolean simulate) { IItemHandler handler = getHandler(world); if (handler == null) return ItemStack.EMPTY; return handler.extractItem(slot, amount, simulate); } - ItemStack extract(World world, int slot, boolean simulate) { + protected ItemStack extract(World world, int slot, boolean simulate) { return extract(world, slot, 64, simulate); } - int getSlotCount(World world) { + protected int getSlotCount(World world) { IItemHandler handler = getHandler(world); if (handler == null) return 0; @@ -177,7 +185,7 @@ public abstract class ArmInteractionPoint { } @Nullable - static ArmInteractionPoint createAt(IBlockReader world, BlockPos pos) { + protected static ArmInteractionPoint createAt(IBlockReader world, BlockPos pos) { BlockState state = world.getBlockState(pos); ArmInteractionPoint point = null; @@ -195,161 +203,167 @@ public abstract class ArmInteractionPoint { return point; } - CompoundNBT serialize(BlockPos anchor) { + protected CompoundNBT serialize(BlockPos anchor) { CompoundNBT nbt = new CompoundNBT(); nbt.put("Pos", NBTUtil.writeBlockPos(pos.subtract(anchor))); NBTHelper.writeEnum(nbt, "Mode", mode); return nbt; } - static ArmInteractionPoint deserialize(IBlockReader world, BlockPos anchor, CompoundNBT nbt) { + protected static ArmInteractionPoint deserialize(IBlockReader world, BlockPos anchor, CompoundNBT nbt) { BlockPos pos = NBTUtil.readBlockPos(nbt.getCompound("Pos")); - ArmInteractionPoint interactionPoint = createAt(world, pos.add(anchor)); + ArmInteractionPoint interactionPoint = createAt(world, pos.offset(anchor)); if (interactionPoint == null) return null; interactionPoint.mode = NBTHelper.readEnum(nbt, "Mode", Mode.class); return interactionPoint; } - static abstract class TopFaceArmInteractionPoint extends ArmInteractionPoint { + protected static void transformPos(StructureTransform transform, CompoundNBT nbt) { + BlockPos pos = NBTUtil.readBlockPos(nbt.getCompound("Pos")); + pos = transform.applyWithoutOffset(pos); + nbt.put("Pos", NBTUtil.writeBlockPos(pos)); + } + + public static abstract class TopFaceArmInteractionPoint extends ArmInteractionPoint { @Override - Vector3d getInteractionPositionVector() { - return Vector3d.of(pos).add(.5f, 1, .5f); + protected Vector3d getInteractionPositionVector() { + return Vector3d.atLowerCornerOf(pos).add(.5f, 1, .5f); } } - static class Depot extends ArmInteractionPoint { + public static class Depot extends ArmInteractionPoint { @Override - Vector3d getInteractionPositionVector() { - return Vector3d.of(pos).add(.5f, 14 / 16f, .5f); + protected Vector3d getInteractionPositionVector() { + return Vector3d.atLowerCornerOf(pos).add(.5f, 14 / 16f, .5f); } @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return AllBlocks.DEPOT.has(state) || AllBlocks.WEIGHTED_EJECTOR.has(state); } } - static class Saw extends Depot { + public static class Saw extends Depot { @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { - return AllBlocks.MECHANICAL_SAW.has(state) && state.get(SawBlock.FACING) == Direction.UP - && ((KineticTileEntity) reader.getTileEntity(pos)).getSpeed() != 0; + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return AllBlocks.MECHANICAL_SAW.has(state) && state.getValue(SawBlock.FACING) == Direction.UP + && ((KineticTileEntity) reader.getBlockEntity(pos)).getSpeed() != 0; } } - static class Millstone extends ArmInteractionPoint { + public static class Millstone extends ArmInteractionPoint { @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return AllBlocks.MILLSTONE.has(state); } } - static class CrushingWheels extends TopFaceArmInteractionPoint { + public static class CrushingWheels extends TopFaceArmInteractionPoint { @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(state); } } - static class Composter extends TopFaceArmInteractionPoint { + public static class Composter extends TopFaceArmInteractionPoint { @Override - Vector3d getInteractionPositionVector() { - return Vector3d.of(pos).add(.5f, 13 / 16f, .5f); + protected Vector3d getInteractionPositionVector() { + return Vector3d.atLowerCornerOf(pos).add(.5f, 13 / 16f, .5f); } @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return Blocks.COMPOSTER.equals(state.getBlock()); } @Nullable @Override - IItemHandler getHandler(World world) { + protected IItemHandler getHandler(World world) { return new InvWrapper( - ((ComposterBlock) Blocks.COMPOSTER).createInventory(world.getBlockState(pos), world, pos)); + ((ComposterBlock) Blocks.COMPOSTER).getContainer(world.getBlockState(pos), world, pos)); } } - static class Deployer extends ArmInteractionPoint { + public static class Deployer extends ArmInteractionPoint { @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return AllBlocks.DEPLOYER.has(state); } @Override - Direction getInteractionDirection() { - return state.get(DeployerBlock.FACING) + protected Direction getInteractionDirection() { + return state.getValue(DeployerBlock.FACING) .getOpposite(); } @Override - Vector3d getInteractionPositionVector() { + protected Vector3d getInteractionPositionVector() { return super.getInteractionPositionVector() - .add(Vector3d.of(getInteractionDirection().getDirectionVec()).scale(.65f)); + .add(Vector3d.atLowerCornerOf(getInteractionDirection().getNormal()).scale(.65f)); } } - static class BlazeBurner extends ArmInteractionPoint { + public static class BlazeBurner extends ArmInteractionPoint { @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return AllBlocks.BLAZE_BURNER.has(state); } @Override - ItemStack extract(World world, int slot, int amount, boolean simulate) { + protected ItemStack extract(World world, int slot, int amount, boolean simulate) { return ItemStack.EMPTY; } @Override - ItemStack insert(World world, ItemStack stack, boolean simulate) { + protected ItemStack insert(World world, ItemStack stack, boolean simulate) { ItemStack input = stack.copy(); - if (!BlazeBurnerBlock.tryInsert(state, world, pos, input, false, true) - .getResult() + if (!BlazeBurnerBlock.tryInsert(state, world, pos, input, false, false, true) + .getObject() .isEmpty()) { return stack; } - ActionResult res = BlazeBurnerBlock.tryInsert(state, world, pos, input, false, simulate); - return res.getType() == ActionResultType.SUCCESS + ActionResult res = BlazeBurnerBlock.tryInsert(state, world, pos, input, false, false, simulate); + return res.getResult() == ActionResultType.SUCCESS ? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1) : stack; } @Override - void cycleMode() {} + protected void cycleMode() {} } - static class Crafter extends ArmInteractionPoint { + public static class Crafter extends ArmInteractionPoint { @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return AllBlocks.MECHANICAL_CRAFTER.has(state); } @Override - Direction getInteractionDirection() { - return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING) + protected Direction getInteractionDirection() { + return state.getValue(MechanicalCrafterBlock.HORIZONTAL_FACING) .getOpposite(); } @Override - ItemStack extract(World world, int slot, int amount, boolean simulate) { - TileEntity te = world.getTileEntity(pos); + protected ItemStack extract(World world, int slot, int amount, boolean simulate) { + TileEntity te = world.getBlockEntity(pos); if (!(te instanceof MechanicalCrafterTileEntity)) return ItemStack.EMPTY; MechanicalCrafterTileEntity crafter = (MechanicalCrafterTileEntity) te; @@ -361,37 +375,37 @@ public abstract class ArmInteractionPoint { } @Override - Vector3d getInteractionPositionVector() { + protected Vector3d getInteractionPositionVector() { return super.getInteractionPositionVector() - .add(Vector3d.of(getInteractionDirection().getDirectionVec()).scale(.5f)); + .add(Vector3d.atLowerCornerOf(getInteractionDirection().getNormal()).scale(.5f)); } } - static class Basin extends ArmInteractionPoint { + public static class Basin extends ArmInteractionPoint { @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return AllBlocks.BASIN.has(state); } } - static class Jukebox extends TopFaceArmInteractionPoint { + public static class Jukebox extends TopFaceArmInteractionPoint { @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return state.getBlock() instanceof JukeboxBlock; } @Override - int getSlotCount(World world) { + protected int getSlotCount(World world) { return 1; } @Override - ItemStack insert(World world, ItemStack stack, boolean simulate) { - TileEntity tileEntity = world.getTileEntity(pos); + protected ItemStack insert(World world, ItemStack stack, boolean simulate) { + TileEntity tileEntity = world.getBlockEntity(pos); if (!(tileEntity instanceof JukeboxTileEntity)) return stack; if (!(state.getBlock() instanceof JukeboxBlock)) @@ -405,17 +419,17 @@ public abstract class ArmInteractionPoint { return stack; ItemStack remainder = stack.copy(); ItemStack toInsert = remainder.split(1); - if (!simulate && !world.isRemote) { - jukeboxBlock.insertRecord(world, pos, state, toInsert); - world.playEvent(null, 1010, pos, Item.getIdFromItem(toInsert.getItem())); + if (!simulate && !world.isClientSide) { + jukeboxBlock.setRecord(world, pos, state, toInsert); + world.levelEvent(null, 1010, pos, Item.getId(toInsert.getItem())); AllTriggers.triggerForNearbyPlayers(AllTriggers.MUSICAL_ARM, world, pos, 10); } return remainder; } @Override - ItemStack extract(World world, int slot, int amount, boolean simulate) { - TileEntity tileEntity = world.getTileEntity(pos); + protected ItemStack extract(World world, int slot, int amount, boolean simulate) { + TileEntity tileEntity = world.getBlockEntity(pos); if (!(tileEntity instanceof JukeboxTileEntity)) return ItemStack.EMPTY; if (!(state.getBlock() instanceof JukeboxBlock)) @@ -424,26 +438,26 @@ public abstract class ArmInteractionPoint { ItemStack itemstack = jukeboxTE.getRecord(); if (itemstack.isEmpty()) return ItemStack.EMPTY; - if (!simulate && !world.isRemote) { - world.playEvent(1010, pos, 0); - jukeboxTE.clear(); - world.setBlockState(pos, state.with(JukeboxBlock.HAS_RECORD, false), 2); + if (!simulate && !world.isClientSide) { + world.levelEvent(1010, pos, 0); + jukeboxTE.clearContent(); + world.setBlock(pos, state.setValue(JukeboxBlock.HAS_RECORD, false), 2); } return itemstack; } } - static class Belt extends Depot { + public static class Belt extends Depot { @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { - return AllBlocks.BELT.has(state) && !(reader.getBlockState(pos.up()) + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return AllBlocks.BELT.has(state) && !(reader.getBlockState(pos.above()) .getBlock() instanceof BeltTunnelBlock); } @Override - void keepAlive(IWorld world) { + protected void keepAlive(IWorld world) { super.keepAlive(world); BeltTileEntity beltTE = BeltHelper.getSegmentTE(world, pos); if (beltTE == null) @@ -464,45 +478,45 @@ public abstract class ArmInteractionPoint { } - static class Chute extends TopFaceArmInteractionPoint { + public static class Chute extends TopFaceArmInteractionPoint { @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return AbstractChuteBlock.isChute(state); } } - static class Funnel extends ArmInteractionPoint { + public static class Funnel extends ArmInteractionPoint { @Override - Vector3d getInteractionPositionVector() { + protected Vector3d getInteractionPositionVector() { return VecHelper.getCenterOf(pos) - .add(Vector3d.of(FunnelBlock.getFunnelFacing(state) - .getDirectionVec()).scale(-.15f)); + .add(Vector3d.atLowerCornerOf(FunnelBlock.getFunnelFacing(state) + .getNormal()).scale(-.15f)); } @Override - int getSlotCount(World world) { + protected int getSlotCount(World world) { return 0; } @Override - ItemStack extract(World world, int slot, int amount, boolean simulate) { + protected ItemStack extract(World world, int slot, int amount, boolean simulate) { return ItemStack.EMPTY; } @Override - Direction getInteractionDirection() { + protected Direction getInteractionDirection() { return FunnelBlock.getFunnelFacing(state) .getOpposite(); } @Override - ItemStack insert(World world, ItemStack stack, boolean simulate) { + protected ItemStack insert(World world, ItemStack stack, boolean simulate) { FilteringBehaviour filtering = TileEntityBehaviour.get(world, pos, FilteringBehaviour.TYPE); InvManipulationBehaviour inserter = TileEntityBehaviour.get(world, pos, InvManipulationBehaviour.TYPE); BlockState state = world.getBlockState(pos); - if (state.method_28500(BlockStateProperties.POWERED).orElse(false)) + if (state.getOptionalValue(BlockStateProperties.POWERED).orElse(false)) return stack; if (inserter == null) return stack; @@ -512,7 +526,7 @@ public abstract class ArmInteractionPoint { inserter.simulate(); ItemStack insert = inserter.insert(stack); if (!simulate && insert.getCount() != stack.getCount()) { - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof FunnelTileEntity) { FunnelTileEntity funnelTileEntity = (FunnelTileEntity) tileEntity; funnelTileEntity.onTransfer(stack); @@ -524,15 +538,14 @@ public abstract class ArmInteractionPoint { } @Override - boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + protected boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return state.getBlock() instanceof AbstractFunnelBlock - && !(state.contains(FunnelBlock.EXTRACTING) && state.get(FunnelBlock.EXTRACTING)) - && !(state.contains(BeltFunnelBlock.SHAPE) && state.get(BeltFunnelBlock.SHAPE) == Shape.PUSHING); + && !(state.hasProperty(FunnelBlock.EXTRACTING) && state.getValue(FunnelBlock.EXTRACTING)) + && !(state.hasProperty(BeltFunnelBlock.SHAPE) && state.getValue(BeltFunnelBlock.SHAPE) == Shape.PUSHING); } @Override - void cycleMode() {} + protected void cycleMode() {} } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java index ff7cbdcc1..7e7142efc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java @@ -45,7 +45,7 @@ public class ArmInteractionPointHandler { return; BlockPos pos = event.getPos(); World world = event.getWorld(); - if (!world.isRemote) + if (!world.isClientSide) return; PlayerEntity player = event.getPlayer(); if (player != null && player.isSpectator()) @@ -66,8 +66,8 @@ public class ArmInteractionPointHandler { String key = selected.mode == Mode.DEPOSIT ? "mechanical_arm.deposit_to" : "mechanical_arm.extract_from"; TextFormatting colour = selected.mode == Mode.DEPOSIT ? TextFormatting.GOLD : TextFormatting.AQUA; TranslationTextComponent translatedBlock = new TranslationTextComponent(selected.state.getBlock() - .getTranslationKey()); - player.sendStatusMessage((Lang.translate(key, translatedBlock.formatted(TextFormatting.WHITE, colour)).formatted(colour)), + .getDescriptionId()); + player.displayClientMessage((Lang.translate(key, translatedBlock.withStyle(TextFormatting.WHITE, colour)).withStyle(colour)), true); } @@ -79,7 +79,7 @@ public class ArmInteractionPointHandler { public static void leftClickingBlocksDeselectsThem(PlayerInteractEvent.LeftClickBlock event) { if (currentItem == null) return; - if (!event.getWorld().isRemote) + if (!event.getWorld().isClientSide) return; BlockPos pos = event.getPos(); if (remove(pos) != null) { @@ -95,7 +95,7 @@ public class ArmInteractionPointHandler { int removed = 0; for (Iterator iterator = currentSelection.iterator(); iterator.hasNext();) { ArmInteractionPoint point = iterator.next(); - if (point.pos.withinDistance(pos, ArmTileEntity.getRange())) + if (point.pos.closerThan(pos, ArmTileEntity.getRange())) continue; iterator.remove(); removed++; @@ -103,8 +103,8 @@ public class ArmInteractionPointHandler { ClientPlayerEntity player = Minecraft.getInstance().player; if (removed > 0) { - player.sendStatusMessage(Lang.createTranslationTextComponent("mechanical_arm.points_outside_range", removed) - .formatted(TextFormatting.RED), true); + player.displayClientMessage(Lang.createTranslationTextComponent("mechanical_arm.points_outside_range", removed) + .withStyle(TextFormatting.RED), true); } else { int inputs = 0; int outputs = 0; @@ -115,8 +115,8 @@ public class ArmInteractionPointHandler { inputs++; } if (inputs + outputs > 0) - player.sendStatusMessage(Lang.createTranslationTextComponent("mechanical_arm.summary", inputs, outputs) - .formatted(TextFormatting.WHITE), true); + player.displayClientMessage(Lang.createTranslationTextComponent("mechanical_arm.summary", inputs, outputs) + .withStyle(TextFormatting.WHITE), true); } AllPackets.channel.sendToServer(new ArmPlacementPacket(currentSelection, pos)); @@ -130,7 +130,7 @@ public class ArmInteractionPointHandler { if (player == null) return; - ItemStack heldItemMainhand = player.getHeldItemMainhand(); + ItemStack heldItemMainhand = player.getMainHandItem(); if (!AllBlocks.MECHANICAL_ARM.isIn(heldItemMainhand)) { currentItem = null; } else { @@ -150,27 +150,27 @@ public class ArmInteractionPointHandler { return; } - RayTraceResult objectMouseOver = Minecraft.getInstance().objectMouseOver; + RayTraceResult objectMouseOver = Minecraft.getInstance().hitResult; if (!(objectMouseOver instanceof BlockRayTraceResult)) { return; } BlockRayTraceResult result = (BlockRayTraceResult) objectMouseOver; - BlockPos pos = result.getPos(); + BlockPos pos = result.getBlockPos(); - TileEntity te = Minecraft.getInstance().world.getTileEntity(pos); + TileEntity te = Minecraft.getInstance().level.getBlockEntity(pos); if (!(te instanceof ArmTileEntity)) { lastBlockPos = -1; currentSelection.clear(); return; } - if (lastBlockPos == -1 || lastBlockPos != pos.toLong()) { + if (lastBlockPos == -1 || lastBlockPos != pos.asLong()) { currentSelection.clear(); ArmTileEntity arm = (ArmTileEntity) te; arm.inputs.forEach(ArmInteractionPointHandler::put); arm.outputs.forEach(ArmInteractionPointHandler::put); - lastBlockPos = pos.toLong(); + lastBlockPos = pos.asLong(); } if (lastBlockPos != -1) { @@ -179,7 +179,7 @@ public class ArmInteractionPointHandler { } private static void drawOutlines(Collection selection) { - World world = Minecraft.getInstance().world; + World world = Minecraft.getInstance().level; for (Iterator iterator = selection.iterator(); iterator.hasNext();) { ArmInteractionPoint point = iterator.next(); BlockPos pos = point.pos; @@ -195,8 +195,8 @@ public class ArmInteractionPointHandler { continue; int color = point.mode == Mode.DEPOSIT ? 0xffcb74 : 0x4f8a8b; - CreateClient.OUTLINER.showAABB(point, shape.getBoundingBox() - .offset(pos)) + CreateClient.OUTLINER.showAABB(point, shape.bounds() + .move(pos)) .colored(color) .lineWidth(1 / 16f); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java index c032ed3dc..5b49ef8ab 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java @@ -21,24 +21,24 @@ public class ArmItem extends BlockItem { } @Override - public ActionResultType onItemUse(ItemUseContext ctx) { - World world = ctx.getWorld(); - BlockPos pos = ctx.getPos(); + public ActionResultType useOn(ItemUseContext ctx) { + World world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); if (ArmInteractionPoint.isInteractable(world, pos, world.getBlockState(pos))) return ActionResultType.SUCCESS; - return super.onItemUse(ctx); + return super.useOn(ctx); } @Override - protected boolean onBlockPlaced(BlockPos pos, World world, PlayerEntity p_195943_3_, ItemStack p_195943_4_, + protected boolean updateCustomBlockEntityTag(BlockPos pos, World world, PlayerEntity p_195943_3_, ItemStack p_195943_4_, BlockState p_195943_5_) { - if (world.isRemote) + if (world.isClientSide) DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ArmInteractionPointHandler.flushSettings(pos)); - return super.onBlockPlaced(pos, world, p_195943_3_, p_195943_4_, p_195943_5_); + return super.updateCustomBlockEntityTag(pos, world, p_195943_3_, p_195943_4_, p_195943_5_); } @Override - public boolean canPlayerBreakBlockWhileHolding(BlockState state, World world, BlockPos pos, + public boolean canAttackBlock(BlockState state, World world, BlockPos pos, PlayerEntity p_195938_4_) { return !ArmInteractionPoint.isInteractable(world, pos, state); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmPlacementPacket.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmPlacementPacket.java index 5ef6187a7..df74cd272 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmPlacementPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmPlacementPacket.java @@ -27,7 +27,7 @@ public class ArmPlacementPacket extends SimplePacketBase { } public ArmPlacementPacket(PacketBuffer buffer) { - CompoundNBT nbt = buffer.readCompoundTag(); + CompoundNBT nbt = buffer.readNbt(); receivedTag = nbt.getList("Points", NBT.TAG_COMPOUND); pos = buffer.readBlockPos(); } @@ -40,7 +40,7 @@ public class ArmPlacementPacket extends SimplePacketBase { .map(aip -> aip.serialize(pos)) .forEach(pointsNBT::add); nbt.put("Points", pointsNBT); - buffer.writeCompoundTag(nbt); + buffer.writeNbt(nbt); buffer.writeBlockPos(pos); } @@ -52,10 +52,10 @@ public class ArmPlacementPacket extends SimplePacketBase { .getSender(); if (player == null) return; - World world = player.world; - if (world == null || !world.isBlockPresent(pos)) + World world = player.level; + if (world == null || !world.isLoaded(pos)) return; - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); if (!(tileEntity instanceof ArmTileEntity)) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 3955b833c..9b0f4499a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; import com.jozufozu.flywheel.backend.Backend; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; @@ -12,7 +13,6 @@ import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -32,7 +32,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { } @Override - public boolean isGlobalRenderer(KineticTileEntity te) { + public boolean shouldRenderOffScreen(KineticTileEntity te) { return true; } @@ -44,7 +44,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { ArmTileEntity arm = (ArmTileEntity) te; ItemStack item = arm.heldItem; boolean hasItem = !item.isEmpty(); - boolean usingFlywheel = Backend.getInstance().canUseInstancing(te.getWorld()); + boolean usingFlywheel = Backend.getInstance().canUseInstancing(te.getLevel()); if (usingFlywheel && !hasItem) return; @@ -52,14 +52,14 @@ public class ArmRenderer extends KineticTileEntityRenderer { .getItemRenderer(); boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem) - && itemRenderer.getItemModelWithOverrides(item, Minecraft.getInstance().world, null) + && itemRenderer.getModel(item, Minecraft.getInstance().level, null) .isGui3d(); - IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); + IVertexBuilder builder = buffer.getBuffer(RenderType.solid()); BlockState blockState = te.getBlockState(); MatrixStack msLocal = new MatrixStack(); - MatrixStacker msr = MatrixStacker.of(msLocal); + MatrixTransformStack msr = MatrixTransformStack.of(msLocal); float baseAngle; float lowerArmAngle; @@ -69,7 +69,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { boolean rave = arm.phase == Phase.DANCING && te.getSpeed() != 0; if (rave) { - float renderTick = AnimationTickHolder.getRenderTime(te.getWorld()) + (te.hashCode() % 64); + float renderTick = AnimationTickHolder.getRenderTime(te.getLevel()) + (te.hashCode() % 64); baseAngle = (renderTick * 10) % 360; lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15); upperArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 8) + 1) / 4, -45, 95); @@ -85,7 +85,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { msr.centre(); - if (blockState.get(ArmBlock.CEILING)) + if (blockState.getValue(ArmBlock.CEILING)) msr.rotateX(180); if (usingFlywheel) @@ -94,22 +94,22 @@ public class ArmRenderer extends KineticTileEntityRenderer { renderArm(builder, ms, msLocal, msr, blockState, color, baseAngle, lowerArmAngle, upperArmAngle, headAngle, hasItem, isBlockItem, light); if (hasItem) { - ms.push(); + ms.pushPose(); float itemScale = isBlockItem ? .5f : .625f; msr.rotateX(90); msLocal.translate(0, -4 / 16f, 0); msLocal.scale(itemScale, itemScale, itemScale); - ms.peek().getModel().multiply(msLocal.peek().getModel()); + ms.last().pose().multiply(msLocal.last().pose()); itemRenderer - .renderItem(item, TransformType.FIXED, light, overlay, ms, buffer); - ms.pop(); + .renderStatic(item, TransformType.FIXED, light, overlay, ms, buffer); + ms.popPose(); } } - private void renderArm(IVertexBuilder builder, MatrixStack ms, MatrixStack msLocal, MatrixStacker msr, BlockState blockState, int color, float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle, boolean hasItem, boolean isBlockItem, int light) { + private void renderArm(IVertexBuilder builder, MatrixStack ms, MatrixStack msLocal, MatrixTransformStack msr, BlockState blockState, int color, float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle, boolean hasItem, boolean isBlockItem, int light) { SuperByteBuffer base = PartialBufferer.get(AllBlockPartials.ARM_BASE, blockState).light(light); SuperByteBuffer lowerBody = PartialBufferer.get(AllBlockPartials.ARM_LOWER_BODY, blockState).light(light); SuperByteBuffer upperBody = PartialBufferer.get(AllBlockPartials.ARM_UPPER_BODY, blockState).light(light); @@ -140,14 +140,14 @@ public class ArmRenderer extends KineticTileEntityRenderer { .renderInto(ms, builder); for (int flip : Iterate.positiveAndNegative) { - msLocal.push(); + msLocal.pushPose(); transformClawHalf(msr, hasItem, isBlockItem, flip); clawGrip.light(light).transform(msLocal).renderInto(ms, builder); - msLocal.pop(); + msLocal.popPose(); } } - private void doItemTransforms(MatrixStacker msr, float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle) { + private void doItemTransforms(MatrixTransformStack msr, float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle) { transformBase(msr, baseAngle); transformLowerArm(msr, lowerArmAngle); @@ -156,32 +156,32 @@ public class ArmRenderer extends KineticTileEntityRenderer { transformClaw(msr); } - public static void transformClawHalf(MatrixStacker msr, boolean hasItem, boolean isBlockItem, int flip) { + public static void transformClawHalf(MatrixTransformStack msr, boolean hasItem, boolean isBlockItem, int flip) { msr.translate(0, flip * 3 / 16d, -1 / 16d); msr.rotateX(flip * (hasItem ? isBlockItem ? 0 : -35 : 0)); } - public static void transformClaw(MatrixStacker msr) { + public static void transformClaw(MatrixTransformStack msr) { msr.translate(0, 0, -4 / 16d); } - public static void transformHead(MatrixStacker msr, float headAngle) { + public static void transformHead(MatrixTransformStack msr, float headAngle) { msr.translate(0, 11 / 16d, -11 / 16d); msr.rotateX(headAngle); } - public static void transformUpperArm(MatrixStacker msr, float upperArmAngle) { + public static void transformUpperArm(MatrixTransformStack msr, float upperArmAngle) { msr.translate(0, 12 / 16d, 12 / 16d); msr.rotateX(upperArmAngle); } - public static void transformLowerArm(MatrixStacker msr, float lowerArmAngle) { + public static void transformLowerArm(MatrixTransformStack msr, float lowerArmAngle) { msr.translate(0, 1 / 16d, -2 / 16d); msr.rotateX(lowerArmAngle); msr.translate(0, -1 / 16d, 0); } - public static void transformBase(MatrixStacker msr, float baseAngle) { + public static void transformBase(MatrixTransformStack msr, float baseAngle) { msr.translate(0, 4 / 16d, 0); msr.rotateY(baseAngle); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index 9db6a126a..8c374085a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -7,6 +7,8 @@ import javax.annotation.Nullable; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.ITransformableTE; +import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Jukebox; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Mode; import com.simibubi.create.foundation.advancement.AllTriggers; @@ -41,7 +43,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.Constants.NBT; -public class ArmTileEntity extends KineticTileEntity { +public class ArmTileEntity extends KineticTileEntity implements ITransformableTE { // Server List inputs; @@ -116,11 +118,11 @@ public class ArmTileEntity extends KineticTileEntity { if (phase == Phase.MOVE_TO_INPUT) { ArmInteractionPoint point = getTargetedInteractionPoint(); if (point != null) - point.keepAlive(world); + point.keepAlive(level); } return; } - if (world.isRemote) + if (level.isClientSide) return; if (phase == Phase.MOVE_TO_INPUT) @@ -138,7 +140,7 @@ public class ArmTileEntity extends KineticTileEntity { public void lazyTick() { super.lazyTick(); - if (world.isRemote) + if (level.isClientSide) return; if (chasedPointProgress < .5f) return; @@ -152,7 +154,7 @@ public class ArmTileEntity extends KineticTileEntity { boolean hasMusic = checkForMusicAmong(inputs) || checkForMusicAmong(outputs); if (hasMusic != (phase == Phase.DANCING)) { phase = hasMusic ? Phase.DANCING : Phase.SEARCH_INPUTS; - markDirty(); + setChanged(); sendData(); } } @@ -160,15 +162,15 @@ public class ArmTileEntity extends KineticTileEntity { @Override @OnlyIn(Dist.CLIENT) public AxisAlignedBB makeRenderBoundingBox() { - return super.makeRenderBoundingBox().grow(3); + return super.makeRenderBoundingBox().inflate(3); } private boolean checkForMusicAmong(List list) { for (ArmInteractionPoint armInteractionPoint : list) { if (!(armInteractionPoint instanceof Jukebox)) continue; - BlockState state = world.getBlockState(armInteractionPoint.pos); - if (state.method_28500(JukeboxBlock.HAS_RECORD).orElse(false)) + BlockState state = level.getBlockState(armInteractionPoint.pos); + if (state.getOptionalValue(JukeboxBlock.HAS_RECORD).orElse(false)) return true; } return false; @@ -179,13 +181,13 @@ public class ArmTileEntity extends KineticTileEntity { chasedPointProgress += Math.min(256, Math.abs(getSpeed())) / 1024f; if (chasedPointProgress > 1) chasedPointProgress = 1; - if (!world.isRemote) + if (!level.isClientSide) return !targetReachedPreviously && chasedPointProgress >= 1; ArmInteractionPoint targetedInteractionPoint = getTargetedInteractionPoint(); ArmAngleTarget previousTarget = this.previousTarget; ArmAngleTarget target = targetedInteractionPoint == null ? ArmAngleTarget.NO_TARGET - : targetedInteractionPoint.getTargetAngles(pos, isOnCeiling()); + : targetedInteractionPoint.getTargetAngles(worldPosition, isOnCeiling()); baseAngle.set(AngleHelper.angleLerp(chasedPointProgress, previousBaseAngle, target == ArmAngleTarget.NO_TARGET ? previousBaseAngle : target.baseAngle)); @@ -206,7 +208,7 @@ public class ArmTileEntity extends KineticTileEntity { protected boolean isOnCeiling() { BlockState state = getBlockState(); - return hasWorld() && state.method_28500(ArmBlock.CEILING).orElse(false); + return hasLevel() && state.getOptionalValue(ArmBlock.CEILING).orElse(false); } @Nullable @@ -237,9 +239,9 @@ public class ArmTileEntity extends KineticTileEntity { InteractionPoints: for (int i = startIndex; i < scanRange; i++) { ArmInteractionPoint armInteractionPoint = inputs.get(i); - if (!armInteractionPoint.isStillValid(world)) + if (!armInteractionPoint.isStillValid(level)) continue; - for (int j = 0; j < armInteractionPoint.getSlotCount(world); j++) { + for (int j = 0; j < armInteractionPoint.getSlotCount(level); j++) { if (getDistributableAmount(armInteractionPoint, j) == 0) continue; @@ -275,10 +277,10 @@ public class ArmTileEntity extends KineticTileEntity { for (int i = startIndex; i < scanRange; i++) { ArmInteractionPoint armInteractionPoint = outputs.get(i); - if (!armInteractionPoint.isStillValid(world)) + if (!armInteractionPoint.isStillValid(level)) continue; - ItemStack remainder = armInteractionPoint.insert(world, held, true); + ItemStack remainder = armInteractionPoint.insert(level, held, true); if (remainder.equals(heldItem, false)) continue; @@ -308,11 +310,11 @@ public class ArmTileEntity extends KineticTileEntity { else lastOutputIndex = index; sendData(); - markDirty(); + setChanged(); } protected int getDistributableAmount(ArmInteractionPoint armInteractionPoint, int i) { - ItemStack stack = armInteractionPoint.extract(world, i, true); + ItemStack stack = armInteractionPoint.extract(level, i, true); ItemStack remainder = simulateInsertion(stack); return stack.getCount() - remainder.getCount(); } @@ -321,37 +323,37 @@ public class ArmTileEntity extends KineticTileEntity { ArmInteractionPoint armInteractionPoint = getTargetedInteractionPoint(); if (armInteractionPoint != null) { ItemStack toInsert = heldItem.copy(); - ItemStack remainder = armInteractionPoint.insert(world, toInsert, false); + ItemStack remainder = armInteractionPoint.insert(level, toInsert, false); heldItem = remainder; } phase = heldItem.isEmpty() ? Phase.SEARCH_INPUTS : Phase.SEARCH_OUTPUTS; chasedPointProgress = 0; chasedPointIndex = -1; sendData(); - markDirty(); + setChanged(); - if (!world.isRemote) - AllTriggers.triggerForNearbyPlayers(AllTriggers.MECHANICAL_ARM, world, pos, 10); + if (!level.isClientSide) + AllTriggers.triggerForNearbyPlayers(AllTriggers.MECHANICAL_ARM, level, worldPosition, 10); } protected void collectItem() { ArmInteractionPoint armInteractionPoint = getTargetedInteractionPoint(); if (armInteractionPoint != null) - for (int i = 0; i < armInteractionPoint.getSlotCount(world); i++) { + for (int i = 0; i < armInteractionPoint.getSlotCount(level); i++) { int amountExtracted = getDistributableAmount(armInteractionPoint, i); if (amountExtracted == 0) continue; ItemStack prevHeld = heldItem; - heldItem = armInteractionPoint.extract(world, i, amountExtracted, false); + heldItem = armInteractionPoint.extract(level, i, amountExtracted, false); phase = Phase.SEARCH_OUTPUTS; chasedPointProgress = 0; chasedPointIndex = -1; sendData(); - markDirty(); + setChanged(); - if (!prevHeld.isItemEqual(heldItem)) - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, .125f, + if (!prevHeld.sameItem(heldItem)) + level.playSound(null, worldPosition, SoundEvents.ITEM_PICKUP, SoundCategory.BLOCKS, .125f, .5f + Create.RANDOM.nextFloat() * .25f); return; } @@ -360,12 +362,12 @@ public class ArmTileEntity extends KineticTileEntity { chasedPointProgress = 0; chasedPointIndex = -1; sendData(); - markDirty(); + setChanged(); } private ItemStack simulateInsertion(ItemStack stack) { for (ArmInteractionPoint armInteractionPoint : outputs) { - stack = armInteractionPoint.insert(world, stack, true); + stack = armInteractionPoint.insert(level, stack, true); if (stack.isEmpty()) break; } @@ -373,9 +375,9 @@ public class ArmTileEntity extends KineticTileEntity { } public void redstoneUpdate() { - if (world.isRemote) + if (level.isClientSide) return; - boolean blockPowered = world.isBlockPowered(pos); + boolean blockPowered = level.hasNeighborSignal(worldPosition); if (blockPowered == redstoneLocked) return; redstoneLocked = blockPowered; @@ -384,17 +386,30 @@ public class ArmTileEntity extends KineticTileEntity { searchForItem(); } + @Override + public void transform(StructureTransform transform) { + if (interactionPointTag == null) + return; + + for (INBT inbt : interactionPointTag) { + ArmInteractionPoint.transformPos(transform, (CompoundNBT) inbt); + } + + sendData(); + setChanged(); + } + protected void initInteractionPoints() { if (!updateInteractionPoints || interactionPointTag == null) return; - if (!world.isAreaLoaded(pos, getRange() + 1)) + if (!level.isAreaLoaded(worldPosition, getRange() + 1)) return; inputs.clear(); outputs.clear(); boolean hasBlazeBurner = false; for (INBT inbt : interactionPointTag) { - ArmInteractionPoint point = ArmInteractionPoint.deserialize(world, pos, (CompoundNBT) inbt); + ArmInteractionPoint point = ArmInteractionPoint.deserialize(level, worldPosition, (CompoundNBT) inbt); if (point == null) continue; if (point.mode == Mode.DEPOSIT) @@ -404,16 +419,16 @@ public class ArmTileEntity extends KineticTileEntity { hasBlazeBurner |= point instanceof ArmInteractionPoint.BlazeBurner; } - if (!world.isRemote) { + if (!level.isClientSide) { if (outputs.size() >= 10) - AllTriggers.triggerForNearbyPlayers(AllTriggers.ARM_MANY_TARGETS, world, pos, 5); + AllTriggers.triggerForNearbyPlayers(AllTriggers.ARM_MANY_TARGETS, level, worldPosition, 5); if (hasBlazeBurner) - AllTriggers.triggerForNearbyPlayers(AllTriggers.ARM_BLAZE_BURNER, world, pos, 5); + AllTriggers.triggerForNearbyPlayers(AllTriggers.ARM_BLAZE_BURNER, level, worldPosition, 5); } updateInteractionPoints = false; sendData(); - markDirty(); + setChanged(); } public void writeInteractionPoints(CompoundNBT compound) { @@ -422,10 +437,10 @@ public class ArmTileEntity extends KineticTileEntity { } else { ListNBT pointsNBT = new ListNBT(); inputs.stream() - .map(aip -> aip.serialize(pos)) + .map(aip -> aip.serialize(worldPosition)) .forEach(pointsNBT::add); outputs.stream() - .map(aip -> aip.serialize(pos)) + .map(aip -> aip.serialize(worldPosition)) .forEach(pointsNBT::add); compound.put("InteractionPoints", pointsNBT); } @@ -458,7 +473,7 @@ public class ArmTileEntity extends KineticTileEntity { ListNBT interactionPointTagBefore = interactionPointTag; super.fromTag(state, compound, clientPacket); - heldItem = ItemStack.read(compound.getCompound("HeldItem")); + heldItem = ItemStack.of(compound.getCompound("HeldItem")); phase = NBTHelper.readEnum(compound, "Phase", Phase.class); chasedPointIndex = compound.getInt("TargetPointIndex"); chasedPointProgress = compound.getFloat("MovementProgress"); @@ -478,9 +493,9 @@ public class ArmTileEntity extends KineticTileEntity { if (previousPhase == Phase.MOVE_TO_OUTPUT && previousIndex < outputs.size()) previousPoint = outputs.get(previousIndex); previousTarget = - previousPoint == null ? ArmAngleTarget.NO_TARGET : previousPoint.getTargetAngles(pos, ceiling); + previousPoint == null ? ArmAngleTarget.NO_TARGET : previousPoint.getTargetAngles(worldPosition, ceiling); if (previousPoint != null) - previousBaseAngle = previousPoint.getTargetAngles(pos, ceiling).baseAngle; + previousBaseAngle = previousPoint.getTargetAngles(worldPosition, ceiling).baseAngle; } } @@ -516,7 +531,7 @@ public class ArmTileEntity extends KineticTileEntity { @Override protected Vector3d getLocalOffset(BlockState state) { - int yPos = state.get(ArmBlock.CEILING) ? 16 - 3 : 3; + int yPos = state.getValue(ArmBlock.CEILING) ? 16 - 3 : 3; Vector3d location = VecHelper.voxelSpace(8, yPos, 15.95); location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Direction.Axis.Y); return location; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java index bda0d93db..00f805719 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java @@ -46,36 +46,36 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE { - boolean sneak = player.isSneaking(); + boolean sneak = player.isShiftKeyDown(); te.changeState(sneak); float f = .25f + ((te.state + 5) / 15f) * .5f; - worldIn.playSound(null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f); + worldIn.playSound(null, pos, SoundEvents.LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f); return ActionResultType.SUCCESS; }); } @Override - public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { + public int getSignal(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { return getTileEntityOptional(blockAccess, pos).map(al -> al.state) .orElse(0); } @Override - public boolean canProvidePower(BlockState state) { + public boolean isSignalSource(BlockState state) { return true; } @Override - public int getStrongPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { - return getFacing(blockState) == side ? getWeakPower(blockState, blockAccess, pos, side) : 0; + public int getDirectSignal(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { + return getConnectedDirection(blockState) == side ? getSignal(blockState, blockAccess, pos, side) : 0; } @Override @@ -88,32 +88,32 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE { if (te.state != 0) updateNeighbors(state, worldIn, pos); - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); }); } private static void addParticles(BlockState state, IWorld worldIn, BlockPos pos, float alpha) { - Direction direction = state.get(HORIZONTAL_FACING) + Direction direction = state.getValue(FACING) .getOpposite(); - Direction direction1 = getFacing(state).getOpposite(); - double d0 = (double) pos.getX() + 0.5D + 0.1D * (double) direction.getXOffset() - + 0.2D * (double) direction1.getXOffset(); - double d1 = (double) pos.getY() + 0.5D + 0.1D * (double) direction.getYOffset() - + 0.2D * (double) direction1.getYOffset(); - double d2 = (double) pos.getZ() + 0.5D + 0.1D * (double) direction.getZOffset() - + 0.2D * (double) direction1.getZOffset(); + Direction direction1 = getConnectedDirection(state).getOpposite(); + double d0 = (double) pos.getX() + 0.5D + 0.1D * (double) direction.getStepX() + + 0.2D * (double) direction1.getStepX(); + double d1 = (double) pos.getY() + 0.5D + 0.1D * (double) direction.getStepY() + + 0.2D * (double) direction1.getStepY(); + double d2 = (double) pos.getZ() + 0.5D + 0.1D * (double) direction.getStepZ() + + 0.2D * (double) direction1.getStepZ(); worldIn.addParticle(new RedstoneParticleData(1.0F, 0.0F, 0.0F, alpha), d0, d1, d2, 0.0D, 0.0D, 0.0D); } static void updateNeighbors(BlockState state, World world, BlockPos pos) { - world.notifyNeighborsOfStateChange(pos, state.getBlock()); - world.notifyNeighborsOfStateChange(pos.offset(getFacing(state).getOpposite()), state.getBlock()); + world.updateNeighborsAt(pos, state.getBlock()); + world.updateNeighborsAt(pos.relative(getConnectedDirection(state).getOpposite()), state.getBlock()); } @SuppressWarnings("deprecation") @@ -123,8 +123,8 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE builder) { - super.fillStateContainer(builder.add(HORIZONTAL_FACING, FACE)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(FACING, FACE)); } @Override @@ -133,7 +133,7 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE tooltip, boolean isPlayerSneaking) { - tooltip.add(componentSpacing.copy().append(Lang.translate("tooltip.analogStrength", this.state))); + tooltip.add(componentSpacing.plainCopy().append(Lang.translate("tooltip.analogStrength", this.state))); return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContactMovementBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContactMovementBehaviour.java index 770dcf450..adbf2b22f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContactMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContactMovementBehaviour.java @@ -16,7 +16,7 @@ public class ContactMovementBehaviour extends MovementBehaviour { @Override public Vector3d getActiveAreaOffset(MovementContext context) { - return Vector3d.of(context.state.get(RedstoneContactBlock.FACING).getDirectionVec()).scale(.65f); + return Vector3d.atLowerCornerOf(context.state.getValue(RedstoneContactBlock.FACING).getNormal()).scale(.65f); } @Override @@ -24,7 +24,7 @@ public class ContactMovementBehaviour extends MovementBehaviour { BlockState block = context.state; World world = context.world; - if (world.isRemote) + if (world.isClientSide) return; if (context.firstMovement) return; @@ -34,13 +34,13 @@ public class ContactMovementBehaviour extends MovementBehaviour { if (!AllBlocks.REDSTONE_CONTACT.has(visitedState)) return; - Vector3d contact = Vector3d.of(block.get(RedstoneContactBlock.FACING).getDirectionVec()); + Vector3d contact = Vector3d.atLowerCornerOf(block.getValue(RedstoneContactBlock.FACING).getNormal()); contact = context.rotation.apply(contact); - Direction direction = Direction.getFacingFromVector(contact.x, contact.y, contact.z); + Direction direction = Direction.getNearest(contact.x, contact.y, contact.z); - if (!RedstoneContactBlock.hasValidContact(world, pos.offset(direction.getOpposite()), direction)) + if (!RedstoneContactBlock.hasValidContact(world, pos.relative(direction.getOpposite()), direction)) return; - world.setBlockState(pos, visitedState.with(RedstoneContactBlock.POWERED, true)); + world.setBlockAndUpdate(pos, visitedState.setValue(RedstoneContactBlock.POWERED, true)); context.data.put("lastContact", NBTUtil.writeBlockPos(pos)); return; } @@ -53,7 +53,7 @@ public class ContactMovementBehaviour extends MovementBehaviour { public void deactivateLastVisitedContact(MovementContext context) { if (context.data.contains("lastContact")) { BlockPos last = NBTUtil.readBlockPos(context.data.getCompound("lastContact")); - context.world.getPendingBlockTicks().scheduleTick(last, AllBlocks.REDSTONE_CONTACT.get(), 1, TickPriority.NORMAL); + context.world.getBlockTicks().scheduleTick(last, AllBlocks.REDSTONE_CONTACT.get(), 1, TickPriority.NORMAL); context.data.remove("lastContact"); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java index a5f568dbf..ce0b60d57 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java @@ -38,13 +38,13 @@ public class ContentObserverBlock extends HorizontalBlock implements ITE builder) { - builder.add(POWERED, HORIZONTAL_FACING); - super.fillStateContainer(builder); + protected void createBlockStateDefinition(Builder builder) { + builder.add(POWERED, FACING); + super.createBlockStateDefinition(builder); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockState state = getDefaultState(); + BlockState state = defaultBlockState(); Direction preferredFacing = null; for (Direction face : Iterate.horizontalDirections) { - BlockPos offsetPos = context.getPos() - .offset(face); - World world = context.getWorld(); + BlockPos offsetPos = context.getClickedPos() + .relative(face); + World world = context.getLevel(); boolean canDetect = false; - TileEntity tileEntity = world.getTileEntity(offsetPos); + TileEntity tileEntity = world.getBlockEntity(offsetPos); if (TileEntityBehaviour.get(tileEntity, TransportedItemStackHandlerBehaviour.TYPE) != null) canDetect = true; @@ -94,39 +94,39 @@ public class ContentObserverBlock extends HorizontalBlock implements ITE { FilteringBehaviour filteringBehaviour = TileEntityBehaviour.get(te, FilteringBehaviour.TYPE); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java index f8db685a2..878053ba1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java @@ -45,18 +45,18 @@ public class ContentObserverTileEntity extends SmartTileEntity { if (turnOffTicks > 0) { turnOffTicks--; if (turnOffTicks == 0) - world.getPendingBlockTicks() - .scheduleTick(pos, state.getBlock(), 1); + level.getBlockTicks() + .scheduleTick(worldPosition, state.getBlock(), 1); } if (!isActive()) return; - Direction facing = state.get(ContentObserverBlock.HORIZONTAL_FACING); - BlockPos targetPos = pos.offset(facing); + Direction facing = state.getValue(ContentObserverBlock.FACING); + BlockPos targetPos = worldPosition.relative(facing); TransportedItemStackHandlerBehaviour behaviour = - TileEntityBehaviour.get(world, targetPos, TransportedItemStackHandlerBehaviour.TYPE); + TileEntityBehaviour.get(level, targetPos, TransportedItemStackHandlerBehaviour.TYPE); if (behaviour != null) { behaviour.handleCenteredProcessingOnAllItems(.45f, stack -> { if (!filtering.test(stack.stack) || turnOffTicks == 6) @@ -83,10 +83,10 @@ public class ContentObserverTileEntity extends SmartTileEntity { public void activate(int ticks) { BlockState state = getBlockState(); turnOffTicks = ticks; - if (state.get(ContentObserverBlock.POWERED)) + if (state.getValue(ContentObserverBlock.POWERED)) return; - world.setBlockState(pos, state.with(ContentObserverBlock.POWERED, true)); - world.notifyNeighborsOfStateChange(pos, state.getBlock()); + level.setBlockAndUpdate(worldPosition, state.setValue(ContentObserverBlock.POWERED, true)); + level.updateNeighborsAt(worldPosition, state.getBlock()); } private boolean isActive() { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java index 85c340826..7528f515f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.logistics.block.redstone; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -20,8 +20,8 @@ public class FilteredDetectorFilterSlot extends ValueBoxTransform { @Override protected void rotate(BlockState state, MatrixStack ms) { - float yRot = AngleHelper.horizontalAngle(state.get(HorizontalBlock.HORIZONTAL_FACING)) + 180; - MatrixStacker.of(ms) + float yRot = AngleHelper.horizontalAngle(state.getValue(HorizontalBlock.FACING)) + 180; + MatrixTransformStack.of(ms) .rotateY(yRot) .rotateX(90); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java index 078deb352..1897b46d6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java @@ -2,9 +2,15 @@ package com.simibubi.create.content.logistics.block.redstone; import java.util.Random; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; +import com.simibubi.create.content.schematics.ItemRequirement; +import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.utility.DyeHelper; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; @@ -12,6 +18,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.HorizontalBlock; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.DyeColor; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.pathfinding.PathType; @@ -23,6 +30,7 @@ import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.vector.Vector3d; @@ -30,27 +38,29 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; -public class NixieTubeBlock extends HorizontalBlock implements ITE { +public class NixieTubeBlock extends HorizontalBlock + implements ITE, IWrenchable, ISpecialBlockItemRequirement { public static final BooleanProperty CEILING = BooleanProperty.create("ceiling"); + private DyeColor color; - public NixieTubeBlock(Properties properties) { + public NixieTubeBlock(Properties properties, DyeColor color) { super(properties); - setDefaultState(getDefaultState().with(CEILING, false)); + this.color = color; + registerDefaultState(defaultBlockState().setValue(CEILING, false)); } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); NixieTubeTileEntity nixie = getTileEntity(world, pos); if (nixie == null) return ActionResultType.PASS; - if (player.isSneaking()) + if (player.isShiftKeyDown()) return ActionResultType.PASS; - if (heldItem.isEmpty()) { if (nixie.reactsToRedstone()) return ActionResultType.PASS; @@ -59,81 +69,121 @@ public class NixieTubeBlock extends HorizontalBlock implements ITE te.displayCustomNameOf(heldItem, rowPosition)); - BlockPos nextPos = currentPos.offset(right); - if (world.getBlockState(nextPos) != state) - break; - currentPos = nextPos; - index++; - } + BlockPos currentPos = pos; + while (true) { + BlockPos nextPos = currentPos.relative(left); + if (!areNixieBlocksEqual(world.getBlockState(nextPos), state)) + break; + currentPos = nextPos; } - return ActionResultType.PASS; + int index = 0; + + while (true) { + final int rowPosition = index; + + if (display) + withTileEntityDo(world, currentPos, te -> te.displayCustomNameOf(heldItem, rowPosition)); + if (dye != null) + world.setBlockAndUpdate(currentPos, withColor(state, dye)); + + BlockPos nextPos = currentPos.relative(right); + if (!areNixieBlocksEqual(world.getBlockState(nextPos), state)) + break; + currentPos = nextPos; + index++; + } + + return ActionResultType.SUCCESS; } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(CEILING, HORIZONTAL_FACING)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(CEILING, FACING)); + } + + @Override + public void onRemove(BlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, + boolean p_196243_5_) { + if (!(p_196243_4_.getBlock() instanceof NixieTubeBlock)) + p_196243_2_.removeBlockEntity(p_196243_3_); + } + + @Override + public ItemStack getCloneItemStack(IBlockReader p_185473_1_, BlockPos p_185473_2_, BlockState p_185473_3_) { + return AllBlocks.ORANGE_NIXIE_TUBE.asStack(); + } + + @Override + public ItemRequirement getRequiredItems(BlockState state, TileEntity te) { + return new ItemRequirement(ItemUseType.CONSUME, AllBlocks.ORANGE_NIXIE_TUBE.get() + .asItem()); } @Override public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { - return (state.get(CEILING) ? AllShapes.NIXIE_TUBE_CEILING : AllShapes.NIXIE_TUBE) - .get(state.get(HORIZONTAL_FACING) + return (state.getValue(CEILING) ? AllShapes.NIXIE_TUBE_CEILING : AllShapes.NIXIE_TUBE) + .get(state.getValue(FACING) .getAxis()); } + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, + PlayerEntity player) { + if (color != DyeColor.ORANGE) + return AllBlocks.ORANGE_NIXIE_TUBE.get() + .getPickBlock(state, target, world, pos, player); + return super.getPickBlock(state, target, world, pos, player); + } + @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockPos pos = context.getPos(); - boolean ceiling = context.getFace() == Direction.DOWN; - Vector3d hitVec = context.getHitVec(); + BlockPos pos = context.getClickedPos(); + boolean ceiling = context.getClickedFace() == Direction.DOWN; + Vector3d hitVec = context.getClickLocation(); if (hitVec != null) ceiling = hitVec.y - pos.getY() > .5f; - return getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing() + return defaultBlockState().setValue(FACING, context.getHorizontalDirection() .getOpposite()) - .with(CEILING, ceiling); + .setValue(CEILING, ceiling); } @Override public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_, boolean p_220069_6_) { - if (worldIn.isRemote) + if (worldIn.isClientSide) return; - if (!worldIn.getPendingBlockTicks() - .isTickPending(pos, this)) - worldIn.getPendingBlockTicks() + if (!worldIn.getBlockTicks() + .willTickThisTick(pos, this)) + worldIn.getBlockTicks() .scheduleTick(pos, this, 0); } @Override - public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { + public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { updateDisplayedRedstoneValue(state, worldIn, pos); } @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { + public void onPlace(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { if (state.getBlock() == oldState.getBlock() || isMoving) return; updateDisplayedRedstoneValue(state, worldIn, pos); @@ -150,7 +200,7 @@ public class NixieTubeBlock extends HorizontalBlock implements ITE { if (te.reactsToRedstone()) @@ -159,7 +209,7 @@ public class NixieTubeBlock extends HorizontalBlock implements ITE ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - return AssetLookup.partialBaseModel(ctx, prov); + return prov.models() + .withExistingParent(ctx.getName(), prov.modLoc("block/nixie_tube/block")); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java index 7f480714b..f401e4246 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java @@ -1,13 +1,15 @@ package com.simibubi.create.content.logistics.block.redstone; +import java.util.Map; import java.util.Random; +import com.google.common.collect.ImmutableMap; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -16,12 +18,38 @@ import net.minecraft.client.gui.fonts.TexturedGlyph; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer.Impl; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.item.DyeColor; import net.minecraft.util.text.Style; public class NixieTubeRenderer extends SafeTileEntityRenderer { private Random r = new Random(); + public static final Map> DYE_TABLE = new ImmutableMap.Builder>() + + // DyeColor, ( Front RGB, Back RGB ) + .put(DyeColor.BLACK, Couple.create(0x45403B, 0x21201F)) + .put(DyeColor.RED, Couple.create(0xB13937, 0x632737)) + .put(DyeColor.GREEN, Couple.create(0x208A46, 0x1D6045)) + .put(DyeColor.BROWN, Couple.create(0xAC855C, 0x68533E)) + + .put(DyeColor.BLUE, Couple.create(0x5391E1, 0x504B90)) + .put(DyeColor.GRAY, Couple.create(0x5D666F, 0x313538)) + .put(DyeColor.LIGHT_GRAY, Couple.create(0x95969B, 0x707070)) + .put(DyeColor.PURPLE, Couple.create(0x9F54AE, 0x63366C)) + + .put(DyeColor.CYAN, Couple.create(0x3EABB4, 0x3C7872)) + .put(DyeColor.PINK, Couple.create(0xD5A8CB, 0xB86B95)) + .put(DyeColor.LIME, Couple.create(0xA3DF55, 0x4FB16F)) + .put(DyeColor.YELLOW, Couple.create(0xE6D756, 0xE9AC29)) + + .put(DyeColor.LIGHT_BLUE, Couple.create(0x69CED2, 0x508AA5)) + .put(DyeColor.ORANGE, Couple.create(0xEE9246, 0xD94927)) + .put(DyeColor.MAGENTA, Couple.create(0xF062B0, 0xC04488)) + .put(DyeColor.WHITE, Couple.create(0xEDEAE5, 0xBBB6B0)) + + .build(); + public NixieTubeRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); } @@ -29,72 +57,72 @@ public class NixieTubeRenderer extends SafeTileEntityRenderer s = te.getDisplayedStrings(); + DyeColor color = NixieTubeBlock.colorOf(te.getBlockState()); - ms.push(); + ms.pushPose(); ms.translate(-4 / 16f, 0, 0); ms.scale(scale, -scale, scale); - drawTube(ms, buffer, s.getFirst(), height); - ms.pop(); + drawTube(ms, buffer, s.getFirst(), height, color); + ms.popPose(); - ms.push(); + ms.pushPose(); ms.translate(4 / 16f, 0, 0); ms.scale(scale, -scale, scale); - drawTube(ms, buffer, s.getSecond(), height); - ms.pop(); + drawTube(ms, buffer, s.getSecond(), height, color); + ms.popPose(); - ms.pop(); + ms.popPose(); } - private void drawTube(MatrixStack ms, IRenderTypeBuffer buffer, String c, float height) { - FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; - float charWidth = fontRenderer.getStringWidth(c); + private void drawTube(MatrixStack ms, IRenderTypeBuffer buffer, String c, float height, DyeColor color) { + FontRenderer fontRenderer = Minecraft.getInstance().font; + float charWidth = fontRenderer.width(c); float shadowOffset = .5f; float flicker = r.nextFloat(); - int brightColor = 0xFF982B; - int darkColor = 0xE03221; + Couple couple = DYE_TABLE.get(color); + int brightColor = couple.getFirst(); + int darkColor = couple.getSecond(); int flickeringBrightColor = ColorHelper.mixColors(brightColor, darkColor, flicker / 4); - ms.push(); + ms.pushPose(); ms.translate((charWidth - shadowOffset) / -2f, -height, 0); drawChar(ms, buffer, c, flickeringBrightColor); - ms.push(); + ms.pushPose(); ms.translate(shadowOffset, shadowOffset, -1 / 16f); drawChar(ms, buffer, c, darkColor); - ms.pop(); - ms.pop(); + ms.popPose(); + ms.popPose(); - ms.push(); + ms.pushPose(); ms.scale(-1, 1, 1); ms.translate((charWidth - shadowOffset) / -2f, -height, 0); drawChar(ms, buffer, c, darkColor); - ms.push(); + ms.pushPose(); ms.translate(-shadowOffset, shadowOffset, -1 / 16f); - drawChar(ms, buffer, c, 0x99180F); - ms.pop(); - ms.pop(); + drawChar(ms, buffer, c, ColorHelper.mixColors(darkColor, 0, .35f)); + ms.popPose(); + ms.popPose(); } private static void drawChar(MatrixStack ms, IRenderTypeBuffer buffer, String c, int color) { - FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; - fontRenderer.draw(c, 0, 0, color, false, ms.peek() - .getModel(), buffer, false, 0, 15728880); + FontRenderer fontRenderer = Minecraft.getInstance().font; + fontRenderer.drawInBatch(c, 0, 0, color, false, ms.last() + .pose(), buffer, false, 0, 15728880); if (buffer instanceof Impl) { - TexturedGlyph texturedglyph = fontRenderer.getFontStorage(Style.DEFAULT_FONT_ID).getRectangleRenderer(); - ((Impl) buffer).draw(texturedglyph.getLayer(false)); + TexturedGlyph texturedglyph = fontRenderer.getFontSet(Style.DEFAULT_FONT) + .whiteGlyph(); + ((Impl) buffer).endBatch(texturedglyph.renderType(false)); } } - private static float getCharWidth(char p_211125_1_, FontRenderer fontRenderer) { - return p_211125_1_ == 167 ? 0.0F : fontRenderer.getFontStorage(Style.DEFAULT_FONT_ID).getGlyph(p_211125_1_).getAdvance(false); - } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeTileEntity.java index 8a530864a..3129f36c3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeTileEntity.java @@ -49,7 +49,7 @@ public class NixieTubeTileEntity extends SmartTileEntity { super.tick(); // Dynamic text components have to be ticked manually and re-sent to the client - if (world instanceof ServerWorld && hasCustomText) { + if (level instanceof ServerWorld && hasCustomText) { Couple currentStrings = displayedStrings; parsedCustomText = parseCustomText(); updateDisplayedStrings(); @@ -60,7 +60,7 @@ public class NixieTubeTileEntity extends SmartTileEntity { @Override public void initialize() { - if (world.isRemote) + if (level.isClientSide) updateDisplayedStrings(); } @@ -83,7 +83,7 @@ public class NixieTubeTileEntity extends SmartTileEntity { } public void displayCustomNameOf(ItemStack stack, int nixiePositionInRow) { - CompoundNBT compoundnbt = stack.getChildTag("display"); + CompoundNBT compoundnbt = stack.getTagElement("display"); if (compoundnbt != null && compoundnbt.contains("Name", NBT.TAG_STRING)) { hasCustomText = true; rawCustomText = getJsonFromString(compoundnbt.getString("Name")); @@ -182,9 +182,9 @@ public class NixieTubeTileEntity extends SmartTileEntity { } protected ITextComponent parseDynamicComponent(ITextComponent customText) { - if (world instanceof ServerWorld) { + if (level instanceof ServerWorld) { try { - return TextComponentUtils.parse(getCommandSource(null), customText, null, 0); + return TextComponentUtils.updateForEntity(getCommandSource(null), customText, null, 0); } catch (CommandSyntaxException e) { // } @@ -196,7 +196,7 @@ public class NixieTubeTileEntity extends SmartTileEntity { public CommandSource getCommandSource(@Nullable ServerPlayerEntity p_195539_1_) { String s = p_195539_1_ == null ? "Nixie Tube" : p_195539_1_.getName().getString(); ITextComponent itextcomponent = (ITextComponent)(p_195539_1_ == null ? new StringTextComponent("Nixie Tube") : p_195539_1_.getDisplayName()); - return new CommandSource(ICommandSource.field_213139_a_, Vector3d.ofCenter(this.pos), Vector2f.ZERO, (ServerWorld)this.world, 2, s, itextcomponent, this.world.getServer(), p_195539_1_); + return new CommandSource(ICommandSource.NULL, Vector3d.atCenterOf(this.worldPosition), Vector2f.ZERO, (ServerWorld)this.level, 2, s, itextcomponent, this.level.getServer(), p_195539_1_); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java index 8db988bfa..f43297a83 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java @@ -30,81 +30,81 @@ public class RedstoneContactBlock extends ProperDirectionalBlock { public RedstoneContactBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(POWERED, false) - .with(FACING, Direction.UP)); + registerDefaultState(defaultBlockState().setValue(POWERED, false) + .setValue(FACING, Direction.UP)); } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(POWERED); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockState state = getDefaultState().with(FACING, context.getNearestLookingDirection() + BlockState state = defaultBlockState().setValue(FACING, context.getNearestLookingDirection() .getOpposite()); - Direction placeDirection = context.getFace() + Direction placeDirection = context.getClickedFace() .getOpposite(); if ((context.getPlayer() != null && context.getPlayer() - .isSneaking()) || hasValidContact(context.getWorld(), context.getPos(), placeDirection)) - state = state.with(FACING, placeDirection); - if (hasValidContact(context.getWorld(), context.getPos(), state.get(FACING))) - state = state.with(POWERED, true); + .isShiftKeyDown()) || hasValidContact(context.getLevel(), context.getClickedPos(), placeDirection)) + state = state.setValue(FACING, placeDirection); + if (hasValidContact(context.getLevel(), context.getClickedPos(), state.getValue(FACING))) + state = state.setValue(POWERED, true); return state; } @Override - public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, + public BlockState updateShape(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) { - if (facing != stateIn.get(FACING)) + if (facing != stateIn.getValue(FACING)) return stateIn; boolean hasValidContact = hasValidContact(worldIn, currentPos, facing); - if (stateIn.get(POWERED) != hasValidContact) { - return stateIn.with(POWERED, hasValidContact); + if (stateIn.getValue(POWERED) != hasValidContact) { + return stateIn.setValue(POWERED, hasValidContact); } return stateIn; } @SuppressWarnings("deprecation") @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + public void onRemove(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { if (state.getBlock() == this && newState.getBlock() == this) { if (state == newState.cycle(POWERED)) - worldIn.notifyNeighborsOfStateChange(pos, this); + worldIn.updateNeighborsAt(pos, this); } - super.onReplaced(state, worldIn, pos, newState, isMoving); + super.onRemove(state, worldIn, pos, newState, isMoving); } @Override - public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { - boolean hasValidContact = hasValidContact(worldIn, pos, state.get(FACING)); - if (state.get(POWERED) != hasValidContact) - worldIn.setBlockState(pos, state.with(POWERED, hasValidContact)); + public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { + boolean hasValidContact = hasValidContact(worldIn, pos, state.getValue(FACING)); + if (state.getValue(POWERED) != hasValidContact) + worldIn.setBlockAndUpdate(pos, state.setValue(POWERED, hasValidContact)); } public static boolean hasValidContact(IWorld world, BlockPos pos, Direction direction) { - BlockState blockState = world.getBlockState(pos.offset(direction)); - return AllBlocks.REDSTONE_CONTACT.has(blockState) && blockState.get(FACING) == direction.getOpposite(); + BlockState blockState = world.getBlockState(pos.relative(direction)); + return AllBlocks.REDSTONE_CONTACT.has(blockState) && blockState.getValue(FACING) == direction.getOpposite(); } @Override - public boolean canProvidePower(BlockState state) { - return state.get(POWERED); + public boolean isSignalSource(BlockState state) { + return state.getValue(POWERED); } @Override public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, @Nullable Direction side) { if (side == null) return true; - return state.get(FACING) != side.getOpposite(); + return state.getValue(FACING) != side.getOpposite(); } @Override - public int getWeakPower(BlockState state, IBlockReader blockAccess, BlockPos pos, Direction side) { - return state.get(POWERED) ? 15 : 0; + public int getSignal(BlockState state, IBlockReader blockAccess, BlockPos pos, Direction side) { + return state.getValue(POWERED) ? 15 : 0; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java index 0469c1161..ea4140d4e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java @@ -37,53 +37,53 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE 0) - worldIn.setBlockState(pos, state.cycle(POWERED), 2); + worldIn.setBlock(pos, state.cycle(POWERED), 2); int transmit = power; withTileEntityDo(worldIn, pos, te -> te.transmit(transmit)); @@ -92,36 +92,36 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(POWERED, RECEIVER); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override @@ -135,22 +135,22 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE { - Boolean wasReceiver = state.get(RECEIVER); - boolean blockPowered = worldIn.isBlockPowered(pos); - worldIn.setBlockState(pos, state.cycle(RECEIVER) - .with(POWERED, blockPowered), 3); + Boolean wasReceiver = state.getValue(RECEIVER); + boolean blockPowered = worldIn.hasNeighborSignal(pos); + worldIn.setBlock(pos, state.cycle(RECEIVER) + .setValue(POWERED, blockPowered), 3); te.transmit(wasReceiver ? 0 : getPower(worldIn, pos)); return ActionResultType.SUCCESS; }); @@ -158,7 +158,7 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - String variant = state.get(RedstoneLinkBlock.RECEIVER) ? "receiver" : "transmitter"; - if (state.get(RedstoneLinkBlock.FACING).getAxis().isHorizontal()) + String variant = state.getValue(RedstoneLinkBlock.RECEIVER) ? "receiver" : "transmitter"; + if (state.getValue(RedstoneLinkBlock.FACING).getAxis().isHorizontal()) variant += "_vertical"; - if (state.get(RedstoneLinkBlock.POWERED)) + if (state.getValue(RedstoneLinkBlock.POWERED)) variant += "_powered"; return prov.models().getExistingFile(prov.modLoc("block/redstone_link/" + variant)); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkTileEntity.java index 5a11ab2ee..cac4b3355 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkTileEntity.java @@ -79,7 +79,7 @@ public class RedstoneLinkTileEntity extends SmartTileEntity { receivedSignal = compound.getInt("Receive"); receivedSignalChanged = compound.getBoolean("ReceivedChanged"); - if (world == null || world.isRemote || !link.newPosition) + if (level == null || level.isClientSide || !link.newPosition) transmittedSignal = compound.getInt("Transmit"); } @@ -98,29 +98,29 @@ public class RedstoneLinkTileEntity extends SmartTileEntity { if (transmitter) return; - if (world.isRemote) + if (level.isClientSide) return; BlockState blockState = getBlockState(); if (!AllBlocks.REDSTONE_LINK.has(blockState)) return; - if ((getReceivedSignal() > 0) != blockState.get(POWERED)) { + if ((getReceivedSignal() > 0) != blockState.getValue(POWERED)) { receivedSignalChanged = true; - world.setBlockState(pos, blockState.cycle(POWERED)); + level.setBlockAndUpdate(worldPosition, blockState.cycle(POWERED)); } if (receivedSignalChanged) { - Direction attachedFace = blockState.get(RedstoneLinkBlock.FACING).getOpposite(); - BlockPos attachedPos = pos.offset(attachedFace); - world.updateNeighbors(pos, world.getBlockState(pos).getBlock()); - world.updateNeighbors(attachedPos, world.getBlockState(attachedPos).getBlock()); + Direction attachedFace = blockState.getValue(RedstoneLinkBlock.FACING).getOpposite(); + BlockPos attachedPos = worldPosition.relative(attachedFace); + level.blockUpdated(worldPosition, level.getBlockState(worldPosition).getBlock()); + level.blockUpdated(attachedPos, level.getBlockState(attachedPos).getBlock()); receivedSignalChanged = false; } } protected Boolean isTransmitterBlock() { - return !getBlockState().get(RedstoneLinkBlock.RECEIVER); + return !getBlockState().getValue(RedstoneLinkBlock.RECEIVER); } public int getReceivedSignal() { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java index 7dc6293fa..c1a1398b5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java @@ -44,13 +44,13 @@ public class StockpileSwitchBlock extends HorizontalBlock implements ITE 15) @@ -91,20 +91,20 @@ public class StockpileSwitchBlock extends HorizontalBlock implements ITE builder) { - builder.add(HORIZONTAL_FACING, INDICATOR); - super.fillStateContainer(builder); + protected void createBlockStateDefinition(Builder builder) { + builder.add(FACING, INDICATOR); + super.createBlockStateDefinition(builder); } @Override - public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + public ActionResultType use(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - if (player != null && AllItems.WRENCH.isIn(player.getHeldItem(handIn))) + if (player != null && AllItems.WRENCH.isIn(player.getItemInHand(handIn))) return ActionResultType.PASS; DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> withTileEntityDo(worldIn, pos, te -> this.displayScreen(te, player))); @@ -119,13 +119,13 @@ public class StockpileSwitchBlock extends HorizontalBlock implements ITE { lastModification = 0; offBelow.titled(Lang.translate("gui.stockpile_switch.move_to_upper_at", state)); @@ -70,7 +70,7 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { .setState((int) (te.offWhenBelow * 100)); onAbove = new ScrollInput(x + 36, y + 18, 102, 18).withRange(1, 101) - .titled(StringTextComponent.EMPTY.copy()) + .titled(StringTextComponent.EMPTY.plainCopy()) .calling(state -> { lastModification = 0; onAbove.titled(Lang.translate("gui.stockpile_switch.move_to_lower_at", state)); @@ -105,27 +105,27 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { AllGuiTextures.STOCKSWITCH_POWERED_LANE.draw(ms, this, x + 36, y + (te.isInverted() ? 18 : 40)); AllGuiTextures.STOCKSWITCH_UNPOWERED_LANE.draw(ms, this, x + 36, y + (te.isInverted() ? 40 : 18)); - drawCenteredText(ms, textRenderer, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); AllGuiTextures sprite = AllGuiTextures.STOCKSWITCH_INTERVAL; float lowerBound = offBelow.getState(); float upperBound = onAbove.getState(); sprite.bind(); - drawTexture(ms, (int) (x + upperBound) + 37, y + 18, (int) (sprite.startX + upperBound), sprite.startY, + blit(ms, (int) (x + upperBound) + 37, y + 18, (int) (sprite.startX + upperBound), sprite.startY, (int) (sprite.width - upperBound), sprite.height); - drawTexture(ms, x + 37, y + 40, sprite.startX, sprite.startY, (int) (lowerBound), sprite.height); + blit(ms, x + 37, y + 40, sprite.startX, sprite.startY, (int) (lowerBound), sprite.height); AllGuiTextures.STOCKSWITCH_ARROW_UP.draw(ms, this, (int) (x + lowerBound + 36) - 2, y + 35); AllGuiTextures.STOCKSWITCH_ARROW_DOWN.draw(ms, this, (int) (x + upperBound + 36) - 3, y + 17); if (te.currentLevel != -1) { AllGuiTextures cursor = AllGuiTextures.STOCKSWITCH_CURSOR; - ms.push(); + ms.pushPose(); ms.translate(Math.min(99, this.cursor.getValue(partialTicks) * sprite.width), cursorLane.getValue(partialTicks) * 22, 0); cursor.draw(ms, this, x + 34, y + 19); - ms.pop(); + ms.popPose(); } GuiGameElement.of(renderedItem) @@ -158,7 +158,7 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { } protected void send(boolean invert) { - AllPackets.channel.sendToServer(new ConfigureStockswitchPacket(te.getPos(), offBelow.getState() / 100f, + AllPackets.channel.sendToServer(new ConfigureStockswitchPacket(te.getBlockPos(), offBelow.getState() / 100f, onAbove.getState() / 100f, invert)); } @@ -167,7 +167,7 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { if (flipSignals.isHovered()) send(!te.isInverted()); if (confirmButton.isHovered()) { - client.player.closeScreen(); + minecraft.player.closeContainer(); return true; } return super.mouseClicked(x, y, button); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java index 51800ee50..27cb20f2a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java @@ -62,7 +62,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { super.write(compound, clientPacket); } - public float getLevel() { + public float getStockLevel() { return currentLevel; } @@ -72,10 +72,10 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { if (!observedInventory.hasInventory()) { if (currentLevel == -1) return; - world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, 0), 3); + level.setBlock(worldPosition, getBlockState().setValue(StockpileSwitchBlock.INDICATOR, 0), 3); currentLevel = -1; state = false; - world.updateNeighbors(pos, getBlockState().getBlock()); + level.blockUpdated(worldPosition, getBlockState().getBlock()); sendData(); return; } @@ -98,10 +98,10 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { occupied += count * (1f / space); } - float level = (float) occupied / totalSpace; - if (currentLevel != level) + float stockLevel = occupied / totalSpace; + if (currentLevel != stockLevel) changed = true; - currentLevel = level; + currentLevel = stockLevel; currentLevel = MathHelper.clamp(currentLevel, 0, 1); boolean previouslyPowered = state; @@ -114,10 +114,10 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { int displayLevel = 0; if (currentLevel > 0) displayLevel = (int) (currentLevel * 6); - world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, displayLevel), update ? 3 : 2); + level.setBlock(worldPosition, getBlockState().setValue(StockpileSwitchBlock.INDICATOR, displayLevel), update ? 3 : 2); - if (update && !world.getPendingBlockTicks().isTickPending(pos, getBlockState().getBlock())) - world.getPendingBlockTicks().scheduleTick(pos, getBlockState().getBlock(), 2, TickPriority.NORMAL); + if (update && !level.getBlockTicks().willTickThisTick(worldPosition, getBlockState().getBlock())) + level.getBlockTicks().scheduleTick(worldPosition, getBlockState().getBlock(), 2, TickPriority.NORMAL); if (changed || update) sendData(); @@ -126,7 +126,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { @Override public void lazyTick() { super.lazyTick(); - if (world.isRemote) + if (level.isClientSide) return; updateCurrentLevel(); } @@ -155,7 +155,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { public void updatePowerAfterDelay() { poweredAfterDelay = shouldBePowered(); - world.updateNeighbors(pos, getBlockState().getBlock()); + level.blockUpdated(worldPosition, getBlockState().getBlock()); } public boolean isPowered() { @@ -170,6 +170,6 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { if (inverted == this.inverted) return; this.inverted = inverted; - world.updateNeighbors(pos, getBlockState().getBlock()); + updatePowerAfterDelay(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/CardboardBoxItem.java b/src/main/java/com/simibubi/create/content/logistics/item/CardboardBoxItem.java index 083722a79..085727e15 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/CardboardBoxItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/CardboardBoxItem.java @@ -35,11 +35,11 @@ public class CardboardBoxItem extends Item { } @Override - public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) { - if (!playerIn.isSneaking()) - return super.onItemRightClick(worldIn, playerIn, handIn); + public ActionResult use(World worldIn, PlayerEntity playerIn, Hand handIn) { + if (!playerIn.isShiftKeyDown()) + return super.use(worldIn, playerIn, handIn); - ItemStack box = playerIn.getHeldItem(handIn); + ItemStack box = playerIn.getItemInHand(handIn); for (ItemStack stack : getContents(box)) playerIn.inventory.placeItemBackInInventory(worldIn, stack); @@ -62,7 +62,7 @@ public class CardboardBoxItem extends Item { } @Override - public void fillItemGroup(ItemGroup group, NonNullList items) { + public void fillItemCategory(ItemGroup group, NonNullList items) { } public static void addAddress(ItemStack box, String address) { @@ -95,13 +95,13 @@ public class CardboardBoxItem extends Item { @Override @OnlyIn(value = Dist.CLIENT) - public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { - super.addInformation(stack, worldIn, tooltip, flagIn); + public void appendHoverText(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { + super.appendHoverText(stack, worldIn, tooltip, flagIn); CompoundNBT compoundnbt = stack.getOrCreateTag(); if (compoundnbt.contains("Address", Constants.NBT.TAG_STRING)) { tooltip.add(new StringTextComponent("-> " + compoundnbt.getString("Address")) - .formatted(TextFormatting.GOLD)); + .withStyle(TextFormatting.GOLD)); } if (!compoundnbt.contains("Items", Constants.NBT.TAG_LIST)) @@ -117,15 +117,15 @@ public class CardboardBoxItem extends Item { ++j; if (i <= 4) { ++i; - ITextComponent itextcomponent = itemstack.getDisplayName(); - tooltip.add(itextcomponent.copy().append(" x").append(String.valueOf(itemstack.getCount())) - .formatted(TextFormatting.GRAY)); + ITextComponent itextcomponent = itemstack.getHoverName(); + tooltip.add(itextcomponent.plainCopy().append(" x").append(String.valueOf(itemstack.getCount())) + .withStyle(TextFormatting.GRAY)); } } if (j - i > 0) { tooltip.add((new TranslationTextComponent("container.shulkerBox.more", j - i)) - .formatted(TextFormatting.ITALIC)); + .withStyle(TextFormatting.ITALIC)); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerBlock.java b/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerBlock.java index 989fe2d92..1e8f87a77 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerBlock.java @@ -1,9 +1,14 @@ package com.simibubi.create.content.logistics.item; +import java.util.ArrayList; + import javax.annotation.Nullable; +import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; +import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.BlockState; @@ -16,19 +21,20 @@ import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -public class LecternControllerBlock extends LecternBlock implements ITE { +public class LecternControllerBlock extends LecternBlock implements ITE, ISpecialBlockItemRequirement { public LecternControllerBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(HAS_BOOK, true)); + registerDefaultState(defaultBlockState().setValue(HAS_BOOK, true)); } @Nullable @Override - public TileEntity createNewTileEntity(IBlockReader p_196283_1_) { + public TileEntity newBlockEntity(IBlockReader p_196283_1_) { return null; } @@ -44,15 +50,15 @@ public class LecternControllerBlock extends LecternBlock implements ITE te.tryStartUsing(player)); return ActionResultType.SUCCESS; } - if (player.isSneaking()) { - if (!world.isRemote) + if (player.isShiftKeyDown()) { + if (!world.isClientSide) replaceWithLectern(state, world, pos); return ActionResultType.SUCCESS; } @@ -61,32 +67,44 @@ public class LecternControllerBlock extends LecternBlock implements ITE te.dropController(state)); - super.onReplaced(state, world, pos, newState, isMoving); + super.onRemove(state, world, pos, newState, isMoving); } } @Override - public int getComparatorInputOverride(BlockState state, World world, BlockPos pos) { + public int getAnalogOutputSignal(BlockState state, World world, BlockPos pos) { return 15; } public void replaceLectern(BlockState lecternState, World world, BlockPos pos, ItemStack controller) { - world.setBlockState(pos, getDefaultState() - .with(FACING, lecternState.get(FACING)) - .with(POWERED, lecternState.get(POWERED))); + world.setBlockAndUpdate(pos, defaultBlockState() + .setValue(FACING, lecternState.getValue(FACING)) + .setValue(POWERED, lecternState.getValue(POWERED))); withTileEntityDo(world, pos, te -> te.setController(controller)); } public void replaceWithLectern(BlockState state, World world, BlockPos pos) { AllSoundEvents.CONTROLLER_TAKE.playOnServer(world, pos); - world.setBlockState(pos, Blocks.LECTERN.getDefaultState() - .with(FACING, state.get(FACING)) - .with(POWERED, state.get(POWERED))); + world.setBlockAndUpdate(pos, Blocks.LECTERN.defaultBlockState() + .setValue(FACING, state.getValue(FACING)) + .setValue(POWERED, state.getValue(POWERED))); } + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, PlayerEntity player) { + return Blocks.LECTERN.getPickBlock(state, target, world, pos, player); + } + + @Override + public ItemRequirement getRequiredItems(BlockState state, TileEntity te) { + ArrayList requiredItems = new ArrayList<>(); + requiredItems.add(new ItemStack(Blocks.LECTERN)); + requiredItems.add(new ItemStack(AllItems.LINKED_CONTROLLER.get())); + return new ItemRequirement(ItemRequirement.ItemUseType.CONSUME, requiredItems); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerRenderer.java index bbe2eaf63..3f725dff0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerRenderer.java @@ -1,11 +1,11 @@ package com.simibubi.create.content.logistics.item; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -28,21 +28,21 @@ public class LecternControllerRenderer extends SafeTileEntityRenderer this::tryToggleActive); prevUser = user; } - if (!world.isRemote) { + if (!level.isClientSide) { deactivatedThisTick = false; - if (!(world instanceof ServerWorld)) + if (!(level instanceof ServerWorld)) return; if (user == null) return; - Entity entity = ((ServerWorld) world).getEntityByUuid(user); + Entity entity = ((ServerWorld) level).getEntity(user); if (!(entity instanceof PlayerEntity)) { stopUsing(null); return; } PlayerEntity player = (PlayerEntity) entity; - if (!playerInRange(player, world, pos) || !playerIsUsingLectern(player)) + if (!playerInRange(player, level, worldPosition) || !playerIsUsingLectern(player)) stopUsing(player); } } @OnlyIn(Dist.CLIENT) private void tryToggleActive() { - if (user == null && Minecraft.getInstance().player.getUniqueID().equals(prevUser)) { + if (user == null && Minecraft.getInstance().player.getUUID().equals(prevUser)) { LinkedControllerClientHandler.deactivateInLectern(); - } else if (prevUser == null && Minecraft.getInstance().player.getUniqueID().equals(user)) { - LinkedControllerClientHandler.activateInLectern(pos); + } else if (prevUser == null && Minecraft.getInstance().player.getUUID().equals(user)) { + LinkedControllerClientHandler.activateInLectern(worldPosition); } } public void setController(ItemStack newController) { controller = newController; if (newController != null) { - AllSoundEvents.CONTROLLER_PUT.playOnServer(world, pos); + AllSoundEvents.CONTROLLER_PUT.playOnServer(level, worldPosition); } } public void swapControllers(ItemStack stack, PlayerEntity player, Hand hand, BlockState state) { ItemStack newController = stack.copy(); stack.setCount(0); - if (player.getHeldItem(hand).isEmpty()) { - player.setHeldItem(hand, controller); + if (player.getItemInHand(hand).isEmpty()) { + player.setItemInHand(hand, controller); } else { dropController(state); } @@ -150,20 +156,24 @@ public class LecternControllerTileEntity extends SmartTileEntity { } public void dropController(BlockState state) { - Direction dir = state.get(LecternControllerBlock.FACING); - double x = pos.getX() + 0.5 + 0.25*dir.getXOffset(); - double y = pos.getY() + 1; - double z = pos.getZ() + 0.5 + 0.25*dir.getZOffset(); - ItemEntity itementity = new ItemEntity(world, x, y, z, controller.copy()); - itementity.setDefaultPickupDelay(); - world.addEntity(itementity); + Entity playerEntity = ((ServerWorld) level).getEntity(user); + if (playerEntity instanceof PlayerEntity) + stopUsing((PlayerEntity) playerEntity); + + Direction dir = state.getValue(LecternControllerBlock.FACING); + double x = worldPosition.getX() + 0.5 + 0.25*dir.getStepX(); + double y = worldPosition.getY() + 1; + double z = worldPosition.getZ() + 0.5 + 0.25*dir.getStepZ(); + ItemEntity itementity = new ItemEntity(level, x, y, z, controller.copy()); + itementity.setDefaultPickUpDelay(); + level.addFreshEntity(itementity); controller = null; } public static boolean playerInRange(PlayerEntity player, World world, BlockPos pos) { //double modifier = world.isRemote ? 0 : 1.0; double reach = 0.4*player.getAttributeValue(ForgeMod.REACH_DISTANCE.get());// + modifier; - return player.getDistanceSq(Vector3d.ofCenter(pos)) < reach*reach; + return player.distanceToSqr(Vector3d.atCenterOf(pos)) < reach*reach; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerBindPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerBindPacket.java index 3a0366d67..096f4f885 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerBindPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerBindPacket.java @@ -42,7 +42,7 @@ public class LinkedControllerBindPacket extends LinkedControllerPacketBase { return; ItemStackHandler frequencyItems = LinkedControllerItem.getFrequencyItems(heldItem); - LinkBehaviour linkBehaviour = TileEntityBehaviour.get(player.world, linkLocation, LinkBehaviour.TYPE); + LinkBehaviour linkBehaviour = TileEntityBehaviour.get(player.level, linkLocation, LinkBehaviour.TYPE); if (linkBehaviour == null) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java index 860fc3f38..c5dd09860 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java @@ -9,6 +9,7 @@ import java.util.Vector; import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.CreateClient; @@ -49,14 +50,14 @@ public class LinkedControllerClientHandler { public static Vector getControls() { if (controls == null) { - GameSettings gameSettings = Minecraft.getInstance().gameSettings; + GameSettings gameSettings = Minecraft.getInstance().options; controls = new Vector<>(6); - controls.add(gameSettings.keyBindForward); - controls.add(gameSettings.keyBindBack); - controls.add(gameSettings.keyBindLeft); - controls.add(gameSettings.keyBindRight); - controls.add(gameSettings.keyBindJump); - controls.add(gameSettings.keySneak); + controls.add(gameSettings.keyUp); + controls.add(gameSettings.keyDown); + controls.add(gameSettings.keyLeft); + controls.add(gameSettings.keyRight); + controls.add(gameSettings.keyJump); + controls.add(gameSettings.keyShift); } return controls; } @@ -100,7 +101,7 @@ public class LinkedControllerClientHandler { } protected static void onReset() { - getControls().forEach(kb -> kb.setPressed(isActuallyPressed(kb))); + getControls().forEach(kb -> kb.setDown(isActuallyPressed(kb))); packetCooldown = 0; selectedLocation = BlockPos.ZERO; @@ -116,9 +117,9 @@ public class LinkedControllerClientHandler { protected static boolean isActuallyPressed(KeyBinding kb) { return InputMappings.isKeyDown(Minecraft.getInstance() .getWindow() - .getHandle(), + .getWindow(), kb.getKey() - .getKeyCode()); + .getValue()); } public static void tick() { @@ -130,7 +131,7 @@ public class LinkedControllerClientHandler { Minecraft mc = Minecraft.getInstance(); ClientPlayerEntity player = mc.player; - ItemStack heldItem = player.getHeldItemMainhand(); + ItemStack heldItem = player.getMainHandItem(); if (player.isSpectator()) { MODE = Mode.IDLE; @@ -139,7 +140,7 @@ public class LinkedControllerClientHandler { } if (!inLectern() && !AllItems.LINKED_CONTROLLER.isIn(heldItem)) { - heldItem = player.getHeldItemOffhand(); + heldItem = player.getOffhandItem(); if (!AllItems.LINKED_CONTROLLER.isIn(heldItem)) { MODE = Mode.IDLE; onReset(); @@ -147,13 +148,20 @@ public class LinkedControllerClientHandler { } } - if (mc.currentScreen != null) { + if (inLectern() && AllBlocks.LECTERN_CONTROLLER.get().getTileEntityOptional(mc.level, lecternPos) + .map(te -> !te.isUsedBy(mc.player)) + .orElse(true)) { + deactivateInLectern(); + return; + } + + if (mc.screen != null) { MODE = Mode.IDLE; onReset(); return; } - if (InputMappings.isKeyDown(mc.getWindow().getHandle(), GLFW.GLFW_KEY_ESCAPE)) { + if (InputMappings.isKeyDown(mc.getWindow().getWindow(), GLFW.GLFW_KEY_ESCAPE)) { MODE = Mode.IDLE; onReset(); return; @@ -175,40 +183,40 @@ public class LinkedControllerClientHandler { // Released Keys if (!releasedKeys.isEmpty()) { AllPackets.channel.sendToServer(new LinkedControllerInputPacket(releasedKeys, false, lecternPos)); - AllSoundEvents.CONTROLLER_CLICK.playAt(player.world, player.getBlockPos(), 1f, .5f, true); + AllSoundEvents.CONTROLLER_CLICK.playAt(player.level, player.blockPosition(), 1f, .5f, true); } // Newly Pressed Keys if (!newKeys.isEmpty()) { AllPackets.channel.sendToServer(new LinkedControllerInputPacket(newKeys, true, lecternPos)); packetCooldown = PACKET_RATE; - AllSoundEvents.CONTROLLER_CLICK.playAt(player.world, player.getBlockPos(), 1f, .75f, true); + AllSoundEvents.CONTROLLER_CLICK.playAt(player.level, player.blockPosition(), 1f, .75f, true); } // Keepalive Pressed Keys if (packetCooldown == 0) { if (!pressedKeys.isEmpty()) { - AllPackets.channel.sendToServer(new LinkedControllerInputPacket(pressedKeys, true)); + AllPackets.channel.sendToServer(new LinkedControllerInputPacket(pressedKeys, true, lecternPos)); packetCooldown = PACKET_RATE; } } } if (MODE == Mode.BIND) { - VoxelShape shape = mc.world.getBlockState(selectedLocation) - .getShape(mc.world, selectedLocation); + VoxelShape shape = mc.level.getBlockState(selectedLocation) + .getShape(mc.level, selectedLocation); if (!shape.isEmpty()) - CreateClient.OUTLINER.showAABB("controller", shape.getBoundingBox() - .offset(selectedLocation)) + CreateClient.OUTLINER.showAABB("controller", shape.bounds() + .move(selectedLocation)) .colored(0xB73C2D) .lineWidth(1 / 16f); for (Integer integer : newKeys) { - LinkBehaviour linkBehaviour = TileEntityBehaviour.get(mc.world, selectedLocation, LinkBehaviour.TYPE); + LinkBehaviour linkBehaviour = TileEntityBehaviour.get(mc.level, selectedLocation, LinkBehaviour.TYPE); if (linkBehaviour != null) { AllPackets.channel.sendToServer(new LinkedControllerBindPacket(integer, selectedLocation)); Lang.sendStatus(mc.player, "linked_controller.key_bound", controls.get(integer) - .getBoundKeyLocalizedText() + .getTranslatedKeyMessage() .getString()); } MODE = Mode.IDLE; @@ -217,7 +225,7 @@ public class LinkedControllerClientHandler { } currentlyPressed = pressedKeys; - controls.forEach(kb -> kb.setPressed(false)); + controls.forEach(kb -> kb.setDown(false)); } public static void renderOverlay(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, @@ -226,38 +234,38 @@ public class LinkedControllerClientHandler { return; Minecraft mc = Minecraft.getInstance(); - ms.push(); + ms.pushPose(); Screen tooltipScreen = new TooltipScreen(null); tooltipScreen.init(mc, mc.getWindow() - .getScaledWidth(), + .getGuiScaledWidth(), mc.getWindow() - .getScaledHeight()); + .getGuiScaledHeight()); Object[] keys = new Object[6]; Vector controls = getControls(); for (int i = 0; i < controls.size(); i++) { KeyBinding keyBinding = controls.get(i); - keys[i] = keyBinding.getBoundKeyLocalizedText() + keys[i] = keyBinding.getTranslatedKeyMessage() .getString(); } List list = new ArrayList<>(); list.add(Lang.createTranslationTextComponent("linked_controller.bind_mode") - .formatted(TextFormatting.GOLD)); + .withStyle(TextFormatting.GOLD)); list.addAll( TooltipHelper.cutTextComponent(Lang.createTranslationTextComponent("linked_controller.press_keybind", keys), TextFormatting.GRAY, TextFormatting.GRAY)); int width = 0; - int height = list.size() * mc.fontRenderer.FONT_HEIGHT; + int height = list.size() * mc.font.lineHeight; for (ITextComponent iTextComponent : list) - width = Math.max(width, mc.fontRenderer.getWidth(iTextComponent)); + width = Math.max(width, mc.font.width(iTextComponent)); int x = (tooltipScreen.width / 3) - width / 2; int y = tooltipScreen.height - height; - tooltipScreen.renderTooltip(ms, list, x, y); + tooltipScreen.renderComponentTooltip(ms, list, x, y); - ms.pop(); + ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerContainer.java index d2770f269..3f546e399 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerContainer.java @@ -22,7 +22,7 @@ public class LinkedControllerContainer extends Container implements IClearableCo public ItemStackHandler filterInventory; public LinkedControllerContainer(ContainerType type, int id, PlayerInventory inv, PacketBuffer extraData) { - this(type, id, inv, extraData.readItemStack()); + this(type, id, inv, extraData.readItem()); } public LinkedControllerContainer(ContainerType type, int id, PlayerInventory inv, ItemStack filterItem) { @@ -42,7 +42,7 @@ public class LinkedControllerContainer extends Container implements IClearableCo // readData(mainItem); addPlayerSlots(); addLinkSlots(); - detectAndSendChanges(); + broadcastChanges(); } protected void addPlayerSlots() { @@ -77,28 +77,28 @@ public class LinkedControllerContainer extends Container implements IClearableCo } @Override - public boolean canMergeSlot(ItemStack stack, Slot slotIn) { - return canDragIntoSlot(slotIn); + public boolean canTakeItemForPickAll(ItemStack stack, Slot slotIn) { + return canDragTo(slotIn); } @Override - public boolean canDragIntoSlot(Slot slotIn) { - return slotIn.inventory == playerInventory; + public boolean canDragTo(Slot slotIn) { + return slotIn.container == playerInventory; } @Override - public boolean canInteractWith(PlayerEntity playerIn) { - return playerInventory.getCurrentItem() == mainItem; + public boolean stillValid(PlayerEntity playerIn) { + return playerInventory.getSelected() == mainItem; } @Override - public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { - if (slotId == playerInventory.currentItem && clickTypeIn != ClickType.THROW) + public ItemStack clicked(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { + if (slotId == playerInventory.selected && clickTypeIn != ClickType.THROW) return ItemStack.EMPTY; - ItemStack held = playerInventory.getItemStack(); + ItemStack held = playerInventory.getCarried(); if (slotId < 36) - return super.slotClick(slotId, dragType, clickTypeIn, player); + return super.clicked(slotId, dragType, clickTypeIn, player); if (clickTypeIn == ClickType.THROW) return ItemStack.EMPTY; @@ -108,7 +108,7 @@ public class LinkedControllerContainer extends Container implements IClearableCo ItemStack stackInSlot = filterInventory.getStackInSlot(slot) .copy(); stackInSlot.setCount(64); - playerInventory.setItemStack(stackInSlot); + playerInventory.setCarried(stackInSlot); return ItemStack.EMPTY; } return ItemStack.EMPTY; @@ -130,9 +130,9 @@ public class LinkedControllerContainer extends Container implements IClearableCo } @Override - public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { + public ItemStack quickMoveStack(PlayerEntity playerIn, int index) { if (index < 36) { - ItemStack stackToInsert = playerInventory.getStackInSlot(index); + ItemStack stackToInsert = playerInventory.getItem(index); for (int i = 0; i < filterInventory.getSlots(); i++) { ItemStack stack = filterInventory.getStackInSlot(i); if (stack.isEmpty()) { @@ -148,8 +148,8 @@ public class LinkedControllerContainer extends Container implements IClearableCo } @Override - public void onContainerClosed(PlayerEntity playerIn) { - super.onContainerClosed(playerIn); + public void removed(PlayerEntity playerIn) { + super.removed(playerIn); mainItem.getOrCreateTag() .put("Items", filterInventory.serializeNBT()); // saveData(filterItem); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerInputPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerInputPacket.java index 1b2414602..5a2105141 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerInputPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerInputPacket.java @@ -51,9 +51,9 @@ public class LinkedControllerInputPacket extends LinkedControllerPacketBase { @Override protected void handleItem(ServerPlayerEntity player, ItemStack heldItem) { - World world = player.getEntityWorld(); - UUID uniqueID = player.getUniqueID(); - BlockPos pos = player.getBlockPos(); + World world = player.getCommandSenderWorld(); + UUID uniqueID = player.getUUID(); + BlockPos pos = player.blockPosition(); if (player.isSpectator() && press) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java index 6403ccfa0..bbc3d7eff 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java @@ -42,57 +42,60 @@ public class LinkedControllerItem extends Item implements INamedContainerProvide PlayerEntity player = ctx.getPlayer(); if (player == null) return ActionResultType.PASS; - World world = ctx.getWorld(); - BlockPos pos = ctx.getPos(); + World world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); BlockState hitState = world.getBlockState(pos); - if (player.isAllowEdit()) { - if (player.isSneaking()) { + if (player.mayBuild()) { + if (player.isShiftKeyDown()) { if (AllBlocks.LECTERN_CONTROLLER.has(hitState)) { - if (!world.isRemote) + if (!world.isClientSide) AllBlocks.LECTERN_CONTROLLER.get().withTileEntityDo(world, pos, te -> te.swapControllers(stack, player, ctx.getHand(), hitState)); return ActionResultType.SUCCESS; } } else { if (AllBlocks.REDSTONE_LINK.has(hitState)) { - if (world.isRemote) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.toggleBindMode(ctx.getPos())); - player.getCooldownTracker() - .setCooldown(this, 2); + if (world.isClientSide) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.toggleBindMode(ctx.getClickedPos())); + player.getCooldowns() + .addCooldown(this, 2); return ActionResultType.SUCCESS; } - if (hitState.isIn(Blocks.LECTERN) && !hitState.get(LecternBlock.HAS_BOOK)) { - if (!world.isRemote) { + if (hitState.is(Blocks.LECTERN) && !hitState.getValue(LecternBlock.HAS_BOOK)) { + if (!world.isClientSide) { ItemStack lecternStack = player.isCreative() ? stack.copy() : stack.split(1); AllBlocks.LECTERN_CONTROLLER.get().replaceLectern(hitState, world, pos, lecternStack); } return ActionResultType.SUCCESS; } + + if (AllBlocks.LECTERN_CONTROLLER.has(hitState)) + return ActionResultType.PASS; } } - return onItemRightClick(world, player, ctx.getHand()).getType(); + return use(world, player, ctx.getHand()).getResult(); } @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack heldItem = player.getHeldItem(hand); + public ActionResult use(World world, PlayerEntity player, Hand hand) { + ItemStack heldItem = player.getItemInHand(hand); - if (player.isSneaking() && hand == Hand.MAIN_HAND) { - if (!world.isRemote && player instanceof ServerPlayerEntity && player.isAllowEdit()) + if (player.isShiftKeyDown() && hand == Hand.MAIN_HAND) { + if (!world.isClientSide && player instanceof ServerPlayerEntity && player.mayBuild()) NetworkHooks.openGui((ServerPlayerEntity) player, this, buf -> { - buf.writeItemStack(heldItem); + buf.writeItem(heldItem); }); return ActionResult.success(heldItem); } - if (!player.isSneaking()) { - if (world.isRemote) + if (!player.isShiftKeyDown()) { + if (world.isClientSide) DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::toggleActive); - player.getCooldownTracker() - .setCooldown(this, 2); + player.getCooldowns() + .addCooldown(this, 2); } return ActionResult.pass(heldItem); @@ -112,7 +115,7 @@ public class LinkedControllerItem extends Item implements INamedContainerProvide ItemStackHandler newInv = new ItemStackHandler(12); if (AllItems.LINKED_CONTROLLER.get() != stack.getItem()) throw new IllegalArgumentException("Cannot get frequency items from non-controller: " + stack); - CompoundNBT invNBT = stack.getOrCreateChildTag("Items"); + CompoundNBT invNBT = stack.getOrCreateTagElement("Items"); if (!invNBT.isEmpty()) newInv.deserializeNBT(invNBT); return newInv; @@ -126,13 +129,13 @@ public class LinkedControllerItem extends Item implements INamedContainerProvide @Override public Container createMenu(int id, PlayerInventory inv, PlayerEntity player) { - ItemStack heldItem = player.getHeldItemMainhand(); + ItemStack heldItem = player.getMainHandItem(); return LinkedControllerContainer.create(id, inv, heldItem); } @Override public ITextComponent getDisplayName() { - return new TranslationTextComponent(getTranslationKey()); + return new TranslationTextComponent(getDescriptionId()); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java index 000bb8273..a94056ca9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java @@ -2,13 +2,13 @@ package com.simibubi.create.content.logistics.item; import java.util.Vector; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.item.LinkedControllerClientHandler.Mode; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; @@ -63,12 +63,12 @@ public class LinkedControllerItemRenderer extends CustomRenderedItemModelRendere int light, Boolean active, Boolean usedByMe) { float pt = AnimationTickHolder.getPartialTicks(); - MatrixStacker msr = MatrixStacker.of(ms); + MatrixTransformStack msr = MatrixTransformStack.of(ms); - ms.push(); + ms.pushPose(); Minecraft mc = Minecraft.getInstance(); - boolean rightHanded = mc.gameSettings.mainHand == HandSide.RIGHT; + boolean rightHanded = mc.options.mainHand == HandSide.RIGHT; TransformType mainHand = rightHanded ? TransformType.FIRST_PERSON_RIGHT_HAND : TransformType.FIRST_PERSON_LEFT_HAND; TransformType offHand = @@ -77,31 +77,34 @@ public class LinkedControllerItemRenderer extends CustomRenderedItemModelRendere if (active == null) { active = false; - boolean noControllerInMain = !AllItems.LINKED_CONTROLLER.isIn(mc.player.getHeldItemMainhand()); + boolean noControllerInMain = !AllItems.LINKED_CONTROLLER.isIn(mc.player.getMainHandItem()); if (transformType == mainHand || (transformType == offHand && noControllerInMain)) { + active = true; + } + + if (transformType == TransformType.GUI) { + if (stack == mc.player.getMainHandItem()) + active = true; + if (stack == mc.player.getOffhandItem() && noControllerInMain) + active = true; + } + + active &= LinkedControllerClientHandler.MODE != Mode.IDLE && !LinkedControllerClientHandler.inLectern(); + usedByMe = active; + + if (active && (transformType == mainHand || transformType == offHand)) { float equip = equipProgress.getValue(pt); int handModifier = transformType == TransformType.FIRST_PERSON_LEFT_HAND ? -1 : 1; msr.translate(0, equip / 4, equip / 4 * handModifier); msr.rotateY(equip * -30 * handModifier); msr.rotateZ(equip * -30); - active = true; } - - if (transformType == TransformType.GUI) { - if (stack == mc.player.getHeldItemMainhand()) - active = true; - if (stack == mc.player.getHeldItemOffhand() && noControllerInMain) - active = true; - } - - active &= LinkedControllerClientHandler.MODE != Mode.IDLE; - usedByMe = active; } renderer.render(active ? model.getPartial("powered") : model.getOriginalModel(), light); if (!usedByMe) { - ms.pop(); + ms.popPose(); return; } @@ -115,7 +118,7 @@ public class LinkedControllerItemRenderer extends CustomRenderedItemModelRendere light = i << 20; } - ms.push(); + ms.pushPose(); msr.translate(2 * s, 0, 8 * s); button(renderer, ms, light, pt, button, b, index++); msr.translate(4 * s, 0, 0); @@ -124,23 +127,23 @@ public class LinkedControllerItemRenderer extends CustomRenderedItemModelRendere button(renderer, ms, light, pt, button, b, index++); msr.translate(0, 0, -4 * s); button(renderer, ms, light, pt, button, b, index++); - ms.pop(); + ms.popPose(); msr.translate(3 * s, 0, 3 * s); button(renderer, ms, light, pt, button, b, index++); msr.translate(2 * s, 0, 0); button(renderer, ms, light, pt, button, b, index++); - ms.pop(); + ms.popPose(); } protected static void button(PartialItemModelRenderer renderer, MatrixStack ms, int light, float pt, IBakedModel button, float b, int index) { - ms.push(); + ms.pushPose(); ms.translate(0, b * buttons.get(index) .getValue(pt), 0); renderer.renderSolid(button, light); - ms.pop(); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerPacketBase.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerPacketBase.java index 78a844af7..d6c391e69 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerPacketBase.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerPacketBase.java @@ -48,14 +48,14 @@ public abstract class LinkedControllerPacketBase extends SimplePacketBase { return; if (inLectern()) { - TileEntity te = player.world.getTileEntity(lecternPos); + TileEntity te = player.level.getBlockEntity(lecternPos); if (!(te instanceof LecternControllerTileEntity)) return; handleLectern(player, (LecternControllerTileEntity) te); } else { - ItemStack controller = player.getHeldItemMainhand(); + ItemStack controller = player.getMainHandItem(); if (!AllItems.LINKED_CONTROLLER.isIn(controller)) { - controller = player.getHeldItemOffhand(); + controller = player.getOffhandItem(); if (!AllItems.LINKED_CONTROLLER.isIn(controller)) return; } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java index bfbfbbbde..8c95a94d1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java @@ -41,8 +41,8 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreenat(x + background.width - 4, y + background.height - 56, -200) .scale(5) .render(ms); @@ -76,9 +76,9 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen(), hoveredSlot.getSlotIndex()), x, y, textRenderer); + renderWrappedToolTip(ms, addToTooltip(new LinkedList<>(), hoveredSlot.getSlotIndex()), x, y, font); } @Override public List getTooltipFromItem(ItemStack stack) { List list = super.getTooltipFromItem(stack); - if (hoveredSlot.inventory == container.playerInventory) + if (hoveredSlot.container == menu.playerInventory) return list; return hoveredSlot != null ? addToTooltip(list, hoveredSlot.getSlotIndex()) : list; } @@ -126,9 +126,9 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen>> receivedInputs = - new WorldAttached<>(HashMap::new); + new WorldAttached<>($ -> new HashMap<>()); static final int TIMEOUT = 30; public static void tick(IWorld world) { diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java index ed3ea6cf3..68193c4ef 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java @@ -22,10 +22,10 @@ public abstract class AbstractFilterContainer extends GhostItemContainer ex super.init(); widgets.clear(); - int x = guiLeft; - int y = guiTop; + int x = leftPos; + int y = topPos; resetButton = new IconButton(x + background.width - 62, y + background.height - 24, AllIcons.I_TRASH); confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); @@ -62,16 +62,16 @@ public abstract class AbstractFilterScreen ex @Override protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { int invX = getLeftOfCentered(PLAYER_INVENTORY.width); - int invY = guiTop + background.height + 4; + int invY = topPos + background.height + 4; renderPlayerInventory(ms, invX, invY); - int x = guiLeft; - int y = guiTop; + int x = leftPos; + int y = topPos; background.draw(ms, this, x, y); - drawCenteredText(ms, textRenderer, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); - GuiGameElement.of(container.contentHolder) + GuiGameElement.of(menu.contentHolder) .at(x + background.width, y + background.height - 56, -200) .scale(5) .render(ms); @@ -83,9 +83,9 @@ public abstract class AbstractFilterScreen ex super.tick(); handleIndicators(); - if (!container.player.getHeldItemMainhand() - .equals(container.contentHolder, false)) - client.player.closeScreen(); + if (!menu.player.getMainHandItem() + .equals(menu.contentHolder, false)) + minecraft.player.closeContainer(); } public void handleIndicators() { @@ -142,13 +142,13 @@ public abstract class AbstractFilterScreen ex if (button == 0) { if (confirmButton.isHovered()) { - client.player.closeScreen(); + minecraft.player.closeContainer(); return true; } if (resetButton.isHovered()) { - container.clearContents(); + menu.clearContents(); contentsCleared(); - container.sendClearPacket(); + menu.sendClearPacket(); return true; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java index c6ddeec64..8d0691975 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java @@ -51,8 +51,8 @@ public class AttributeFilterContainer extends AbstractFilterContainer { protected void init(PlayerInventory inv, ItemStack contentHolder) { super.init(inv, contentHolder); ItemStack stack = new ItemStack(Items.NAME_TAG); - stack.setDisplayName( - new StringTextComponent("Selected Tags").formatted(TextFormatting.RESET, TextFormatting.BLUE)); + stack.setHoverName( + new StringTextComponent("Selected Tags").withStyle(TextFormatting.RESET, TextFormatting.BLUE)); ghostInventory.setStackInSlot(1, stack); } @@ -71,7 +71,7 @@ public class AttributeFilterContainer extends AbstractFilterContainer { this.addSlot(new SlotItemHandler(ghostInventory, 0, 16, 22)); this.addSlot(new SlotItemHandler(ghostInventory, 1, 22, 57) { @Override - public boolean canTakeStack(PlayerEntity playerIn) { + public boolean mayPickup(PlayerEntity playerIn) { return false; } }); @@ -88,28 +88,28 @@ public class AttributeFilterContainer extends AbstractFilterContainer { } @Override - public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { + public ItemStack clicked(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { if (slotId == 37) return ItemStack.EMPTY; - return super.slotClick(slotId, dragType, clickTypeIn, player); + return super.clicked(slotId, dragType, clickTypeIn, player); } @Override - public boolean canDragIntoSlot(Slot slotIn) { - if (slotIn.slotNumber == 37) + public boolean canDragTo(Slot slotIn) { + if (slotIn.index == 37) return false; - return super.canDragIntoSlot(slotIn); + return super.canDragTo(slotIn); } @Override - public boolean canMergeSlot(ItemStack stack, Slot slotIn) { - if (slotIn.slotNumber == 37) + public boolean canTakeItemForPickAll(ItemStack stack, Slot slotIn) { + if (slotIn.index == 37) return false; - return super.canMergeSlot(stack, slotIn); + return super.canTakeItemForPickAll(stack, slotIn); } @Override - public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { + public ItemStack quickMoveStack(PlayerEntity playerIn, int index) { if (index == 37) return ItemStack.EMPTY; if (index == 36) { @@ -117,7 +117,7 @@ public class AttributeFilterContainer extends AbstractFilterContainer { return ItemStack.EMPTY; } if (index < 36) { - ItemStack stackToInsert = playerInventory.getStackInSlot(index); + ItemStack stackToInsert = playerInventory.getItem(index); ItemStack copy = stackToInsert.copy(); copy.setCount(1); ghostInventory.setStackInSlot(0, copy); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java index ba7ccfa45..ee2339881 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java @@ -64,8 +64,8 @@ public class AttributeFilterScreen extends AbstractFilterScreen selectedAttributes.add(new StringTextComponent("- ") + selectedAttributes.add((menu.selectedAttributes.isEmpty() ? noSelectedT : selectedT).plainCopy() + .withStyle(TextFormatting.YELLOW)); + menu.selectedAttributes.forEach(at -> selectedAttributes.add(new StringTextComponent("- ") .append(at.getFirst() .format(at.getSecond())) - .formatted(TextFormatting.GRAY))); + .withStyle(TextFormatting.GRAY))); } private void referenceItemChanged(ItemStack stack) { @@ -113,8 +113,8 @@ public class AttributeFilterScreen extends AbstractFilterScreen { @@ -125,12 +125,12 @@ public class AttributeFilterScreen extends AbstractFilterScreen options = attributesOfItem.stream() .map(a -> a.format(false)) .collect(Collectors.toList()); @@ -141,7 +141,7 @@ public class AttributeFilterScreen extends AbstractFilterScreen { attributeSelectorLabel.setTextAndTrim(options.get(i), true, 112); ItemAttribute selected = attributesOfItem.get(i); - for (Pair existing : container.selectedAttributes) { + for (Pair existing : menu.selectedAttributes) { CompoundNBT testTag = new CompoundNBT(); CompoundNBT testTag2 = new CompoundNBT(); existing.getFirst() @@ -161,16 +161,16 @@ public class AttributeFilterScreen extends AbstractFilterScreen getTooltipDescriptions() { - return Arrays.asList(denyDESC.copy(), allowConDESC.copy(), allowDisDESC.copy()); + return Arrays.asList(denyDESC.plainCopy(), allowConDESC.plainCopy(), allowDisDESC.plainCopy()); } @Override @@ -214,19 +214,19 @@ public class AttributeFilterScreen extends AbstractFilterScreen tooltip, ITooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { if (!AllKeys.shiftDown()) { List makeSummary = makeSummary(stack); if (makeSummary.isEmpty()) @@ -90,18 +90,18 @@ public class FilterItem extends Item implements INamedContainerProvider { boolean blacklist = filter.getOrCreateTag() .getBoolean("Blacklist"); - list.add((blacklist ? Lang.translate("gui.filter.deny_list") : Lang.translate("gui.filter.allow_list")).formatted(TextFormatting.GOLD)); + list.add((blacklist ? Lang.translate("gui.filter.deny_list") : Lang.translate("gui.filter.allow_list")).withStyle(TextFormatting.GOLD)); int count = 0; for (int i = 0; i < filterItems.getSlots(); i++) { if (count > 3) { - list.add(new StringTextComponent("- ...").formatted(TextFormatting.DARK_GRAY)); + list.add(new StringTextComponent("- ...").withStyle(TextFormatting.DARK_GRAY)); break; } ItemStack filterStack = filterItems.getStackInSlot(i); if (filterStack.isEmpty()) continue; - list.add(new StringTextComponent("- ").append(filterStack.getDisplayName()).formatted(TextFormatting.GRAY)); + list.add(new StringTextComponent("- ").append(filterStack.getHoverName()).withStyle(TextFormatting.GRAY)); count++; } @@ -116,7 +116,7 @@ public class FilterItem extends Item implements INamedContainerProvider { ? Lang.translate("gui.attribute_filter.allow_list_conjunctive") : whitelistMode == WhitelistMode.WHITELIST_DISJ ? Lang.translate("gui.attribute_filter.allow_list_disjunctive") - : Lang.translate("gui.attribute_filter.deny_list")).formatted(TextFormatting.GOLD)); + : Lang.translate("gui.attribute_filter.deny_list")).withStyle(TextFormatting.GOLD)); int count = 0; ListNBT attributes = filter.getOrCreateTag() @@ -126,7 +126,7 @@ public class FilterItem extends Item implements INamedContainerProvider { ItemAttribute attribute = ItemAttribute.fromNBT(compound); boolean inverted = compound.getBoolean("Inverted"); if (count > 3) { - list.add(new StringTextComponent("- ...").formatted(TextFormatting.DARK_GRAY)); + list.add(new StringTextComponent("- ...").withStyle(TextFormatting.DARK_GRAY)); break; } list.add(new StringTextComponent("- ").append(attribute.format(inverted))); @@ -141,13 +141,13 @@ public class FilterItem extends Item implements INamedContainerProvider { } @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack heldItem = player.getHeldItem(hand); + public ActionResult use(World world, PlayerEntity player, Hand hand) { + ItemStack heldItem = player.getItemInHand(hand); - if (!player.isSneaking() && hand == Hand.MAIN_HAND) { - if (!world.isRemote && player instanceof ServerPlayerEntity) + if (!player.isShiftKeyDown() && hand == Hand.MAIN_HAND) { + if (!world.isClientSide && player instanceof ServerPlayerEntity) NetworkHooks.openGui((ServerPlayerEntity) player, this, buf -> { - buf.writeItemStack(heldItem); + buf.writeItem(heldItem); }); return ActionResult.success(heldItem); } @@ -156,7 +156,7 @@ public class FilterItem extends Item implements INamedContainerProvider { @Override public Container createMenu(int id, PlayerInventory inv, PlayerEntity player) { - ItemStack heldItem = player.getHeldItemMainhand(); + ItemStack heldItem = player.getMainHandItem(); if (type == FilterType.REGULAR) return FilterContainer.create(id, inv, heldItem); if (type == FilterType.ATTRIBUTE) @@ -166,14 +166,14 @@ public class FilterItem extends Item implements INamedContainerProvider { @Override public ITextComponent getDisplayName() { - return new TranslationTextComponent(getTranslationKey()); + return new TranslationTextComponent(getDescriptionId()); } public static ItemStackHandler getFilterItems(ItemStack stack) { ItemStackHandler newInv = new ItemStackHandler(18); if (AllItems.FILTER.get() != stack.getItem()) throw new IllegalArgumentException("Cannot get filter items from non-filter: " + stack); - CompoundNBT invNBT = stack.getOrCreateChildTag("Items"); + CompoundNBT invNBT = stack.getOrCreateTagElement("Items"); if (!invNBT.isEmpty()) newInv.deserializeNBT(invNBT); return newInv; @@ -193,7 +193,7 @@ public class FilterItem extends Item implements INamedContainerProvider { if (!(filter.getItem() instanceof FilterItem)) return (matchNBT ? ItemHandlerHelper.canItemStacksStack(filter, stack) - : ItemStack.areItemsEqual(filter, stack)); + : ItemStack.isSame(filter, stack)); if (AllItems.FILTER.get() == filter.getItem()) { ItemStackHandler filterItems = getFilterItems(filter); @@ -271,7 +271,7 @@ public class FilterItem extends Item implements INamedContainerProvider { return false; if (!matchNBT) return fluidInFilter.getFluid() - .isEquivalentTo(stack.getFluid()); + .isSame(stack.getFluid()); boolean fluidEqual = fluidInFilter.isFluidEqual(stack); return fluidEqual; } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java index d4fcd2618..579c8d711 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java @@ -43,8 +43,8 @@ public class FilterScreen extends AbstractFilterScreen { setWindowOffset(-11, 5); super.init(); - int x = guiLeft; - int y = guiTop; + int x = leftPos; + int y = topPos; blacklist = new IconButton(x + 18, y + 73, AllIcons.I_BLACKLIST); blacklist.setToolTip(denyN); @@ -73,25 +73,25 @@ public class FilterScreen extends AbstractFilterScreen { return mouseClicked; if (blacklist.isHovered()) { - container.blacklist = true; + menu.blacklist = true; sendOptionUpdate(Option.BLACKLIST); return true; } if (whitelist.isHovered()) { - container.blacklist = false; + menu.blacklist = false; sendOptionUpdate(Option.WHITELIST); return true; } if (respectNBT.isHovered()) { - container.respectNBT = true; + menu.respectNBT = true; sendOptionUpdate(Option.RESPECT_DATA); return true; } if (ignoreNBT.isHovered()) { - container.respectNBT = false; + menu.respectNBT = false; sendOptionUpdate(Option.IGNORE_DATA); return true; } @@ -106,32 +106,32 @@ public class FilterScreen extends AbstractFilterScreen { @Override protected List getTooltipDescriptions() { - return Arrays.asList(denyDESC.copy(), allowDESC.copy(), respectDataDESC.copy(), ignoreDataDESC.copy()); + return Arrays.asList(denyDESC.plainCopy(), allowDESC.plainCopy(), respectDataDESC.plainCopy(), ignoreDataDESC.plainCopy()); } @Override protected boolean isButtonEnabled(IconButton button) { if (button == blacklist) - return !container.blacklist; + return !menu.blacklist; if (button == whitelist) - return container.blacklist; + return menu.blacklist; if (button == respectNBT) - return !container.respectNBT; + return !menu.respectNBT; if (button == ignoreNBT) - return container.respectNBT; + return menu.respectNBT; return true; } @Override protected boolean isIndicatorOn(Indicator indicator) { if (indicator == blacklistIndicator) - return container.blacklist; + return menu.blacklist; if (indicator == whitelistIndicator) - return !container.blacklist; + return !menu.blacklist; if (indicator == respectNBTIndicator) - return container.respectNBT; + return menu.respectNBT; if (indicator == ignoreNBTIndicator) - return !container.respectNBT; + return !menu.respectNBT; return false; } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java index 1b1f61398..a1e50375a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java @@ -30,13 +30,13 @@ public class FilterScreenPacket extends SimplePacketBase { public FilterScreenPacket(PacketBuffer buffer) { option = Option.values()[buffer.readInt()]; - data = buffer.readCompoundTag(); + data = buffer.readNbt(); } @Override public void write(PacketBuffer buffer) { buffer.writeInt(option.ordinal()); - buffer.writeCompoundTag(data); + buffer.writeNbt(data); } @Override @@ -46,8 +46,8 @@ public class FilterScreenPacket extends SimplePacketBase { if (player == null) return; - if (player.openContainer instanceof FilterContainer) { - FilterContainer c = (FilterContainer) player.openContainer; + if (player.containerMenu instanceof FilterContainer) { + FilterContainer c = (FilterContainer) player.containerMenu; if (option == Option.WHITELIST) c.blacklist = false; if (option == Option.BLACKLIST) @@ -59,11 +59,11 @@ public class FilterScreenPacket extends SimplePacketBase { if (option == Option.UPDATE_FILTER_ITEM) c.ghostInventory.setStackInSlot( data.getInt("Slot"), - net.minecraft.item.ItemStack.read(data.getCompound("Item"))); + net.minecraft.item.ItemStack.of(data.getCompound("Item"))); } - if (player.openContainer instanceof AttributeFilterContainer) { - AttributeFilterContainer c = (AttributeFilterContainer) player.openContainer; + if (player.containerMenu instanceof AttributeFilterContainer) { + AttributeFilterContainer c = (AttributeFilterContainer) player.containerMenu; if (option == Option.WHITELIST) c.whitelistMode = WhitelistMode.WHITELIST_DISJ; if (option == Option.WHITELIST2) diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java index 4f79b0eee..b72d60db7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java @@ -19,6 +19,7 @@ import com.simibubi.create.content.logistics.item.filter.attribute.ColorAttribut import com.simibubi.create.content.logistics.item.filter.attribute.EnchantAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.FluidContentsAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.ItemNameAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ShulkerFillLevelAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryAmuletAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryAttunementAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryCrystalAttribute; @@ -53,9 +54,10 @@ public interface ItemAttribute { static ItemAttribute standard = register(StandardTraits.DUMMY); static ItemAttribute inTag = register(new InTag(new ResourceLocation("dummy"))); - static ItemAttribute inItemGroup = register(new InItemGroup(ItemGroup.MISC)); + static ItemAttribute inItemGroup = register(new InItemGroup(ItemGroup.TAB_MISC)); static ItemAttribute addedBy = register(new InItemGroup.AddedBy("dummy")); static ItemAttribute hasEnchant = register(EnchantAttribute.EMPTY); + static ItemAttribute shulkerFillLevel = register(ShulkerFillLevelAttribute.EMPTY); static ItemAttribute hasColor = register(ColorAttribute.EMPTY); static ItemAttribute hasFluid = register(FluidContentsAttribute.EMPTY); static ItemAttribute hasName = register(new ItemNameAttribute("dummy")); @@ -126,12 +128,12 @@ public interface ItemAttribute { DUMMY(s -> false), PLACEABLE(s -> s.getItem() instanceof BlockItem), - CONSUMABLE(ItemStack::isFood), + CONSUMABLE(ItemStack::isEdible), FLUID_CONTAINER(s -> s.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY).isPresent()), ENCHANTED(ItemStack::isEnchanted), - RENAMED(ItemStack::hasDisplayName), + RENAMED(ItemStack::hasCustomHoverName), DAMAGED(ItemStack::isDamaged), - BADLY_DAMAGED(s -> s.isDamaged() && s.getDamage() / s.getMaxDamage() > 3 / 4f), + BADLY_DAMAGED(s -> s.isDamaged() && s.getDamageValue() / s.getMaxDamage() > 3 / 4f), NOT_STACKABLE(((Predicate) ItemStack::isStackable).negate()), EQUIPABLE(s -> s.getEquipmentSlot() != null), MAX_ENCHANTED(StandardTraits::maxEnchanted), @@ -152,9 +154,9 @@ public interface ItemAttribute { } private static boolean testRecipe(ItemStack s, World w, IRecipeType> type) { - RECIPE_WRAPPER.setInventorySlotContents(0, s.copy()); + RECIPE_WRAPPER.setItem(0, s.copy()); return w.getRecipeManager() - .getRecipe(type, RECIPE_WRAPPER, w) + .getRecipeFor(type, RECIPE_WRAPPER, w) .isPresent(); } @@ -278,13 +280,13 @@ public interface ItemAttribute { @Override public boolean appliesTo(ItemStack stack) { Item item = stack.getItem(); - return item.getGroup() == group; + return item.getItemCategory() == group; } @Override public List listAttributesOf(ItemStack stack) { ItemGroup group = stack.getItem() - .getGroup(); + .getItemCategory(); return group == null ? Collections.emptyList() : Arrays.asList(new InItemGroup(group)); } @@ -297,19 +299,19 @@ public interface ItemAttribute { @OnlyIn(value = Dist.CLIENT) public TranslationTextComponent format(boolean inverted) { return Lang.translate("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""), - group.getTranslationKey()); + group.getDisplayName()); } @Override public void writeNBT(CompoundNBT nbt) { - nbt.putString("path", group.getPath()); + nbt.putString("path", group.getRecipeFolderName()); } @Override public ItemAttribute readNBT(CompoundNBT nbt) { String readPath = nbt.getString("path"); - for (ItemGroup group : ItemGroup.GROUPS) - if (group.getPath() + for (ItemGroup group : ItemGroup.TABS) + if (group.getRecipeFolderName() .equals(readPath)) return new InItemGroup(group); return null; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ColorAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ColorAttribute.java index f9e5e2380..354fe068c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ColorAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ColorAttribute.java @@ -56,7 +56,7 @@ public class ColorAttribute implements ItemAttribute { colors.addAll(getFireworkStarColors(nbt.getCompound("Explosion"))); } - Arrays.stream(DyeColor.values()).filter(c -> stack.getItem().getRegistryName().getPath().startsWith(c.getTranslationKey() + "_")).forEach(colors::add); + Arrays.stream(DyeColor.values()).filter(c -> stack.getItem().getRegistryName().getPath().startsWith(c.getName() + "_")).forEach(colors::add); return colors; } @@ -75,7 +75,7 @@ public class ColorAttribute implements ItemAttribute { @Override public Object[] getTranslationParameters() { - return new Object[]{new TranslationTextComponent(color.getTranslationKey()).getUnformattedComponentText()}; + return new Object[]{new TranslationTextComponent(color.getName()).getContents()}; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java index 611eb28a6..d23c806b9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java @@ -43,7 +43,7 @@ public class EnchantAttribute implements ItemAttribute { public Object[] getTranslationParameters() { String parameter = ""; if(enchantment != null) - parameter = new TranslationTextComponent(enchantment.getName()).getString(); + parameter = new TranslationTextComponent(enchantment.getDescriptionId()).getString(); return new Object[] { parameter }; } @@ -59,6 +59,6 @@ public class EnchantAttribute implements ItemAttribute { @Override public ItemAttribute readNBT(CompoundNBT nbt) { - return nbt.contains("id") ? new EnchantAttribute(ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryCreate(nbt.getString("id")))) : EMPTY; + return nbt.contains("id") ? new EnchantAttribute(ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(nbt.getString("id")))) : EMPTY; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java index 76638df30..dfe0ee944 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java @@ -62,7 +62,7 @@ public class FluidContentsAttribute implements ItemAttribute { @Override public ItemAttribute readNBT(CompoundNBT nbt) { - return nbt.contains("id") ? new FluidContentsAttribute(ForgeRegistries.FLUIDS.getValue(ResourceLocation.tryCreate(nbt.getString("id")))) : EMPTY; + return nbt.contains("id") ? new FluidContentsAttribute(ForgeRegistries.FLUIDS.getValue(ResourceLocation.tryParse(nbt.getString("id")))) : EMPTY; } private List extractFluids(ItemStack stack) { diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemNameAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemNameAttribute.java index 0c9581cae..ebe7c6024 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemNameAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemNameAttribute.java @@ -54,7 +54,7 @@ public class ItemNameAttribute implements ItemAttribute { } private String extractCustomName(ItemStack stack) { - CompoundNBT compoundnbt = stack.getChildTag("display"); + CompoundNBT compoundnbt = stack.getTagElement("display"); if (compoundnbt != null && compoundnbt.contains("Name", 8)) { try { ITextComponent itextcomponent = ITextComponent.Serializer.fromJson(compoundnbt.getString("Name")); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ShulkerFillLevelAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ShulkerFillLevelAttribute.java new file mode 100644 index 000000000..8950409b6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ShulkerFillLevelAttribute.java @@ -0,0 +1,109 @@ +package com.simibubi.create.content.logistics.item.filter.attribute; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import javax.annotation.Nullable; + +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.block.Block; +import net.minecraft.block.ShulkerBoxBlock; +import net.minecraft.inventory.ItemStackHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.NonNullList; + +public class ShulkerFillLevelAttribute implements ItemAttribute { + public static final ShulkerFillLevelAttribute EMPTY = new ShulkerFillLevelAttribute(null); + + private final ShulkerLevels levels; + + public ShulkerFillLevelAttribute(ShulkerLevels levels) { + this.levels = levels; + } + + @Override + public boolean appliesTo(ItemStack stack) { + return levels != null && levels.canApply(stack); + } + + @Override + public List listAttributesOf(ItemStack stack) { + return Arrays.stream(ShulkerLevels.values()) + .filter(shulkerLevels -> shulkerLevels.canApply(stack)) + .map(ShulkerFillLevelAttribute::new) + .collect(Collectors.toList()); + } + + @Override + public String getTranslationKey() { + return "shulker_level"; + } + + @Override + public Object[] getTranslationParameters() { + String parameter = ""; + if (levels != null) + parameter = Lang.translate("item_attributes." + getTranslationKey() + "." + levels.key).getString(); + return new Object[]{parameter}; + } + + @Override + public void writeNBT(CompoundNBT nbt) { + if (levels != null) + nbt.putString("id", levels.key); + } + + @Override + public ItemAttribute readNBT(CompoundNBT nbt) { + return nbt.contains("id") ? new ShulkerFillLevelAttribute(ShulkerLevels.fromKey(nbt.getString("id"))) : EMPTY; + } + + enum ShulkerLevels { + EMPTY("empty", amount -> amount == 0), + PARTIAL("partial", amount -> amount > 0 && amount < Integer.MAX_VALUE), + FULL("full", amount -> amount == Integer.MAX_VALUE); + + private final Predicate requiredSize; + private final String key; + + ShulkerLevels(String key, Predicate requiredSize) { + this.key = key; + this.requiredSize = requiredSize; + } + + @Nullable + public static ShulkerLevels fromKey(String key) { + return Arrays.stream(values()).filter(shulkerLevels -> shulkerLevels.key.equals(key)).findFirst().orElse(null); + } + + private static boolean isShulker(ItemStack stack) { + return Block.byItem(stack.getItem()) instanceof ShulkerBoxBlock; + } + + public boolean canApply(ItemStack testStack) { + if (!isShulker(testStack)) + return false; + CompoundNBT compoundnbt = testStack.getTagElement("BlockEntityTag"); + if (compoundnbt == null) + return requiredSize.test(0); + if (compoundnbt.contains("LootTable", 8)) + return false; + if (compoundnbt.contains("Items", 9)) { + int rawSize = compoundnbt.getList("Items", 10).size(); + if (rawSize < 27) + return requiredSize.test(rawSize); + + NonNullList inventory = NonNullList.withSize(27, ItemStack.EMPTY); + ItemStackHelper.loadAllItems(compoundnbt, inventory); + boolean isFull = inventory.stream().allMatch(itemStack -> !itemStack.isEmpty() && itemStack.getCount() == itemStack.getMaxStackSize()); + return requiredSize.test(isFull ? Integer.MAX_VALUE : rawSize); + } + return requiredSize.test(0); + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java index 85b40b8d2..dbc3c8e7a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java @@ -54,9 +54,9 @@ public class AstralSorceryAmuletAttribute implements ItemAttribute { public Object[] getTranslationParameters() { String something = ""; - Enchantment enchant = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryCreate(enchName)); + Enchantment enchant = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(enchName)); if(enchant != null) { - something = new TranslationTextComponent(enchant.getName()).getString(); + something = new TranslationTextComponent(enchant.getDescriptionId()).getString(); } if(enchType == 1) something = "existing " + something; diff --git a/src/main/java/com/simibubi/create/content/logistics/packet/FunnelFlapPacket.java b/src/main/java/com/simibubi/create/content/logistics/packet/FunnelFlapPacket.java index 4118817ff..526fbfe5f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packet/FunnelFlapPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/packet/FunnelFlapPacket.java @@ -16,7 +16,7 @@ public class FunnelFlapPacket extends TileEntityDataPacket { } public FunnelFlapPacket(FunnelTileEntity tile, boolean inwards) { - super(tile.getPos()); + super(tile.getBlockPos()); this.inwards = inwards; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packet/TunnelFlapPacket.java b/src/main/java/com/simibubi/create/content/logistics/packet/TunnelFlapPacket.java index 0fcf32b4d..2545b164e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packet/TunnelFlapPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/packet/TunnelFlapPacket.java @@ -23,7 +23,7 @@ public class TunnelFlapPacket extends TileEntityDataPacket this.flaps = new ArrayList<>(size); for (int i = 0; i < size; i++) { - Direction direction = Direction.byIndex(buffer.readByte()); + Direction direction = Direction.from3DDataValue(buffer.readByte()); boolean inwards = buffer.readBoolean(); flaps.add(Pair.of(direction, inwards)); @@ -31,7 +31,7 @@ public class TunnelFlapPacket extends TileEntityDataPacket } public TunnelFlapPacket(BeltTunnelTileEntity tile, List> flaps) { - super(tile.getPos()); + super(tile.getBlockPos()); this.flaps = new ArrayList<>(flaps); } @@ -41,7 +41,7 @@ public class TunnelFlapPacket extends TileEntityDataPacket buffer.writeByte(flaps.size()); for (Pair flap : flaps) { - buffer.writeByte(flap.getLeft().getIndex()); + buffer.writeByte(flap.getLeft().get3DDataValue()); buffer.writeBoolean(flap.getRight()); } } diff --git a/src/main/java/com/simibubi/create/content/palettes/AllPaletteBlocks.java b/src/main/java/com/simibubi/create/content/palettes/AllPaletteBlocks.java index f51eb78a1..0e8bae19e 100644 --- a/src/main/java/com/simibubi/create/content/palettes/AllPaletteBlocks.java +++ b/src/main/java/com/simibubi/create/content/palettes/AllPaletteBlocks.java @@ -43,7 +43,7 @@ public class AllPaletteBlocks { public static final BlockEntry TILED_GLASS = REGISTRATE.block("tiled_glass", GlassBlock::new) .initialProperties(() -> Blocks.GLASS) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .recipe((c, p) -> p.stonecutting(DataIngredient.tag(Tags.Items.GLASS_COLORLESS), c::get)) .blockstate(palettesCubeAll()) .tag(Tags.Blocks.GLASS_COLORLESS, BlockTags.IMPERMEABLE) @@ -61,7 +61,7 @@ public class AllPaletteBlocks { public static final BlockEntry TILED_GLASS_PANE = WindowGen.standardGlassPane("tiled_glass", TILED_GLASS, Create.asResource("block/palettes/tiled_glass"), - new ResourceLocation("block/glass_pane_top"), () -> RenderType::getCutoutMipped); + new ResourceLocation("block/glass_pane_top"), () -> RenderType::cutoutMipped); public static final BlockEntry FRAMED_GLASS_PANE = framedGlassPane("framed_glass", FRAMED_GLASS, AllSpriteShifts.FRAMED_GLASS), @@ -72,26 +72,26 @@ public class AllPaletteBlocks { public static final BlockEntry OAK_WINDOW = woodenWindowBlock(WoodType.OAK, Blocks.OAK_PLANKS), SPRUCE_WINDOW = woodenWindowBlock(WoodType.SPRUCE, Blocks.SPRUCE_PLANKS), - BIRCH_WINDOW = woodenWindowBlock(WoodType.BIRCH, Blocks.BIRCH_PLANKS, () -> RenderType::getTranslucent), + BIRCH_WINDOW = woodenWindowBlock(WoodType.BIRCH, Blocks.BIRCH_PLANKS, () -> RenderType::translucent), JUNGLE_WINDOW = woodenWindowBlock(WoodType.JUNGLE, Blocks.JUNGLE_PLANKS), ACACIA_WINDOW = woodenWindowBlock(WoodType.ACACIA, Blocks.ACACIA_PLANKS), DARK_OAK_WINDOW = woodenWindowBlock(WoodType.DARK_OAK, Blocks.DARK_OAK_PLANKS), CRIMSON_WINDOW = woodenWindowBlock(WoodType.CRIMSON, Blocks.CRIMSON_PLANKS), WARPED_WINDOW = woodenWindowBlock(WoodType.WARPED, Blocks.WARPED_PLANKS), ORNATE_IRON_WINDOW = customWindowBlock("ornate_iron_window", AllItems.ANDESITE_ALLOY, - AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::getCutoutMipped); + AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::cutoutMipped); public static final BlockEntry OAK_WINDOW_PANE = woodenWindowPane(WoodType.OAK, OAK_WINDOW), SPRUCE_WINDOW_PANE = woodenWindowPane(WoodType.SPRUCE, SPRUCE_WINDOW), - BIRCH_WINDOW_PANE = woodenWindowPane(WoodType.BIRCH, BIRCH_WINDOW, () -> RenderType::getTranslucent), + BIRCH_WINDOW_PANE = woodenWindowPane(WoodType.BIRCH, BIRCH_WINDOW, () -> RenderType::translucent), JUNGLE_WINDOW_PANE = woodenWindowPane(WoodType.JUNGLE, JUNGLE_WINDOW), ACACIA_WINDOW_PANE = woodenWindowPane(WoodType.ACACIA, ACACIA_WINDOW), DARK_OAK_WINDOW_PANE = woodenWindowPane(WoodType.DARK_OAK, DARK_OAK_WINDOW), CRIMSON_WINDOW_PANE = woodenWindowPane(WoodType.CRIMSON, CRIMSON_WINDOW), WARPED_WINDOW_PANE = woodenWindowPane(WoodType.WARPED, WARPED_WINDOW), ORNATE_IRON_WINDOW_PANE = customWindowPane("ornate_iron_window", ORNATE_IRON_WINDOW, - AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::getCutoutMipped); + AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::cutoutMipped); // Vanilla stone variant patterns @@ -157,7 +157,7 @@ public class AllPaletteBlocks { .initialProperties(() -> Blocks.ANDESITE) .tag(BlockTags.BASE_STONE_OVERWORLD) .onRegister(CreateRegistrate.blockVertexColors(new ScoriaVertexColor())) - .loot((p, g) -> p.registerLootTable(g, RegistrateBlockLootTables.droppingWithSilkTouch(g, SCORIA.get()))) + .loot((p, g) -> p.add(g, RegistrateBlockLootTables.droppingWithSilkTouch(g, SCORIA.get()))) .blockstate(palettesCubeAll()) .simpleItem() .register(); @@ -174,7 +174,7 @@ public class AllPaletteBlocks { new PalettesVariantEntry(PaletteStoneVariants.DARK_SCORIA, PaletteBlockPattern.STANDARD_RANGE, DARK_SCORIA); private static NonNullBiConsumer cobblestoneLoot(PaletteStoneVariants variant) { - return (loot, block) -> loot.registerLootTable(block, RegistrateBlockLootTables.droppingWithSilkTouch(block, + return (loot, block) -> loot.add(block, RegistrateBlockLootTables.droppingWithSilkTouch(block, variant.getVariants().registeredBlocks.get(0).get())); } diff --git a/src/main/java/com/simibubi/create/content/palettes/ConnectedGlassBlock.java b/src/main/java/com/simibubi/create/content/palettes/ConnectedGlassBlock.java index 0a2f58468..b843de134 100644 --- a/src/main/java/com/simibubi/create/content/palettes/ConnectedGlassBlock.java +++ b/src/main/java/com/simibubi/create/content/palettes/ConnectedGlassBlock.java @@ -17,9 +17,9 @@ public class ConnectedGlassBlock extends GlassBlock { @Override @OnlyIn(Dist.CLIENT) - public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) { + public boolean skipRendering(BlockState state, BlockState adjacentBlockState, Direction side) { return adjacentBlockState.getBlock() instanceof ConnectedGlassBlock ? true - : super.isSideInvisible(state, adjacentBlockState, side); + : super.skipRendering(state, adjacentBlockState, side); } @Override diff --git a/src/main/java/com/simibubi/create/content/palettes/ConnectedGlassPaneBlock.java b/src/main/java/com/simibubi/create/content/palettes/ConnectedGlassPaneBlock.java index b7d57bc0d..a09a2cb6e 100644 --- a/src/main/java/com/simibubi/create/content/palettes/ConnectedGlassPaneBlock.java +++ b/src/main/java/com/simibubi/create/content/palettes/ConnectedGlassPaneBlock.java @@ -13,11 +13,11 @@ public class ConnectedGlassPaneBlock extends GlassPaneBlock { @Override @OnlyIn(Dist.CLIENT) - public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) { + public boolean skipRendering(BlockState state, BlockState adjacentBlockState, Direction side) { if (side.getAxis() .isVertical()) return adjacentBlockState == state; - return super.isSideInvisible(state, adjacentBlockState, side); + return super.skipRendering(state, adjacentBlockState, side); } } diff --git a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java index 9c79046af..e21cc1e83 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java +++ b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java @@ -95,7 +95,7 @@ public abstract class PaletteBlockPartial { @Override protected StairsBlock createBlock(Supplier block) { return new StairsBlock(() -> block.get() - .getDefaultState(), Properties.from(block.get())); + .defaultBlockState(), Properties.copy(block.get())); } @Override @@ -135,7 +135,7 @@ public abstract class PaletteBlockPartial { @Override protected SlabBlock createBlock(Supplier block) { - return new SlabBlock(Properties.from(block.get())); + return new SlabBlock(Properties.copy(block.get())); } @Override @@ -186,7 +186,7 @@ public abstract class PaletteBlockPartial { protected BlockBuilder transformBlock( BlockBuilder builder, String variantName, PaletteBlockPattern pattern) { - builder.loot((lt, block) -> lt.registerLootTable(block, RegistrateBlockLootTables.droppingSlab(block))); + builder.loot((lt, block) -> lt.add(block, RegistrateBlockLootTables.droppingSlab(block))); return super.transformBlock(builder, variantName, pattern); } @@ -200,7 +200,7 @@ public abstract class PaletteBlockPartial { @Override protected WallBlock createBlock(Supplier block) { - return new WallBlock(Properties.from(block.get())); + return new WallBlock(Properties.copy(block.get())); } @Override diff --git a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPattern.java b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPattern.java index 16cdd6dfe..91819c83d 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPattern.java +++ b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPattern.java @@ -43,20 +43,20 @@ public class PaletteBlockPattern { .addRecipes(v -> (c, p) -> { DataIngredient ingredient = DataIngredient.items(c.get()); Block result = v.getBaseBlock().get(); - CookingRecipeBuilder.smeltingRecipe(ingredient, result, 0.1f, 200) - .addCriterion("has_" + p.safeName(ingredient), ingredient.getCritereon(p)) - .build(p, p.safeId(result)); + CookingRecipeBuilder.smelting(ingredient, result, 0.1f, 200) + .unlockedBy("has_" + p.safeName(ingredient), ingredient.getCritereon(p)) + .save(p, p.safeId(result)); }), POLISHED = create("polished", PREFIX, FOR_POLISHED) .addRecipes(v -> (c, p) -> { DataIngredient ingredient = DataIngredient.items(v.getBaseBlock().get()); - ShapedRecipeBuilder.shapedRecipe(c.get(), 4) - .key('#', ingredient) - .patternLine("##") - .patternLine("##") - .addCriterion("has_" + p.safeName(ingredient), ingredient.getCritereon(p)) - .build(p, p.safeId(c.get())); + ShapedRecipeBuilder.shaped(c.get(), 4) + .define('#', ingredient) + .pattern("##") + .pattern("##") + .unlockedBy("has_" + p.safeName(ingredient), ingredient.getCritereon(p)) + .save(p, p.safeId(c.get())); }), BRICKS = create("bricks", SUFFIX, ALL_PARTIALS), FANCY_BRICKS = create("fancy_bricks", WRAP, ALL_PARTIALS), @@ -77,12 +77,12 @@ public class PaletteBlockPattern { .textures("pillar", "pillar_end") .addRecipes(v -> (c, p) -> { DataIngredient ingredient = DataIngredient.items(v.getBaseBlock().get()); - ShapedRecipeBuilder.shapedRecipe(c.get(), 2) - .key('#', ingredient) - .patternLine("#") - .patternLine("#") - .addCriterion("has_" + p.safeName(ingredient), ingredient.getCritereon(p)) - .build(p, p.safeId(c.get())); + ShapedRecipeBuilder.shaped(c.get(), 2) + .define('#', ingredient) + .pattern("#") + .pattern("#") + .unlockedBy("has_" + p.safeName(ingredient), ingredient.getCritereon(p)) + .save(p, p.safeId(c.get())); }), MOSSY = create("mossy", PREFIX).blockStateFactory(p -> p::cubeAllButMossy) diff --git a/src/main/java/com/simibubi/create/content/palettes/PalettesItemGroup.java b/src/main/java/com/simibubi/create/content/palettes/PalettesItemGroup.java index a96173a7b..aa9d5746b 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PalettesItemGroup.java +++ b/src/main/java/com/simibubi/create/content/palettes/PalettesItemGroup.java @@ -23,7 +23,7 @@ public class PalettesItemGroup extends CreateItemGroupBase { public void addItems(NonNullList items, boolean specialItems) {} @Override - public ItemStack createIcon() { + public ItemStack makeIcon() { return new ItemStack(AllPaletteBlocks.ORNATE_IRON_WINDOW.get()); } diff --git a/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java b/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java index 9543a7b37..cecd78294 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java +++ b/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java @@ -37,7 +37,7 @@ public class PalettesVariantEntry { .apply(name)::accept); if (pattern.isTranslucent()) - builder.addLayer(() -> RenderType::getTranslucent); + builder.addLayer(() -> RenderType::translucent); if (pattern == PaletteBlockPattern.COBBLESTONE) builder.item().tag(AllTags.AllItemTags.COBBLESTONE.tag); if (pattern.hasFoliage()) diff --git a/src/main/java/com/simibubi/create/content/palettes/PavedBlock.java b/src/main/java/com/simibubi/create/content/palettes/PavedBlock.java index f1376cb8a..8c29e223b 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PavedBlock.java +++ b/src/main/java/com/simibubi/create/content/palettes/PavedBlock.java @@ -15,26 +15,26 @@ public class PavedBlock extends Block { public PavedBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(COVERED, false)); + registerDefaultState(defaultBlockState().setValue(COVERED, false)); } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(COVERED)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(COVERED)); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return getDefaultState().with(COVERED, context.getWorld() - .getBlockState(context.getPos().up()) + return defaultBlockState().setValue(COVERED, context.getLevel() + .getBlockState(context.getClickedPos().above()) .getBlock() == this); } @Override - public BlockState updatePostPlacement(BlockState stateIn, Direction face, BlockState neighbour, IWorld worldIn, + public BlockState updateShape(BlockState stateIn, Direction face, BlockState neighbour, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) { if (face == Direction.UP) - return stateIn.with(COVERED, worldIn.getBlockState(facingPos).getBlock() == this); + return stateIn.setValue(COVERED, worldIn.getBlockState(facingPos).getBlock() == this); return stateIn; } diff --git a/src/main/java/com/simibubi/create/content/palettes/StandardFoliageColorHandler.java b/src/main/java/com/simibubi/create/content/palettes/StandardFoliageColorHandler.java index 061ff32aa..d0aaea069 100644 --- a/src/main/java/com/simibubi/create/content/palettes/StandardFoliageColorHandler.java +++ b/src/main/java/com/simibubi/create/content/palettes/StandardFoliageColorHandler.java @@ -14,7 +14,7 @@ public class StandardFoliageColorHandler implements IBlockColor { @Override public int getColor(BlockState state, IBlockDisplayReader light, BlockPos pos, int layer) { - return pos != null && light != null ? BiomeColors.getGrassColor(light, pos) : GrassColors.get(0.5D, 1.0D); + return pos != null && light != null ? BiomeColors.getAverageGrassColor(light, pos) : GrassColors.get(0.5D, 1.0D); } } diff --git a/src/main/java/com/simibubi/create/content/palettes/WindowBlock.java b/src/main/java/com/simibubi/create/content/palettes/WindowBlock.java index 02e3db3f7..30764cedd 100644 --- a/src/main/java/com/simibubi/create/content/palettes/WindowBlock.java +++ b/src/main/java/com/simibubi/create/content/palettes/WindowBlock.java @@ -15,11 +15,11 @@ public class WindowBlock extends ConnectedGlassBlock { @Override @OnlyIn(Dist.CLIENT) - public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) { + public boolean skipRendering(BlockState state, BlockState adjacentBlockState, Direction side) { return adjacentBlockState.getBlock() instanceof ConnectedGlassBlock - ? (!RenderTypeLookup.canRenderInLayer(state, RenderType.getTranslucent()) && side.getAxis() + ? (!RenderTypeLookup.canRenderInLayer(state, RenderType.translucent()) && side.getAxis() .isHorizontal() || state.getBlock() == adjacentBlockState.getBlock()) - : super.isSideInvisible(state, adjacentBlockState, side); + : super.skipRendering(state, adjacentBlockState, side); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java index 0416a9acd..51e85900f 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java @@ -80,14 +80,14 @@ public class ClientSchematicLoader { } public static boolean validateSizeLimitation(long size) { - if (Minecraft.getInstance().isSingleplayer()) + if (Minecraft.getInstance().hasSingleplayerServer()) return true; Integer maxSize = AllConfigs.SERVER.schematics.maxTotalSchematicSize.get(); if (size > maxSize * 1000) { ClientPlayerEntity player = Minecraft.getInstance().player; if (player != null) { - player.sendMessage(Lang.translate("schematics.uploadTooLarge").append(" (" + size / 1000 + " KB)."), player.getUniqueID()); - player.sendMessage(Lang.translate("schematics.maxAllowedSize").append(" " + maxSize + " KB"), player.getUniqueID()); + player.sendMessage(Lang.translate("schematics.uploadTooLarge").append(" (" + size / 1000 + " KB)."), player.getUUID()); + player.sendMessage(Lang.translate("schematics.maxAllowedSize").append(" " + maxSize + " KB"), player.getUUID()); } return false; } @@ -104,7 +104,7 @@ public class ClientSchematicLoader { if (status != -1) { if (status < maxPacketSize) data = Arrays.copyOf(data, status); - if (Minecraft.getInstance().world != null) + if (Minecraft.getInstance().level != null) AllPackets.channel.sendToServer(SchematicUploadPacket.write(schematic, data)); else { activeUploads.remove(schematic); diff --git a/src/main/java/com/simibubi/create/content/schematics/ItemRequirement.java b/src/main/java/com/simibubi/create/content/schematics/ItemRequirement.java index e4fa3f827..aa52f4374 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ItemRequirement.java +++ b/src/main/java/com/simibubi/create/content/schematics/ItemRequirement.java @@ -92,17 +92,17 @@ public class ItemRequirement { if (block == Blocks.AIR) return NONE; - Item item = BlockItem.BLOCK_TO_ITEM.getOrDefault(state.getBlock(), Items.AIR); + Item item = BlockItem.BY_BLOCK.getOrDefault(state.getBlock(), Items.AIR); // double slab needs two items - if (state.contains(BlockStateProperties.SLAB_TYPE) && state.get(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE) + if (state.hasProperty(BlockStateProperties.SLAB_TYPE) && state.getValue(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE) return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(item, 2))); if (block instanceof TurtleEggBlock) - return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(item, state.get(TurtleEggBlock.EGGS).intValue()))); + return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(item, state.getValue(TurtleEggBlock.EGGS).intValue()))); if (block instanceof SeaPickleBlock) - return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(item, state.get(SeaPickleBlock.PICKLES).intValue()))); + return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(item, state.getValue(SeaPickleBlock.PICKLES).intValue()))); if (block instanceof SnowBlock) - return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(item, state.get(SnowBlock.LAYERS).intValue()))); + return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(item, state.getValue(SnowBlock.LAYERS).intValue()))); if (block instanceof GrassPathBlock) return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(new ItemStack(Items.GRASS_BLOCK))); if (block instanceof FarmlandBlock) @@ -120,7 +120,7 @@ public class ItemRequirement { if (type == EntityType.ITEM_FRAME) { ItemFrameEntity ife = (ItemFrameEntity) entity; ItemStack frame = new ItemStack(Items.ITEM_FRAME); - ItemStack displayedItem = ife.getDisplayedItem(); + ItemStack displayedItem = ife.getItem(); if (displayedItem.isEmpty()) return new ItemRequirement(ItemUseType.CONSUME, Items.ITEM_FRAME); return new ItemRequirement(ItemUseType.CONSUME, Arrays.asList(frame, displayedItem)); @@ -132,7 +132,7 @@ public class ItemRequirement { if (type == EntityType.ARMOR_STAND) { List requirements = new ArrayList<>(); ArmorStandEntity armorStandEntity = (ArmorStandEntity) entity; - armorStandEntity.getEquipmentAndArmor().forEach(requirements::add); + armorStandEntity.getAllSlots().forEach(requirements::add); requirements.add(new ItemStack(Items.ARMOR_STAND)); return new ItemRequirement(ItemUseType.CONSUME, requirements); } @@ -144,7 +144,7 @@ public class ItemRequirement { if (entity instanceof BoatEntity) { BoatEntity boatEntity = (BoatEntity) entity; - return new ItemRequirement(ItemUseType.CONSUME, boatEntity.getItemBoat().getItem()); + return new ItemRequirement(ItemUseType.CONSUME, boatEntity.getDropItem().getItem()); } if (type == EntityType.END_CRYSTAL) diff --git a/src/main/java/com/simibubi/create/content/schematics/MaterialChecklist.java b/src/main/java/com/simibubi/create/content/schematics/MaterialChecklist.java index 1619173b4..bcfd97955 100644 --- a/src/main/java/com/simibubi/create/content/schematics/MaterialChecklist.java +++ b/src/main/java/com/simibubi/create/content/schematics/MaterialChecklist.java @@ -83,15 +83,15 @@ public class MaterialChecklist { textComponent = new StringTextComponent("\n" + TextFormatting.RED); textComponent = textComponent.append(Lang.createTranslationTextComponent("materialChecklist.blocksNotLoaded")); - pages.add(StringNBT.of(ITextComponent.Serializer.toJson(textComponent))); + pages.add(StringNBT.valueOf(ITextComponent.Serializer.toJson(textComponent))); } List keys = new ArrayList<>(Sets.union(required.keySet(), damageRequired.keySet())); Collections.sort(keys, (item1, item2) -> { Locale locale = Locale.ENGLISH; - String name1 = new TranslationTextComponent(item1.getTranslationKey()).getString() + String name1 = new TranslationTextComponent(item1.getDescriptionId()).getString() .toLowerCase(locale); - String name2 = new TranslationTextComponent(item2.getTranslationKey()).getString() + String name2 = new TranslationTextComponent(item2.getDescriptionId()).getString() .toLowerCase(locale); return name1.compareTo(name2); }); @@ -110,8 +110,8 @@ public class MaterialChecklist { if (itemsWritten == MAX_ENTRIES_PER_PAGE) { itemsWritten = 0; - textComponent.append(new StringTextComponent("\n >>>").formatted(TextFormatting.BLUE)); - pages.add(StringNBT.of(ITextComponent.Serializer.toJson(textComponent))); + textComponent.append(new StringTextComponent("\n >>>").withStyle(TextFormatting.BLUE)); + pages.add(StringNBT.valueOf(ITextComponent.Serializer.toJson(textComponent))); textComponent = new StringTextComponent(""); } @@ -122,8 +122,8 @@ public class MaterialChecklist { for (Item item : completed) { if (itemsWritten == MAX_ENTRIES_PER_PAGE) { itemsWritten = 0; - textComponent.append(new StringTextComponent("\n >>>").formatted(TextFormatting.DARK_GREEN)); - pages.add(StringNBT.of(ITextComponent.Serializer.toJson(textComponent))); + textComponent.append(new StringTextComponent("\n >>>").withStyle(TextFormatting.DARK_GREEN)); + pages.add(StringNBT.valueOf(ITextComponent.Serializer.toJson(textComponent))); textComponent = new StringTextComponent(""); } @@ -131,7 +131,7 @@ public class MaterialChecklist { textComponent.append(entry(new ItemStack(item), getRequiredAmount(item), false)); } - pages.add(StringNBT.of(ITextComponent.Serializer.toJson(textComponent))); + pages.add(StringNBT.valueOf(ITextComponent.Serializer.toJson(textComponent))); tag.put("pages", pages); tag.putString("author", "Schematicannon"); @@ -139,7 +139,7 @@ public class MaterialChecklist { textComponent = Lang.createTranslationTextComponent("materialChecklist") .setStyle(Style.EMPTY.withColor(TextFormatting.BLUE) .withItalic(Boolean.FALSE)); - book.getOrCreateChildTag("display") + book.getOrCreateTagElement("display") .putString("Name", ITextComponent.Serializer.toJson(textComponent)); book.setTag(tag); @@ -156,13 +156,13 @@ public class MaterialChecklist { private ITextComponent entry(ItemStack item, int amount, boolean unfinished) { int stacks = amount / 64; int remainder = amount % 64; - IFormattableTextComponent tc = new TranslationTextComponent(item.getTranslationKey()); + IFormattableTextComponent tc = new TranslationTextComponent(item.getDescriptionId()); if (!unfinished) tc.append(" \u2714"); - tc.formatted(unfinished ? TextFormatting.BLUE : TextFormatting.DARK_GREEN); - return tc.append(new StringTextComponent("\n" + " x" + amount).formatted(TextFormatting.BLACK)) + tc.withStyle(unfinished ? TextFormatting.BLUE : TextFormatting.DARK_GREEN); + return tc.append(new StringTextComponent("\n" + " x" + amount).withStyle(TextFormatting.BLACK)) .append( - new StringTextComponent(" | " + stacks + "\u25A4 +" + remainder + "\n").formatted(TextFormatting.GRAY)); + new StringTextComponent(" | " + stacks + "\u25A4 +" + remainder + "\n").withStyle(TextFormatting.GRAY)); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java b/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java index 4006b976a..99dd33f7a 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java @@ -6,6 +6,7 @@ import java.util.stream.Collectors; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.structureMovement.BlockMovementChecks; +import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform; import com.simibubi.create.content.schematics.item.SchematicItem; import com.simibubi.create.foundation.utility.BlockHelper; @@ -22,7 +23,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MutableBoundingBox; -import net.minecraft.util.math.vector.Vector3i; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; @@ -80,13 +80,19 @@ public class SchematicPrinter { schematicAnchor = NBTUtil.readBlockPos(blueprint.getTag().getCompound("Anchor")); blockReader = new SchematicWorld(schematicAnchor, originalWorld); - activeTemplate.place(blockReader, schematicAnchor, settings, blockReader.getRandom()); + activeTemplate.placeInWorldChunk(blockReader, schematicAnchor, settings, blockReader.getRandom()); + + StructureTransform transform = new StructureTransform(settings.getRotationPivot(), Direction.Axis.Y, + settings.getRotation(), settings.getMirror()); + for (TileEntity te : blockReader.tileEntities.values()) { + transform.apply(te); + } printingEntityIndex = -1; printStage = PrintStage.BLOCKS; deferredBlocks.clear(); MutableBoundingBox bounds = blockReader.getBounds(); - currentPos = new BlockPos(bounds.minX - 1, bounds.minY, bounds.minZ); + currentPos = new BlockPos(bounds.x0 - 1, bounds.y0, bounds.z0); schematicLoaded = true; } @@ -107,7 +113,7 @@ public class SchematicPrinter { public BlockPos getCurrentTarget() { if (!isLoaded()) return null; - return schematicAnchor.add(currentPos); + return schematicAnchor.offset(currentPos); } public PrintStage getPrintStage() { @@ -119,7 +125,8 @@ public class SchematicPrinter { } public boolean isWorldEmpty() { - return blockReader.getBounds().getLength().equals(new Vector3i(0,0,0)); + return blockReader.getAllPositions().isEmpty(); + //return blockReader.getBounds().getLength().equals(new Vector3i(0,0,0)); } @FunctionalInterface @@ -141,7 +148,7 @@ public class SchematicPrinter { entityHandler.handle(target, entity); } else { BlockState blockState = BlockHelper.setZeroAge(blockReader.getBlockState(target)); - TileEntity tileEntity = blockReader.getTileEntity(target); + TileEntity tileEntity = blockReader.getBlockEntity(target); blockHandler.handle(target, blockState, tileEntity); } } @@ -166,28 +173,28 @@ public class SchematicPrinter { public boolean shouldPlaceBlock(World world, PlacementPredicate predicate, BlockPos pos) { BlockState state = BlockHelper.setZeroAge(blockReader.getBlockState(pos)); - TileEntity tileEntity = blockReader.getTileEntity(pos); + TileEntity tileEntity = blockReader.getBlockEntity(pos); BlockState toReplace = world.getBlockState(pos); BlockState toReplaceOther = null; - if (state.contains(BlockStateProperties.BED_PART) && state.contains(BlockStateProperties.HORIZONTAL_FACING) - && state.get(BlockStateProperties.BED_PART) == BedPart.FOOT) - toReplaceOther = world.getBlockState(pos.offset(state.get(BlockStateProperties.HORIZONTAL_FACING))); - if (state.contains(BlockStateProperties.DOUBLE_BLOCK_HALF) - && state.get(BlockStateProperties.DOUBLE_BLOCK_HALF) == DoubleBlockHalf.LOWER) - toReplaceOther = world.getBlockState(pos.up()); + if (state.hasProperty(BlockStateProperties.BED_PART) && state.hasProperty(BlockStateProperties.HORIZONTAL_FACING) + && state.getValue(BlockStateProperties.BED_PART) == BedPart.FOOT) + toReplaceOther = world.getBlockState(pos.relative(state.getValue(BlockStateProperties.HORIZONTAL_FACING))); + if (state.hasProperty(BlockStateProperties.DOUBLE_BLOCK_HALF) + && state.getValue(BlockStateProperties.DOUBLE_BLOCK_HALF) == DoubleBlockHalf.LOWER) + toReplaceOther = world.getBlockState(pos.above()); - if (!world.isBlockPresent(pos)) + if (!world.isLoaded(pos)) return false; - if (!world.getWorldBorder().contains(pos)) + if (!world.getWorldBorder().isWithinBounds(pos)) return false; if (toReplace == state) return false; - if (toReplace.getBlockHardness(world, pos) == -1 - || (toReplaceOther != null && toReplaceOther.getBlockHardness(world, pos) == -1)) + if (toReplace.getDestroySpeed(world, pos) == -1 + || (toReplaceOther != null && toReplaceOther.getDestroySpeed(world, pos) == -1)) return false; - boolean isNormalCube = state.isNormalCube(blockReader, currentPos); + boolean isNormalCube = state.isRedstoneConductor(blockReader, currentPos); return predicate.shouldPlace(pos, state, tileEntity, toReplace, toReplaceOther, isNormalCube); } @@ -199,18 +206,18 @@ public class SchematicPrinter { BlockPos target = getCurrentTarget(); BlockState blockState = BlockHelper.setZeroAge(blockReader.getBlockState(target)); - TileEntity tileEntity = blockReader.getTileEntity(target); + TileEntity tileEntity = blockReader.getBlockEntity(target); return ItemRequirement.of(blockState, tileEntity); } public int markAllBlockRequirements(MaterialChecklist checklist, World world, PlacementPredicate predicate) { int blocksToPlace = 0; for (BlockPos pos : blockReader.getAllPositions()) { - BlockPos relPos = pos.add(schematicAnchor); + BlockPos relPos = pos.offset(schematicAnchor); BlockState required = blockReader.getBlockState(relPos); - TileEntity requiredTE = blockReader.getTileEntity(relPos); + TileEntity requiredTE = blockReader.getBlockEntity(relPos); - if (!world.isAreaLoaded(pos.add(schematicAnchor), 0)) { + if (!world.isAreaLoaded(pos.offset(schematicAnchor), 0)) { checklist.warnBlockNotLoaded(); continue; } @@ -260,30 +267,30 @@ public class SchematicPrinter { if (printStage == PrintStage.ENTITIES) { if (printingEntityIndex + 1 < entities.size()) { printingEntityIndex++; - currentPos = entities.get(printingEntityIndex).getBlockPos().subtract(schematicAnchor); + currentPos = entities.get(printingEntityIndex).blockPosition().subtract(schematicAnchor); } else { // Reached end of printing return false; } } - } while (!blockReader.getBounds().isVecInside(currentPos)); + } while (!blockReader.getBounds().isInside(currentPos)); // More things available to print return true; } public boolean tryAdvanceCurrentPos() { - currentPos = currentPos.offset(Direction.EAST); + currentPos = currentPos.relative(Direction.EAST); MutableBoundingBox bounds = blockReader.getBounds(); - BlockPos posInBounds = currentPos.add(-bounds.minX, -bounds.minY, -bounds.minZ); + BlockPos posInBounds = currentPos.offset(-bounds.x0, -bounds.y0, -bounds.z0); - if (posInBounds.getX() > bounds.getXSize()) - currentPos = new BlockPos(bounds.minX, currentPos.getY(), currentPos.getZ() + 1).west(); - if (posInBounds.getZ() > bounds.getZSize()) - currentPos = new BlockPos(currentPos.getX(), currentPos.getY() + 1, bounds.minZ).west(); + if (posInBounds.getX() > bounds.getXSpan()) + currentPos = new BlockPos(bounds.x0, currentPos.getY(), currentPos.getZ() + 1).west(); + if (posInBounds.getZ() > bounds.getZSpan()) + currentPos = new BlockPos(currentPos.getX(), currentPos.getY() + 1, bounds.z0).west(); // End of blocks reached - if (currentPos.getY() > bounds.getYSize()) { + if (currentPos.getY() > bounds.getYSpan()) { printStage = PrintStage.DEFERRED_BLOCKS; return false; } @@ -292,7 +299,8 @@ public class SchematicPrinter { } public static boolean shouldDeferBlock(BlockState state) { - return state.getBlock().is(AllBlocks.GANTRY_CARRIAGE.get()) || BlockMovementChecks.isBrittle(state); + return AllBlocks.GANTRY_CARRIAGE.has(state) || AllBlocks.MECHANICAL_ARM.has(state) + || BlockMovementChecks.isBrittle(state); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java b/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java index 110444475..7539d6108 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java @@ -51,10 +51,10 @@ public class SchematicProcessor extends StructureProcessor { @Override public Template.EntityInfo processEntity(IWorldReader world, BlockPos pos, Template.EntityInfo rawInfo, Template.EntityInfo info, PlacementSettings settings, Template template) { - return EntityType.readEntityType(info.nbt).flatMap(type -> { + return EntityType.by(info.nbt).flatMap(type -> { if (world instanceof World) { Entity e = type.create((World) world); - if (e != null && !e.ignoreItemEntityData()) { + if (e != null && !e.onlyOpCanSetNbt()) { return Optional.of(info); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java index 58df85ed1..c06e3e938 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java @@ -67,13 +67,13 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld { } @Override - public boolean addEntity(Entity entityIn) { + public boolean addFreshEntity(Entity entityIn) { if (entityIn instanceof ItemFrameEntity) - ((ItemFrameEntity) entityIn).getDisplayedItem() + ((ItemFrameEntity) entityIn).getItem() .setTag(null); if (entityIn instanceof ArmorStandEntity) { ArmorStandEntity armorStandEntity = (ArmorStandEntity) entityIn; - armorStandEntity.getEquipmentAndArmor() + armorStandEntity.getAllSlots() .forEach(stack -> stack.setTag(null)); } @@ -85,7 +85,7 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld { } @Override - public TileEntity getTileEntity(BlockPos pos) { + public TileEntity getBlockEntity(BlockPos pos) { if (isOutsideBuildHeight(pos)) return null; if (tileEntities.containsKey(pos)) @@ -111,18 +111,18 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld { } protected void onTEadded(TileEntity tileEntity, BlockPos pos) { - tileEntity.setLocation(this, pos); + tileEntity.setLevelAndPosition(this, pos); } @Override public BlockState getBlockState(BlockPos globalPos) { BlockPos pos = globalPos.subtract(anchor); - if (pos.getY() - bounds.minY == -1 && !renderMode) - return Blocks.GRASS_BLOCK.getDefaultState(); - if (getBounds().isVecInside(pos) && blocks.containsKey(pos)) + if (pos.getY() - bounds.y0 == -1 && !renderMode) + return Blocks.GRASS_BLOCK.defaultBlockState(); + if (getBounds().isInside(pos) && blocks.containsKey(pos)) return processBlockStateForPrinting(blocks.get(pos)); - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); } public Map getBlockMap() { @@ -140,62 +140,62 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld { } @Override - public int getLightLevel(LightType p_226658_1_, BlockPos p_226658_2_) { + public int getBrightness(LightType p_226658_1_, BlockPos p_226658_2_) { return 10; } @Override - public List getEntitiesInAABBexcluding(Entity arg0, AxisAlignedBB arg1, Predicate arg2) { + public List getEntities(Entity arg0, AxisAlignedBB arg1, Predicate arg2) { return Collections.emptyList(); } @Override - public List getEntitiesWithinAABB(Class arg0, AxisAlignedBB arg1, + public List getEntitiesOfClass(Class arg0, AxisAlignedBB arg1, Predicate arg2) { return Collections.emptyList(); } @Override - public List getPlayers() { + public List players() { return Collections.emptyList(); } @Override - public int getSkylightSubtracted() { + public int getSkyDarken() { return 0; } @Override - public boolean hasBlockState(BlockPos pos, Predicate predicate) { + public boolean isStateAtPosition(BlockPos pos, Predicate predicate) { return predicate.test(getBlockState(pos)); } @Override public boolean destroyBlock(BlockPos arg0, boolean arg1) { - return setBlockState(arg0, Blocks.AIR.getDefaultState(), 3); + return setBlock(arg0, Blocks.AIR.defaultBlockState(), 3); } @Override public boolean removeBlock(BlockPos arg0, boolean arg1) { - return setBlockState(arg0, Blocks.AIR.getDefaultState(), 3); + return setBlock(arg0, Blocks.AIR.defaultBlockState(), 3); } @Override - public boolean setBlockState(BlockPos pos, BlockState arg1, int arg2) { - pos = pos.toImmutable() + public boolean setBlock(BlockPos pos, BlockState arg1, int arg2) { + pos = pos.immutable() .subtract(anchor); - bounds.expandTo(new MutableBoundingBox(pos, pos)); + bounds.expand(new MutableBoundingBox(pos, pos)); blocks.put(pos, arg1); if (tileEntities.containsKey(pos)) { TileEntity tileEntity = tileEntities.get(pos); if (!tileEntity.getType() - .isValidBlock(arg1.getBlock())) { + .isValid(arg1.getBlock())) { tileEntities.remove(pos); renderedTileEntities.remove(tileEntity); } } - TileEntity tileEntity = getTileEntity(pos); + TileEntity tileEntity = getBlockEntity(pos); if (tileEntity != null) tileEntities.put(pos, tileEntity); @@ -203,16 +203,16 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld { } @Override - public void notifyBlockUpdate(BlockPos pos, BlockState oldState, BlockState newState, int flags) { } + public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { } @Override - public ITickList getPendingBlockTicks() { - return EmptyTickList.get(); + public ITickList getBlockTicks() { + return EmptyTickList.empty(); } @Override - public ITickList getPendingFluidTicks() { - return EmptyTickList.get(); + public ITickList getLiquidTicks() { + return EmptyTickList.empty(); } public MutableBoundingBox getBounds() { @@ -224,13 +224,13 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld { } protected BlockState processBlockStateForPrinting(BlockState state) { - if (state.getBlock() instanceof AbstractFurnaceBlock && state.contains(BlockStateProperties.LIT)) - state = state.with(BlockStateProperties.LIT, false); + if (state.getBlock() instanceof AbstractFurnaceBlock && state.hasProperty(BlockStateProperties.LIT)) + state = state.setValue(BlockStateProperties.LIT, false); return state; } @Override - public ServerWorld getWorld() { + public ServerWorld getLevel() { if (this.world instanceof ServerWorld) { return (ServerWorld) this.world; } diff --git a/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java index 151fdaf08..9c1b40ea1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java @@ -116,7 +116,7 @@ public class ServerSchematicLoader { try { // Validate Referenced Block - SchematicTableTileEntity table = getTable(player.getEntityWorld(), pos); + SchematicTableTileEntity table = getTable(player.getCommandSenderWorld(), pos); if (table == null) return; @@ -142,7 +142,7 @@ public class ServerSchematicLoader { // Open Stream OutputStream writer = Files.newOutputStream(uploadPath); - activeUploads.put(playerSchematicId, new SchematicUploadEntry(writer, size, player.getServerWorld(), pos)); + activeUploads.put(playerSchematicId, new SchematicUploadEntry(writer, size, player.getLevel(), pos)); // Notify Tile Entity table.startUpload(schematic); @@ -157,9 +157,9 @@ public class ServerSchematicLoader { Integer maxFileSize = getConfig().maxTotalSchematicSize.get(); if (size > maxFileSize * 1000) { player.sendMessage(new TranslationTextComponent("create.schematics.uploadTooLarge") - .append(new StringTextComponent(" (" + size / 1000 + " KB).")), player.getUniqueID()); + .append(new StringTextComponent(" (" + size / 1000 + " KB).")), player.getUUID()); player.sendMessage(new TranslationTextComponent("create.schematics.maxAllowedSize") - .append(new StringTextComponent(" " + maxFileSize + " KB")), player.getUniqueID()); + .append(new StringTextComponent(" " + maxFileSize + " KB")), player.getUUID()); return false; } return true; @@ -232,7 +232,7 @@ public class ServerSchematicLoader { } public SchematicTableTileEntity getTable(World world, BlockPos pos) { - TileEntity te = world.getTileEntity(pos); + TileEntity te = world.getBlockEntity(pos); if (!(te instanceof SchematicTableTileEntity)) return null; SchematicTableTileEntity table = (SchematicTableTileEntity) te; @@ -291,7 +291,7 @@ public class ServerSchematicLoader { } // Not holding S&Q - if (!AllItems.SCHEMATIC_AND_QUILL.isIn(player.getHeldItemMainhand())) + if (!AllItems.SCHEMATIC_AND_QUILL.isIn(player.getMainHandItem())) return; try { @@ -315,12 +315,12 @@ public class ServerSchematicLoader { } Template t = new Template(); - t.takeBlocksFromWorld(world, pos, bounds, true, Blocks.AIR); + t.fillFromWorld(world, pos, bounds, true, Blocks.AIR); try (OutputStream outputStream = Files.newOutputStream(path)) { - CompoundNBT nbttagcompound = t.writeToNBT(new CompoundNBT()); + CompoundNBT nbttagcompound = t.save(new CompoundNBT()); CompressedStreamTools.writeCompressed(nbttagcompound, outputStream); - player.setHeldItem(Hand.MAIN_HAND, SchematicItem.create(schematic, player.getGameProfile().getName())); + player.setItemInHand(Hand.MAIN_HAND, SchematicItem.create(schematic, player.getGameProfile().getName())); } catch (IOException e) { e.printStackTrace(); diff --git a/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java b/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java index 1e123ebfb..d542734bd 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/LaunchedItem.java @@ -33,7 +33,7 @@ public abstract class LaunchedItem { } private static int ticksForDistance(BlockPos start, BlockPos target) { - return (int) (Math.max(10, MathHelper.sqrt(MathHelper.sqrt(target.distanceSq(start))) * 4f)); + return (int) (Math.max(10, MathHelper.sqrt(MathHelper.sqrt(target.distSqr(start))) * 4f)); } LaunchedItem() {} @@ -50,7 +50,7 @@ public abstract class LaunchedItem { ticksRemaining--; return false; } - if (world.isRemote) + if (world.isClientSide) return false; place(world); @@ -79,7 +79,7 @@ public abstract class LaunchedItem { target = NBTUtil.readBlockPos(c.getCompound("Target")); ticksRemaining = c.getInt("TicksLeft"); totalTicks = c.getInt("TotalTicks"); - stack = ItemStack.read(c.getCompound("Stack")); + stack = ItemStack.of(c.getCompound("Stack")); } public static class ForBlockState extends LaunchedItem { @@ -150,13 +150,13 @@ public abstract class LaunchedItem { @Override void place(World world) { // todo place belt - boolean isStart = state.get(BeltBlock.PART) == BeltPart.START; + boolean isStart = state.getValue(BeltBlock.PART) == BeltPart.START; BlockPos offset = BeltBlock.nextSegmentPosition(state, BlockPos.ZERO, isStart); int i = length - 1; - Axis axis = state.get(BeltBlock.HORIZONTAL_FACING).rotateY().getAxis(); - world.setBlockState(target, AllBlocks.SHAFT.getDefaultState().with(AbstractShaftBlock.AXIS, axis)); + Axis axis = state.getValue(BeltBlock.HORIZONTAL_FACING).getClockWise().getAxis(); + world.setBlockAndUpdate(target, AllBlocks.SHAFT.getDefaultState().setValue(AbstractShaftBlock.AXIS, axis)); BeltConnectorItem - .createBelts(world, target, target.add(offset.getX() * i, offset.getY() * i, offset.getZ() * i)); + .createBelts(world, target, target.offset(offset.getX() * i, offset.getY() * i, offset.getZ() * i)); } } @@ -176,7 +176,7 @@ public abstract class LaunchedItem { public boolean update(World world) { if (deferredTag != null && entity == null) { try { - Optional loadEntityUnchecked = EntityType.loadEntityUnchecked(deferredTag, world); + Optional loadEntityUnchecked = EntityType.create(deferredTag, world); if (!loadEntityUnchecked.isPresent()) return true; entity = loadEntityUnchecked.get(); @@ -205,7 +205,7 @@ public abstract class LaunchedItem { @Override void place(World world) { - world.addEntity(entity); + world.addFreshEntity(entity); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableBlock.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableBlock.java index 1640a46b0..9ec819e8a 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableBlock.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableBlock.java @@ -32,19 +32,19 @@ public class SchematicTableBlock extends HorizontalBlock implements ITE builder) { - builder.add(HORIZONTAL_FACING); - super.fillStateContainer(builder); + protected void createBlockStateDefinition(Builder builder) { + builder.add(FACING); + super.createBlockStateDefinition(builder); } @Override - public PushReaction getPushReaction(BlockState state) { + public PushReaction getPistonPushReaction(BlockState state) { return PushReaction.BLOCK; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return this.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite()); + return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); } @Override @@ -55,7 +55,7 @@ public class SchematicTableBlock extends HorizontalBlock implements ITE ItemHelper.dropContents(worldIn, pos, te.inventory)); - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } @Override @@ -94,7 +94,7 @@ public class SchematicTableBlock extends HorizontalBlock implements ITE type, int id, PlayerInventory inv, PacketBuffer extraData) { super(type, id); player = inv.player; - ClientWorld world = Minecraft.getInstance().world; - TileEntity tileEntity = world.getTileEntity(extraData.readBlockPos()); + ClientWorld world = Minecraft.getInstance().level; + TileEntity tileEntity = world.getBlockEntity(extraData.readBlockPos()); if (tileEntity instanceof SchematicTableTileEntity) { this.te = (SchematicTableTileEntity) tileEntity; - this.te.handleUpdateTag(te.getBlockState(), extraData.readCompoundTag()); + this.te.handleUpdateTag(te.getBlockState(), extraData.readNbt()); init(); } } @@ -48,7 +48,7 @@ public class SchematicTableContainer extends Container { protected void init() { inputSlot = new SlotItemHandler(te.inventory, 0, 21, 57) { @Override - public boolean isItemValid(ItemStack stack) { + public boolean mayPlace(ItemStack stack) { return AllItems.EMPTY_SCHEMATIC.isIn(stack) || AllItems.SCHEMATIC_AND_QUILL.isIn(stack) || AllItems.SCHEMATIC.isIn(stack); } @@ -56,7 +56,7 @@ public class SchematicTableContainer extends Container { outputSlot = new SlotItemHandler(te.inventory, 1, 166, 57) { @Override - public boolean isItemValid(ItemStack stack) { + public boolean mayPlace(ItemStack stack) { return false; } }; @@ -75,29 +75,29 @@ public class SchematicTableContainer extends Container { this.addSlot(new Slot(player.inventory, hotbarSlot, 38 + hotbarSlot * 18, 163)); } - detectAndSendChanges(); + broadcastChanges(); } public boolean canWrite() { - return inputSlot.getHasStack() && !outputSlot.getHasStack(); + return inputSlot.hasItem() && !outputSlot.hasItem(); } @Override - public boolean canInteractWith(PlayerEntity player) { + public boolean stillValid(PlayerEntity player) { return te != null && te.canPlayerUse(player); } @Override - public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { + public ItemStack quickMoveStack(PlayerEntity playerIn, int index) { Slot clickedSlot = getSlot(index); - if (!clickedSlot.getHasStack()) + if (!clickedSlot.hasItem()) return ItemStack.EMPTY; - ItemStack stack = clickedSlot.getStack(); + ItemStack stack = clickedSlot.getItem(); if (index < 2) - mergeItemStack(stack, 2, inventorySlots.size(), false); + moveItemStackTo(stack, 2, slots.size(), false); else - mergeItemStack(stack, 0, 1, false); + moveItemStackTo(stack, 0, 1, false); return ItemStack.EMPTY; } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java index 658c99f78..deac70f34 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java @@ -70,15 +70,15 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen availableSchematics = CreateClient.SCHEMATIC_SENDER.getAvailableSchematics(); - int x = guiLeft; - int y = guiTop; + int x = leftPos; + int y = topPos; schematicsLabel = new Label(x + 49, y + 26, StringTextComponent.EMPTY).withShadow(); schematicsLabel.text = StringTextComponent.EMPTY; if (!availableSchematics.isEmpty()) { schematicsArea = new SelectionScrollInput(x + 45, y + 21, 139, 18).forOptions(availableSchematics) - .titled(availableSchematicsTitle.copy()) + .titled(availableSchematicsTitle.plainCopy()) .writingTo(schematicsLabel); widgets.add(schematicsArea); widgets.add(schematicsLabel); @@ -97,33 +97,33 @@ public class SchematicTableScreen extends AbstractSimiContainerScreenat(x + background.width, y + background.height - 40, -200) @@ -135,29 +135,29 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen availableSchematics = schematicSender.getAvailableSchematics(); ITextComponent schematic = availableSchematics.get(schematicsArea.getState()); - schematicSender.startNewUpload(schematic.getUnformattedComponentText()); + schematicSender.startNewUpload(schematic.getContents()); } if (folderButton.isHovered()) { - Util.getOSType() + Util.getPlatform() .openFile(Paths.get("schematics/") .toFile()); } @@ -202,9 +202,9 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer)); @@ -58,12 +58,12 @@ public class SchematicannonBlock extends Block implements ITE ItemHelper.dropContents(worldIn, pos, te.inventory)); - worldIn.removeTileEntity(pos); + worldIn.removeBlockEntity(pos); } @Override diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonContainer.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonContainer.java index f3dee8ab1..d58a88a24 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonContainer.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonContainer.java @@ -22,11 +22,11 @@ public class SchematicannonContainer extends Container { public SchematicannonContainer(ContainerType type, int id, PlayerInventory inv, PacketBuffer buffer) { super(type, id); player = inv.player; - ClientWorld world = Minecraft.getInstance().world; - TileEntity tileEntity = world.getTileEntity(buffer.readBlockPos()); + ClientWorld world = Minecraft.getInstance().level; + TileEntity tileEntity = world.getBlockEntity(buffer.readBlockPos()); if (tileEntity instanceof SchematicannonTileEntity) { this.te = (SchematicannonTileEntity) tileEntity; - this.te.handleUpdateTag(te.getBlockState(), buffer.readCompoundTag()); + this.te.handleUpdateTag(te.getBlockState(), buffer.readNbt()); init(); } } @@ -62,17 +62,17 @@ public class SchematicannonContainer extends Container { for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) addSlot(new Slot(player.inventory, hotbarSlot, invX + hotbarSlot * 18, invY + 58)); - detectAndSendChanges(); + broadcastChanges(); } @Override - public boolean canInteractWith(PlayerEntity player) { + public boolean stillValid(PlayerEntity player) { return te != null && te.canPlayerUse(player); } @Override - public void onContainerClosed(PlayerEntity playerIn) { - super.onContainerClosed(playerIn); + public void removed(PlayerEntity playerIn) { + super.removed(playerIn); } public SchematicannonTileEntity getTileEntity() { @@ -80,17 +80,17 @@ public class SchematicannonContainer extends Container { } @Override - public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { + public ItemStack quickMoveStack(PlayerEntity playerIn, int index) { Slot clickedSlot = getSlot(index); - if (!clickedSlot.getHasStack()) + if (!clickedSlot.hasItem()) return ItemStack.EMPTY; - ItemStack stack = clickedSlot.getStack(); + ItemStack stack = clickedSlot.getItem(); if (index < 5) { - mergeItemStack(stack, 5, inventorySlots.size(), false); + moveItemStackTo(stack, 5, slots.size(), false); } else { - if (mergeItemStack(stack, 0, 1, false) || mergeItemStack(stack, 2, 3, false) - || mergeItemStack(stack, 4, 5, false)) + if (moveItemStackTo(stack, 0, 1, false) || moveItemStackTo(stack, 2, 3, false) + || moveItemStackTo(stack, 4, 5, false)) ; } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java index 98db7d37b..3d64468c1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java @@ -1,14 +1,14 @@ package com.simibubi.create.content.schematics.block; import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.InstanceMaterial; -import com.jozufozu.flywheel.backend.instancing.MaterialManager; +import com.jozufozu.flywheel.backend.material.InstanceMaterial; +import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; import com.jozufozu.flywheel.core.materials.ModelData; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.util.Direction; @@ -40,16 +40,16 @@ public class SchematicannonInstance extends TileEntityInstance(4); @@ -168,7 +168,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen tip = button.getToolTip(); - tip.add((enabled ? optionEnabled : optionDisabled).copy().formatted(BLUE)); + tip.add((enabled ? optionEnabled : optionDisabled).plainCopy().withStyle(BLUE)); tip.addAll(TooltipHelper.cutTextComponent(Lang.translate("gui.schematicannon.option." + tooltipKey + ".description"), GRAY, GRAY)); } @@ -248,16 +248,16 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen= fuelX && mouseY >= fuelY && mouseX <= fuelX + AllGuiTextures.SCHEMATICANNON_FUEL.width && mouseY <= fuelY + AllGuiTextures.SCHEMATICANNON_FUEL.height) { List tooltip = getFuelLevelTooltip(te); - renderTooltip(matrixStack, tooltip, mouseX, mouseY); + renderComponentTooltip(matrixStack, tooltip, mouseX, mouseY); } - if (hoveredSlot != null && !hoveredSlot.getHasStack()) { - if (hoveredSlot.slotNumber == 0) - renderTooltip(matrixStack, + if (hoveredSlot != null && !hoveredSlot.hasItem()) { + if (hoveredSlot.index == 0) + renderComponentTooltip(matrixStack, TooltipHelper.cutTextComponent(Lang.translate(_slotSchematic), GRAY, TextFormatting.BLUE), mouseX, mouseY); - if (hoveredSlot.slotNumber == 2) - renderTooltip(matrixStack, + if (hoveredSlot.index == 2) + renderComponentTooltip(matrixStack, TooltipHelper.cutTextComponent(Lang.translate(_slotListPrinter), GRAY, TextFormatting.BLUE), mouseX, mouseY); - if (hoveredSlot.slotNumber == 4) - renderTooltip(matrixStack, + if (hoveredSlot.index == 4) + renderComponentTooltip(matrixStack, TooltipHelper.cutTextComponent(Lang.translate(_slotGunpowder), GRAY, TextFormatting.BLUE), mouseX, mouseY); } @@ -371,15 +371,15 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen tileEntityTypeIn) { @@ -141,13 +141,13 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC attachedInventories.clear(); for (Direction facing : Iterate.directions) { - if (!world.isBlockPresent(pos.offset(facing))) + if (!level.isLoaded(worldPosition.relative(facing))) continue; - if (AllBlocks.CREATIVE_CRATE.has(world.getBlockState(pos.offset(facing)))) + if (AllBlocks.CREATIVE_CRATE.has(level.getBlockState(worldPosition.relative(facing)))) hasCreativeCrate = true; - TileEntity tileEntity = world.getTileEntity(pos.offset(facing)); + TileEntity tileEntity = level.getBlockEntity(worldPosition.relative(facing)); if (tileEntity != null) { LazyOptional capability = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing.getOpposite()); @@ -175,7 +175,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC missingItem = null; if (compound.contains("MissingItem")) - missingItem = ItemStack.read(compound.getCompound("MissingItem")); + missingItem = ItemStack.of(compound.getCompound("MissingItem")); // Settings CompoundNBT options = compound.getCompound("Options"); @@ -205,7 +205,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC BlockPos readBlockPos = launched.target; // Always write to Server tile - if (world == null || !world.isRemote) { + if (level == null || !level.isClientSide) { flyingBlocks.add(launched); continue; } @@ -281,7 +281,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC previousTarget = printer.getCurrentTarget(); tickFlyingBlocks(); - if (world.isRemote) + if (level.isClientSide) return; // Update Fuel and Paper @@ -302,7 +302,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC // Update Client Tile if (sendUpdate) { sendUpdate = false; - world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 6); + level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 6); } } @@ -369,7 +369,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC } // Check block - if (!getWorld().isAreaLoaded(printer.getCurrentTarget(), 0)) { + if (!getLevel().isAreaLoaded(printer.getCurrentTarget(), 0)) { positionNotLoaded = true; statusMsg = "targetNotLoaded"; state = State.PAUSED; @@ -383,7 +383,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC // Get item requirement ItemRequirement requirement = printer.getCurrentRequirement(); - if (requirement.isInvalid() || !printer.shouldPlaceCurrent(world, this::shouldPlace)) { + if (requirement.isInvalid() || !printer.shouldPlaceCurrent(level, this::shouldPlace)) { statusMsg = "searching"; blockSkipped = true; return; @@ -455,7 +455,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC } // Load blocks into reader - printer.loadSchematic(blueprint, world, true); + printer.loadSchematic(blueprint, level, true); if (printer.isWorldEmpty()) { state = State.STOPPED; @@ -466,7 +466,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC return; } - if (!printer.getAnchor().withinDistance(getPos(), MAX_ANCHOR_DISTANCE)) { + if (!printer.getAnchor().closerThan(getBlockPos(), MAX_ANCHOR_DISTANCE)) { state = State.STOPPED; statusMsg = "targetOutsideRange"; printer.resetSchematic(); @@ -481,7 +481,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC } protected ItemStack getItemForBlock(BlockState blockState) { - Item item = BlockItem.BLOCK_TO_ITEM.getOrDefault(blockState.getBlock(), Items.AIR); + Item item = BlockItem.BY_BLOCK.getOrDefault(blockState.getBlock(), Items.AIR); return item == Items.AIR ? ItemStack.EMPTY : new ItemStack(item); } @@ -499,13 +499,13 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC ItemStack extractItem = iItemHandler.extractItem(slot, 1, true); if (!ItemRequirement.validate(required, extractItem)) continue; - if (!extractItem.isDamageable()) + if (!extractItem.isDamageableItem()) continue; if (!simulate) { ItemStack stack = iItemHandler.extractItem(slot, 1, false); - stack.setDamage(stack.getDamage() + 1); - if (stack.getDamage() <= stack.getMaxDamage()) { + stack.setDamageValue(stack.getDamageValue() + 1); + if (stack.getDamageValue() <= stack.getMaxDamage()) { if (iItemHandler.getStackInSlot(slot) .isEmpty()) iItemHandler.insertItem(slot, stack, false); @@ -562,7 +562,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC state = State.STOPPED; statusMsg = "finished"; resetPrinter(); - AllSoundEvents.SCHEMATICANNON_FINISH.playOnServer(world, pos); + AllSoundEvents.SCHEMATICANNON_FINISH.playOnServer(level, worldPosition); sendUpdate = true; } @@ -577,7 +577,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC protected boolean shouldPlace(BlockPos pos, BlockState state, TileEntity te, BlockState toReplace, BlockState toReplaceOther, boolean isNormalCube) { - if (pos.withinDistance(getPos(), 2f)) + if (pos.closerThan(getBlockPos(), 2f)) return false; if (!replaceTileEntities && (toReplace.hasTileEntity() || (toReplaceOther != null && toReplaceOther.hasTileEntity()))) @@ -586,19 +586,19 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC if (shouldIgnoreBlockState(state, te)) return false; - boolean placingAir = state.getBlock().isAir(state, world, pos); + boolean placingAir = state.getBlock().isAir(state, level, pos); if (replaceMode == 3) return true; if (replaceMode == 2 && !placingAir) return true; if (replaceMode == 1 - && (isNormalCube || (!toReplace.isNormalCube(world, pos) - && (toReplaceOther == null || !toReplaceOther.isNormalCube(world, pos)))) + && (isNormalCube || (!toReplace.isRedstoneConductor(level, pos) + && (toReplaceOther == null || !toReplaceOther.isRedstoneConductor(level, pos)))) && !placingAir) return true; - if (replaceMode == 0 && !toReplace.isNormalCube(world, pos) - && (toReplaceOther == null || !toReplaceOther.isNormalCube(world, pos)) && !placingAir) + if (replaceMode == 0 && !toReplace.isRedstoneConductor(level, pos) + && (toReplaceOther == null || !toReplaceOther.isRedstoneConductor(level, pos)) && !placingAir) return true; return false; @@ -616,10 +616,10 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC return false; // Block doesnt need to be placed twice (Doors, beds, double plants) - if (state.contains(BlockStateProperties.DOUBLE_BLOCK_HALF) - && state.get(BlockStateProperties.DOUBLE_BLOCK_HALF) == DoubleBlockHalf.UPPER) + if (state.hasProperty(BlockStateProperties.DOUBLE_BLOCK_HALF) + && state.getValue(BlockStateProperties.DOUBLE_BLOCK_HALF) == DoubleBlockHalf.UPPER) return true; - if (state.contains(BlockStateProperties.BED_PART) && state.get(BlockStateProperties.BED_PART) == BedPart.HEAD) + if (state.hasProperty(BlockStateProperties.BED_PART) && state.getValue(BlockStateProperties.BED_PART) == BedPart.HEAD) return true; if (state.getBlock() instanceof PistonHeadBlock) return true; @@ -630,7 +630,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC protected void tickFlyingBlocks() { List toRemove = new LinkedList<>(); for (LaunchedItem b : flyingBlocks) - if (b.update(world)) + if (b.update(level)) toRemove.add(b); flyingBlocks.removeAll(toRemove); } @@ -699,11 +699,11 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC public static BlockState stripBeltIfNotLast(BlockState blockState) { // is highest belt? boolean isLastSegment = false; - Direction facing = blockState.get(BeltBlock.HORIZONTAL_FACING); - BeltSlope slope = blockState.get(BeltBlock.SLOPE); + Direction facing = blockState.getValue(BeltBlock.HORIZONTAL_FACING); + BeltSlope slope = blockState.getValue(BeltBlock.SLOPE); boolean positive = facing.getAxisDirection() == AxisDirection.POSITIVE; - boolean start = blockState.get(BeltBlock.PART) == BeltPart.START; - boolean end = blockState.get(BeltBlock.PART) == BeltPart.END; + boolean start = blockState.getValue(BeltBlock.PART) == BeltPart.START; + boolean end = blockState.getValue(BeltBlock.PART) == BeltPart.END; switch (slope) { case DOWNWARD: @@ -718,9 +718,9 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC isLastSegment = positive && end || !positive && start; } if (!isLastSegment) - blockState = (blockState.get(BeltBlock.PART) == BeltPart.MIDDLE) ? Blocks.AIR.getDefaultState() + blockState = (blockState.getValue(BeltBlock.PART) == BeltPart.MIDDLE) ? Blocks.AIR.defaultBlockState() : AllBlocks.SHAFT.getDefaultState() - .with(AbstractShaftBlock.AXIS, facing.rotateY() + .setValue(AbstractShaftBlock.AXIS, facing.getClockWise() .getAxis()); return blockState; } @@ -736,7 +736,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC CompoundNBT data = null; if (tile != null) { if (AllBlockTags.SAFE_NBT.matches(blockState)) { - data = tile.write(new CompoundNBT()); + data = tile.save(new CompoundNBT()); data = NBTProcessors.process(tile, data, true); } else if (tile instanceof IPartialSafeNBT) { data = new CompoundNBT(); @@ -751,30 +751,30 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC protected void launchBelt(BlockPos target, BlockState state, int length) { blocksPlaced++; ItemStack connector = AllItems.BELT_CONNECTOR.asStack(); - flyingBlocks.add(new LaunchedItem.ForBelt(this.getPos(), target, connector, state, length)); + flyingBlocks.add(new LaunchedItem.ForBelt(this.getBlockPos(), target, connector, state, length)); playFiringSound(); } protected void launchBlock(BlockPos target, ItemStack stack, BlockState state, @Nullable CompoundNBT data) { - if (!state.getBlock().isAir(state, world, target)) + if (!state.getBlock().isAir(state, level, target)) blocksPlaced++; - flyingBlocks.add(new LaunchedItem.ForBlockState(this.getPos(), target, stack, state, data)); + flyingBlocks.add(new LaunchedItem.ForBlockState(this.getBlockPos(), target, stack, state, data)); playFiringSound(); } protected void launchEntity(BlockPos target, ItemStack stack, Entity entity) { blocksPlaced++; - flyingBlocks.add(new LaunchedItem.ForEntity(this.getPos(), target, stack, entity)); + flyingBlocks.add(new LaunchedItem.ForEntity(this.getBlockPos(), target, stack, entity)); playFiringSound(); } public void playFiringSound() { - AllSoundEvents.SCHEMATICANNON_LAUNCH_BLOCK.playOnServer(world, pos); + AllSoundEvents.SCHEMATICANNON_LAUNCH_BLOCK.playOnServer(level, worldPosition); } public void sendToContainer(PacketBuffer buffer) { - buffer.writeBlockPos(getPos()); - buffer.writeCompoundTag(getUpdateTag()); + buffer.writeBlockPos(getBlockPos()); + buffer.writeNbt(getUpdateTag()); } @Override @@ -794,7 +794,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC if (printer.isLoaded()) { blocksToPlace = blocksPlaced; - blocksToPlace += printer.markAllBlockRequirements(checklist, world, this::shouldPlace); + blocksToPlace += printer.markAllBlockRequirements(checklist, level, this::shouldPlace); printer.markAllEntityRequirements(checklist); } checklist.gathered.clear(); @@ -827,4 +827,6 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC public boolean shouldRenderNormally() { return true; } + + } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java index af0624b67..02243a42d 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java @@ -67,9 +67,9 @@ public class SchematicAndQuillHandler { return true; AxisAlignedBB bb = new AxisAlignedBB(firstPos, secondPos); - Vector3i vec = selectedFace.getDirectionVec(); - Vector3d projectedView = Minecraft.getInstance().gameRenderer.getActiveRenderInfo() - .getProjectedView(); + Vector3i vec = selectedFace.getNormal(); + Vector3d projectedView = Minecraft.getInstance().gameRenderer.getMainCamera() + .getPosition(); if (bb.contains(projectedView)) delta *= -1; @@ -79,17 +79,17 @@ public class SchematicAndQuillHandler { AxisDirection axisDirection = selectedFace.getAxisDirection(); if (axisDirection == AxisDirection.NEGATIVE) - bb = bb.offset(-x, -y, -z); + bb = bb.move(-x, -y, -z); - double maxX = Math.max(bb.maxX - x * axisDirection.getOffset(), bb.minX); - double maxY = Math.max(bb.maxY - y * axisDirection.getOffset(), bb.minY); - double maxZ = Math.max(bb.maxZ - z * axisDirection.getOffset(), bb.minZ); + double maxX = Math.max(bb.maxX - x * axisDirection.getStep(), bb.minX); + double maxY = Math.max(bb.maxY - y * axisDirection.getStep(), bb.minY); + double maxZ = Math.max(bb.maxZ - z * axisDirection.getStep(), bb.minZ); bb = new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, maxX, maxY, maxZ); firstPos = new BlockPos(bb.minX, bb.minY, bb.minZ); secondPos = new BlockPos(bb.maxX, bb.maxY, bb.maxZ); - Lang.sendStatus(Minecraft.getInstance().player, "schematicAndQuill.dimensions", (int) bb.getXSize() + 1, - (int) bb.getYSize() + 1, (int) bb.getZSize() + 1); + Lang.sendStatus(Minecraft.getInstance().player, "schematicAndQuill.dimensions", (int) bb.getXsize() + 1, + (int) bb.getYsize() + 1, (int) bb.getZsize() + 1); return true; } @@ -102,7 +102,7 @@ public class SchematicAndQuillHandler { ClientPlayerEntity player = Minecraft.getInstance().player; - if (player.isSneaking()) { + if (player.isShiftKeyDown()) { discard(); return; } @@ -142,21 +142,21 @@ public class SchematicAndQuillHandler { if (AllKeys.ACTIVATE_TOOL.isPressed()) { float pt = AnimationTickHolder.getPartialTicks(); Vector3d targetVec = player.getEyePosition(pt) - .add(player.getLookVec() + .add(player.getLookAngle() .scale(range)); selectedPos = new BlockPos(targetVec); } else { - BlockRayTraceResult trace = RaycastHelper.rayTraceRange(player.world, player, 75); + BlockRayTraceResult trace = RaycastHelper.rayTraceRange(player.level, player, 75); if (trace != null && trace.getType() == Type.BLOCK) { - BlockPos hit = trace.getPos(); - boolean replaceable = player.world.getBlockState(hit) - .isReplaceable(new BlockItemUseContext(new ItemUseContext(player, Hand.MAIN_HAND, trace))); - if (trace.getFace() + BlockPos hit = trace.getBlockPos(); + boolean replaceable = player.level.getBlockState(hit) + .canBeReplaced(new BlockItemUseContext(new ItemUseContext(player, Hand.MAIN_HAND, trace))); + if (trace.getDirection() .getAxis() .isVertical() && !replaceable) - hit = hit.offset(trace.getFace()); + hit = hit.relative(trace.getDirection()); selectedPos = hit; } else selectedPos = null; @@ -164,10 +164,10 @@ public class SchematicAndQuillHandler { selectedFace = null; if (secondPos != null) { - AxisAlignedBB bb = new AxisAlignedBB(firstPos, secondPos).expand(1, 1, 1) - .grow(.45f); - Vector3d projectedView = Minecraft.getInstance().gameRenderer.getActiveRenderInfo() - .getProjectedView(); + AxisAlignedBB bb = new AxisAlignedBB(firstPos, secondPos).expandTowards(1, 1, 1) + .inflate(.45f); + Vector3d projectedView = Minecraft.getInstance().gameRenderer.getMainCamera() + .getPosition(); boolean inside = bb.contains(projectedView); PredicateTraceResult result = RaycastHelper.rayTraceUntil(player, 70, pos -> inside ^ bb.contains(VecHelper.getCenterOf(pos))); @@ -190,27 +190,27 @@ public class SchematicAndQuillHandler { if (firstPos == null) return selectedPos == null ? null : new AxisAlignedBB(selectedPos); return selectedPos == null ? new AxisAlignedBB(firstPos) - : new AxisAlignedBB(firstPos, selectedPos).expand(1, 1, 1); + : new AxisAlignedBB(firstPos, selectedPos).expandTowards(1, 1, 1); } - return new AxisAlignedBB(firstPos, secondPos).expand(1, 1, 1); + return new AxisAlignedBB(firstPos, secondPos).expandTowards(1, 1, 1); } private boolean isActive() { - return isPresent() && AllItems.SCHEMATIC_AND_QUILL.isIn(Minecraft.getInstance().player.getHeldItemMainhand()); + return isPresent() && AllItems.SCHEMATIC_AND_QUILL.isIn(Minecraft.getInstance().player.getMainHandItem()); } private boolean isPresent() { - return Minecraft.getInstance() != null && Minecraft.getInstance().world != null - && Minecraft.getInstance().currentScreen == null; + return Minecraft.getInstance() != null && Minecraft.getInstance().level != null + && Minecraft.getInstance().screen == null; } public void saveSchematic(String string, boolean convertImmediately) { Template t = new Template(); MutableBoundingBox bb = new MutableBoundingBox(firstPos, secondPos); - BlockPos origin = new BlockPos(bb.minX, bb.minY, bb.minZ); - BlockPos bounds = new BlockPos(bb.getXSize(), bb.getYSize(), bb.getZSize()); + BlockPos origin = new BlockPos(bb.x0, bb.y0, bb.z0); + BlockPos bounds = new BlockPos(bb.getXSpan(), bb.getYSpan(), bb.getZSpan()); - t.takeBlocksFromWorld(Minecraft.getInstance().world, origin, bounds, true, Blocks.AIR); + t.fillFromWorld(Minecraft.getInstance().level, origin, bounds, true, Blocks.AIR); if (string.isEmpty()) string = Lang.translate("schematicAndQuill.fallbackName").getString(); @@ -224,7 +224,7 @@ public class SchematicAndQuillHandler { OutputStream outputStream = null; try { outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE); - CompoundNBT nbttagcompound = t.writeToNBT(new CompoundNBT()); + CompoundNBT nbttagcompound = t.save(new CompoundNBT()); CompressedStreamTools.writeCompressed(nbttagcompound, outputStream); } catch (IOException e) { e.printStackTrace(); diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java index 5f29331d4..4d2f11747 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java @@ -62,30 +62,30 @@ public class SchematicEditScreen extends AbstractSimiScreen { int x = guiLeft; int y = guiTop; - xInput = new TextFieldWidget(textRenderer, x + 50, y + 26, 34, 10, StringTextComponent.EMPTY); - yInput = new TextFieldWidget(textRenderer, x + 90, y + 26, 34, 10, StringTextComponent.EMPTY); - zInput = new TextFieldWidget(textRenderer, x + 130, y + 26, 34, 10, StringTextComponent.EMPTY); + xInput = new TextFieldWidget(font, x + 50, y + 26, 34, 10, StringTextComponent.EMPTY); + yInput = new TextFieldWidget(font, x + 90, y + 26, 34, 10, StringTextComponent.EMPTY); + zInput = new TextFieldWidget(font, x + 130, y + 26, 34, 10, StringTextComponent.EMPTY); BlockPos anchor = handler.getTransformation() .getAnchor(); if (handler.isDeployed()) { - xInput.setText("" + anchor.getX()); - yInput.setText("" + anchor.getY()); - zInput.setText("" + anchor.getZ()); + xInput.setValue("" + anchor.getX()); + yInput.setValue("" + anchor.getY()); + zInput.setValue("" + anchor.getZ()); } else { - BlockPos alt = client.player.getBlockPos(); - xInput.setText("" + alt.getX()); - yInput.setText("" + alt.getY()); - zInput.setText("" + alt.getZ()); + BlockPos alt = minecraft.player.blockPosition(); + xInput.setValue("" + alt.getX()); + yInput.setValue("" + alt.getY()); + zInput.setValue("" + alt.getZ()); } for (TextFieldWidget widget : new TextFieldWidget[] { xInput, yInput, zInput }) { - widget.setMaxStringLength(6); - widget.setEnableBackgroundDrawing(false); + widget.setMaxLength(6); + widget.setBordered(false); widget.setTextColor(0xFFFFFF); widget.changeFocus(false); widget.mouseClicked(0, 0, 0); - widget.setValidator(s -> { + widget.setFilter(s -> { if (s.isEmpty() || s.equals("-")) return true; try { @@ -101,14 +101,14 @@ public class SchematicEditScreen extends AbstractSimiScreen { .toSettings(); Label labelR = new Label(x + 50, y + 48, StringTextComponent.EMPTY).withShadow(); rotationArea = new SelectionScrollInput(x + 45, y + 43, 118, 18).forOptions(rotationOptions) - .titled(rotationLabel.copy()) + .titled(rotationLabel.plainCopy()) .setState(settings.getRotation() .ordinal()) .writingTo(labelR); Label labelM = new Label(x + 50, y + 70, StringTextComponent.EMPTY).withShadow(); mirrorArea = new SelectionScrollInput(x + 45, y + 65, 118, 18).forOptions(mirrorOptions) - .titled(mirrorLabel.copy()) + .titled(mirrorLabel.plainCopy()) .setState(settings.getMirror() .ordinal()) .writingTo(labelM); @@ -124,7 +124,7 @@ public class SchematicEditScreen extends AbstractSimiScreen { @Override public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) { if (isPaste(code)) { - String coords = client.keyboardListener.getClipboardString(); + String coords = minecraft.keyboardHandler.getClipboard(); if (coords != null && !coords.isEmpty()) { coords.replaceAll(" ", ""); String[] split = coords.split(","); @@ -138,9 +138,9 @@ public class SchematicEditScreen extends AbstractSimiScreen { } } if (valid) { - xInput.setText(split[0]); - yInput.setText(split[1]); - zInput.setText(split[2]); + xInput.setValue(split[0]); + yInput.setValue(split[1]); + zInput.setValue(split[2]); return true; } } @@ -157,7 +157,7 @@ public class SchematicEditScreen extends AbstractSimiScreen { background.draw(ms, this, x, y); String title = handler.getCurrentSchematicName(); - drawCenteredString(ms, textRenderer, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); GuiGameElement.of(AllItems.SCHEMATIC.asStack()) .at(x + background.width + 6, y + background.height - 40, -200) @@ -170,8 +170,8 @@ public class SchematicEditScreen extends AbstractSimiScreen { boolean validCoords = true; BlockPos newLocation = null; try { - newLocation = new BlockPos(Integer.parseInt(xInput.getText()), Integer.parseInt(yInput.getText()), - Integer.parseInt(zInput.getText())); + newLocation = new BlockPos(Integer.parseInt(xInput.getValue()), Integer.parseInt(yInput.getValue()), + Integer.parseInt(zInput.getValue())); } catch (NumberFormatException e) { validCoords = false; } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index 9bea80f55..305a11982 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -126,17 +126,17 @@ public class SchematicHandler { if (size.equals(BlockPos.ZERO)) return; - World clientWorld = Minecraft.getInstance().world; + World clientWorld = Minecraft.getInstance().level; SchematicWorld w = new SchematicWorld(clientWorld); SchematicWorld wMirroredFB = new SchematicWorld(clientWorld); SchematicWorld wMirroredLR = new SchematicWorld(clientWorld); PlacementSettings placementSettings = new PlacementSettings(); - schematic.place(w, BlockPos.ZERO, placementSettings, w.getRandom()); + schematic.placeInWorldChunk(w, BlockPos.ZERO, placementSettings, w.getRandom()); placementSettings.setMirror(Mirror.FRONT_BACK); - schematic.place(wMirroredFB, BlockPos.ZERO.east(size.getX() - 1), placementSettings, wMirroredFB.getRandom()); + schematic.placeInWorldChunk(wMirroredFB, BlockPos.ZERO.east(size.getX() - 1), placementSettings, wMirroredFB.getRandom()); placementSettings.setMirror(Mirror.LEFT_RIGHT); - schematic.place(wMirroredLR, BlockPos.ZERO.south(size.getZ() - 1), placementSettings, wMirroredFB.getRandom()); + schematic.placeInWorldChunk(wMirroredLR, BlockPos.ZERO.south(size.getZ() - 1), placementSettings, wMirroredFB.getRandom()); renderers.get(0) .display(w); @@ -152,13 +152,13 @@ public class SchematicHandler { return; if (active) { - ms.push(); + ms.pushPose(); currentTool.getTool() .renderTool(ms, buffer); - ms.pop(); + ms.popPose(); } - ms.push(); + ms.pushPose(); transformation.applyGLTransformations(ms); if (!renderers.isEmpty()) { @@ -182,7 +182,7 @@ public class SchematicHandler { currentTool.getTool() .renderOnSchematic(ms, buffer); - ms.pop(); + ms.popPose(); } @@ -202,11 +202,11 @@ public class SchematicHandler { if (!pressed || button != 1) return; Minecraft mc = Minecraft.getInstance(); - if (mc.player.isSneaking()) + if (mc.player.isShiftKeyDown()) return; - if (mc.objectMouseOver instanceof BlockRayTraceResult) { - BlockRayTraceResult blockRayTraceResult = (BlockRayTraceResult) mc.objectMouseOver; - BlockState clickedBlock = mc.world.getBlockState(blockRayTraceResult.getPos()); + if (mc.hitResult instanceof BlockRayTraceResult) { + BlockRayTraceResult blockRayTraceResult = (BlockRayTraceResult) mc.hitResult; + BlockState clickedBlock = mc.level.getBlockState(blockRayTraceResult.getBlockPos()); if (AllBlocks.SCHEMATICANNON.has(clickedBlock)) return; if (AllBlocks.DEPLOYER.has(clickedBlock)) @@ -245,23 +245,23 @@ public class SchematicHandler { } private ItemStack findBlueprintInHand(PlayerEntity player) { - ItemStack stack = player.getHeldItemMainhand(); + ItemStack stack = player.getMainHandItem(); if (!AllItems.SCHEMATIC.isIn(stack)) return null; if (!stack.hasTag()) return null; activeSchematicItem = stack; - activeHotbarSlot = player.inventory.currentItem; + activeHotbarSlot = player.inventory.selected; return stack; } private boolean itemLost(PlayerEntity player) { - for (int i = 0; i < PlayerInventory.getHotbarSize(); i++) { - if (!player.inventory.getStackInSlot(i) - .isItemEqual(activeSchematicItem)) + for (int i = 0; i < PlayerInventory.getSelectionSize(); i++) { + if (!player.inventory.getItem(i) + .sameItem(activeSchematicItem)) continue; - if (!ItemStack.areItemStackTagsEqual(player.inventory.getStackInSlot(i), activeSchematicItem)) + if (!ItemStack.tagMatches(player.inventory.getItem(i), activeSchematicItem)) continue; return false; } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java index 33f531cbe..a5fe5eff7 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java @@ -12,12 +12,12 @@ public class SchematicHotbarSlotOverlay extends AbstractGui { public void renderOn(MatrixStack matrixStack, int slot) { MainWindow mainWindow = Minecraft.getInstance().getWindow(); - int x = mainWindow.getScaledWidth() / 2 - 88; - int y = mainWindow.getScaledHeight() - 19; + int x = mainWindow.getGuiScaledWidth() / 2 - 88; + int y = mainWindow.getGuiScaledHeight() - 19; RenderSystem.enableDepthTest(); - matrixStack.push(); + matrixStack.pushPose(); AllGuiTextures.SCHEMATIC_SLOT.draw(matrixStack, this, x + 20 * slot, y); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java index c635d4bb9..c13cc1dc0 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java @@ -43,11 +43,11 @@ public class SchematicPromptScreen extends AbstractSimiScreen { int x = guiLeft; int y = guiTop; - nameField = new TextFieldWidget(textRenderer, x + 49, y + 26, 131, 10, StringTextComponent.EMPTY); + nameField = new TextFieldWidget(font, x + 49, y + 26, 131, 10, StringTextComponent.EMPTY); nameField.setTextColor(-1); - nameField.setDisabledTextColour(-1); - nameField.setEnableBackgroundDrawing(false); - nameField.setMaxStringLength(35); + nameField.setTextColorUneditable(-1); + nameField.setBordered(false); + nameField.setMaxLength(35); nameField.changeFocus(true); abort = new IconButton(x + 7, y + 53, AllIcons.I_TRASH); @@ -74,7 +74,7 @@ public class SchematicPromptScreen extends AbstractSimiScreen { int y = guiTop; background.draw(ms, this, x, y); - drawCenteredText(ms, textRenderer, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); GuiGameElement.of(AllItems.SCHEMATIC.asStack()) .at(x + 22, y + 23, 0) .render(ms); @@ -106,7 +106,7 @@ public class SchematicPromptScreen extends AbstractSimiScreen { } if (abort.isHovered()) { CreateClient.SCHEMATIC_AND_QUILL_HANDLER.discard(); - client.player.closeScreen(); + minecraft.player.closeContainer(); return true; } if (convert.isHovered()) { @@ -117,8 +117,8 @@ public class SchematicPromptScreen extends AbstractSimiScreen { } private void confirm(boolean convertImmediately) { - CreateClient.SCHEMATIC_AND_QUILL_HANDLER.saveSchematic(nameField.getText(), convertImmediately); - client.player.closeScreen(); + CreateClient.SCHEMATIC_AND_QUILL_HANDLER.saveSchematic(nameField.getValue(), convertImmediately); + minecraft.player.closeContainer(); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index 75f55c7ba..dc85da723 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -9,12 +9,12 @@ import java.util.Set; import org.lwjgl.opengl.GL11; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.TileEntityRenderHelper; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -61,7 +61,7 @@ public class SchematicRenderer { if (!active) return; Minecraft mc = Minecraft.getInstance(); - if (mc.world == null || mc.player == null || !changed) + if (mc.level == null || mc.player == null || !changed) return; redraw(mc); @@ -71,8 +71,8 @@ public class SchematicRenderer { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { if (!active) return; - buffer.getBuffer(RenderType.getSolid()); - for (RenderType layer : RenderType.getBlockLayers()) { + buffer.getBuffer(RenderType.solid()); + for (RenderType layer : RenderType.chunkBufferLayers()) { if (!usedBlockRenderLayers.contains(layer)) continue; SuperByteBuffer superByteBuffer = bufferCache.get(layer); @@ -86,21 +86,21 @@ public class SchematicRenderer { startedBufferBuilders.clear(); final SchematicWorld blockAccess = schematic; - final BlockRendererDispatcher blockRendererDispatcher = minecraft.getBlockRendererDispatcher(); + final BlockRendererDispatcher blockRendererDispatcher = minecraft.getBlockRenderer(); List blockstates = new LinkedList<>(); Map buffers = new HashMap<>(); MatrixStack ms = new MatrixStack(); - BlockPos.stream(blockAccess.getBounds()) + BlockPos.betweenClosedStream(blockAccess.getBounds()) .forEach(localPos -> { - ms.push(); - MatrixStacker.of(ms) + ms.pushPose(); + MatrixTransformStack.of(ms) .translate(localPos); - BlockPos pos = localPos.add(anchor); + BlockPos pos = localPos.offset(anchor); BlockState state = blockAccess.getBlockState(pos); - for (RenderType blockRenderLayer : RenderType.getBlockLayers()) { + for (RenderType blockRenderLayer : RenderType.chunkBufferLayers()) { if (!RenderTypeLookup.canRenderInLayer(state, blockRenderLayer)) continue; ForgeHooksClient.setRenderLayer(blockRenderLayer); @@ -111,10 +111,10 @@ public class SchematicRenderer { if (startedBufferBuilders.add(blockRenderLayer)) bufferBuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - TileEntity tileEntity = blockAccess.getTileEntity(localPos); + TileEntity tileEntity = blockAccess.getBlockEntity(localPos); if (blockRendererDispatcher.renderModel(state, pos, blockAccess, ms, bufferBuilder, true, - minecraft.world.rand, + minecraft.level.random, tileEntity != null ? tileEntity.getModelData() : EmptyModelData.INSTANCE)) { usedBlockRenderLayers.add(blockRenderLayer); } @@ -122,21 +122,21 @@ public class SchematicRenderer { } ForgeHooksClient.setRenderLayer(null); - ms.pop(); + ms.popPose(); }); // finishDrawing - for (RenderType layer : RenderType.getBlockLayers()) { + for (RenderType layer : RenderType.chunkBufferLayers()) { if (!startedBufferBuilders.contains(layer)) continue; BufferBuilder buf = buffers.get(layer); - buf.finishDrawing(); + buf.end(); bufferCache.put(layer, new SuperByteBuffer(buf)); } } private static int getLayerCount() { - return RenderType.getBlockLayers() + return RenderType.chunkBufferLayers() .size(); } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java index 7c3c6c6a2..2b6db0cf1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java @@ -2,11 +2,11 @@ package com.simibubi.create.content.schematics.client; import static java.lang.Math.abs; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingAngle; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.util.Direction.Axis; @@ -38,8 +38,8 @@ public class SchematicTransformation { int frontBack = settings.getMirror() == Mirror.FRONT_BACK ? -1 : 1; getScaleFB().start(frontBack); getScaleLR().start(leftRight); - xOrigin = bounds.getXSize() / 2f; - zOrigin = bounds.getZSize() / 2f; + xOrigin = bounds.getXsize() / 2f; + zOrigin = bounds.getZsize() / 2f; int r = -(settings.getRotation() .ordinal() * 90); @@ -63,7 +63,7 @@ public class SchematicTransformation { float lr = getScaleLR().get(pt); float rot = rotation.get(pt) + ((fb < 0 && lr < 0) ? 180 : 0); ms.translate(xOrigin, 0, zOrigin); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .translate(rotationOffset) .rotateY(rot) .translateBack(rotationOffset); @@ -99,7 +99,7 @@ public class SchematicTransformation { vec = vec.subtract(xOrigin + rotationOffset.x, 0, zOrigin + rotationOffset.z); vec = VecHelper.rotate(vec, -rotation.get(pt), Axis.Y); vec = vec.add(rotationOffset.x, 0, rotationOffset.z); - vec = vec.mul(getScaleFB().get(pt), 1, getScaleLR().get(pt)); + vec = vec.multiply(getScaleFB().get(pt), 1, getScaleLR().get(pt)); vec = vec.add(xOrigin, 0, zOrigin); return vec; @@ -148,7 +148,7 @@ public class SchematicTransformation { Vector3d rotationOffset = getRotationOffset(false); vec = vec.subtract(xOrigin, 0, zOrigin); vec = vec.subtract(rotationOffset.x, 0, rotationOffset.z); - vec = vec.mul(getScaleFB().getTarget(), 1, getScaleLR().getTarget()); + vec = vec.multiply(getScaleFB().getTarget(), 1, getScaleLR().getTarget()); vec = VecHelper.rotate(vec, rotation.getTarget(), Axis.Y); vec = vec.add(xOrigin, 0, zOrigin); @@ -161,11 +161,11 @@ public class SchematicTransformation { Vector3d rotationOffset = getRotationOffset(false); vec = vec.subtract(xOrigin, 0, zOrigin); vec = vec.subtract(rotationOffset.x, 0, rotationOffset.z); - vec = vec.mul(getScaleFB().getTarget(), 1, getScaleLR().getTarget()); + vec = vec.multiply(getScaleFB().getTarget(), 1, getScaleLR().getTarget()); vec = VecHelper.rotate(vec, rotation.getTarget(), Axis.Y); vec = vec.add(xOrigin, 0, zOrigin); - return Vector3d.of(pos.subtract(new BlockPos(vec.x, vec.y, vec.z))); + return Vector3d.atLowerCornerOf(pos.subtract(new BlockPos(vec.x, vec.y, vec.z))); } public int getRotationTarget() { diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java index b873d5f78..b04dba764 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java @@ -1,11 +1,11 @@ package com.simibubi.create.content.schematics.client.tools; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllKeys; import com.simibubi.create.content.schematics.client.SchematicTransformation; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.outliner.AABBOutline; import net.minecraft.item.ItemStack; @@ -42,7 +42,7 @@ public class DeployTool extends PlacementToolBase { if (selectedPos == null) return; - ms.push(); + ms.pushPose(); float pt = AnimationTickHolder.getPartialTicks(); double x = MathHelper.lerp(pt, lastChasingSelectedPos.x, chasingSelectedPos.x); double y = MathHelper.lerp(pt, lastChasingSelectedPos.y, chasingSelectedPos.y); @@ -54,12 +54,12 @@ public class DeployTool extends PlacementToolBase { Vector3d rotationOffset = transformation.getRotationOffset(true); int centerX = (int) center.x; int centerZ = (int) center.z; - double xOrigin = bounds.getXSize() / 2f; - double zOrigin = bounds.getZSize() / 2f; + double xOrigin = bounds.getXsize() / 2f; + double zOrigin = bounds.getZsize() / 2f; Vector3d origin = new Vector3d(xOrigin, 0, zOrigin); ms.translate(x - centerX, y, z - centerZ); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .translate(origin) .translate(rotationOffset) .rotateY(transformation.getCurrentRotation()) @@ -70,7 +70,7 @@ public class DeployTool extends PlacementToolBase { outline.render(ms, buffer, pt); outline.getParams() .clearTextures(); - ms.pop(); + ms.popPose(); } @Override @@ -88,7 +88,7 @@ public class DeployTool extends PlacementToolBase { return super.handleRightClick(); Vector3d center = schematicHandler.getBounds() .getCenter(); - BlockPos target = selectedPos.add(-((int) center.x), 0, -((int) center.z)); + BlockPos target = selectedPos.offset(-((int) center.x), 0, -((int) center.z)); ItemStack item = schematicHandler.getActiveSchematicItem(); if (item != null) { diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java index dc8733e61..82b6b0f2f 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java @@ -56,17 +56,17 @@ public class FlipTool extends PlacementToolBase { return; } - Direction facing = selectedFace.rotateY(); + Direction facing = selectedFace.getClockWise(); AxisAlignedBB bounds = schematicHandler.getBounds(); - Vector3d directionVec = Vector3d.of(Direction.getFacingFromAxis(AxisDirection.POSITIVE, facing.getAxis()) - .getDirectionVec()); - Vector3d boundsSize = new Vector3d(bounds.getXSize(), bounds.getYSize(), bounds.getZSize()); - Vector3d vec = boundsSize.mul(directionVec); + Vector3d directionVec = Vector3d.atLowerCornerOf(Direction.get(AxisDirection.POSITIVE, facing.getAxis()) + .getNormal()); + Vector3d boundsSize = new Vector3d(bounds.getXsize(), bounds.getYsize(), bounds.getZsize()); + Vector3d vec = boundsSize.multiply(directionVec); bounds = bounds.contract(vec.x, vec.y, vec.z) - .grow(1 - directionVec.x, 1 - directionVec.y, 1 - directionVec.z); - bounds = bounds.offset(directionVec.scale(.5f) - .mul(boundsSize)); + .inflate(1 - directionVec.x, 1 - directionVec.y, 1 - directionVec.z); + bounds = bounds.move(directionVec.scale(.5f) + .multiply(boundsSize)); outline.setBounds(bounds); AllSpecialTextures tex = AllSpecialTextures.CHECKERED; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java index 4fcaf8659..f01e87d7c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java @@ -25,8 +25,8 @@ public class MoveTool extends PlacementToolBase { return true; SchematicTransformation transformation = schematicHandler.getTransformation(); - Vector3d vec = Vector3d.of(selectedFace.getDirectionVec()).scale(-Math.signum(delta)); - vec = vec.mul(transformation.getMirrorModifier(Axis.X), 1, transformation.getMirrorModifier(Axis.Z)); + Vector3d vec = Vector3d.atLowerCornerOf(selectedFace.getNormal()).scale(-Math.signum(delta)); + vec = vec.multiply(transformation.getMirrorModifier(Axis.X), 1, transformation.getMirrorModifier(Axis.Z)); vec = VecHelper.rotate(vec, transformation.getRotationTarget(), Axis.Y); transformation.move((float) vec.x, 0, (float) vec.z); schematicHandler.markDirty(); diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java index 2e57dd830..bc793d1ec 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java @@ -23,7 +23,7 @@ public class RotateTool extends PlacementToolBase { @Override public void renderOnSchematic(MatrixStack ms, SuperRenderTypeBuffer buffer) { AxisAlignedBB bounds = schematicHandler.getBounds(); - double height = bounds.getYSize() + Math.max(20, bounds.getYSize()); + double height = bounds.getYsize() + Math.max(20, bounds.getYsize()); Vector3d center = bounds.getCenter() .add(schematicHandler.getTransformation() .getRotationOffset(false)); diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java index bbfa5163c..9340d82a6 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java @@ -60,7 +60,7 @@ public abstract class SchematicToolBase implements ISchematicTool { if (selectedPos == null) return; lastChasingSelectedPos = chasingSelectedPos; - Vector3d target = Vector3d.of(selectedPos); + Vector3d target = Vector3d.atLowerCornerOf(selectedPos); if (target.distanceTo(chasingSelectedPos) < 1 / 512f) { chasingSelectedPos = target; return; @@ -94,30 +94,30 @@ public abstract class SchematicToolBase implements ISchematicTool { if (selectIgnoreBlocks) { float pt = AnimationTickHolder.getPartialTicks(); selectedPos = new BlockPos(player.getEyePosition(pt) - .add(player.getLookVec() + .add(player.getLookAngle() .scale(selectionRange))); if (snap) - lastChasingSelectedPos = chasingSelectedPos = Vector3d.of(selectedPos); + lastChasingSelectedPos = chasingSelectedPos = Vector3d.atLowerCornerOf(selectedPos); return; } // Select targeted Block selectedPos = null; - BlockRayTraceResult trace = RaycastHelper.rayTraceRange(player.world, player, 75); + BlockRayTraceResult trace = RaycastHelper.rayTraceRange(player.level, player, 75); if (trace == null || trace.getType() != Type.BLOCK) return; - BlockPos hit = new BlockPos(trace.getHitVec()); - boolean replaceable = player.world.getBlockState(hit) + BlockPos hit = new BlockPos(trace.getLocation()); + boolean replaceable = player.level.getBlockState(hit) .getMaterial() .isReplaceable(); - if (trace.getFace() + if (trace.getDirection() .getAxis() .isVertical() && !replaceable) - hit = hit.offset(trace.getFace()); + hit = hit.relative(trace.getDirection()); selectedPos = hit; if (snap) - lastChasingSelectedPos = chasingSelectedPos = Vector3d.of(selectedPos); + lastChasingSelectedPos = chasingSelectedPos = Vector3d.atLowerCornerOf(selectedPos); } @Override @@ -131,7 +131,7 @@ public abstract class SchematicToolBase implements ISchematicTool { if (!schematicHandler.isDeployed()) return; - ms.push(); + ms.pushPose(); AABBOutline outline = schematicHandler.getOutline(); if (renderSelectedFace) { outline.getParams() @@ -146,7 +146,7 @@ public abstract class SchematicToolBase implements ISchematicTool { outline.render(ms, buffer, AnimationTickHolder.getPartialTicks()); outline.getParams() .clearTextures(); - ms.pop(); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java b/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java index 9ca103e6b..3942a7eb9 100644 --- a/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java +++ b/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java @@ -23,7 +23,7 @@ public class SchematicInstances { public static WorldAttached> loadedSchematics; static { - loadedSchematics = new WorldAttached<>(() -> CacheBuilder.newBuilder() + loadedSchematics = new WorldAttached<>($ -> CacheBuilder.newBuilder() .expireAfterAccess(5, TimeUnit.MINUTES) .build()); } @@ -61,7 +61,7 @@ public class SchematicInstances { .getCompound("Anchor")); SchematicWorld world = new SchematicWorld(anchor, wrapped); PlacementSettings settings = SchematicItem.getSettings(schematic); - activeTemplate.place(world, anchor, settings, wrapped.getRandom()); + activeTemplate.placeInWorldChunk(world, anchor, settings, wrapped.getRandom()); return world; } diff --git a/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java b/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java index eca91e789..9c78c265c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java +++ b/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java @@ -55,7 +55,7 @@ public class SchematicItem extends Item { private static final Logger LOGGER = LogManager.getLogger(); public SchematicItem(Properties properties) { - super(properties.maxStackSize(1)); + super(properties.stacksTo(1)); } public static ItemStack create(String schematic, String owner) { @@ -75,20 +75,20 @@ public class SchematicItem extends Item { } @Override - public void fillItemGroup(ItemGroup group, NonNullList items) {} + public void fillItemCategory(ItemGroup group, NonNullList items) {} @Override @OnlyIn(value = Dist.CLIENT) - public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { if (stack.hasTag()) { if (stack.getTag() .contains("File")) tooltip.add(new StringTextComponent(TextFormatting.GOLD + stack.getTag() .getString("File"))); } else { - tooltip.add(Lang.translate("schematic.invalid").formatted(TextFormatting.RED)); + tooltip.add(Lang.translate("schematic.invalid").withStyle(TextFormatting.RED)); } - super.addInformation(stack, worldIn, tooltip, flagIn); + super.appendHoverText(stack, worldIn, tooltip, flagIn); } public static void writeSize(ItemStack blueprint) { @@ -141,7 +141,7 @@ public class SchematicItem extends Item { try (DataInputStream stream = new DataInputStream(new BufferedInputStream( new GZIPInputStream(Files.newInputStream(path, StandardOpenOption.READ))))) { CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); - t.read(nbt); + t.load(nbt); } catch (IOException e) { LOGGER.warn("Failed to read schematic", e); } @@ -151,23 +151,23 @@ public class SchematicItem extends Item { @Nonnull @Override - public ActionResultType onItemUse(ItemUseContext context) { + public ActionResultType useOn(ItemUseContext context) { if (context.getPlayer() != null && !onItemUse(context.getPlayer(), context.getHand())) - return super.onItemUse(context); + return super.useOn(context); return ActionResultType.SUCCESS; } @Override - public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) { + public ActionResult use(World worldIn, PlayerEntity playerIn, Hand handIn) { if (!onItemUse(playerIn, handIn)) - return super.onItemRightClick(worldIn, playerIn, handIn); - return new ActionResult<>(ActionResultType.SUCCESS, playerIn.getHeldItem(handIn)); + return super.use(worldIn, playerIn, handIn); + return new ActionResult<>(ActionResultType.SUCCESS, playerIn.getItemInHand(handIn)); } private boolean onItemUse(PlayerEntity player, Hand hand) { - if (!player.isSneaking() || hand != Hand.MAIN_HAND) + if (!player.isShiftKeyDown() || hand != Hand.MAIN_HAND) return false; - if (!player.getHeldItem(hand) + if (!player.getItemInHand(hand) .hasTag()) return false; DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::displayBlueprintScreen); diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/ConfigureSchematicannonPacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/ConfigureSchematicannonPacket.java index 2e66fc255..e53a876db 100644 --- a/src/main/java/com/simibubi/create/content/schematics/packet/ConfigureSchematicannonPacket.java +++ b/src/main/java/com/simibubi/create/content/schematics/packet/ConfigureSchematicannonPacket.java @@ -26,21 +26,21 @@ public class ConfigureSchematicannonPacket extends SimplePacketBase { } public ConfigureSchematicannonPacket(PacketBuffer buffer) { - this(buffer.readEnumValue(Option.class), buffer.readBoolean()); + this(buffer.readEnum(Option.class), buffer.readBoolean()); } public void write(PacketBuffer buffer) { - buffer.writeEnumValue(option); + buffer.writeEnum(option); buffer.writeBoolean(set); } public void handle(Supplier context) { context.get().enqueueWork(() -> { ServerPlayerEntity player = context.get().getSender(); - if (player == null || !(player.openContainer instanceof SchematicannonContainer)) + if (player == null || !(player.containerMenu instanceof SchematicannonContainer)) return; - SchematicannonTileEntity te = ((SchematicannonContainer) player.openContainer).getTileEntity(); + SchematicannonTileEntity te = ((SchematicannonContainer) player.containerMenu).getTileEntity(); switch (option) { case DONT_REPLACE: case REPLACE_ANY: diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/InstantSchematicPacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/InstantSchematicPacket.java index 00255c435..433875cb2 100644 --- a/src/main/java/com/simibubi/create/content/schematics/packet/InstantSchematicPacket.java +++ b/src/main/java/com/simibubi/create/content/schematics/packet/InstantSchematicPacket.java @@ -23,14 +23,14 @@ public class InstantSchematicPacket extends SimplePacketBase { } public InstantSchematicPacket(PacketBuffer buffer) { - name = buffer.readString(32767); + name = buffer.readUtf(32767); origin = buffer.readBlockPos(); bounds = buffer.readBlockPos(); } @Override public void write(PacketBuffer buffer) { - buffer.writeString(name); + buffer.writeUtf(name); buffer.writeBlockPos(origin); buffer.writeBlockPos(bounds); } @@ -43,7 +43,7 @@ public class InstantSchematicPacket extends SimplePacketBase { .getSender(); if (player == null) return; - Create.SCHEMATIC_RECEIVER.handleInstantSchematic(player, name, player.world, origin, bounds); + Create.SCHEMATIC_RECEIVER.handleInstantSchematic(player, name, player.level, origin, bounds); }); context.get() .setPacketHandled(true); diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicPlacePacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicPlacePacket.java index 01cc59d07..3f6eccd0f 100644 --- a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicPlacePacket.java +++ b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicPlacePacket.java @@ -22,11 +22,11 @@ public class SchematicPlacePacket extends SimplePacketBase { } public SchematicPlacePacket(PacketBuffer buffer) { - stack = buffer.readItemStack(); + stack = buffer.readItem(); } public void write(PacketBuffer buffer) { - buffer.writeItemStack(stack); + buffer.writeItem(stack); } public void handle(Supplier context) { @@ -35,19 +35,19 @@ public class SchematicPlacePacket extends SimplePacketBase { if (player == null) return; - World world = player.getServerWorld(); + World world = player.getLevel(); SchematicPrinter printer = new SchematicPrinter(); - printer.loadSchematic(stack, world, !player.canUseCommandBlock()); + printer.loadSchematic(stack, world, !player.canUseGameMasterBlocks()); while (printer.advanceCurrentPos()) { if (!printer.shouldPlaceCurrent(world)) continue; printer.handleCurrentTarget((pos, state, tile) -> { - CompoundNBT tileData = tile != null ? tile.write(new CompoundNBT()) : null; + CompoundNBT tileData = tile != null ? tile.save(new CompoundNBT()) : null; BlockHelper.placeSchematicBlock(world, state, pos, null, tileData); }, (pos, entity) -> { - world.addEntity(entity); + world.addFreshEntity(entity); }); } }); diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java index 030f66a93..f35991b80 100644 --- a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java +++ b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java @@ -38,8 +38,8 @@ public class SchematicSyncPacket extends SimplePacketBase { slot = buffer.readVarInt(); deployed = buffer.readBoolean(); anchor = buffer.readBlockPos(); - rotation = buffer.readEnumValue(Rotation.class); - mirror = buffer.readEnumValue(Mirror.class); + rotation = buffer.readEnum(Rotation.class); + mirror = buffer.readEnum(Mirror.class); } @Override @@ -47,8 +47,8 @@ public class SchematicSyncPacket extends SimplePacketBase { buffer.writeVarInt(slot); buffer.writeBoolean(deployed); buffer.writeBlockPos(anchor); - buffer.writeEnumValue(rotation); - buffer.writeEnumValue(mirror); + buffer.writeEnum(rotation); + buffer.writeEnum(mirror); } @Override @@ -59,9 +59,9 @@ public class SchematicSyncPacket extends SimplePacketBase { return; ItemStack stack = ItemStack.EMPTY; if (slot == -1) { - stack = player.getHeldItemMainhand(); + stack = player.getMainHandItem(); } else { - stack = player.inventory.getStackInSlot(slot); + stack = player.inventory.getItem(slot); } if (!AllItems.SCHEMATIC.isIn(stack)) { return; diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicUploadPacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicUploadPacket.java index bde22038b..3828588c9 100644 --- a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicUploadPacket.java +++ b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicUploadPacket.java @@ -45,7 +45,7 @@ public class SchematicUploadPacket extends SimplePacketBase { public SchematicUploadPacket(PacketBuffer buffer) { code = buffer.readInt(); - schematic = buffer.readString(256); + schematic = buffer.readUtf(256); if (code == BEGIN) size = buffer.readLong(); @@ -55,7 +55,7 @@ public class SchematicUploadPacket extends SimplePacketBase { public void write(PacketBuffer buffer) { buffer.writeInt(code); - buffer.writeString(schematic); + buffer.writeUtf(schematic); if (code == BEGIN) buffer.writeLong(size); @@ -71,8 +71,8 @@ public class SchematicUploadPacket extends SimplePacketBase { if (player == null) return; if (code == BEGIN) { - BlockPos pos = ((SchematicTableContainer) player.openContainer).getTileEntity() - .getPos(); + BlockPos pos = ((SchematicTableContainer) player.containerMenu).getTileEntity() + .getBlockPos(); Create.SCHEMATIC_RECEIVER.handleNewUpload(player, schematic, size, pos); } if (code == WRITE) diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 38284706d..7021f2dfd 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -96,7 +96,7 @@ public class ClientEvents { @SubscribeEvent public static void onTick(ClientTickEvent event) { - World world = Minecraft.getInstance().world; + World world = Minecraft.getInstance().level; if (!isGameActive()) return; @@ -153,7 +153,7 @@ public class ClientEvents { @SubscribeEvent public static void onLoadWorld(WorldEvent.Load event) { IWorld world = event.getWorld(); - if (world.isRemote() && world instanceof ClientWorld && !(world instanceof WrappedClientWorld)) { + if (world.isClientSide() && world instanceof ClientWorld && !(world instanceof WrappedClientWorld)) { CreateClient.invalidateRenderers(); AnimationTickHolder.reset(); } @@ -168,7 +168,8 @@ public class ClientEvents { @SubscribeEvent public static void onUnloadWorld(WorldEvent.Unload event) { - if (event.getWorld().isRemote()) { + if (event.getWorld() + .isClientSide()) { CreateClient.invalidateRenderers(); CreateClient.SOUL_PULSE_EFFECT_HANDLER.refresh(); AnimationTickHolder.reset(); @@ -177,13 +178,13 @@ public class ClientEvents { @SubscribeEvent public static void onRenderWorld(RenderWorldLastEvent event) { - Vector3d cameraPos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo() - .getProjectedView(); + Vector3d cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera() + .getPosition(); float pt = AnimationTickHolder.getPartialTicks(); MatrixStack ms = event.getMatrixStack(); - ms.push(); - ms.translate(-cameraPos.getX(), -cameraPos.getY(), -cameraPos.getZ()); + ms.pushPose(); + ms.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z()); SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); CouplingRenderer.renderAll(ms, buffer); @@ -195,17 +196,17 @@ public class ClientEvents { buffer.draw(); RenderSystem.enableCull(); - ms.pop(); + ms.popPose(); } @SubscribeEvent public static void onRenderOverlay(RenderGameOverlayEvent.Post event) { MatrixStack ms = event.getMatrixStack(); Impl buffers = Minecraft.getInstance() - .getBufferBuilders() - .getEntityVertexConsumers(); + .renderBuffers() + .bufferSource(); int light = 0xF000F0; - int overlay = OverlayTexture.DEFAULT_UV; + int overlay = OverlayTexture.NO_OVERLAY; float pt = event.getPartialTicks(); if (event.getType() == ElementType.AIR) @@ -238,18 +239,17 @@ public class ClientEvents { ItemStack stack = event.getItemStack(); String translationKey = stack.getItem() - .getTranslationKey(stack); - if (!translationKey.startsWith(itemPrefix) && !translationKey.startsWith(blockPrefix)) - return; + .getDescriptionId(stack); - if (TooltipHelper.hasTooltip(stack, event.getPlayer())) { - List itemTooltip = event.getToolTip(); - List toolTip = new ArrayList<>(); - toolTip.add(itemTooltip.remove(0)); - TooltipHelper.getTooltip(stack) - .addInformation(toolTip); - itemTooltip.addAll(0, toolTip); - } + if (translationKey.startsWith(itemPrefix) || translationKey.startsWith(blockPrefix)) + if (TooltipHelper.hasTooltip(stack, event.getPlayer())) { + List itemTooltip = event.getToolTip(); + List toolTip = new ArrayList<>(); + toolTip.add(itemTooltip.remove(0)); + TooltipHelper.getTooltip(stack) + .addInformation(toolTip); + itemTooltip.addAll(0, toolTip); + } if (stack.getItem() instanceof BlockItem) { BlockItem item = (BlockItem) stack.getItem(); @@ -276,31 +276,31 @@ public class ClientEvents { } protected static boolean isGameActive() { - return !(Minecraft.getInstance().world == null || Minecraft.getInstance().player == null); + return !(Minecraft.getInstance().level == null || Minecraft.getInstance().player == null); } @SubscribeEvent public static void getFogDensity(EntityViewRenderEvent.FogDensity event) { ActiveRenderInfo info = event.getInfo(); - FluidState fluidState = info.getFluidState(); + FluidState fluidState = info.getFluidInCamera(); if (fluidState.isEmpty()) return; - Fluid fluid = fluidState.getFluid(); + Fluid fluid = fluidState.getType(); - if (fluid.isEquivalentTo(AllFluids.CHOCOLATE.get())) { + if (fluid.isSame(AllFluids.CHOCOLATE.get())) { event.setDensity(5f); event.setCanceled(true); return; } - if (fluid.isEquivalentTo(AllFluids.HONEY.get())) { + if (fluid.isSame(AllFluids.HONEY.get())) { event.setDensity(1.5f); event.setCanceled(true); return; } if (FluidHelper.isWater(fluid) && AllItems.DIVING_HELMET.get() - .isWornBy(Minecraft.getInstance().renderViewEntity)) { + .isWornBy(Minecraft.getInstance().cameraEntity)) { event.setDensity(0.010f); event.setCanceled(true); return; @@ -310,18 +310,18 @@ public class ClientEvents { @SubscribeEvent public static void getFogColor(EntityViewRenderEvent.FogColors event) { ActiveRenderInfo info = event.getInfo(); - FluidState fluidState = info.getFluidState(); + FluidState fluidState = info.getFluidInCamera(); if (fluidState.isEmpty()) return; - Fluid fluid = fluidState.getFluid(); + Fluid fluid = fluidState.getType(); - if (fluid.isEquivalentTo(AllFluids.CHOCOLATE.get())) { + if (fluid.isSame(AllFluids.CHOCOLATE.get())) { event.setRed(98 / 256f); event.setGreen(32 / 256f); event.setBlue(32 / 256f); } - if (fluid.isEquivalentTo(AllFluids.HONEY.get())) { + if (fluid.isSame(AllFluids.HONEY.get())) { event.setRed(234 / 256f); event.setGreen(174 / 256f); event.setBlue(47 / 256f); @@ -337,8 +337,11 @@ public class ClientEvents { } public static void loadCompleted(FMLLoadCompleteEvent event) { - ModContainer createContainer = ModList.get().getModContainerById(Create.ID).orElseThrow(() -> new IllegalStateException("Create Mod Container missing after loadCompleted")); - createContainer.registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (mc, previousScreen) -> BaseConfigScreen.forCreate(previousScreen)); + ModContainer createContainer = ModList.get() + .getModContainerById(Create.ID) + .orElseThrow(() -> new IllegalStateException("Create Mod Container missing after loadCompleted")); + createContainer.registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, + () -> (mc, previousScreen) -> BaseConfigScreen.forCreate(previousScreen)); } } diff --git a/src/main/java/com/simibubi/create/events/CommonEvents.java b/src/main/java/com/simibubi/create/events/CommonEvents.java index 6664931dd..3631e9b0b 100644 --- a/src/main/java/com/simibubi/create/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/events/CommonEvents.java @@ -71,12 +71,12 @@ public class CommonEvents { BlockPos pos = event.getPos(); IWorld world = event.getWorld(); - if (fluidState.isSource() && FluidHelper.isLava(fluidState.getFluid())) + if (fluidState.isSource() && FluidHelper.isLava(fluidState.getType())) return; for (Direction direction : Iterate.directions) { - FluidState metFluidState = fluidState.isSource() ? fluidState : world.getFluidState(pos.offset(direction)); - if (!metFluidState.isTagged(FluidTags.WATER)) + FluidState metFluidState = fluidState.isSource() ? fluidState : world.getFluidState(pos.relative(direction)); + if (!metFluidState.is(FluidTags.WATER)) continue; BlockState lavaInteraction = AllFluids.getLavaInteraction(metFluidState); if (lavaInteraction == null) @@ -100,7 +100,7 @@ public class CommonEvents { @SubscribeEvent public static void onUpdateLivingEntity(LivingUpdateEvent event) { LivingEntity entityLiving = event.getEntityLiving(); - World world = entityLiving.world; + World world = entityLiving.level; if (world == null) return; ContraptionHandler.entitiesWhoJustDismountedGetSentToTheRightLocation(entityLiving, world); @@ -161,7 +161,7 @@ public class CommonEvents { } public static void leftClickEmpty(ServerPlayerEntity player) { - ItemStack stack = player.getHeldItemMainhand(); + ItemStack stack = player.getMainHandItem(); if (stack.getItem() instanceof ZapperItem) { ZapperInteractionHandler.trySelect(stack, player); } diff --git a/src/main/java/com/simibubi/create/events/InputEvents.java b/src/main/java/com/simibubi/create/events/InputEvents.java index b40da1974..2b97cb343 100644 --- a/src/main/java/com/simibubi/create/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/events/InputEvents.java @@ -22,7 +22,7 @@ public class InputEvents { int key = event.getKey(); boolean pressed = !(event.getAction() == 0); - if (Minecraft.getInstance().currentScreen != null) + if (Minecraft.getInstance().screen != null) return; CreateClient.SCHEMATIC_HANDLER.onKeyInput(key, pressed); @@ -30,7 +30,7 @@ public class InputEvents { @SubscribeEvent public static void onMouseScrolled(MouseScrollEvent event) { - if (Minecraft.getInstance().currentScreen != null) + if (Minecraft.getInstance().screen != null) return; double delta = event.getScrollDelta(); @@ -43,7 +43,7 @@ public class InputEvents { @SubscribeEvent public static void onMouseInput(MouseInputEvent event) { - if (Minecraft.getInstance().currentScreen != null) + if (Minecraft.getInstance().screen != null) return; int button = event.getButton(); @@ -55,7 +55,7 @@ public class InputEvents { @SubscribeEvent public static void onClickInput(ClickInputEvent event) { - if (Minecraft.getInstance().currentScreen != null) + if (Minecraft.getInstance().screen != null) return; if (event.isUseItem()) diff --git a/src/main/java/com/simibubi/create/foundation/BreakProgressHook.java b/src/main/java/com/simibubi/create/foundation/BreakProgressHook.java index 34c16f20e..c77691c83 100644 --- a/src/main/java/com/simibubi/create/foundation/BreakProgressHook.java +++ b/src/main/java/com/simibubi/create/foundation/BreakProgressHook.java @@ -12,10 +12,10 @@ public class BreakProgressHook { public static void whenBreaking(ClientWorld world, WorldRenderer renderer, int playerEntityId, BlockPos pos, int progress) { if (AllBlocks.BELT.has(world.getBlockState(pos))) { - BeltTileEntity belt = (BeltTileEntity) world.getTileEntity(pos); + BeltTileEntity belt = (BeltTileEntity) world.getBlockEntity(pos); for (BlockPos beltPos : BeltBlock.getBeltChain(world, belt.getController())) { - renderer.sendBlockBreakProgress(beltPos.hashCode(), beltPos, progress); + renderer.destroyBlockProgress(beltPos.hashCode(), beltPos, progress); } } } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java index 56573292e..f5e4d5b02 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java @@ -45,135 +45,135 @@ public class AllAdvancements implements IDataProvider { public void register(Consumer t) { String id = Create.ID; - Advancement root = Advancement.Builder.builder() - .withDisplay(AllItems.BRASS_HAND.asStack(), new TranslationTextComponent(LANG + "root"), + Advancement root = Advancement.Builder.advancement() + .display(AllItems.BRASS_HAND.asStack(), new TranslationTextComponent(LANG + "root"), new TranslationTextComponent(LANG + "root.desc"), new ResourceLocation(Create.ID, "textures/block/palettes/gabbro/bricks.png"), FrameType.TASK, false, false, false) - .withCriterion("0", InventoryChangeTrigger.Instance.forItems(new IItemProvider[] {})) - .register(t, id + ":root"); + .addCriterion("0", InventoryChangeTrigger.Instance.hasItems(new IItemProvider[] {})) + .save(t, id + ":root"); Advancement andesite_alloy = - advancement("andesite_alloy", AllItems.ANDESITE_ALLOY.get(), TaskType.NORMAL).withParent(root) - .withCriterion("0", itemGathered(AllItems.ANDESITE_ALLOY.get())) - .register(t, id + ":andesite_alloy"); + advancement("andesite_alloy", AllItems.ANDESITE_ALLOY.get(), TaskType.NORMAL).parent(root) + .addCriterion("0", itemGathered(AllItems.ANDESITE_ALLOY.get())) + .save(t, id + ":andesite_alloy"); kineticsBranch(t, andesite_alloy); Advancement aesthetics = advancement("aesthetics", AllBlocks.WOODEN_BRACKET.get(), TaskType.NORMAL) - .withParent(andesite_alloy) - .withCriterion("0", AllTriggers.BRACKET_APPLY_TRIGGER.forEntries(AllBlocks.SHAFT.get())) - .withCriterion("1", + .parent(andesite_alloy) + .addCriterion("0", AllTriggers.BRACKET_APPLY_TRIGGER.forEntries(AllBlocks.SHAFT.get())) + .addCriterion("1", AllTriggers.BRACKET_APPLY_TRIGGER.forEntries(AllBlocks.COGWHEEL.get(), AllBlocks.LARGE_COGWHEEL.get())) - .withCriterion("2", AllTriggers.BRACKET_APPLY_TRIGGER.forEntries(AllBlocks.FLUID_PIPE.get())) - .register(t, id + ":aesthetics"); + .addCriterion("2", AllTriggers.BRACKET_APPLY_TRIGGER.forEntries(AllBlocks.FLUID_PIPE.get())) + .save(t, id + ":aesthetics"); Advancement reinforced = - advancement("reinforced", AllBlocks.ANDESITE_ENCASED_SHAFT.get(), TaskType.NORMAL).withParent(aesthetics) - .withCriterion("0", AllTriggers.CASING_SHAFT.instance()) - .withCriterion("1", AllTriggers.CASING_BELT.instance()) - .withCriterion("2", AllTriggers.CASING_PIPE.instance()) - .register(t, id + ":reinforced"); + advancement("reinforced", AllBlocks.ANDESITE_ENCASED_SHAFT.get(), TaskType.NORMAL).parent(aesthetics) + .addCriterion("0", AllTriggers.CASING_SHAFT.instance()) + .addCriterion("1", AllTriggers.CASING_BELT.instance()) + .addCriterion("2", AllTriggers.CASING_PIPE.instance()) + .save(t, id + ":reinforced"); Advancement water_wheel = - advancement("water_wheel", AllBlocks.WATER_WHEEL.get(), TaskType.NORMAL).withParent(andesite_alloy) - .withCriterion("0", placeBlock(AllBlocks.WATER_WHEEL.get())) - .withCriterion("1", AllTriggers.WATER_WHEEL.instance()) - .register(t, id + ":water_wheel"); + advancement("water_wheel", AllBlocks.WATER_WHEEL.get(), TaskType.NORMAL).parent(andesite_alloy) + .addCriterion("0", placeBlock(AllBlocks.WATER_WHEEL.get())) + .addCriterion("1", AllTriggers.WATER_WHEEL.instance()) + .save(t, id + ":water_wheel"); - Advancement lava_wheel = advancement("lava_wheel", Items.LAVA_BUCKET, TaskType.SECRET).withParent(water_wheel) - .withCriterion("0", AllTriggers.LAVA_WHEEL.instance()) - .register(t, id + ":lava_wheel"); + Advancement lava_wheel = advancement("lava_wheel", Items.LAVA_BUCKET, TaskType.SECRET).parent(water_wheel) + .addCriterion("0", AllTriggers.LAVA_WHEEL.instance()) + .save(t, id + ":lava_wheel"); Advancement chocolate_wheel = advancement("chocolate_wheel", AllFluids.CHOCOLATE.get() - .getFilledBucket(), TaskType.SECRET).withParent(water_wheel) - .withCriterion("0", AllTriggers.CHOCOLATE_WHEEL.instance()) - .register(t, id + ":chocolate_wheel"); + .getBucket(), TaskType.SECRET).parent(water_wheel) + .addCriterion("0", AllTriggers.CHOCOLATE_WHEEL.instance()) + .save(t, id + ":chocolate_wheel"); Advancement millstone = - kinecticAdvancement("millstone", AllBlocks.MILLSTONE.get(), TaskType.NORMAL).withParent(andesite_alloy) - .register(t, id + ":millstone"); + kinecticAdvancement("millstone", AllBlocks.MILLSTONE.get(), TaskType.NORMAL).parent(andesite_alloy) + .save(t, id + ":millstone"); Advancement cuckoo = - advancement("cuckoo", AllBlocks.CUCKOO_CLOCK.get(), TaskType.NORMAL).withParent(andesite_alloy) - .withCriterion("0", AllTriggers.CUCKOO.instance()) - .register(t, id + ":cuckoo"); + advancement("cuckoo", AllBlocks.CUCKOO_CLOCK.get(), TaskType.NORMAL).parent(andesite_alloy) + .addCriterion("0", AllTriggers.CUCKOO.instance()) + .save(t, id + ":cuckoo"); Advancement windmill = - advancement("windmill", AllBlocks.WINDMILL_BEARING.get(), TaskType.NORMAL).withParent(andesite_alloy) - .withCriterion("0", AllTriggers.WINDMILL.instance()) - .register(t, id + ":windmill"); + advancement("windmill", AllBlocks.WINDMILL_BEARING.get(), TaskType.NORMAL).parent(andesite_alloy) + .addCriterion("0", AllTriggers.WINDMILL.instance()) + .save(t, id + ":windmill"); Advancement maxed_windmill = - advancement("maxed_windmill", AllBlocks.WINDMILL_BEARING.get(), TaskType.GOAL).withParent(windmill) - .withCriterion("0", AllTriggers.MAXED_WINDMILL.instance()) - .register(t, id + ":maxed_windmill"); + advancement("maxed_windmill", AllBlocks.WINDMILL_BEARING.get(), TaskType.GOAL).parent(windmill) + .addCriterion("0", AllTriggers.MAXED_WINDMILL.instance()) + .save(t, id + ":maxed_windmill"); Advancement andesite_casing = - advancement("andesite_casing", AllBlocks.ANDESITE_CASING.get(), TaskType.GOAL).withParent(andesite_alloy) - .withCriterion("0", itemGathered(AllBlocks.ANDESITE_CASING.get())) - .register(t, id + ":andesite_casing"); + advancement("andesite_casing", AllBlocks.ANDESITE_CASING.get(), TaskType.GOAL).parent(andesite_alloy) + .addCriterion("0", itemGathered(AllBlocks.ANDESITE_CASING.get())) + .save(t, id + ":andesite_casing"); Advancement drill = kinecticAdvancement("mechanical_drill", AllBlocks.MECHANICAL_DRILL.get(), TaskType.NORMAL) - .withParent(andesite_casing) - .register(t, id + ":mechanical_drill"); + .parent(andesite_casing) + .save(t, id + ":mechanical_drill"); Advancement press = - advancement("press", AllBlocks.MECHANICAL_PRESS.get(), TaskType.MILESTONE).withParent(andesite_casing) - .withCriterion("0", AllTriggers.BONK.instance()) - .register(t, id + ":press"); + advancement("press", AllBlocks.MECHANICAL_PRESS.get(), TaskType.MILESTONE).parent(andesite_casing) + .addCriterion("0", AllTriggers.BONK.instance()) + .save(t, id + ":press"); - Advancement fan = advancement("fan", AllBlocks.ENCASED_FAN.get(), TaskType.NORMAL).withParent(press) - .withCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.NONE)) - .register(t, id + ":fan"); + Advancement fan = advancement("fan", AllBlocks.ENCASED_FAN.get(), TaskType.NORMAL).parent(press) + .addCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.NONE)) + .save(t, id + ":fan"); - Advancement fan_lava = advancement("fan_lava", Items.LAVA_BUCKET, TaskType.NORMAL).withParent(fan) - .withCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.BLASTING)) - .register(t, id + ":fan_lava"); + Advancement fan_lava = advancement("fan_lava", Items.LAVA_BUCKET, TaskType.NORMAL).parent(fan) + .addCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.BLASTING)) + .save(t, id + ":fan_lava"); - Advancement fan_smoke = advancement("fan_smoke", Items.CAMPFIRE, TaskType.NORMAL).withParent(fan) - .withCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.SMOKING)) - .register(t, id + ":fan_smoke"); + Advancement fan_smoke = advancement("fan_smoke", Items.CAMPFIRE, TaskType.NORMAL).parent(fan) + .addCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.SMOKING)) + .save(t, id + ":fan_smoke"); - Advancement fan_water = advancement("fan_water", Items.WATER_BUCKET, TaskType.NORMAL).withParent(fan) - .withCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.SPLASHING)) - .register(t, id + ":fan_water"); + Advancement fan_water = advancement("fan_water", Items.WATER_BUCKET, TaskType.NORMAL).parent(fan) + .addCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.SPLASHING)) + .save(t, id + ":fan_water"); Advancement rose_quartz = itemAdvancement("polished_rose_quartz", AllItems.POLISHED_ROSE_QUARTZ, TaskType.NORMAL) - .withParent(andesite_casing) - .register(t, id + ":polished_rose_quartz"); + .parent(andesite_casing) + .save(t, id + ":polished_rose_quartz"); Advancement electron_tube = - itemAdvancement("electron_tube", AllItems.ELECTRON_TUBE, TaskType.NORMAL).withParent(rose_quartz) - .register(t, id + ":electron_tube"); + itemAdvancement("electron_tube", AllItems.ELECTRON_TUBE, TaskType.NORMAL).parent(rose_quartz) + .save(t, id + ":electron_tube"); Advancement saw = - kinecticAdvancement("mechanical_saw", AllBlocks.MECHANICAL_SAW.get(), TaskType.NORMAL).withParent(press) - .register(t, id + ":mechanical_saw"); + kinecticAdvancement("mechanical_saw", AllBlocks.MECHANICAL_SAW.get(), TaskType.NORMAL).parent(press) + .save(t, id + ":mechanical_saw"); - Advancement basin = advancement("basin", AllBlocks.BASIN.get(), TaskType.NORMAL).withParent(press) - .withCriterion("0", placeBlock(AllBlocks.BASIN.get())) - .withCriterion("1", AllTriggers.BASIN_THROW.instance()) - .register(t, id + ":basin"); + Advancement basin = advancement("basin", AllBlocks.BASIN.get(), TaskType.NORMAL).parent(press) + .addCriterion("0", placeBlock(AllBlocks.BASIN.get())) + .addCriterion("1", AllTriggers.BASIN_THROW.instance()) + .save(t, id + ":basin"); Advancement mixer = advancement("mixer", AllBlocks.MECHANICAL_MIXER.get(), TaskType.MILESTONE) - .withCriterion("0", placeBlock(AllBlocks.MECHANICAL_MIXER.get())) - .withCriterion("1", AllTriggers.MIXER_MIX.instance()) - .withParent(basin) - .register(t, id + ":mixer"); + .addCriterion("0", placeBlock(AllBlocks.MECHANICAL_MIXER.get())) + .addCriterion("1", AllTriggers.MIXER_MIX.instance()) + .parent(basin) + .save(t, id + ":mixer"); Advancement compact = advancement("compact", Blocks.IRON_BLOCK, TaskType.NORMAL) - .withCriterion("0", AllTriggers.PRESS_COMPACT.instance()) - .withParent(basin) - .register(t, id + ":compact"); + .addCriterion("0", AllTriggers.PRESS_COMPACT.instance()) + .parent(basin) + .save(t, id + ":compact"); Advancement blaze_burner = - itemAdvancement("blaze_burner", AllBlocks.BLAZE_BURNER, TaskType.NORMAL).withParent(mixer) - .register(t, id + ":blaze_burner"); + itemAdvancement("blaze_burner", AllBlocks.BLAZE_BURNER, TaskType.NORMAL).parent(mixer) + .save(t, id + ":blaze_burner"); - Advancement brass = itemAdvancement("brass", AllItems.BRASS_INGOT, TaskType.NORMAL).withParent(blaze_burner) - .register(t, id + ":brass"); + Advancement brass = itemAdvancement("brass", AllItems.BRASS_INGOT, TaskType.NORMAL).parent(blaze_burner) + .save(t, id + ":brass"); brassAge(t, brass); copperAge(t, press); @@ -182,64 +182,64 @@ public class AllAdvancements implements IDataProvider { void kineticsBranch(Consumer t, Advancement root) { String id = Create.ID; - Advancement its_alive = advancement("its_alive", AllBlocks.COGWHEEL.get(), TaskType.NORMAL).withParent(root) - .withCriterion("0", AllTriggers.ROTATION.instance()) - .register(t, id + ":its_alive"); + Advancement its_alive = advancement("its_alive", AllBlocks.COGWHEEL.get(), TaskType.NORMAL).parent(root) + .addCriterion("0", AllTriggers.ROTATION.instance()) + .save(t, id + ":its_alive"); - Advancement belt = advancement("belt", AllItems.BELT_CONNECTOR.get(), TaskType.NORMAL).withParent(its_alive) - .withCriterion("0", AllTriggers.CONNECT_BELT.instance()) - .register(t, id + ":belt"); + Advancement belt = advancement("belt", AllItems.BELT_CONNECTOR.get(), TaskType.NORMAL).parent(its_alive) + .addCriterion("0", AllTriggers.CONNECT_BELT.instance()) + .save(t, id + ":belt"); - Advancement tunnel = advancement("tunnel", AllBlocks.ANDESITE_TUNNEL.get(), TaskType.NORMAL).withParent(belt) - .withCriterion("0", AllTriggers.PLACE_TUNNEL.instance()) - .register(t, id + ":tunnel"); + Advancement tunnel = advancement("tunnel", AllBlocks.ANDESITE_TUNNEL.get(), TaskType.NORMAL).parent(belt) + .addCriterion("0", AllTriggers.PLACE_TUNNEL.instance()) + .save(t, id + ":tunnel"); Advancement splitter_tunnel = - advancement("splitter_tunnel", AllBlocks.BRASS_TUNNEL.get(), TaskType.MILESTONE).withParent(tunnel) - .withCriterion("0", AllTriggers.CONNECT_TUNNEL.instance()) - .register(t, id + ":splitter_tunnel"); + advancement("splitter_tunnel", AllBlocks.BRASS_TUNNEL.get(), TaskType.MILESTONE).parent(tunnel) + .addCriterion("0", AllTriggers.CONNECT_TUNNEL.instance()) + .save(t, id + ":splitter_tunnel"); - Advancement chute = advancement("chute", AllBlocks.CHUTE.get(), TaskType.NORMAL).withParent(belt) - .withCriterion("0", placeBlock(AllBlocks.CHUTE.get())) - .register(t, id + ":chute"); + Advancement chute = advancement("chute", AllBlocks.CHUTE.get(), TaskType.NORMAL).parent(belt) + .addCriterion("0", placeBlock(AllBlocks.CHUTE.get())) + .save(t, id + ":chute"); Advancement upward_chute = - advancement("upward_chute", AllBlocks.ENCASED_FAN.get(), TaskType.NORMAL).withParent(chute) - .withCriterion("0", AllTriggers.UPWARD_CHUTE.instance()) - .register(t, id + ":upward_chute"); + advancement("upward_chute", AllBlocks.ENCASED_FAN.get(), TaskType.NORMAL).parent(chute) + .addCriterion("0", AllTriggers.UPWARD_CHUTE.instance()) + .save(t, id + ":upward_chute"); Advancement belt_funnel = - advancement("belt_funnel", AllBlocks.ANDESITE_FUNNEL.get(), TaskType.NORMAL).withParent(belt) - .withCriterion("0", AllTriggers.BELT_FUNNEL.instance()) - .register(t, id + ":belt_funnel"); + advancement("belt_funnel", AllBlocks.ANDESITE_FUNNEL.get(), TaskType.NORMAL).parent(belt) + .addCriterion("0", AllTriggers.BELT_FUNNEL.instance()) + .save(t, id + ":belt_funnel"); Advancement belt_funnel_kiss = - advancement("belt_funnel_kiss", AllBlocks.BRASS_FUNNEL.get(), TaskType.SECRET).withParent(belt_funnel) - .withCriterion("0", AllTriggers.BELT_FUNNEL_KISS.instance()) - .register(t, id + ":belt_funnel_kiss"); + advancement("belt_funnel_kiss", AllBlocks.BRASS_FUNNEL.get(), TaskType.SECRET).parent(belt_funnel) + .addCriterion("0", AllTriggers.BELT_FUNNEL_KISS.instance()) + .save(t, id + ":belt_funnel_kiss"); - Advancement wrench = itemAdvancement("wrench", AllItems.WRENCH, TaskType.NORMAL).withParent(its_alive) - .register(t, id + ":wrench"); + Advancement wrench = itemAdvancement("wrench", AllItems.WRENCH, TaskType.NORMAL).parent(its_alive) + .save(t, id + ":wrench"); - Advancement goggles = itemAdvancement("goggles", AllItems.GOGGLES, TaskType.NORMAL).withParent(its_alive) - .register(t, id + ":goggles"); + Advancement goggles = itemAdvancement("goggles", AllItems.GOGGLES, TaskType.NORMAL).parent(its_alive) + .save(t, id + ":goggles"); Advancement speed_gauge = - kinecticAdvancement("speedometer", AllBlocks.SPEEDOMETER.get(), TaskType.NORMAL).withParent(goggles) - .register(t, id + ":speedometer"); + kinecticAdvancement("speedometer", AllBlocks.SPEEDOMETER.get(), TaskType.NORMAL).parent(goggles) + .save(t, id + ":speedometer"); Advancement stress_gauge = - kinecticAdvancement("stressometer", AllBlocks.STRESSOMETER.get(), TaskType.NORMAL).withParent(goggles) - .register(t, id + ":stressometer"); + kinecticAdvancement("stressometer", AllBlocks.STRESSOMETER.get(), TaskType.NORMAL).parent(goggles) + .save(t, id + ":stressometer"); Advancement shifting_gears = - advancement("shifting_gears", AllBlocks.LARGE_COGWHEEL.get(), TaskType.NORMAL).withParent(its_alive) - .withCriterion("0", AllTriggers.SHIFTING_GEARS.instance()) - .register(t, id + ":shifting_gears"); + advancement("shifting_gears", AllBlocks.LARGE_COGWHEEL.get(), TaskType.NORMAL).parent(its_alive) + .addCriterion("0", AllTriggers.SHIFTING_GEARS.instance()) + .save(t, id + ":shifting_gears"); - Advancement overstressed = advancement("overstressed", Items.BARRIER, TaskType.SECRET).withParent(its_alive) - .withCriterion("0", AllTriggers.OVERSTRESSED.instance()) - .register(t, id + ":overstressed"); + Advancement overstressed = advancement("overstressed", Items.BARRIER, TaskType.SECRET).parent(its_alive) + .addCriterion("0", AllTriggers.OVERSTRESSED.instance()) + .save(t, id + ":overstressed"); } @@ -247,190 +247,190 @@ public class AllAdvancements implements IDataProvider { String id = Create.ID; Advancement copper_casing = - advancement("copper_casing", AllBlocks.COPPER_CASING.get(), TaskType.GOAL).withParent(root) - .withCriterion("0", itemGathered(AllBlocks.COPPER_CASING.get())) - .register(t, id + ":copper_casing"); + advancement("copper_casing", AllBlocks.COPPER_CASING.get(), TaskType.GOAL).parent(root) + .addCriterion("0", itemGathered(AllBlocks.COPPER_CASING.get())) + .save(t, id + ":copper_casing"); Advancement item_drain = - advancement("item_drain", AllBlocks.ITEM_DRAIN.get(), TaskType.NORMAL).withParent(copper_casing) - .withCriterion("0", AllTriggers.ITEM_DRAIN.instance()) - .register(t, id + ":item_drain"); + advancement("item_drain", AllBlocks.ITEM_DRAIN.get(), TaskType.NORMAL).parent(copper_casing) + .addCriterion("0", AllTriggers.ITEM_DRAIN.instance()) + .save(t, id + ":item_drain"); Advancement chained_item_drain = - advancement("chained_item_drain", AllBlocks.ITEM_DRAIN.get(), TaskType.SECRET).withParent(item_drain) - .withCriterion("0", AllTriggers.CHAINED_ITEM_DRAIN.instance()) - .register(t, id + ":chained_item_drain"); + advancement("chained_item_drain", AllBlocks.ITEM_DRAIN.get(), TaskType.SECRET).parent(item_drain) + .addCriterion("0", AllTriggers.CHAINED_ITEM_DRAIN.instance()) + .save(t, id + ":chained_item_drain"); - Advancement spout = advancement("spout", AllBlocks.SPOUT.get(), TaskType.NORMAL).withParent(copper_casing) - .withCriterion("0", AllTriggers.SPOUT.instance()) - .register(t, id + ":spout"); + Advancement spout = advancement("spout", AllBlocks.SPOUT.get(), TaskType.NORMAL).parent(copper_casing) + .addCriterion("0", AllTriggers.SPOUT.instance()) + .save(t, id + ":spout"); - Advancement spout_potion = advancement("spout_potion", Items.POTION, TaskType.GOAL).withParent(spout) - .withCriterion("0", AllTriggers.SPOUT_POTION.instance()) - .register(t, id + ":spout_potion"); + Advancement spout_potion = advancement("spout_potion", Items.POTION, TaskType.GOAL).parent(spout) + .addCriterion("0", AllTriggers.SPOUT_POTION.instance()) + .save(t, id + ":spout_potion"); Advancement chocolate = itemAdvancement("chocolate", () -> AllFluids.CHOCOLATE.get() - .getFilledBucket(), TaskType.GOAL).withParent(spout) - .register(t, id + ":chocolate"); + .getBucket(), TaskType.GOAL).parent(spout) + .save(t, id + ":chocolate"); Advancement glass_pipe = - advancement("glass_pipe", AllBlocks.FLUID_PIPE.get(), TaskType.NORMAL).withParent(copper_casing) - .withCriterion("0", AllTriggers.GLASS_PIPE.instance()) - .register(t, id + ":glass_pipe"); + advancement("glass_pipe", AllBlocks.FLUID_PIPE.get(), TaskType.NORMAL).parent(copper_casing) + .addCriterion("0", AllTriggers.GLASS_PIPE.instance()) + .save(t, id + ":glass_pipe"); Advancement pipe_collision = - advancement("pipe_collision", AllBlocks.FLUID_VALVE.get(), TaskType.NORMAL).withParent(glass_pipe) - .withCriterion("0", AllTriggers.PIPE_COLLISION.instance()) - .register(t, id + ":pipe_collision"); + advancement("pipe_collision", AllBlocks.FLUID_VALVE.get(), TaskType.NORMAL).parent(glass_pipe) + .addCriterion("0", AllTriggers.PIPE_COLLISION.instance()) + .save(t, id + ":pipe_collision"); - Advancement pipe_spill = advancement("pipe_spill", Items.BUCKET, TaskType.NORMAL).withParent(glass_pipe) - .withCriterion("0", AllTriggers.PIPE_SPILL.instance()) - .register(t, id + ":pipe_spill"); + Advancement pipe_spill = advancement("pipe_spill", Items.BUCKET, TaskType.NORMAL).parent(glass_pipe) + .addCriterion("0", AllTriggers.PIPE_SPILL.instance()) + .save(t, id + ":pipe_spill"); Advancement hose_pulley = - advancement("hose_pulley", AllBlocks.HOSE_PULLEY.get(), TaskType.NORMAL).withParent(pipe_spill) - .withCriterion("0", AllTriggers.HOSE_PULLEY.instance()) - .register(t, id + ":hose_pulley"); + advancement("hose_pulley", AllBlocks.HOSE_PULLEY.get(), TaskType.NORMAL).parent(pipe_spill) + .addCriterion("0", AllTriggers.HOSE_PULLEY.instance()) + .save(t, id + ":hose_pulley"); Advancement infinite_water = - advancement("infinite_water", Items.WATER_BUCKET, TaskType.NORMAL).withParent(hose_pulley) - .withCriterion("0", isInfinite(Fluids.WATER)) - .register(t, id + ":infinite_water"); + advancement("infinite_water", Items.WATER_BUCKET, TaskType.NORMAL).parent(hose_pulley) + .addCriterion("0", isInfinite(Fluids.WATER)) + .save(t, id + ":infinite_water"); Advancement infinite_lava = - advancement("infinite_lava", Items.LAVA_BUCKET, TaskType.GOAL).withParent(hose_pulley) - .withCriterion("0", isInfinite(Fluids.LAVA)) - .register(t, id + ":infinite_lava"); + advancement("infinite_lava", Items.LAVA_BUCKET, TaskType.GOAL).parent(hose_pulley) + .addCriterion("0", isInfinite(Fluids.LAVA)) + .save(t, id + ":infinite_lava"); Advancement infinite_chocolate = advancement("infinite_chocolate", AllFluids.CHOCOLATE.get() - .getFilledBucket(), TaskType.CHALLENGE).withParent(hose_pulley) - .withCriterion("0", isInfinite(AllFluids.CHOCOLATE.get())) - .register(t, id + ":infinite_chocolate"); + .getBucket(), TaskType.CHALLENGE).parent(hose_pulley) + .addCriterion("0", isInfinite(AllFluids.CHOCOLATE.get())) + .save(t, id + ":infinite_chocolate"); } void brassAge(Consumer t, Advancement root) { String id = Create.ID; Advancement brass_casing = - advancement("brass_casing", AllBlocks.BRASS_CASING.get(), TaskType.GOAL).withParent(root) - .withCriterion("0", itemGathered(AllBlocks.BRASS_CASING.get())) - .register(t, id + ":brass_casing"); + advancement("brass_casing", AllBlocks.BRASS_CASING.get(), TaskType.GOAL).parent(root) + .addCriterion("0", itemGathered(AllBlocks.BRASS_CASING.get())) + .save(t, id + ":brass_casing"); Advancement nixie_tube = - advancement("nixie_tube", AllBlocks.NIXIE_TUBE.get(), TaskType.NORMAL).withParent(brass_casing) - .withCriterion("0", placeBlock(AllBlocks.NIXIE_TUBE.get())) - .register(t, id + ":nixie_tube"); + advancement("nixie_tube", AllBlocks.ORANGE_NIXIE_TUBE.get(), TaskType.NORMAL).parent(brass_casing) + .addCriterion("0", placeBlock(AllBlocks.ORANGE_NIXIE_TUBE.get())) + .save(t, id + ":nixie_tube"); Advancement crafter = kinecticAdvancement("crafter", AllBlocks.MECHANICAL_CRAFTER.get(), TaskType.MILESTONE) - .withParent(brass_casing) - .register(t, id + ":crafter"); + .parent(brass_casing) + .save(t, id + ":crafter"); - Advancement flywheel = advancement("flywheel", AllBlocks.FLYWHEEL.get(), TaskType.NORMAL).withParent(crafter) - .withCriterion("0", AllTriggers.FLYWHEEL.instance()) - .register(t, id + ":flywheel"); + Advancement flywheel = advancement("flywheel", AllBlocks.FLYWHEEL.get(), TaskType.NORMAL).parent(crafter) + .addCriterion("0", AllTriggers.FLYWHEEL.instance()) + .save(t, id + ":flywheel"); Advancement overstress_flywheel = - advancement("overstress_flywheel", AllBlocks.FURNACE_ENGINE.get(), TaskType.CHALLENGE).withParent(flywheel) - .withCriterion("0", AllTriggers.OVERSTRESS_FLYWHEEL.instance()) - .register(t, id + ":overstress_flywheel"); + advancement("overstress_flywheel", AllBlocks.FURNACE_ENGINE.get(), TaskType.CHALLENGE).parent(flywheel) + .addCriterion("0", AllTriggers.OVERSTRESS_FLYWHEEL.instance()) + .save(t, id + ":overstress_flywheel"); Advancement clockwork_bearing = advancement("clockwork_bearing", AllBlocks.CLOCKWORK_BEARING.get(), TaskType.NORMAL) - .withParent(brass_casing) - .withCriterion("0", AllTriggers.CLOCKWORK_BEARING.instance()) - .register(t, id + ":clockwork_bearing"); + .parent(brass_casing) + .addCriterion("0", AllTriggers.CLOCKWORK_BEARING.instance()) + .save(t, id + ":clockwork_bearing"); Advancement mechanical_arm = advancement("mechanical_arm", AllBlocks.MECHANICAL_ARM.get(), TaskType.MILESTONE) - .withCriterion("0", AllTriggers.MECHANICAL_ARM.instance()) - .withParent(brass_casing) - .register(t, id + ":mechanical_arm"); + .addCriterion("0", AllTriggers.MECHANICAL_ARM.instance()) + .parent(brass_casing) + .save(t, id + ":mechanical_arm"); Advancement musical_arm = advancement("musical_arm", Items.MUSIC_DISC_13, TaskType.MILESTONE) - .withCriterion("0", AllTriggers.MUSICAL_ARM.instance()) - .withParent(mechanical_arm) - .register(t, id + ":musical_arm"); + .addCriterion("0", AllTriggers.MUSICAL_ARM.instance()) + .parent(mechanical_arm) + .save(t, id + ":musical_arm"); Advancement arm_many_targets = advancement("arm_many_targets", AllBlocks.BRASS_FUNNEL.get(), TaskType.MILESTONE) - .withCriterion("0", AllTriggers.ARM_MANY_TARGETS.instance()) - .withParent(mechanical_arm) - .register(t, id + ":arm_many_targets"); + .addCriterion("0", AllTriggers.ARM_MANY_TARGETS.instance()) + .parent(mechanical_arm) + .save(t, id + ":arm_many_targets"); Advancement arm_blaze_burner = advancement("arm_blaze_burner", AllBlocks.BLAZE_BURNER.get(), TaskType.NORMAL) - .withCriterion("0", AllTriggers.ARM_BLAZE_BURNER.instance()) - .withParent(mechanical_arm) - .register(t, id + ":arm_blaze_burner"); + .addCriterion("0", AllTriggers.ARM_BLAZE_BURNER.instance()) + .parent(mechanical_arm) + .save(t, id + ":arm_blaze_burner"); Advancement deployer = - kinecticAdvancement("deployer", AllBlocks.DEPLOYER.get(), TaskType.MILESTONE).withParent(brass_casing) - .register(t, id + ":deployer"); + kinecticAdvancement("deployer", AllBlocks.DEPLOYER.get(), TaskType.MILESTONE).parent(brass_casing) + .save(t, id + ":deployer"); Advancement clockwork_component = - itemAdvancement("clockwork_component", AllItems.CLOCKWORK_COMPONENT, TaskType.NORMAL).withParent(deployer) - .register(t, id + ":clockwork_component"); + itemAdvancement("precision_mechanism", AllItems.PRECISION_MECHANISM, TaskType.NORMAL).parent(deployer) + .save(t, id + ":precision_mechanism"); - Advancement clockwork_component_eob = deadEnd().withParent(clockwork_component) - .withCriterion("0", itemGathered(AllItems.CLOCKWORK_COMPONENT.get())) - .register(t, id + ":clockwork_component_eob"); + Advancement clockwork_component_eob = deadEnd().parent(clockwork_component) + .addCriterion("0", itemGathered(AllItems.PRECISION_MECHANISM.get())) + .save(t, id + ":clockwork_component_eob"); Advancement extendo_grip = - advancement("extendo_grip", AllItems.EXTENDO_GRIP.get(), TaskType.NORMAL).withParent(clockwork_component) - .withCriterion("0", AllTriggers.EXTENDO.instance()) - .register(t, id + ":extendo_grip"); + advancement("extendo_grip", AllItems.EXTENDO_GRIP.get(), TaskType.NORMAL).parent(clockwork_component) + .addCriterion("0", AllTriggers.EXTENDO.instance()) + .save(t, id + ":extendo_grip"); Advancement potato_cannon = - advancement("potato_cannon", AllItems.POTATO_CANNON.get(), TaskType.GOAL).withParent(clockwork_component) - .withCriterion("0", AllTriggers.POTATO_KILL.instance()) - .register(t, id + ":potato_cannon"); + advancement("potato_cannon", AllItems.POTATO_CANNON.get(), TaskType.GOAL).parent(clockwork_component) + .addCriterion("0", AllTriggers.POTATO_KILL.instance()) + .save(t, id + ":potato_cannon"); Advancement dual_extendo_grip = - advancement("dual_extendo_grip", AllItems.EXTENDO_GRIP.get(), TaskType.SECRET).withParent(extendo_grip) - .withCriterion("0", AllTriggers.GIGA_EXTENDO.instance()) - .register(t, id + ":dual_extendo_grip"); + advancement("dual_extendo_grip", AllItems.EXTENDO_GRIP.get(), TaskType.SECRET).parent(extendo_grip) + .addCriterion("0", AllTriggers.GIGA_EXTENDO.instance()) + .save(t, id + ":dual_extendo_grip"); Advancement speed_controller = kinecticAdvancement("speed_controller", AllBlocks.ROTATION_SPEED_CONTROLLER.get(), TaskType.NORMAL) - .withParent(clockwork_component) - .register(t, id + ":speed_controller"); + .parent(clockwork_component) + .save(t, id + ":speed_controller"); - Advancement fist_bump = advancement("fist_bump", AllBlocks.DEPLOYER.get(), TaskType.SECRET).withParent(deployer) - .withCriterion("0", AllTriggers.DEPLOYER_BOOP.instance()) - .register(t, id + ":fist_bump"); + Advancement fist_bump = advancement("fist_bump", AllBlocks.DEPLOYER.get(), TaskType.SECRET).parent(deployer) + .addCriterion("0", AllTriggers.DEPLOYER_BOOP.instance()) + .save(t, id + ":fist_bump"); Advancement crushing_wheel = - advancement("crushing_wheel", AllBlocks.CRUSHING_WHEEL.get(), TaskType.MILESTONE).withParent(crafter) - .withCriterion("0", itemGathered(AllBlocks.CRUSHING_WHEEL.get())) - .register(t, id + ":crushing_wheel"); + advancement("crushing_wheel", AllBlocks.CRUSHING_WHEEL.get(), TaskType.MILESTONE).parent(crafter) + .addCriterion("0", itemGathered(AllBlocks.CRUSHING_WHEEL.get())) + .save(t, id + ":crushing_wheel"); Advancement blaze_cake = - itemAdvancement("blaze_cake", AllItems.BLAZE_CAKE, TaskType.NORMAL).withParent(crushing_wheel) - .register(t, id + ":blaze_cake"); + itemAdvancement("blaze_cake", AllItems.BLAZE_CAKE, TaskType.NORMAL).parent(crushing_wheel) + .save(t, id + ":blaze_cake"); Advancement chromatic_compound = - itemAdvancement("chromatic_compound", AllItems.CHROMATIC_COMPOUND, TaskType.NORMAL).withParent(blaze_cake) - .register(t, id + ":chromatic_compound"); + itemAdvancement("chromatic_compound", AllItems.CHROMATIC_COMPOUND, TaskType.NORMAL).parent(blaze_cake) + .save(t, id + ":chromatic_compound"); Advancement shadow_steel = - itemAdvancement("shadow_steel", AllItems.SHADOW_STEEL, TaskType.GOAL).withParent(chromatic_compound) - .register(t, id + ":shadow_steel"); + itemAdvancement("shadow_steel", AllItems.SHADOW_STEEL, TaskType.GOAL).parent(chromatic_compound) + .save(t, id + ":shadow_steel"); Advancement refined_radiance = - itemAdvancement("refined_radiance", AllItems.REFINED_RADIANCE, TaskType.GOAL).withParent(chromatic_compound) - .register(t, id + ":refined_radiance"); + itemAdvancement("refined_radiance", AllItems.REFINED_RADIANCE, TaskType.GOAL).parent(chromatic_compound) + .save(t, id + ":refined_radiance"); Advancement chromatic_age = advancement("chromatic_age", AllBlocks.REFINED_RADIANCE_CASING.get(), TaskType.GOAL) - .withParent(chromatic_compound) - .withCriterion("0", itemGathered(AllBlocks.SHADOW_STEEL_CASING.get())) - .withCriterion("1", itemGathered(AllBlocks.REFINED_RADIANCE_CASING.get())) - .register(t, id + "chromatic_age"); + .parent(chromatic_compound) + .addCriterion("0", itemGathered(AllBlocks.SHADOW_STEEL_CASING.get())) + .addCriterion("1", itemGathered(AllBlocks.REFINED_RADIANCE_CASING.get())) + .save(t, id + "chromatic_age"); - Advancement chromatic_eob = deadEnd().withParent(chromatic_age) - .withCriterion("0", itemGathered(AllBlocks.SHADOW_STEEL_CASING.get())) - .withCriterion("1", itemGathered(AllBlocks.REFINED_RADIANCE_CASING.get())) - .register(t, id + ":chromatic_eob"); + Advancement chromatic_eob = deadEnd().parent(chromatic_age) + .addCriterion("0", itemGathered(AllBlocks.SHADOW_STEEL_CASING.get())) + .addCriterion("1", itemGathered(AllBlocks.REFINED_RADIANCE_CASING.get())) + .save(t, id + ":chromatic_eob"); Advancement symmetry_wand = - itemAdvancement("wand_of_symmetry", AllItems.WAND_OF_SYMMETRY, TaskType.NORMAL).withParent(refined_radiance) - .register(t, id + ":wand_of_symmetry"); + itemAdvancement("wand_of_symmetry", AllItems.WAND_OF_SYMMETRY, TaskType.NORMAL).parent(refined_radiance) + .save(t, id + ":wand_of_symmetry"); } @@ -446,7 +446,7 @@ public class AllAdvancements implements IDataProvider { } @Override - public void act(DirectoryCache cache) throws IOException { + public void run(DirectoryCache cache) throws IOException { Path path = this.generator.getOutputFolder(); Set set = Sets.newHashSet(); Consumer consumer = (p_204017_3_) -> { @@ -456,8 +456,8 @@ public class AllAdvancements implements IDataProvider { Path path1 = getPath(path, p_204017_3_); try { - IDataProvider.save(GSON, cache, p_204017_3_.copy() - .serialize(), path1); + IDataProvider.save(GSON, cache, p_204017_3_.deconstruct() + .serializeToJson(), path1); } catch (IOException ioexception) { LOGGER.error("Couldn't save advancement {}", path1, ioexception); } @@ -484,11 +484,11 @@ public class AllAdvancements implements IDataProvider { } public RegistryTrigger.Instance isInfinite(FlowingFluid fluid) { - return AllTriggers.INFINITE_FLUID.forEntries(fluid.getStillFluid()); + return AllTriggers.INFINITE_FLUID.forEntries(fluid.getSource()); } public InventoryChangeTrigger.Instance itemGathered(IItemProvider itemprovider) { - return InventoryChangeTrigger.Instance.forItems(itemprovider); + return InventoryChangeTrigger.Instance.hasItems(itemprovider); } static enum TaskType { @@ -516,7 +516,7 @@ public class AllAdvancements implements IDataProvider { } public Builder kinecticAdvancement(String name, Block block, TaskType type) { - return advancement(name, block, type).withCriterion("0", placeBlock(block)); + return advancement(name, block, type).addCriterion("0", placeBlock(block)); // .withCriterion("1", isPowered(block)); Duplicate toast } @@ -529,14 +529,14 @@ public class AllAdvancements implements IDataProvider { } public Builder advancement(String name, ItemStack icon, TaskType type) { - return Advancement.Builder.builder() - .withDisplay(icon, new TranslationTextComponent(LANG + name), + return Advancement.Builder.advancement() + .display(icon, new TranslationTextComponent(LANG + name), new TranslationTextComponent(LANG + name + ".desc"), null, type.frame, type.toast, type.announce, type.hide); } public Builder itemAdvancement(String name, Supplier item, TaskType type) { - return advancement(name, item.get(), type).withCriterion("0", itemGathered(item.get())); + return advancement(name, item.get(), type).addCriterion("0", itemGathered(item.get())); } } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index 12ecd41c9..d3af35134 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -72,7 +72,7 @@ public class AllTriggers { Predicate playerFilter) { if (world == null) return; - if (world.isRemote()) + if (world.isClientSide()) return; List players = getPlayersInRange(world, pos, range); players.stream() @@ -81,6 +81,6 @@ public class AllTriggers { } public static List getPlayersInRange(IWorld world, BlockPos pos, int range) { - return world.getEntitiesWithinAABB(ServerPlayerEntity.class, new AxisAlignedBB(pos).grow(range)); + return world.getEntitiesOfClass(ServerPlayerEntity.class, new AxisAlignedBB(pos).inflate(range)); } } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java b/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java index c1acd07f4..c6389a6cb 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java @@ -33,14 +33,14 @@ public abstract class CriterionTriggerBase>> listeners = Maps.newHashMap(); @Override - public void addListener(PlayerAdvancements playerAdvancementsIn, Listener listener) { + public void addPlayerListener(PlayerAdvancements playerAdvancementsIn, Listener listener) { Set> playerListeners = this.listeners.computeIfAbsent(playerAdvancementsIn, k -> new HashSet<>()); playerListeners.add(listener); } @Override - public void removeListener(PlayerAdvancements playerAdvancementsIn, Listener listener) { + public void removePlayerListener(PlayerAdvancements playerAdvancementsIn, Listener listener) { Set> playerListeners = this.listeners.get(playerAdvancementsIn); if (playerListeners != null) { playerListeners.remove(listener); @@ -51,7 +51,7 @@ public abstract class CriterionTriggerBase> list = new LinkedList<>(); for (Listener listener : playerListeners) { - if (listener.getCriterionInstance() + if (listener.getTriggerInstance() .test(suppliers)) { list.add(listener); } } - list.forEach(listener -> listener.grantCriterion(playerAdvancements)); + list.forEach(listener -> listener.run(playerAdvancements)); } } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/SimpleTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/SimpleTrigger.java index 7713bf39d..49ec625e1 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/SimpleTrigger.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/SimpleTrigger.java @@ -23,7 +23,7 @@ public class SimpleTrigger extends CriterionTriggerBase } @Override - public Instance conditionsFromJson(JsonObject json, ConditionArrayParser context) { + public Instance createInstance(JsonObject json, ConditionArrayParser context) { return new Instance(getId()); } @@ -38,7 +38,7 @@ public class SimpleTrigger extends CriterionTriggerBase public static class Instance extends CriterionTriggerBase.Instance { public Instance(ResourceLocation idIn) { - super(idIn, EntityPredicate.AndPredicate.EMPTY); // FIXME: Is this right? + super(idIn, EntityPredicate.AndPredicate.ANY); // FIXME: Is this right? } @Override diff --git a/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java index 125e4772d..0c2c3b8fe 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java @@ -48,7 +48,7 @@ public abstract class StringSerializableTrigger extends CriterionTriggerBase< } @Override - public Instance conditionsFromJson(JsonObject json, ConditionArrayParser context) { + public Instance createInstance(JsonObject json, ConditionArrayParser context) { if (json.has(getJsonKey())) { JsonArray elements = json.getAsJsonArray(getJsonKey()); return new Instance<>(this, StreamSupport.stream(elements.spliterator(), false) @@ -77,7 +77,7 @@ public abstract class StringSerializableTrigger extends CriterionTriggerBase< private final StringSerializableTrigger trigger; public Instance(StringSerializableTrigger trigger, @Nullable Set entries) { - super(trigger.getId(), EntityPredicate.AndPredicate.EMPTY); + super(trigger.getId(), EntityPredicate.AndPredicate.ANY); this.trigger = trigger; this.entries = entries; } @@ -91,8 +91,8 @@ public abstract class StringSerializableTrigger extends CriterionTriggerBase< } @Override - public JsonObject toJson(ConditionArraySerializer p_230240_1_) { - JsonObject jsonobject = super.toJson(p_230240_1_); + public JsonObject serializeToJson(ConditionArraySerializer p_230240_1_) { + JsonObject jsonobject = super.serializeToJson(p_230240_1_); JsonArray elements = new JsonArray(); if (entries == null) { diff --git a/src/main/java/com/simibubi/create/foundation/block/ITE.java b/src/main/java/com/simibubi/create/foundation/block/ITE.java index 16eae3ba0..f84a378ae 100644 --- a/src/main/java/com/simibubi/create/foundation/block/ITE.java +++ b/src/main/java/com/simibubi/create/foundation/block/ITE.java @@ -31,7 +31,7 @@ public interface ITE { @Nullable @SuppressWarnings("unchecked") default T getTileEntity(IBlockReader worldIn, BlockPos pos) { - TileEntity tileEntity = worldIn.getTileEntity(pos); + TileEntity tileEntity = worldIn.getBlockEntity(pos); Class expectedClass = getTileEntityClass(); if (tileEntity == null) diff --git a/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java b/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java index 9d3dbf59b..5dfee53d8 100644 --- a/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java +++ b/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java @@ -39,9 +39,9 @@ public class ItemUseOverrides { BlockRayTraceResult blockTrace = new BlockRayTraceResult(VecHelper.getCenterOf(event.getPos()), event.getFace(), event.getPos(), true); - ActionResultType result = state.onUse(event.getWorld(), event.getPlayer(), event.getHand(), blockTrace); + ActionResultType result = state.use(event.getWorld(), event.getPlayer(), event.getHand(), blockTrace); - if (!result.isAccepted()) + if (!result.consumesAction()) return; event.setCanceled(true); diff --git a/src/main/java/com/simibubi/create/foundation/block/ProperDirectionalBlock.java b/src/main/java/com/simibubi/create/foundation/block/ProperDirectionalBlock.java index c7e30cb34..1d294eb84 100644 --- a/src/main/java/com/simibubi/create/foundation/block/ProperDirectionalBlock.java +++ b/src/main/java/com/simibubi/create/foundation/block/ProperDirectionalBlock.java @@ -19,36 +19,36 @@ public class ProperDirectionalBlock extends DirectionalBlock implements IWrencha } @Override - protected void fillStateContainer(Builder builder) { + protected void createBlockStateDefinition(Builder builder) { builder.add(FACING); - super.fillStateContainer(builder); + super.createBlockStateDefinition(builder); } @Override public BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace) { - Direction facing = originalState.get(FACING); + Direction facing = originalState.getValue(FACING); if (facing.getAxis() == targetedFace.getAxis()) return originalState; Direction newFacing = DirectionHelper.rotateAround(facing, targetedFace.getAxis()); - return originalState.with(FACING, newFacing); + return originalState.setValue(FACING, newFacing); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return getDefaultState().with(FACING, context.getNearestLookingDirection()); + return defaultBlockState().setValue(FACING, context.getNearestLookingDirection()); } @Override public BlockState rotate(BlockState state, Rotation rot) { - return state.with(FACING, rot.rotate(state.get(FACING))); + return state.setValue(FACING, rot.rotate(state.getValue(FACING))); } @Override public BlockState mirror(BlockState state, Mirror mirrorIn) { - return state.rotate(mirrorIn.toRotation(state.get(FACING))); + return state.rotate(mirrorIn.getRotation(state.getValue(FACING))); } } diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java index 3ed787c7e..51971939d 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java @@ -36,11 +36,11 @@ public class CTModel extends BakedModelWrapperWithData { } void put(Direction face, int texture) { - indices[face.getIndex()] = texture; + indices[face.get3DDataValue()] = texture; } int get(Direction face) { - return indices[face.getIndex()]; + return indices[face.get3DDataValue()]; } } @@ -57,7 +57,7 @@ public class CTModel extends BakedModelWrapperWithData { protected CTData createCTData(IBlockDisplayReader world, BlockPos pos, BlockState state) { CTData data = new CTData(); for (Direction face : Iterate.directions) { - if (!Block.shouldSideBeRendered(state, world, pos, face) && !behaviour.buildContextForOccludedDirections()) + if (!Block.shouldRenderFace(state, world, pos, face) && !behaviour.buildContextForOccludedDirections()) continue; CTSpriteShiftEntry spriteShift = behaviour.get(state, face); if (spriteShift == null) @@ -81,17 +81,17 @@ public class CTModel extends BakedModelWrapperWithData { for (int i = 0; i < quads.size(); i++) { BakedQuad quad = quads.get(i); - CTSpriteShiftEntry spriteShift = behaviour.get(state, quad.getFace()); + CTSpriteShiftEntry spriteShift = behaviour.get(state, quad.getDirection()); if (spriteShift == null) continue; if (quad.getSprite() != spriteShift.getOriginal()) continue; - int index = data.get(quad.getFace()); + int index = data.get(quad.getDirection()); if (index == -1) continue; BakedQuad newQuad = QuadHelper.clone(quad); - int[] vertexData = newQuad.getVertexData(); + int[] vertexData = newQuad.getVertices(); for (int vertex = 0; vertex < vertexData.length; vertex += format.getIntegerSize()) { int uvOffset = 16 / 4; diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java index fa99114c3..40d6bf434 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java @@ -15,13 +15,13 @@ public abstract class CTSpriteShiftEntry extends SpriteShiftEntry { public float getTargetU(float localU, int index) { float uOffset = (index % textureSheetSize); - return getTarget().getInterpolatedU( + return getTarget().getU( (SuperByteBuffer.getUnInterpolatedU(getOriginal(), localU) + (uOffset * 16)) / ((float) textureSheetSize)); } public float getTargetV(float localV, int index) { float vOffset = (index / textureSheetSize); - return getTarget().getInterpolatedV( + return getTarget().getV( (SuperByteBuffer.getUnInterpolatedV(getOriginal(), localV) + (vOffset * 16)) / ((float) textureSheetSize)); } diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java b/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java index 4a373e8c2..e2a8f06ed 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java @@ -41,10 +41,10 @@ public abstract class ConnectedTextureBehaviour { protected boolean isBeingBlocked(BlockState state, IBlockDisplayReader reader, BlockPos pos, BlockPos otherPos, Direction face) { - BlockPos blockingPos = otherPos.offset(face); + BlockPos blockingPos = otherPos.relative(face); return face.getAxis() - .getCoordinate(pos.getX(), pos.getY(), pos.getZ()) == face.getAxis() - .getCoordinate(otherPos.getX(), otherPos.getY(), otherPos.getZ()) + .choose(pos.getX(), pos.getY(), pos.getZ()) == face.getAxis() + .choose(otherPos.getX(), otherPos.getY(), otherPos.getZ()) && connectsTo(state, reader.getBlockState(blockingPos), reader, pos, blockingPos, face); } @@ -106,8 +106,8 @@ public abstract class ConnectedTextureBehaviour { private boolean testConnection(IBlockDisplayReader reader, BlockPos pos, BlockState state, Direction face, final Direction horizontal, final Direction vertical, int sh, int sv) { - BlockPos p = pos.offset(horizontal, sh) - .offset(vertical, sv); + BlockPos p = pos.relative(horizontal, sh) + .relative(vertical, sv); boolean test = connectsTo(state, reader.getBlockState(p), reader, pos, p, face); return test; } diff --git a/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java b/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java index e4be4b2ba..305e4364d 100644 --- a/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java +++ b/src/main/java/com/simibubi/create/foundation/block/render/ColoredVertexModel.java @@ -57,7 +57,7 @@ public class ColoredVertexModel extends BakedModelWrapper { BakedQuad quad = quads.get(i); BakedQuad newQuad = QuadHelper.clone(quad); - int[] vertexData = newQuad.getVertexData(); + int[] vertexData = newQuad.getVertices(); for (int vertex = 0; vertex < vertexData.length; vertex += format.getIntegerSize()) { float x = Float.intBitsToFloat(vertexData[vertex]); diff --git a/src/main/java/com/simibubi/create/foundation/block/render/QuadHelper.java b/src/main/java/com/simibubi/create/foundation/block/render/QuadHelper.java index 81ece13f1..68dc08dac 100644 --- a/src/main/java/com/simibubi/create/foundation/block/render/QuadHelper.java +++ b/src/main/java/com/simibubi/create/foundation/block/render/QuadHelper.java @@ -9,8 +9,8 @@ public final class QuadHelper { private QuadHelper() {} public static BakedQuad clone(BakedQuad quad) { - return new BakedQuad(Arrays.copyOf(quad.getVertexData(), quad.getVertexData().length), - quad.getTintIndex(), quad.getFace(), quad.getSprite(), quad.hasShade()); + return new BakedQuad(Arrays.copyOf(quad.getVertices(), quad.getVertices().length), + quad.getTintIndex(), quad.getDirection(), quad.getSprite(), quad.isShade()); } } diff --git a/src/main/java/com/simibubi/create/foundation/block/render/SpriteShiftEntry.java b/src/main/java/com/simibubi/create/foundation/block/render/SpriteShiftEntry.java index c5c96b82e..dd5593034 100644 --- a/src/main/java/com/simibubi/create/foundation/block/render/SpriteShiftEntry.java +++ b/src/main/java/com/simibubi/create/foundation/block/render/SpriteShiftEntry.java @@ -20,7 +20,7 @@ public class SpriteShiftEntry { protected void loadTextures() { Function textureMap = Minecraft.getInstance() - .getSpriteAtlas(PlayerContainer.BLOCK_ATLAS_TEXTURE); + .getTextureAtlas(PlayerContainer.BLOCK_ATLAS); original = textureMap.apply(originalTextureLocation); target = textureMap.apply(targetTextureLocation); } diff --git a/src/main/java/com/simibubi/create/foundation/collision/ContinuousOBBCollider.java b/src/main/java/com/simibubi/create/foundation/collision/ContinuousOBBCollider.java index ae561cf1c..39ff0d745 100644 --- a/src/main/java/com/simibubi/create/foundation/collision/ContinuousOBBCollider.java +++ b/src/main/java/com/simibubi/create/foundation/collision/ContinuousOBBCollider.java @@ -89,19 +89,19 @@ public class ContinuousOBBCollider extends OBBCollider { mf.normalSeparation = seperation; } - double dot = mf.stepSeparationAxis.dotProduct(axis); + double dot = mf.stepSeparationAxis.dot(axis); if (dot != 0 && discreteCollision) { - Vector3d cross = axis.crossProduct(mf.stepSeparationAxis); + Vector3d cross = axis.cross(mf.stepSeparationAxis); double dotSeparation = signum(dot) * TL - (rA + rB); double stepSeparation = -dotSeparation; Vector3d stepSeparationVec = axis; if (!cross.equals(Vector3d.ZERO)) { Vector3d sepVec = normalizedAxis.scale(dotSeparation); - Vector3d axisPlane = axis.crossProduct(cross); - Vector3d stepPlane = mf.stepSeparationAxis.crossProduct(cross); + Vector3d axisPlane = axis.cross(cross); + Vector3d stepPlane = mf.stepSeparationAxis.cross(cross); stepSeparationVec = - sepVec.subtract(axisPlane.scale(sepVec.dotProduct(stepPlane) / axisPlane.dotProduct(stepPlane))); + sepVec.subtract(axisPlane.scale(sepVec.dot(stepPlane) / axisPlane.dot(stepPlane))); stepSeparation = stepSeparationVec.length(); if (abs(mf.stepSeparation) > abs(stepSeparation) && stepSeparation != 0) mf.stepSeparation = stepSeparation; diff --git a/src/main/java/com/simibubi/create/foundation/collision/OrientedBB.java b/src/main/java/com/simibubi/create/foundation/collision/OrientedBB.java index 09a2d4579..2fa4c582d 100644 --- a/src/main/java/com/simibubi/create/foundation/collision/OrientedBB.java +++ b/src/main/java/com/simibubi/create/foundation/collision/OrientedBB.java @@ -41,7 +41,7 @@ public class OrientedBB { } private static Vector3d extentsFromBB(AxisAlignedBB bb) { - return new Vector3d(bb.getXSize() / 2, bb.getYSize() / 2, bb.getZSize() / 2); + return new Vector3d(bb.getXsize() / 2, bb.getYsize() / 2, bb.getZsize() / 2); } public Matrix3d getRotation() { @@ -65,8 +65,8 @@ public class OrientedBB { } public AxisAlignedBB getAsAxisAlignedBB() { - return new AxisAlignedBB(0, 0, 0, 0, 0, 0).offset(center) - .grow(extents.x, extents.y, extents.z); + return new AxisAlignedBB(0, 0, 0, 0, 0, 0).move(center) + .inflate(extents.x, extents.y, extents.z); } /* diff --git a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java index 9f393940b..e8534da84 100644 --- a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java @@ -21,7 +21,7 @@ public class AllCommands { LiteralCommandNode util = buildUtilityCommands(); LiteralCommandNode createRoot = dispatcher.register(Commands.literal("create") - .requires(cs -> cs.hasPermissionLevel(0)) + .requires(cs -> cs.hasPermission(0)) // general purpose .then(new ToggleDebugCommand().register()) .then(FabulousWarningCommand.register()) diff --git a/src/main/java/com/simibubi/create/foundation/command/ChunkUtil.java b/src/main/java/com/simibubi/create/foundation/command/ChunkUtil.java index df7abeb39..af82ccc0a 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ChunkUtil.java +++ b/src/main/java/com/simibubi/create/foundation/command/ChunkUtil.java @@ -34,11 +34,11 @@ public class ChunkUtil { new ChunkStatus("full", ChunkStatus.HEIGHTMAPS, 0, POST_FEATURES, ChunkStatus.Type.LEVELCHUNK, (_0, _1, _2, _3, _4, future, _6, chunk) -> future.apply(chunk), (_0, _1, _2, _3, future, chunk) -> { if (markedChunks.contains(chunk.getPos() - .asLong())) { + .toLong())) { LOGGER.debug("trying to load unforced chunk " + chunk.getPos() .toString() + ", returning chunk loading error"); // this.reloadChunk(world.getChunkProvider(), chunk.getPos()); - return ChunkHolder.MISSING_CHUNK_FUTURE; + return ChunkHolder.UNLOADED_CHUNK_FUTURE; } else { // LOGGER.debug("regular, chunkStatus: " + chunk.getStatus().toString()); return future.apply(chunk); @@ -48,11 +48,11 @@ public class ChunkUtil { } public boolean reloadChunk(ServerChunkProvider provider, ChunkPos pos) { - ChunkHolder holder = provider.chunkManager.loadedChunks.remove(pos.asLong()); - provider.chunkManager.immutableLoadedChunksDirty = true; + ChunkHolder holder = provider.chunkMap.updatingChunkMap.remove(pos.toLong()); + provider.chunkMap.modified = true; if (holder != null) { - provider.chunkManager.chunksToUnload.put(pos.asLong(), holder); - provider.chunkManager.scheduleSave(pos.asLong(), holder); + provider.chunkMap.pendingUnloads.put(pos.toLong(), holder); + provider.chunkMap.scheduleUnload(pos.toLong(), holder); return true; } else { return false; @@ -60,8 +60,8 @@ public class ChunkUtil { } public boolean unloadChunk(ServerChunkProvider provider, ChunkPos pos) { - this.interestingChunks.add(pos.asLong()); - this.markedChunks.add(pos.asLong()); + this.interestingChunks.add(pos.toLong()); + this.markedChunks.add(pos.toLong()); return this.reloadChunk(provider, pos); } @@ -78,8 +78,8 @@ public class ChunkUtil { } public void reForce(ServerChunkProvider provider, ChunkPos pos) { - provider.forceChunk(pos, true); - provider.forceChunk(pos, false); + provider.updateChunkForced(pos, true); + provider.updateChunkForced(pos, false); } @SubscribeEvent @@ -87,7 +87,7 @@ public class ChunkUtil { // LOGGER.debug("Chunk Unload: " + event.getChunk().getPos().toString()); if (interestingChunks.contains(event.getChunk() .getPos() - .asLong())) { + .toLong())) { LOGGER.info("Interesting Chunk Unload: " + event.getChunk() .getPos() .toString()); @@ -100,10 +100,10 @@ public class ChunkUtil { ChunkPos pos = event.getChunk() .getPos(); - if (interestingChunks.contains(pos.asLong())) { + if (interestingChunks.contains(pos.toLong())) { LOGGER.info("Interesting Chunk Load: " + pos.toString()); - if (!markedChunks.contains(pos.asLong())) - interestingChunks.remove(pos.asLong()); + if (!markedChunks.contains(pos.toLong())) + interestingChunks.remove(pos.toLong()); } } diff --git a/src/main/java/com/simibubi/create/foundation/command/ChunkUtilCommand.java b/src/main/java/com/simibubi/create/foundation/command/ChunkUtilCommand.java index e999333ca..8179fbbfc 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ChunkUtilCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ChunkUtilCommand.java @@ -15,27 +15,27 @@ public class ChunkUtilCommand { public static ArgumentBuilder register() { return Commands.literal("chunk") - .requires(cs -> cs.hasPermissionLevel(2)) + .requires(cs -> cs.hasPermission(2)) .then(Commands.literal("reload") .then(Commands.argument("pos", ColumnPosArgument.columnPos()) .executes(ctx -> { // chunk reload - ColumnPos columnPos = ColumnPosArgument.fromBlockPos(ctx, "pos"); + ColumnPos columnPos = ColumnPosArgument.getColumnPos(ctx, "pos"); ChunkPos chunkPos = new ChunkPos(columnPos.x >> 4, columnPos.z >> 4); ServerChunkProvider chunkProvider = ctx.getSource() - .getWorld() - .getChunkProvider(); + .getLevel() + .getChunkSource(); boolean success = Create.CHUNK_UTIL.reloadChunk(chunkProvider, chunkPos); if (success) { ctx.getSource() - .sendFeedback(new StringTextComponent("scheduled unload for chunk " + .sendSuccess(new StringTextComponent("scheduled unload for chunk " + chunkPos.toString() + ", might need to repeat command"), true); return 1; } else { ctx.getSource() - .sendFeedback( + .sendSuccess( new StringTextComponent( "unable to schedule unload, is chunk " + chunkPos.toString() + " loaded?"), true); @@ -46,26 +46,26 @@ public class ChunkUtilCommand { .then(Commands.argument("pos", ColumnPosArgument.columnPos()) .executes(ctx -> { // chunk unload - ColumnPos columnPos = ColumnPosArgument.fromBlockPos(ctx, "pos"); + ColumnPos columnPos = ColumnPosArgument.getColumnPos(ctx, "pos"); ChunkPos chunkPos = new ChunkPos(columnPos.x >> 4, columnPos.z >> 4); ServerChunkProvider chunkProvider = ctx.getSource() - .getWorld() - .getChunkProvider(); + .getLevel() + .getChunkSource(); boolean success = Create.CHUNK_UTIL.unloadChunk(chunkProvider, chunkPos); ctx.getSource() - .sendFeedback( + .sendSuccess( new StringTextComponent("added chunk " + chunkPos.toString() + " to unload list"), true); if (success) { ctx.getSource() - .sendFeedback(new StringTextComponent("scheduled unload for chunk " + .sendSuccess(new StringTextComponent("scheduled unload for chunk " + chunkPos.toString() + ", might need to repeat command"), true); return 1; } else { ctx.getSource() - .sendFeedback( + .sendSuccess( new StringTextComponent( "unable to schedule unload, is chunk " + chunkPos.toString() + " loaded?"), true); @@ -76,10 +76,10 @@ public class ChunkUtilCommand { .executes(ctx -> { // chunk clear int count = Create.CHUNK_UTIL.clear(ctx.getSource() - .getWorld() - .getChunkProvider()); + .getLevel() + .getChunkSource()); ctx.getSource() - .sendFeedback(new StringTextComponent("removed " + count + " entries from unload list"), false); + .sendSuccess(new StringTextComponent("removed " + count + " entries from unload list"), false); return 1; })); diff --git a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java index 3cc35646e..6161a973d 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java @@ -14,11 +14,11 @@ public class ClearBufferCacheCommand { static ArgumentBuilder register() { return Commands.literal("clearRenderBuffers") - .requires(cs -> cs.hasPermissionLevel(0)) + .requires(cs -> cs.hasPermission(0)) .executes(ctx -> { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ClearBufferCacheCommand::execute); ctx.getSource() - .sendFeedback(new StringTextComponent("Cleared rendering buffers."), true); + .sendSuccess(new StringTextComponent("Cleared rendering buffers."), true); return 1; }); } diff --git a/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java b/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java index 5147a4bae..40f3a16ed 100644 --- a/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java @@ -35,7 +35,7 @@ public class CloneCommand { public static ArgumentBuilder register() { return Commands.literal("clone") - .requires(cs -> cs.hasPermissionLevel(2)) + .requires(cs -> cs.hasPermission(2)) .then(Commands.argument("begin", BlockPosArgument.blockPos()) .then(Commands.argument("end", BlockPosArgument.blockPos()) .then(Commands.argument("destination", BlockPosArgument.blockPos()) @@ -48,7 +48,7 @@ public class CloneCommand { BlockPosArgument.getLoadedBlockPos(ctx, "destination"), true))))) .executes(ctx -> { ctx.getSource() - .sendFeedback(new StringTextComponent( + .sendSuccess(new StringTextComponent( "Clones all blocks as well as super glue from the specified area to the target destination"), true); @@ -60,28 +60,28 @@ public class CloneCommand { private static int doClone(CommandSource source, BlockPos begin, BlockPos end, BlockPos destination, boolean cloneBlocks) throws CommandSyntaxException { MutableBoundingBox sourceArea = new MutableBoundingBox(begin, end); - BlockPos destinationEnd = destination.add(sourceArea.getLength()); + BlockPos destinationEnd = destination.offset(sourceArea.getLength()); MutableBoundingBox destinationArea = new MutableBoundingBox(destination, destinationEnd); - int i = sourceArea.getXSize() * sourceArea.getYSize() * sourceArea.getZSize(); + int i = sourceArea.getXSpan() * sourceArea.getYSpan() * sourceArea.getZSpan(); if (i > 32768) throw CLONE_TOO_BIG_EXCEPTION.create(32768, i); - ServerWorld world = source.getWorld(); + ServerWorld world = source.getLevel(); - if (!world.isAreaLoaded(begin, end) || !world.isAreaLoaded(destination, destinationEnd)) - throw BlockPosArgument.POS_UNLOADED.create(); + if (!world.hasChunksAt(begin, end) || !world.hasChunksAt(destination, destinationEnd)) + throw BlockPosArgument.ERROR_NOT_LOADED.create(); - BlockPos diffToTarget = new BlockPos(destinationArea.minX - sourceArea.minX, - destinationArea.minY - sourceArea.minY, destinationArea.minZ - sourceArea.minZ); + BlockPos diffToTarget = new BlockPos(destinationArea.x0 - sourceArea.x0, + destinationArea.y0 - sourceArea.y0, destinationArea.z0 - sourceArea.z0); int blockPastes = cloneBlocks ? cloneBlocks(sourceArea, world, diffToTarget) : 0; int gluePastes = cloneGlue(sourceArea, world, diffToTarget); if (cloneBlocks) - source.sendFeedback(new StringTextComponent("Successfully cloned " + blockPastes + " Blocks"), true); + source.sendSuccess(new StringTextComponent("Successfully cloned " + blockPastes + " Blocks"), true); - source.sendFeedback(new StringTextComponent("Successfully applied glue " + gluePastes + " times"), true); + source.sendSuccess(new StringTextComponent("Successfully applied glue " + gluePastes + " times"), true); return blockPastes + gluePastes; } @@ -90,19 +90,19 @@ public class CloneCommand { int gluePastes = 0; List glue = - world.getEntitiesWithinAABB(SuperGlueEntity.class, AxisAlignedBB.func_216363_a(sourceArea)); + world.getEntitiesOfClass(SuperGlueEntity.class, AxisAlignedBB.of(sourceArea)); List> newGlue = Lists.newArrayList(); for (SuperGlueEntity g : glue) { BlockPos pos = g.getHangingPosition(); Direction direction = g.getFacingDirection(); - newGlue.add(Pair.of(pos.add(diffToTarget), direction)); + newGlue.add(Pair.of(pos.offset(diffToTarget), direction)); } for (Pair p : newGlue) { SuperGlueEntity g = new SuperGlueEntity(world, p.getFirst(), p.getSecond()); if (g.onValidSurface()) { - world.addEntity(g); + world.addFreshEntity(g); gluePastes++; } } @@ -115,16 +115,16 @@ public class CloneCommand { List blocks = Lists.newArrayList(); List tileBlocks = Lists.newArrayList(); - for (int z = sourceArea.minZ; z <= sourceArea.maxZ; ++z) { - for (int y = sourceArea.minY; y <= sourceArea.maxY; ++y) { - for (int x = sourceArea.minX; x <= sourceArea.maxX; ++x) { + for (int z = sourceArea.z0; z <= sourceArea.z1; ++z) { + for (int y = sourceArea.y0; y <= sourceArea.y1; ++y) { + for (int x = sourceArea.x0; x <= sourceArea.x1; ++x) { BlockPos currentPos = new BlockPos(x, y, z); - BlockPos newPos = currentPos.add(diffToTarget); + BlockPos newPos = currentPos.offset(diffToTarget); CachedBlockInfo cached = new CachedBlockInfo(world, currentPos, false); - BlockState state = cached.getBlockState(); - TileEntity te = world.getTileEntity(currentPos); + BlockState state = cached.getState(); + TileEntity te = world.getBlockEntity(currentPos); if (te != null) { - CompoundNBT nbt = te.write(new CompoundNBT()); + CompoundNBT nbt = te.save(new CompoundNBT()); tileBlocks.add(new Template.BlockInfo(newPos, state, nbt)); } else { blocks.add(new Template.BlockInfo(newPos, state, null)); @@ -140,36 +140,36 @@ public class CloneCommand { List reverse = Lists.reverse(allBlocks); for (Template.BlockInfo info : reverse) { - TileEntity te = world.getTileEntity(info.pos); - IClearable.clearObj(te); - world.setBlockState(info.pos, Blocks.BARRIER.getDefaultState(), 2); + TileEntity te = world.getBlockEntity(info.pos); + IClearable.tryClear(te); + world.setBlock(info.pos, Blocks.BARRIER.defaultBlockState(), 2); } for (Template.BlockInfo info : allBlocks) { - if (world.setBlockState(info.pos, info.state, 2)) + if (world.setBlock(info.pos, info.state, 2)) blockPastes++; } for (Template.BlockInfo info : tileBlocks) { - TileEntity te = world.getTileEntity(info.pos); + TileEntity te = world.getBlockEntity(info.pos); if (te != null && info.nbt != null) { info.nbt.putInt("x", info.pos.getX()); info.nbt.putInt("y", info.pos.getY()); info.nbt.putInt("z", info.pos.getZ()); - te.fromTag(info.state, info.nbt); - te.markDirty(); + te.load(info.state, info.nbt); + te.setChanged(); } // idk why the state is set twice for a te, but its done like this in the original clone command - world.setBlockState(info.pos, info.state, 2); + world.setBlock(info.pos, info.state, 2); } for (Template.BlockInfo info : reverse) { - world.updateNeighbors(info.pos, info.state.getBlock()); + world.blockUpdated(info.pos, info.state.getBlock()); } - world.getPendingBlockTicks() - .copyTicks(sourceArea, diffToTarget); + world.getBlockTicks() + .copy(sourceArea, diffToTarget); return blockPastes; } diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java b/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java index 5115d9d6f..2ea2e7971 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java @@ -25,7 +25,7 @@ public class ConfigCommand { public static ArgumentBuilder register() { return Commands.literal("config") .executes(ctx -> { - ServerPlayerEntity player = ctx.getSource().asPlayer(); + ServerPlayerEntity player = ctx.getSource().getPlayerOrException(); AllPackets.channel.send( PacketDistributor.PLAYER.with(() -> player), new SConfigureConfigPacket(SConfigureConfigPacket.Actions.configScreen.name(), "") @@ -35,7 +35,7 @@ public class ConfigCommand { }) .then(Commands.argument("path", StringArgumentType.string()) .executes(ctx -> { - ServerPlayerEntity player = ctx.getSource().asPlayer(); + ServerPlayerEntity player = ctx.getSource().getPlayerOrException(); AllPackets.channel.send( PacketDistributor.PLAYER.with(() -> player), new SConfigureConfigPacket(SConfigureConfigPacket.Actions.configScreen.name(), StringArgumentType.getString(ctx, "path")) @@ -44,7 +44,7 @@ public class ConfigCommand { return Command.SINGLE_SUCCESS; }) .then(Commands.literal("set") - .requires(cs -> cs.hasPermissionLevel(2)) + .requires(cs -> cs.hasPermission(2)) .then(Commands.argument("value", StringArgumentType.string()) .executes(ctx -> { String path = StringArgumentType.getString(ctx, "path"); @@ -55,12 +55,12 @@ public class ConfigCommand { try { configPath = ConfigHelper.ConfigPath.parse(path); } catch (IllegalArgumentException e) { - ctx.getSource().sendErrorMessage(new StringTextComponent(e.getMessage())); + ctx.getSource().sendFailure(new StringTextComponent(e.getMessage())); return 0; } if (configPath.getType() == ModConfig.Type.CLIENT) { - ServerPlayerEntity player = ctx.getSource().asPlayer(); + ServerPlayerEntity player = ctx.getSource().getPlayerOrException(); AllPackets.channel.send( PacketDistributor.PLAYER.with(() -> player), new SConfigureConfigPacket("SET" + path, value) @@ -71,13 +71,13 @@ public class ConfigCommand { try { ConfigHelper.setConfigValue(configPath, value); - ctx.getSource().sendFeedback(new StringTextComponent("Great Success!"), false); + ctx.getSource().sendSuccess(new StringTextComponent("Great Success!"), false); return Command.SINGLE_SUCCESS; } catch (ConfigHelper.InvalidValueException e) { - ctx.getSource().sendErrorMessage(new StringTextComponent("Config could not be set the the specified value!")); + ctx.getSource().sendFailure(new StringTextComponent("Config could not be set the the specified value!")); return 0; } catch (Exception e) { - ctx.getSource().sendErrorMessage(new StringTextComponent("Something went wrong while trying to set config value. Check the server logs for more information")); + ctx.getSource().sendFailure(new StringTextComponent("Something went wrong while trying to set config value. Check the server logs for more information")); Create.LOGGER.warn("Exception during server-side config value set:", e); return 0; } diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigCommand.java b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigCommand.java index bcb8206d6..31837720d 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigCommand.java @@ -17,11 +17,11 @@ public abstract class ConfigureConfigCommand { ArgumentBuilder register() { return Commands.literal(this.commandLiteral) - .requires(cs -> cs.hasPermissionLevel(0)) + .requires(cs -> cs.hasPermission(0)) .then(Commands.literal("on") .executes(ctx -> { ServerPlayerEntity player = ctx.getSource() - .asPlayer(); + .getPlayerOrException(); sendPacket(player, String.valueOf(true)); return Command.SINGLE_SUCCESS; @@ -29,14 +29,14 @@ public abstract class ConfigureConfigCommand { .then(Commands.literal("off") .executes(ctx -> { ServerPlayerEntity player = ctx.getSource() - .asPlayer(); + .getPlayerOrException(); sendPacket(player, String.valueOf(false)); return Command.SINGLE_SUCCESS; })) .executes(ctx -> { ServerPlayerEntity player = ctx.getSource() - .asPlayer(); + .getPlayerOrException(); sendPacket(player, "info"); return Command.SINGLE_SUCCESS; diff --git a/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java b/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java index 4cec64866..38ebe6177 100644 --- a/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java @@ -36,7 +36,7 @@ public class CouplingCommand { public static ArgumentBuilder register() { return Commands.literal("coupling") - .requires(cs -> cs.hasPermissionLevel(2)) + .requires(cs -> cs.hasPermission(2)) .then(Commands.literal("add") .then(Commands.argument("cart1", EntityArgument.entity()) .then(Commands.argument("cart2", EntityArgument.entity()) @@ -49,16 +49,16 @@ public class CouplingCommand { if (!(cart2 instanceof AbstractMinecartEntity)) throw ONLY_MINECARTS_ALLOWED.create(); - if (!cart1.getEntityWorld() - .equals(cart2.getEntityWorld())) + if (!cart1.getCommandSenderWorld() + .equals(cart2.getCommandSenderWorld())) throw SAME_DIMENSION.create(); Entity source = ctx.getSource() .getEntity(); CouplingHandler.tryToCoupleCarts( - source instanceof PlayerEntity ? (PlayerEntity) source : null, cart1.getEntityWorld(), - cart1.getEntityId(), cart2.getEntityId()); + source instanceof PlayerEntity ? (PlayerEntity) source : null, cart1.getCommandSenderWorld(), + cart1.getId(), cart2.getId()); return Command.SINGLE_SUCCESS; }))) @@ -77,15 +77,15 @@ public class CouplingCommand { if (!(cart2 instanceof AbstractMinecartEntity)) throw ONLY_MINECARTS_ALLOWED.create(); - if (!cart1.getEntityWorld() - .equals(cart2.getEntityWorld())) + if (!cart1.getCommandSenderWorld() + .equals(cart2.getCommandSenderWorld())) throw SAME_DIMENSION.create(); Entity source = ctx.getSource() .getEntity(); CouplingHandler.tryToCoupleCarts(source instanceof PlayerEntity ? (PlayerEntity) source : null, - cart1.getEntityWorld(), cart1.getEntityId(), cart2.getEntityId()); + cart1.getCommandSenderWorld(), cart1.getId(), cart2.getId()); return Command.SINGLE_SUCCESS; }))) @@ -105,7 +105,7 @@ public class CouplingCommand { cart1.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY); if (!cart1Capability.isPresent()) { ctx.getSource() - .sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true); + .sendSuccess(new StringTextComponent("Minecart has no Couplings Attached"), true); return 0; } @@ -115,7 +115,7 @@ public class CouplingCommand { + (cart1Controller.isLeadingCoupling() ? 1 : 0); if (cart1Couplings == 0) { ctx.getSource() - .sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true); + .sendSuccess(new StringTextComponent("Minecart has no Couplings Attached"), true); return 0; } @@ -124,11 +124,11 @@ public class CouplingCommand { if (coupledCart == null) continue; - if (coupledCart != cart2.getUniqueID()) + if (coupledCart != cart2.getUUID()) continue; MinecartController cart2Controller = - CapabilityMinecartController.getIfPresent(cart1.getEntityWorld(), coupledCart); + CapabilityMinecartController.getIfPresent(cart1.getCommandSenderWorld(), coupledCart); if (cart2Controller == null) return 0; @@ -138,7 +138,7 @@ public class CouplingCommand { } ctx.getSource() - .sendFeedback(new StringTextComponent("The specified Carts are not coupled"), true); + .sendSuccess(new StringTextComponent("The specified Carts are not coupled"), true); return 0; })))) @@ -153,7 +153,7 @@ public class CouplingCommand { cart.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY); if (!capability.isPresent()) { ctx.getSource() - .sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true); + .sendSuccess(new StringTextComponent("Minecart has no Couplings Attached"), true); return 0; } @@ -163,14 +163,14 @@ public class CouplingCommand { (controller.isConnectedToCoupling() ? 1 : 0) + (controller.isLeadingCoupling() ? 1 : 0); if (couplings == 0) { ctx.getSource() - .sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true); + .sendSuccess(new StringTextComponent("Minecart has no Couplings Attached"), true); return 0; } controller.decouple(); ctx.getSource() - .sendFeedback( + .sendSuccess( new StringTextComponent("Removed " + couplings + " couplings from the Minecart"), true); return couplings; diff --git a/src/main/java/com/simibubi/create/foundation/command/FabulousWarningCommand.java b/src/main/java/com/simibubi/create/foundation/command/FabulousWarningCommand.java index 2c03d40b0..c85496e46 100644 --- a/src/main/java/com/simibubi/create/foundation/command/FabulousWarningCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/FabulousWarningCommand.java @@ -16,7 +16,7 @@ public class FabulousWarningCommand { .requires(AllCommands.sourceIsPlayer) .executes(ctx -> { ServerPlayerEntity player = ctx.getSource() - .asPlayer(); + .getPlayerOrException(); AllPackets.channel.send( PacketDistributor.PLAYER.with(() -> player), diff --git a/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java b/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java index 4557c07ad..5e11d833d 100644 --- a/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java @@ -13,14 +13,14 @@ public class FixLightingCommand { static ArgumentBuilder register() { return Commands.literal("fixLighting") - .requires(cs -> cs.hasPermissionLevel(0)) + .requires(cs -> cs.hasPermission(0)) .executes(ctx -> { AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource() .getEntity()), new SConfigureConfigPacket(SConfigureConfigPacket.Actions.fixLighting.name(), String.valueOf(true))); ctx.getSource() - .sendFeedback( + .sendSuccess( new StringTextComponent("Forge's experimental block rendering pipeline is now enabled."), true); return 1; diff --git a/src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java b/src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java index 2a8a1c189..a67b5bc19 100644 --- a/src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java @@ -17,18 +17,18 @@ public class FlySpeedCommand { public static ArgumentBuilder register() { return Commands.literal("flySpeed") - .requires(cs -> cs.hasPermissionLevel(2)) + .requires(cs -> cs.hasPermission(2)) .then(Commands.argument("speed", FloatArgumentType.floatArg(0)) .then(Commands.argument("target", EntityArgument.player()) .executes(ctx -> sendFlySpeedUpdate(ctx, EntityArgument.getPlayer(ctx, "target"), FloatArgumentType.getFloat(ctx, "speed")))) .executes(ctx -> sendFlySpeedUpdate(ctx, ctx.getSource() - .asPlayer(), FloatArgumentType.getFloat(ctx, "speed")))) + .getPlayerOrException(), FloatArgumentType.getFloat(ctx, "speed")))) .then(Commands.literal("reset") .then(Commands.argument("target", EntityArgument.player()) .executes(ctx -> sendFlySpeedUpdate(ctx, EntityArgument.getPlayer(ctx, "target"), 0.05f))) .executes(ctx -> sendFlySpeedUpdate(ctx, ctx.getSource() - .asPlayer(), 0.05f)) + .getPlayerOrException(), 0.05f)) ); } @@ -36,11 +36,11 @@ public class FlySpeedCommand { private static int sendFlySpeedUpdate(CommandContext ctx, ServerPlayerEntity player, float speed) { SPlayerAbilitiesPacket packet = new SPlayerAbilitiesPacket(player.abilities); // packet.setFlySpeed(speed); - ObfuscationReflectionHelper.setPrivateValue(SPlayerAbilitiesPacket.class, packet, speed, "field_149116_e"); - player.connection.sendPacket(packet); + ObfuscationReflectionHelper.setPrivateValue(SPlayerAbilitiesPacket.class, packet, speed, "field_149116_e"); // flyingSpeed + player.connection.send(packet); ctx.getSource() - .sendFeedback(new StringTextComponent("Temporarily set " + player.getName() + .sendSuccess(new StringTextComponent("Temporarily set " + player.getName() .getString() + "'s Flying Speed to: " + speed), true); return Command.SINGLE_SUCCESS; diff --git a/src/main/java/com/simibubi/create/foundation/command/GlueCommand.java b/src/main/java/com/simibubi/create/foundation/command/GlueCommand.java index 269d52023..c3535e5a4 100644 --- a/src/main/java/com/simibubi/create/foundation/command/GlueCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/GlueCommand.java @@ -13,17 +13,17 @@ import net.minecraft.world.server.ServerWorld; public class GlueCommand { public static ArgumentBuilder register() { return Commands.literal("glue") - .requires(cs -> cs.hasPermissionLevel(0)) + .requires(cs -> cs.hasPermission(0)) .then(Commands.argument("pos", BlockPosArgument.blockPos()) //.then(Commands.argument("direction", EnumArgument.enumArgument(Direction.class)) .executes(ctx -> { - BlockPos pos = BlockPosArgument.getBlockPos(ctx, "pos"); + BlockPos pos = BlockPosArgument.getOrLoadBlockPos(ctx, "pos"); - ServerWorld world = ctx.getSource().getWorld(); + ServerWorld world = ctx.getSource().getLevel(); SuperGlueEntity entity = new SuperGlueEntity(world, pos, Direction.UP); entity.playPlaceSound(); - world.addEntity(entity); + world.addFreshEntity(entity); return 1; })); diff --git a/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java b/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java index 2d242ee4f..44dc55900 100644 --- a/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java @@ -28,12 +28,12 @@ public class HighlightCommand { public static ArgumentBuilder register() { return Commands.literal("highlight") - .requires(cs -> cs.hasPermissionLevel(0)) + .requires(cs -> cs.hasPermission(0)) .then(Commands.argument("pos", BlockPosArgument.blockPos()) .then(Commands.argument("players", EntityArgument.players()) .executes(ctx -> { Collection players = EntityArgument.getPlayers(ctx, "players"); - BlockPos pos = BlockPosArgument.getBlockPos(ctx, "pos"); + BlockPos pos = BlockPosArgument.getOrLoadBlockPos(ctx, "pos"); for (ServerPlayerEntity p : players) { AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> p), new HighlightPacket(pos)); @@ -53,14 +53,14 @@ public class HighlightCommand { // .requires(AllCommands.sourceIsPlayer) .executes(ctx -> { ServerPlayerEntity player = ctx.getSource() - .asPlayer(); + .getPlayerOrException(); return highlightAssemblyExceptionFor(player, ctx.getSource()); }); } private static void sendMissMessage(CommandSource source) { - source.sendFeedback( + source.sendSuccess( new StringTextComponent("Try looking at a Block that has failed to assemble a Contraption and try again."), true); } @@ -69,19 +69,19 @@ public class HighlightCommand { double distance = player.getAttribute(ForgeMod.REACH_DISTANCE.get()) .getValue(); Vector3d start = player.getEyePosition(1); - Vector3d look = player.getLook(1); + Vector3d look = player.getViewVector(1); Vector3d end = start.add(look.x * distance, look.y * distance, look.z * distance); - World world = player.world; + World world = player.level; - BlockRayTraceResult ray = world.rayTraceBlocks( + BlockRayTraceResult ray = world.clip( new RayTraceContext(start, end, RayTraceContext.BlockMode.OUTLINE, RayTraceContext.FluidMode.NONE, player)); if (ray.getType() == RayTraceResult.Type.MISS) { sendMissMessage(source); return 0; } - BlockPos pos = ray.getPos(); - TileEntity te = world.getTileEntity(pos); + BlockPos pos = ray.getBlockPos(); + TileEntity te = world.getBlockEntity(pos); if (!(te instanceof IDisplayAssemblyExceptions)) { sendMissMessage(source); return 0; @@ -95,13 +95,13 @@ public class HighlightCommand { } if (!exception.hasPosition()) { - source.sendFeedback(new StringTextComponent("Can't highlight a specific position for this issue"), true); + source.sendSuccess(new StringTextComponent("Can't highlight a specific position for this issue"), true); return Command.SINGLE_SUCCESS; } BlockPos p = exception.getPosition(); String command = "/create highlight " + p.getX() + " " + p.getY() + " " + p.getZ(); - return player.server.getCommandManager() - .handleCommand(source, command); + return player.server.getCommands() + .performCommand(source, command); } } diff --git a/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java b/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java index 900e250fe..61422c598 100644 --- a/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java @@ -24,12 +24,12 @@ public class HighlightPacket extends SimplePacketBase { } public HighlightPacket(PacketBuffer buffer) { - this.pos = BlockPos.fromLong(buffer.readLong()); + this.pos = BlockPos.of(buffer.readLong()); } @Override public void write(PacketBuffer buffer) { - buffer.writeLong(pos.toLong()); + buffer.writeLong(pos.asLong()); } @Override @@ -45,12 +45,12 @@ public class HighlightPacket extends SimplePacketBase { @OnlyIn(Dist.CLIENT) public static void performHighlight(BlockPos pos) { - if (Minecraft.getInstance().world == null || !Minecraft.getInstance().world.isBlockPresent(pos)) + if (Minecraft.getInstance().level == null || !Minecraft.getInstance().level.isLoaded(pos)) return; - CreateClient.OUTLINER.showAABB("highlightCommand", VoxelShapes.fullCube() - .getBoundingBox() - .offset(pos), 200) + CreateClient.OUTLINER.showAABB("highlightCommand", VoxelShapes.block() + .bounds() + .move(pos), 200) .lineWidth(1 / 32f) .colored(0xEeEeEe) // .colored(0x243B50) diff --git a/src/main/java/com/simibubi/create/foundation/command/KillTPSCommand.java b/src/main/java/com/simibubi/create/foundation/command/KillTPSCommand.java index 46e18f681..366e83196 100644 --- a/src/main/java/com/simibubi/create/foundation/command/KillTPSCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/KillTPSCommand.java @@ -12,19 +12,19 @@ public class KillTPSCommand { public static ArgumentBuilder register() { return Commands.literal("killtps") - .requires(cs -> cs.hasPermissionLevel(2)) + .requires(cs -> cs.hasPermission(2)) .executes(ctx -> { // killtps no arguments ctx.getSource() - .sendFeedback(Lang.createTranslationTextComponent("command.killTPSCommand.status.slowed_by.0", + .sendSuccess(Lang.createTranslationTextComponent("command.killTPSCommand.status.slowed_by.0", Create.LAGGER.isLagging() ? Create.LAGGER.getTickTime() : 0), true); if (Create.LAGGER.isLagging()) ctx.getSource() - .sendFeedback(Lang.createTranslationTextComponent("command.killTPSCommand.status.usage.0"), + .sendSuccess(Lang.createTranslationTextComponent("command.killTPSCommand.status.usage.0"), true); else ctx.getSource() - .sendFeedback(Lang.createTranslationTextComponent("command.killTPSCommand.status.usage.1"), + .sendSuccess(Lang.createTranslationTextComponent("command.killTPSCommand.status.usage.1"), true); return 1; @@ -36,35 +36,35 @@ public class KillTPSCommand { if (tickTime > 0) { Create.LAGGER.setLagging(true); ctx.getSource() - .sendFeedback((Lang + .sendSuccess((Lang .createTranslationTextComponent("command.killTPSCommand.status.slowed_by.1", tickTime)), true); ctx.getSource() - .sendFeedback(Lang.createTranslationTextComponent("command.killTPSCommand.status.usage.0"), + .sendSuccess(Lang.createTranslationTextComponent("command.killTPSCommand.status.usage.0"), true); } else { ctx.getSource() - .sendFeedback(Lang.createTranslationTextComponent("command.killTPSCommand.status.usage.1"), + .sendSuccess(Lang.createTranslationTextComponent("command.killTPSCommand.status.usage.1"), true); } return 1; }) .then(Commands.argument(Lang.translate("command.killTPSCommand.argument.tickTime") - .getUnformattedComponentText(), IntegerArgumentType.integer(1)) + .getContents(), IntegerArgumentType.integer(1)) .executes(ctx -> { // killtps start tickTime int tickTime = IntegerArgumentType.getInteger(ctx, Lang.translate("command.killTPSCommand.argument.tickTime") - .getUnformattedComponentText()); + .getContents()); Create.LAGGER.setTickTime(tickTime); Create.LAGGER.setLagging(true); ctx.getSource() - .sendFeedback((Lang + .sendSuccess((Lang .createTranslationTextComponent("command.killTPSCommand.status.slowed_by.1", tickTime)), true); ctx.getSource() - .sendFeedback(Lang.createTranslationTextComponent("command.killTPSCommand.status.usage.0"), + .sendSuccess(Lang.createTranslationTextComponent("command.killTPSCommand.status.usage.0"), true); return 1; @@ -74,7 +74,7 @@ public class KillTPSCommand { // killtps stop Create.LAGGER.setLagging(false); ctx.getSource() - .sendFeedback(Lang.createTranslationTextComponent("command.killTPSCommand.status.slowed_by.2"), + .sendSuccess(Lang.createTranslationTextComponent("command.killTPSCommand.status.slowed_by.2"), false); return 1; diff --git a/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java b/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java index 034746d58..e7479a2a6 100644 --- a/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java @@ -15,7 +15,7 @@ public class OverlayConfigCommand { public static ArgumentBuilder register() { return Commands.literal("overlay") - .requires(cs -> cs.hasPermissionLevel(0)) + .requires(cs -> cs.hasPermission(0)) .then(Commands.literal("reset") .executes(ctx -> { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> SConfigureConfigPacket.Actions.overlayReset.performAction("")); @@ -26,7 +26,7 @@ public class OverlayConfigCommand { new SConfigureConfigPacket(SConfigureConfigPacket.Actions.overlayReset.name(), ""))); ctx.getSource() - .sendFeedback(new StringTextComponent("reset overlay offset"), true); + .sendSuccess(new StringTextComponent("reset overlay offset"), true); return 1; }) @@ -40,7 +40,7 @@ public class OverlayConfigCommand { new SConfigureConfigPacket(SConfigureConfigPacket.Actions.overlayScreen.name(), ""))); ctx.getSource() - .sendFeedback(new StringTextComponent("window opened"), true); + .sendSuccess(new StringTextComponent("window opened"), true); return 1; }); diff --git a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java index 70d353a64..853de1525 100644 --- a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java @@ -21,18 +21,18 @@ import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.network.PacketDistributor; public class PonderCommand { - public static final SuggestionProvider ITEM_PONDERS = SuggestionProviders.register(new ResourceLocation("all_ponders"), (iSuggestionProviderCommandContext, builder) -> ISuggestionProvider.func_212476_a(PonderRegistry.all.keySet().stream(), builder)); + public static final SuggestionProvider ITEM_PONDERS = SuggestionProviders.register(new ResourceLocation("all_ponders"), (iSuggestionProviderCommandContext, builder) -> ISuggestionProvider.suggestResource(PonderRegistry.ALL.keySet().stream(), builder)); static ArgumentBuilder register() { return Commands.literal("ponder") - .requires(cs -> cs.hasPermissionLevel(0)) - .executes(ctx -> openScene("index", ctx.getSource().asPlayer())) - .then(Commands.argument("scene", ResourceLocationArgument.resourceLocation()) + .requires(cs -> cs.hasPermission(0)) + .executes(ctx -> openScene("index", ctx.getSource().getPlayerOrException())) + .then(Commands.argument("scene", ResourceLocationArgument.id()) .suggests(ITEM_PONDERS) - .executes(ctx -> openScene(ResourceLocationArgument.getResourceLocation(ctx, "scene").toString(), ctx.getSource().asPlayer())) + .executes(ctx -> openScene(ResourceLocationArgument.getId(ctx, "scene").toString(), ctx.getSource().getPlayerOrException())) .then(Commands.argument("targets", EntityArgument.players()) - .requires(cs -> cs.hasPermissionLevel(2)) - .executes(ctx -> openScene(ResourceLocationArgument.getResourceLocation(ctx, "scene").toString(), EntityArgument.getPlayers(ctx, "targets"))) + .requires(cs -> cs.hasPermission(2)) + .executes(ctx -> openScene(ResourceLocationArgument.getId(ctx, "scene").toString(), EntityArgument.getPlayers(ctx, "targets"))) ) ); diff --git a/src/main/java/com/simibubi/create/foundation/command/ReplaceInCommandBlocksCommand.java b/src/main/java/com/simibubi/create/foundation/command/ReplaceInCommandBlocksCommand.java index 7a7e136e6..02f62bcc5 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ReplaceInCommandBlocksCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ReplaceInCommandBlocksCommand.java @@ -21,7 +21,7 @@ public class ReplaceInCommandBlocksCommand { public static ArgumentBuilder register() { return Commands.literal("replaceInCommandBlocks") - .requires(cs -> cs.hasPermissionLevel(0)) + .requires(cs -> cs.hasPermission(0)) .then(Commands.argument("begin", BlockPosArgument.blockPos()) .then(Commands.argument("end", BlockPosArgument.blockPos()) .then(Commands.argument("toReplace", StringArgumentType.string()) @@ -38,31 +38,31 @@ public class ReplaceInCommandBlocksCommand { private static void doReplace(CommandSource source, BlockPos from, BlockPos to, String toReplace, String replaceWith) { - ServerWorld world = source.getWorld(); + ServerWorld world = source.getLevel(); MutableInt blocks = new MutableInt(0); - BlockPos.getAllInBox(from, to) + BlockPos.betweenClosedStream(from, to) .forEach(pos -> { BlockState blockState = world.getBlockState(pos); if (!(blockState.getBlock() instanceof CommandBlockBlock)) return; - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); if (!(tileEntity instanceof CommandBlockTileEntity)) return; CommandBlockTileEntity cb = (CommandBlockTileEntity) tileEntity; - CommandBlockLogic commandBlockLogic = cb.getCommandBlockLogic(); + CommandBlockLogic commandBlockLogic = cb.getCommandBlock(); String command = commandBlockLogic.getCommand(); if (command.indexOf(toReplace) != -1) blocks.increment(); commandBlockLogic.setCommand(command.replaceAll(toReplace, replaceWith)); - cb.markDirty(); - world.notifyBlockUpdate(pos, blockState, blockState, 2); + cb.setChanged(); + world.sendBlockUpdated(pos, blockState, blockState, 2); }); int intValue = blocks.intValue(); if (intValue == 0) { - source.sendFeedback(new StringTextComponent("Couldn't find \"" + toReplace + "\" anywhere."), true); + source.sendSuccess(new StringTextComponent("Couldn't find \"" + toReplace + "\" anywhere."), true); return; } - source.sendFeedback(new StringTextComponent("Replaced occurrences in " + intValue + " blocks."), true); + source.sendSuccess(new StringTextComponent("Replaced occurrences in " + intValue + " blocks."), true); } } diff --git a/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java index 73ffd6168..489ace535 100644 --- a/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java @@ -44,14 +44,14 @@ public class SConfigureConfigPacket extends SimplePacketBase { } public SConfigureConfigPacket(PacketBuffer buffer) { - this.option = buffer.readString(32767); - this.value = buffer.readString(32767); + this.option = buffer.readUtf(32767); + this.value = buffer.readUtf(32767); } @Override public void write(PacketBuffer buffer) { - buffer.writeString(option); - buffer.writeString(value); + buffer.writeUtf(option); + buffer.writeUtf(value); } @Override @@ -85,7 +85,7 @@ public class SConfigureConfigPacket extends SimplePacketBase { try { configPath = ConfigHelper.ConfigPath.parse(option); } catch (IllegalArgumentException e) { - player.sendStatusMessage(new StringTextComponent(e.getMessage()), false); + player.displayClientMessage(new StringTextComponent(e.getMessage()), false); return; } @@ -96,11 +96,11 @@ public class SConfigureConfigPacket extends SimplePacketBase { try { ConfigHelper.setConfigValue(configPath, value); - player.sendStatusMessage(new StringTextComponent("Great Success!"), false); + player.displayClientMessage(new StringTextComponent("Great Success!"), false); } catch (ConfigHelper.InvalidValueException e) { - player.sendStatusMessage(new StringTextComponent("Config could not be set the the specified value!"), false); + player.displayClientMessage(new StringTextComponent("Config could not be set the the specified value!"), false); } catch (Exception e) { - player.sendStatusMessage(new StringTextComponent("Something went wrong while trying to set config value. Check the client logs for more information"), false); + player.displayClientMessage(new StringTextComponent("Something went wrong while trying to set config value. Check the client logs for more information"), false); Create.LOGGER.warn("Exception during client-side config value set:", e); } @@ -140,14 +140,14 @@ public class SConfigureConfigPacket extends SimplePacketBase { try { configPath = ConfigHelper.ConfigPath.parse(value); } catch (IllegalArgumentException e) { - player.sendStatusMessage(new StringTextComponent(e.getMessage()), false); + player.displayClientMessage(new StringTextComponent(e.getMessage()), false); return; } try { ScreenOpener.open(SubMenuConfigScreen.find(configPath)); } catch (Exception e) { - player.sendStatusMessage(new StringTextComponent("Unable to find the specified config"), false); + player.displayClientMessage(new StringTextComponent("Unable to find the specified config"), false); } } @@ -160,14 +160,14 @@ public class SConfigureConfigPacket extends SimplePacketBase { if (value.equals("info")) { ITextComponent text = new StringTextComponent("Rainbow Debug Utility is currently: ") .append(boolToText(AllConfigs.CLIENT.rainbowDebug.get())); - player.sendStatusMessage(text, false); + player.displayClientMessage(text, false); return; } AllConfigs.CLIENT.rainbowDebug.set(Boolean.parseBoolean(value)); ITextComponent text = boolToText(AllConfigs.CLIENT.rainbowDebug.get()) - .append(new StringTextComponent(" Rainbow Debug Utility").formatted(TextFormatting.WHITE)); - player.sendStatusMessage(text, false); + .append(new StringTextComponent(" Rainbow Debug Utility").withStyle(TextFormatting.WHITE)); + player.displayClientMessage(text, false); } @OnlyIn(Dist.CLIENT) @@ -184,7 +184,7 @@ public class SConfigureConfigPacket extends SimplePacketBase { @OnlyIn(Dist.CLIENT) private static void experimentalLighting(String value) { ForgeConfig.CLIENT.experimentalForgeLightPipelineEnabled.set(true); - Minecraft.getInstance().worldRenderer.loadRenderers(); + Minecraft.getInstance().levelRenderer.allChanged(); } @OnlyIn(Dist.CLIENT) @@ -195,7 +195,7 @@ public class SConfigureConfigPacket extends SimplePacketBase { } ResourceLocation id = new ResourceLocation(value); - if (!PonderRegistry.all.containsKey(id)) { + if (!PonderRegistry.ALL.containsKey(id)) { Create.LOGGER.error("Could not find ponder scenes for item: " + id); return; } @@ -207,14 +207,14 @@ public class SConfigureConfigPacket extends SimplePacketBase { @OnlyIn(Dist.CLIENT) private static void fabulousWarning(String value) { AllConfigs.CLIENT.ignoreFabulousWarning.set(true); - Minecraft.getInstance().ingameGUI.addChatMessage(ChatType.CHAT, + Minecraft.getInstance().gui.handleChat(ChatType.CHAT, new StringTextComponent("Disabled Fabulous graphics warning"), - Minecraft.getInstance().player.getUniqueID()); + Minecraft.getInstance().player.getUUID()); } private static IFormattableTextComponent boolToText(boolean b) { - return b ? new StringTextComponent("enabled").formatted(TextFormatting.DARK_GREEN) - : new StringTextComponent("disabled").formatted(TextFormatting.RED); + return b ? new StringTextComponent("enabled").withStyle(TextFormatting.DARK_GREEN) + : new StringTextComponent("disabled").withStyle(TextFormatting.RED); } } } diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index 5ec4fe323..bea229d1e 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -14,6 +14,8 @@ public class CClient extends ConfigBase { b(true, "enableRainbowDebug", "Show colourful debug information while the F3-Menu is open."); public ConfigBool experimentalRendering = b(true, "experimentalRendering", "Use modern OpenGL features to drastically increase performance."); + public ConfigInt maxContraptionLightVolume = i(16384, 0, Integer.MAX_VALUE, "maximumContraptionLightVolume", + "The maximum amount of blocks for which to try and calculate dynamic contraption lighting. Decrease if large contraption cause too much lag"); public ConfigInt overlayOffsetX = i(20, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetX", "Offset the overlay from goggle- and hover- information by this many pixels on the X axis; Use /create overlay"); public ConfigInt overlayOffsetY = i(0, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetY", @@ -47,7 +49,7 @@ public class CClient extends ConfigBase { public ConfigGroup ponder = group(1, "ponder", "Ponder settings"); public ConfigBool comfyReading = b(false, "comfyReading", "Slow down a ponder scene whenever there is text on screen."); - + public ConfigGroup sound = group(1, "sound", "Sound settings"); public ConfigBool enableAmbientSounds = b(true, "enableAmbientSounds", "Make cogs rumble and machines clatter."); public ConfigFloat ambientVolumeCap = f(.1f, 0, 1, "ambientVolumeCap", "Maximum volume modifier of Ambient noise"); diff --git a/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java b/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java index ffa5876b7..2ba15eaea 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java +++ b/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java @@ -4,7 +4,8 @@ public class CCuriosities extends ConfigBase { public ConfigInt maxSymmetryWandRange = i(50, 10, "maxSymmetryWandRange", Comments.symmetryRange); public ConfigInt placementAssistRange = i(12, 3, "placementAssistRange", Comments.placementRange); - public ConfigInt maxAirInBacktank = i(900, 1, "maxAirInBacktank", Comments.maxAirInBacktank); + public ConfigInt airInBacktank = i(900, 1, "airInBacktank", Comments.maxAirInBacktank); + public ConfigInt enchantedBacktankCapacity = i(300, 1, "enchantedBacktankCapacity", Comments.enchantedBacktankCapacity); public ConfigInt maxExtendoGripActions = i(1000, 0, "maxExtendoGripActions", Comments.maxExtendoGripActions); public ConfigInt maxPotatoCannonShots = i(200, 0, "maxPotatoCannonShots", Comments.maxPotatoCannonShots); @@ -20,6 +21,8 @@ public class CCuriosities extends ConfigBase { static String symmetryRange = "The Maximum Distance to an active mirror for the symmetry wand to trigger."; static String maxAirInBacktank = "The Maximum volume of Air that can be stored in a backtank = Seconds of underwater breathing"; + static String enchantedBacktankCapacity = + "The volume of Air added by each level of the backtanks Capacity Enchantment"; static String placementRange = "The Maximum Distance a Block placed by Create's placement assist will have to its interaction point."; static String maxExtendoGripActions = diff --git a/src/main/java/com/simibubi/create/foundation/config/StressConfigDefaults.java b/src/main/java/com/simibubi/create/foundation/config/StressConfigDefaults.java index 682fc14cc..c93103f82 100644 --- a/src/main/java/com/simibubi/create/foundation/config/StressConfigDefaults.java +++ b/src/main/java/com/simibubi/create/foundation/config/StressConfigDefaults.java @@ -17,7 +17,7 @@ public class StressConfigDefaults { * Worlds from the previous version will overwrite potentially changed values * with the new defaults. */ - public static final int forcedUpdateVersion = 1; + public static final int forcedUpdateVersion = 2; static Map registeredDefaultImpacts = new HashMap<>(); static Map registeredDefaultCapacities = new HashMap<>(); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java index cb2e3401b..eb551320e 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java @@ -117,7 +117,7 @@ public class BaseConfigScreen extends ConfigScreen { super.init(); returnOnClose = true; - TextStencilElement clientText = new TextStencilElement(client.fontRenderer, new StringTextComponent(clientTile)).centered(true, true); + TextStencilElement clientText = new TextStencilElement(minecraft.font, new StringTextComponent(clientTile)).centered(true, true); widgets.add(clientConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 - 30, 200, 16).showingElement(clientText)); if (clientSpec != null) { @@ -129,7 +129,7 @@ public class BaseConfigScreen extends ConfigScreen { clientText.withElementRenderer(DISABLED_RENDERER); } - TextStencilElement commonText = new TextStencilElement(client.fontRenderer, new StringTextComponent(commonTile)).centered(true, true); + TextStencilElement commonText = new TextStencilElement(minecraft.font, new StringTextComponent(commonTile)).centered(true, true); widgets.add(commonConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15, 200, 16).showingElement(commonText)); if (commonSpec != null) { @@ -141,14 +141,14 @@ public class BaseConfigScreen extends ConfigScreen { commonText.withElementRenderer(DISABLED_RENDERER); } - TextStencilElement serverText = new TextStencilElement(client.fontRenderer, new StringTextComponent(serverTile)).centered(true, true); + TextStencilElement serverText = new TextStencilElement(minecraft.font, new StringTextComponent(serverTile)).centered(true, true); widgets.add(serverConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 + 30, 200, 16).showingElement(serverText)); if (serverSpec == null) { serverConfigWidget.active = false; serverConfigWidget.updateColorsFromState(); serverText.withElementRenderer(DISABLED_RENDERER); - } else if (Minecraft.getInstance().world == null) { + } else if (Minecraft.getInstance().level == null) { serverText.withElementRenderer(DISABLED_RENDERER); serverConfigWidget.getToolTip() .add(new StringTextComponent("Stored individually per World")); @@ -162,7 +162,7 @@ public class BaseConfigScreen extends ConfigScreen { serverText.withElementRenderer(BoxWidget.gradientFactory.apply(serverConfigWidget)); } - TextStencilElement titleText = new TextStencilElement(client.fontRenderer, modID.toUpperCase(Locale.ROOT)) + TextStencilElement titleText = new TextStencilElement(minecraft.font, modID.toUpperCase(Locale.ROOT)) .centered(true, true) .withElementRenderer((ms, w, h, alpha) -> { UIRenderHelper.angledGradient(ms, 0, 0, h / 2, h, w / 2, Theme.p(Theme.Key.CONFIG_TITLE_A)); @@ -195,7 +195,7 @@ public class BaseConfigScreen extends ConfigScreen { @Override protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - drawCenteredString(ms, client.fontRenderer, "Access Configs for Mod:", width / 2, height / 2 - 105, Theme.i(Theme.Key.TEXT_ACCENT_STRONG)); + drawCenteredString(ms, minecraft.font, "Access Configs for Mod:", width / 2, height / 2 - 105, Theme.i(Theme.Key.TEXT_ACCENT_STRONG)); } private void linkTo(Screen screen) { diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java index b472b0a70..3def1c55e 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java @@ -25,16 +25,16 @@ public class CConfigureConfigPacket extends SimplePacketBase { } public CConfigureConfigPacket(PacketBuffer buffer) { - this.modID = buffer.readString(32767); - this.path = buffer.readString(32767); - this.value = buffer.readString(32767); + this.modID = buffer.readUtf(32767); + this.path = buffer.readUtf(32767); + this.value = buffer.readUtf(32767); } @Override public void write(PacketBuffer buffer) { - buffer.writeString(modID); - buffer.writeString(path); - buffer.writeString(value); + buffer.writeUtf(modID); + buffer.writeUtf(path); + buffer.writeUtf(value); } @Override @@ -42,7 +42,7 @@ public class CConfigureConfigPacket extends SimplePacketBase { context.get().enqueueWork(() -> { try { ServerPlayerEntity sender = context.get().getSender(); - if (sender == null || !sender.hasPermissionLevel(2)) + if (sender == null || !sender.hasPermissions(2)) return; ForgeConfigSpec spec = ConfigHelper.findConfigSpecFor(ModConfig.Type.SERVER, modID); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java index bf56960eb..797c4758f 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java @@ -8,6 +8,7 @@ import java.util.stream.Collectors; import javax.annotation.Nonnull; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.util.TriConsumer; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL30; @@ -15,12 +16,15 @@ import org.lwjgl.opengl.GL30; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.versioned.GlCompat; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.StencilElement; import com.simibubi.create.foundation.gui.UIRenderHelper; +import com.simibubi.create.foundation.gui.mainMenu.CreateMainMenuScreen; import com.simibubi.create.foundation.utility.animation.Force; import com.simibubi.create.foundation.utility.animation.PhysicalFloat; @@ -47,8 +51,9 @@ public abstract class ConfigScreen extends AbstractSimiScreen { * * */ - public static final PhysicalFloat cogSpin = PhysicalFloat.create().withDrag(0.3).addForce(new Force.Static(.2f)); - public static final BlockState cogwheelState = AllBlocks.LARGE_COGWHEEL.getDefaultState().with(CogWheelBlock.AXIS, Direction.Axis.Y); + public static final Map> backgrounds = new HashMap<>(); + public static final PhysicalFloat cogSpin = PhysicalFloat.create().withLimit(10f).withDrag(0.3).addForce(new Force.Static(.2f)); + public static final BlockState cogwheelState = AllBlocks.LARGE_COGWHEEL.getDefaultState().setValue(CogWheelBlock.AXIS, Direction.Axis.Y); public static final Map changes = new HashMap<>(); public static String modID = null; protected final Screen parent; @@ -70,10 +75,12 @@ public abstract class ConfigScreen extends AbstractSimiScreen { @Override protected void renderWindowBackground(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - if (this.client != null && this.client.world != null) { + if (this.minecraft != null && this.minecraft.level != null) { + //in game fill(ms, 0, 0, this.width, this.height, 0xb0_282c34); } else { - fill(ms, 0, 0, this.width, this.height, 0xff_282c34); + //in menus + renderMenuBackground(ms, partialTicks); } new StencilElement() { @@ -95,14 +102,14 @@ public abstract class ConfigScreen extends AbstractSimiScreen { @Override protected void prepareFrame() { Framebuffer thisBuffer = UIRenderHelper.framebuffer; - Framebuffer mainBuffer = Minecraft.getInstance().getFramebuffer(); + Framebuffer mainBuffer = Minecraft.getInstance().getMainRenderTarget(); GlCompat functions = Backend.getInstance().compat; - functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, mainBuffer.framebufferObject); - functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, thisBuffer.framebufferObject); - functions.blit.blitFramebuffer(0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, 0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); + functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, mainBuffer.frameBufferId); + functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, thisBuffer.frameBufferId); + functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); - functions.fbo.bindFramebuffer(FramebufferConstants.FRAME_BUFFER, thisBuffer.framebufferObject); + functions.fbo.bindFramebuffer(FramebufferConstants.GL_FRAMEBUFFER, thisBuffer.frameBufferId); GL11.glClear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT); } @@ -111,14 +118,14 @@ public abstract class ConfigScreen extends AbstractSimiScreen { protected void endFrame() { Framebuffer thisBuffer = UIRenderHelper.framebuffer; - Framebuffer mainBuffer = Minecraft.getInstance().getFramebuffer(); + Framebuffer mainBuffer = Minecraft.getInstance().getMainRenderTarget(); GlCompat functions = Backend.getInstance().compat; - functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, thisBuffer.framebufferObject); - functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, mainBuffer.framebufferObject); - functions.blit.blitFramebuffer(0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, 0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); + functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, thisBuffer.frameBufferId); + functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, mainBuffer.frameBufferId); + functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); - functions.fbo.bindFramebuffer(FramebufferConstants.FRAME_BUFFER, mainBuffer.framebufferObject); + functions.fbo.bindFramebuffer(FramebufferConstants.GL_FRAMEBUFFER, mainBuffer.frameBufferId); } @Override @@ -144,8 +151,32 @@ public abstract class ConfigScreen extends AbstractSimiScreen { return s; } + /** + * By default ConfigScreens will render the Create Panorama as + * their background when opened from the Main- or ModList-Menu. + * If your addon wants to render something else, please add to the + * backgrounds Map in this Class with your modID as the key. + */ + protected void renderMenuBackground(MatrixStack ms, float partialTicks) { + TriConsumer customBackground = backgrounds.get(modID); + if (customBackground != null) { + customBackground.accept(this, ms, partialTicks); + return; + } + + float elapsedPartials = minecraft.getDeltaFrameTime(); + CreateMainMenuScreen.panorama.render(elapsedPartials, 1); + + minecraft.getTextureManager().bind(CreateMainMenuScreen.PANORAMA_OVERLAY_TEXTURES); + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + blit(ms, 0, 0, this.width, this.height, 0.0F, 0.0F, 16, 128, 16, 128); + + fill(ms, 0, 0, this.width, this.height, 0x90_282c34); + } + protected void renderCog(MatrixStack ms, float partialTicks) { - ms.push(); + ms.pushPose(); ms.translate(-100, 100, -100); ms.scale(200, 200, 1); @@ -153,6 +184,6 @@ public abstract class ConfigScreen extends AbstractSimiScreen { .rotateBlock(22.5, cogSpin.getValue(partialTicks), 22.5) .render(ms); - ms.pop(); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java index 2b01b9647..1a7f4e105 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java @@ -31,8 +31,8 @@ public class ConfigScreenList extends ExtendedList { public ConfigScreenList(Minecraft client, int width, int height, int top, int bottom, int elementHeight) { super(client, width, height, top, bottom, elementHeight); - func_244605_b(false); - func_244606_c(false); + setRenderBackground(false); + setRenderTopAndBottom(false); setRenderSelection(false); currentText = null; headerHeight = 3; @@ -40,10 +40,10 @@ public class ConfigScreenList extends ExtendedList { @Override public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - UIRenderHelper.angledGradient(ms, 90, left + width / 2, top, width, 5, 0x60_000000, 0x0); - UIRenderHelper.angledGradient(ms, -90, left + width / 2, bottom, width, 5, 0x60_000000, 0x0); - UIRenderHelper.angledGradient(ms, 0, left, top + height / 2, height, 5, 0x60_000000, 0x0); - UIRenderHelper.angledGradient(ms, 180, right, top + height / 2, height, 5, 0x60_000000, 0x0); + UIRenderHelper.angledGradient(ms, 90, x0 + width / 2, y0, width, 5, 0x60_000000, 0x0); + UIRenderHelper.angledGradient(ms, -90, x0 + width / 2, y1, width, 5, 0x60_000000, 0x0); + UIRenderHelper.angledGradient(ms, 0, x0, y0 + height / 2, height, 5, 0x60_000000, 0x0); + UIRenderHelper.angledGradient(ms, 180, x1, y0 + height / 2, height, 5, 0x60_000000, 0x0); super.render(ms, mouseX, mouseY, partialTicks); } @@ -51,8 +51,8 @@ public class ConfigScreenList extends ExtendedList { @Override protected void renderList(MatrixStack p_238478_1_, int p_238478_2_, int p_238478_3_, int p_238478_4_, int p_238478_5_, float p_238478_6_) { MainWindow window = Minecraft.getInstance().getWindow(); - double d0 = window.getGuiScaleFactor(); - RenderSystem.enableScissor((int) (this.left * d0), (int) (window.getFramebufferHeight() - (this.bottom * d0)), (int) (this.width * d0), (int) (this.height * d0)); + double d0 = window.getGuiScale(); + RenderSystem.enableScissor((int) (this.x0 * d0), (int) (window.getHeight() - (this.y1 * d0)), (int) (this.width * d0), (int) (this.height * d0)); super.renderList(p_238478_1_, p_238478_2_, p_238478_3_, p_238478_4_, p_238478_5_, p_238478_6_); RenderSystem.disableScissor(); } @@ -70,15 +70,15 @@ public class ConfigScreenList extends ExtendedList { } @Override - protected int getScrollbarPositionX() { - return left + this.width - 6; + protected int getScrollbarPosition() { + return x0 + this.width - 6; } public void tick() { for(int i = 0; i < getItemCount(); ++i) { int top = this.getRowTop(i); int bot = top + itemHeight; - if (bot >= this.top && top <= this.bottom) + if (bot >= this.y0 && top <= this.y1) this.getEntry(i).tick(); } @@ -128,7 +128,7 @@ public class ConfigScreenList extends ExtendedList { protected String unit = null; public LabeledEntry(String label) { - this.label = new TextStencilElement(Minecraft.getInstance().fontRenderer, label); + this.label = new TextStencilElement(Minecraft.getInstance().font, label); this.label.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.p(Theme.Key.TEXT_ACCENT_STRONG))); labelTooltip = new ArrayList<>(); } @@ -138,12 +138,12 @@ public class ConfigScreenList extends ExtendedList { UIRenderHelper.streak(ms, 0, x - 10, y + height / 2, height - 6, width / 8 * 7, 0xdd_000000); UIRenderHelper.streak(ms, 180, x + (int) (width * 1.35f) + 10, y + height / 2, height - 6, width / 8 * 7, 0xdd_000000); IFormattableTextComponent component = label.getComponent(); - FontRenderer font = Minecraft.getInstance().fontRenderer; - if (font.getWidth(component) > getLabelWidth(width) - 10) { - label.withText(font.trimToWidth(component, getLabelWidth(width) - 15).getString() + "..."); + FontRenderer font = Minecraft.getInstance().font; + if (font.width(component) > getLabelWidth(width) - 10) { + label.withText(font.substrByWidth(component, getLabelWidth(width) - 15).getString() + "..."); } if (unit != null) { - int unitWidth = font.getStringWidth(unit); + int unitWidth = font.width(unit); font.draw(ms, unit, x + getLabelWidth(width) - unitWidth - 5, y + height / 2 + 2, Theme.i(Theme.Key.TEXT_DARKER)); label.at(x + 10, y + height / 2 - 10, 0).render(ms); } else { @@ -157,11 +157,11 @@ public class ConfigScreenList extends ExtendedList { return; GL11.glDisable(GL11.GL_SCISSOR_TEST); - Screen screen = Minecraft.getInstance().currentScreen; - ms.push(); + Screen screen = Minecraft.getInstance().screen; + ms.pushPose(); ms.translate(0, 0, 400); GuiUtils.drawHoveringText(ms, tooltip, mouseX, mouseY, screen.width, screen.height, 300, font); - ms.pop(); + ms.popPose(); GL11.glEnable(GL11.GL_SCISSOR_TEST); } } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigTextField.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigTextField.java index efa5d886d..e00b8638a 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigTextField.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigTextField.java @@ -16,8 +16,8 @@ public class ConfigTextField extends TextFieldWidget { } @Override - public void setFocused2(boolean focus) { - super.setFocused2(focus); + public void setFocus(boolean focus) { + super.setFocus(focus); if (!focus) { if (ConfigScreenList.currentText == this) @@ -27,7 +27,7 @@ public class ConfigTextField extends TextFieldWidget { } if (ConfigScreenList.currentText != null && ConfigScreenList.currentText != this) - ConfigScreenList.currentText.setFocused2(false); + ConfigScreenList.currentText.setFocus(false); ConfigScreenList.currentText = this; } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/OpenCreateMenuButton.java b/src/main/java/com/simibubi/create/foundation/config/ui/OpenCreateMenuButton.java index 6d12dc3f8..bf5593471 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/OpenCreateMenuButton.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/OpenCreateMenuButton.java @@ -34,18 +34,20 @@ public class OpenCreateMenuButton extends Button { @Override public void render(MatrixStack mstack, int mouseX, int mouseY, float pticks) { super.render(mstack, mouseX, mouseY, pticks); - Minecraft.getInstance().getItemRenderer().renderItemIntoGUI(icon, x + 2, y + 2); + if (!visible) + return; + Minecraft.getInstance().getItemRenderer().renderGuiItem(icon, x + 2, y + 2); } public static void click(Button b) { - ScreenOpener.open(new CreateMainMenuScreen(Minecraft.getInstance().currentScreen)); + ScreenOpener.open(new CreateMainMenuScreen(Minecraft.getInstance().screen)); } public static class SingleMenuRow { public final String left, right; public SingleMenuRow(String left, String right) { - this.left = I18n.format(left); - this.right = I18n.format(right); + this.left = I18n.get(left); + this.right = I18n.get(right); } public SingleMenuRow(String center) { this(center, center); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java index 1dd1156b5..639de55c8 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java @@ -166,7 +166,7 @@ public class SubMenuConfigScreen extends ConfigScreen { .withCallback((x, y) -> new ConfirmationScreen() .centered() - .withText(ITextProperties.plain("Resetting all settings of the " + type.toString() + " config. Are you sure?")) + .withText(ITextProperties.of("Resetting all settings of the " + type.toString() + " config. Are you sure?")) .withAction(success -> { if (success) resetConfig(spec.getValues()); @@ -186,7 +186,7 @@ public class SubMenuConfigScreen extends ConfigScreen { new ConfirmationScreen() .centered() - .withText(ITextProperties.plain("Saving " + changes.size() + " changed value" + (changes.size() != 1 ? "s" : "") + "")) + .withText(ITextProperties.of("Saving " + changes.size() + " changed value" + (changes.size() != 1 ? "s" : "") + "")) .withAction(success -> { if (success) saveChanges(); @@ -205,7 +205,7 @@ public class SubMenuConfigScreen extends ConfigScreen { new ConfirmationScreen() .centered() - .withText(ITextProperties.plain("Discarding " + changes.size() + " unsaved change" + (changes.size() != 1 ? "s" : "") + "")) + .withText(ITextProperties.of("Discarding " + changes.size() + " unsaved change" + (changes.size() != 1 ? "s" : "") + "")) .withAction(success -> { if (success) clearChanges(); @@ -227,7 +227,7 @@ public class SubMenuConfigScreen extends ConfigScreen { widgets.add(discardChanges); widgets.add(goBack); - list = new ConfigScreenList(client, listWidth, height - 60, 45, height - 15, 40); + list = new ConfigScreenList(minecraft, listWidth, height - 60, 45, height - 15, 40); list.setLeftPos(this.width / 2 - list.getWidth() / 2); children.add(list); @@ -284,11 +284,11 @@ public class SubMenuConfigScreen extends ConfigScreen { //extras for server configs if (type != ModConfig.Type.SERVER) return; - if (client.isSingleplayer()) + if (minecraft.hasSingleplayerServer()) return; list.isForServer = true; - boolean canEdit = client != null && client.player != null && client.player.hasPermissionLevel(2); + boolean canEdit = minecraft != null && minecraft.player != null && minecraft.player.hasPermissions(2); Couple red = Theme.p(Theme.Key.BUTTON_FAIL); Couple green = Theme.p(Theme.Key.BUTTON_SUCCESS); @@ -306,13 +306,13 @@ public class SubMenuConfigScreen extends ConfigScreen { stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_LOCKED.draw(ms, 0, 0)); stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, red)); serverLocked.withBorderColors(red); - serverLocked.getToolTip().add(new StringTextComponent("Locked").formatted(TextFormatting.BOLD)); + serverLocked.getToolTip().add(new StringTextComponent("Locked").withStyle(TextFormatting.BOLD)); serverLocked.getToolTip().addAll(TooltipHelper.cutStringTextComponent("You do not have enough permissions to edit the server config. You can still look at the current values here though.", TextFormatting.GRAY, TextFormatting.GRAY)); } else { stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_UNLOCKED.draw(ms, 0, 0)); stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, green)); serverLocked.withBorderColors(green); - serverLocked.getToolTip().add(new StringTextComponent("Unlocked").formatted(TextFormatting.BOLD)); + serverLocked.getToolTip().add(new StringTextComponent("Unlocked").withStyle(TextFormatting.BOLD)); serverLocked.getToolTip().addAll(TooltipHelper.cutStringTextComponent("You have enough permissions to edit the server config. Changes you make here will be synced with the server when you save them.", TextFormatting.GRAY, TextFormatting.GRAY)); } @@ -324,7 +324,7 @@ public class SubMenuConfigScreen extends ConfigScreen { super.renderWindow(ms, mouseX, mouseY, partialTicks); int x = width / 2; - drawCenteredString(ms, client.fontRenderer, ConfigScreen.modID + " > " + type.toString().toLowerCase(Locale.ROOT) + " > " + title, x, 15, Theme.i(Theme.Key.TEXT)); + drawCenteredString(ms, minecraft.font, ConfigScreen.modID + " > " + type.toString().toLowerCase(Locale.ROOT) + " > " + title, x, 15, Theme.i(Theme.Key.TEXT)); list.render(ms, mouseX, mouseY, partialTicks); } @@ -402,7 +402,7 @@ public class SubMenuConfigScreen extends ConfigScreen { public void showLeavingPrompt(Consumer action) { new ConfirmationScreen().centered() - .addText(ITextProperties.plain("Leaving with " + changes.size() + " unsaved change" + .addText(ITextProperties.of("Leaving with " + changes.size() + " unsaved change" + (changes.size() != 1 ? "s" : "") + " for this config")) .withThreeActions(action) .open(this); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java index 3d7590762..2c82b98bf 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java @@ -25,18 +25,22 @@ public class EnumEntry extends ValueEntry> { public EnumEntry(String label, ForgeConfigSpec.ConfigValue> value, ForgeConfigSpec.ValueSpec spec) { super(label, value, spec); - valueText = new TextStencilElement(Minecraft.getInstance().fontRenderer, "YEP").centered(true, true); + valueText = new TextStencilElement(Minecraft.getInstance().font, "YEP").centered(true, true); valueText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.p(Theme.Key.TEXT))); DelegatedStencilElement l = AllIcons.I_CONFIG_PREV.asStencil(); - cycleLeft = new BoxWidget(0, 0, cycleWidth + 8, 16).showingElement(l) - .withCallback(() -> cycleValue(-1)); + cycleLeft = new BoxWidget(0, 0, cycleWidth + 8, 16) + .withCustomBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) + .showingElement(l) + .withCallback(() -> cycleValue(-1)); l.withElementRenderer(BoxWidget.gradientFactory.apply(cycleLeft)); DelegatedStencilElement r = AllIcons.I_CONFIG_NEXT.asStencil(); - cycleRight = new BoxWidget(0, 0, cycleWidth + 8, 16).showingElement(r) - .withCallback(() -> cycleValue(1)); + cycleRight = new BoxWidget(0, 0, cycleWidth + 8, 16) + .withCustomBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) + .showingElement(r) + .withCallback(() -> cycleValue(1)); r.at(cycleWidth - 8, 0); r.withElementRenderer(BoxWidget.gradientFactory.apply(cycleRight)); @@ -89,10 +93,10 @@ public class EnumEntry extends ValueEntry> { cycleRight.render(ms, mouseX, mouseY, partialTicks); new BoxElement() - .withBackground(0) - .flatBorder(0) - .withBounds(10, 10) - .at(cycleLeft.x + cycleWidth + 4, cycleLeft.y + 3) + .withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) + .flatBorder(0x01_000000) + .withBounds(48, 6) + .at(cycleLeft.x + 22, cycleLeft.y + 5) .render(ms); } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java index 315d147df..79b5c7a75 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java @@ -38,8 +38,8 @@ public abstract class NumberEntry extends ValueEntry { public NumberEntry(String label, ForgeConfigSpec.ConfigValue value, ForgeConfigSpec.ValueSpec spec) { super(label, value, spec); - textField = new ConfigTextField(Minecraft.getInstance().fontRenderer, 0, 0, 200, 20, unit); - textField.setText(String.valueOf(getValue())); + textField = new ConfigTextField(Minecraft.getInstance().font, 0, 0, 200, 20, unit); + textField.setValue(String.valueOf(getValue())); textField.setTextColor(Theme.i(Theme.Key.TEXT)); Object range = spec.getRange(); @@ -51,18 +51,18 @@ public abstract class NumberEntry extends ValueEntry { T min = (T) minField.get(range); T max = (T) maxField.get(range); - FontRenderer font = Minecraft.getInstance().fontRenderer; + FontRenderer font = Minecraft.getInstance().font; if (min.doubleValue() > getTypeMin().doubleValue()) { StringTextComponent t = new StringTextComponent(formatBound(min) + " < "); minText = new TextStencilElement(font, t).centered(true, false); minText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.p(Theme.Key.TEXT_DARKER))); - minOffset = font.getWidth(t); + minOffset = font.width(t); } if (max.doubleValue() < getTypeMax().doubleValue()) { StringTextComponent t = new StringTextComponent(" < " + formatBound(max)); maxText = new TextStencilElement(font, t).centered(true, false); maxText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.p(Theme.Key.TEXT_DARKER))); - maxOffset = font.getWidth(t); + maxOffset = font.width(t); } } catch (NoSuchFieldException | IllegalAccessException | ClassCastException | NullPointerException ignored) { @@ -101,17 +101,17 @@ public abstract class NumberEntry extends ValueEntry { @Override protected void setEditable(boolean b) { super.setEditable(b); - textField.setEnabled(b); + textField.setEditable(b); } @Override public void onValueChange(T newValue) { super.onValueChange(newValue); String newText = String.valueOf(newValue); - if (textField.getText().equals(newText)) + if (textField.getValue().equals(newText)) return; - textField.setText(newText); + textField.setValue(newText); } @Override @@ -133,13 +133,13 @@ public abstract class NumberEntry extends ValueEntry { if (minText != null) minText .at(textField.x - minOffset, textField.y, 0) - .withBounds(minOffset, textField.unusedGetHeight()) + .withBounds(minOffset, textField.getHeight()) .render(ms); if (maxText != null) maxText .at(textField.x + textField.getWidth(), textField.y, 0) - .withBounds(maxOffset, textField.unusedGetHeight()) + .withBounds(maxOffset, textField.getHeight()) .render(ms); } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java index 52a0d3fa1..1a0d05cdf 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java @@ -27,7 +27,7 @@ import net.minecraftforge.common.ForgeConfigSpec; public class ValueEntry extends ConfigScreenList.LabeledEntry { - protected static final IFormattableTextComponent modComponent = new StringTextComponent("* ").formatted(TextFormatting.BOLD, TextFormatting.DARK_BLUE).append(StringTextComponent.EMPTY.copy().formatted(TextFormatting.RESET)); + protected static final IFormattableTextComponent modComponent = new StringTextComponent("* ").withStyle(TextFormatting.BOLD, TextFormatting.DARK_BLUE).append(StringTextComponent.EMPTY.plainCopy().withStyle(TextFormatting.RESET)); protected static final int resetWidth = 28;//including 6px offset on either side public static final Pattern unitPattern = Pattern.compile("\\[(in .*)]"); @@ -54,7 +54,7 @@ public class ValueEntry extends ConfigScreenList.LabeledEntry { listeners.add(resetButton); List path = value.getPath(); - labelTooltip.add(new StringTextComponent(label).formatted(TextFormatting.WHITE)); + labelTooltip.add(new StringTextComponent(label).withStyle(TextFormatting.WHITE)); String comment = spec.getComment(); if (comment == null || comment.isEmpty()) return; @@ -85,7 +85,7 @@ public class ValueEntry extends ConfigScreenList.LabeledEntry { .flatMap(stc -> TooltipHelper.cutTextComponent(stc, TextFormatting.GRAY, TextFormatting.GRAY) .stream()) .collect(Collectors.toList())); - labelTooltip.add(new StringTextComponent(ConfigScreen.modID + ":" + path.get(path.size() - 1)).formatted(TextFormatting.DARK_GRAY)); + labelTooltip.add(new StringTextComponent(ConfigScreen.modID + ":" + path.get(path.size() - 1)).withStyle(TextFormatting.DARK_GRAY)); } @Override @@ -105,7 +105,7 @@ public class ValueEntry extends ConfigScreenList.LabeledEntry { public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { if (isCurrentValueChanged()) { IFormattableTextComponent original = label.getComponent(); - IFormattableTextComponent changed = modComponent.copy().append(original); + IFormattableTextComponent changed = modComponent.plainCopy().append(original); label.withText(changed); super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); label.withText(original); diff --git a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java index 9904c53b4..6392055b6 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java +++ b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java @@ -4,7 +4,7 @@ import com.google.common.base.Supplier; import com.google.gson.JsonElement; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; -import com.simibubi.create.foundation.ponder.PonderRegistry; +import com.simibubi.create.foundation.ponder.PonderLocalization; import com.simibubi.create.foundation.utility.FilesHelper; import com.simibubi.create.foundation.utility.Lang; @@ -14,7 +14,7 @@ public enum AllLangPartials { MESSAGES("UI & Messages"), SUBTITLES("Subtitles", AllSoundEvents::provideLangEntries), TOOLTIPS("Item Descriptions"), - PONDER("Ponder Content", PonderRegistry::provideLangEntries), + PONDER("Ponder Content", PonderLocalization::provideLangEntries), ; diff --git a/src/main/java/com/simibubi/create/foundation/data/AssetLookup.java b/src/main/java/com/simibubi/create/foundation/data/AssetLookup.java index f677efa7c..18977afe5 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AssetLookup.java +++ b/src/main/java/com/simibubi/create/foundation/data/AssetLookup.java @@ -66,7 +66,7 @@ public class AssetLookup { p.withExistingParent(c.getName(), p.modLoc(path)); }; } - + public static NonNullBiConsumer, RegistrateItemModelProvider> customGenericItemModel( String... folders) { return (c, p) -> { @@ -79,7 +79,7 @@ public class AssetLookup { public static Function forPowered(DataGenContext ctx, RegistrateBlockstateProvider prov) { - return state -> state.get(BlockStateProperties.POWERED) ? partialBaseModel(ctx, prov, "powered") + return state -> state.getValue(BlockStateProperties.POWERED) ? partialBaseModel(ctx, prov, "powered") : partialBaseModel(ctx, prov); } @@ -87,7 +87,7 @@ public class AssetLookup { RegistrateBlockstateProvider prov, String path) { return state -> prov.models() .getExistingFile( - prov.modLoc("block/" + path + (state.get(BlockStateProperties.POWERED) ? "_powered" : ""))); + prov.modLoc("block/" + path + (state.getValue(BlockStateProperties.POWERED) ? "_powered" : ""))); } public static Function withIndicator(DataGenContext ctx, @@ -95,7 +95,7 @@ public class AssetLookup { return state -> { ResourceLocation baseModel = baseModelFunc.apply(state) .getLocation(); - Integer integer = state.get(property); + Integer integer = state.getValue(property); return prov.models() .withExistingParent(ctx.getName() + "_" + integer, baseModel) .texture("indicator", "block/indicator/" + integer); @@ -110,6 +110,10 @@ public class AssetLookup { return (c, p) -> p.getExistingFile(p.modLoc("item/" + c.getName())); } + public static NonNullBiConsumer, RegistrateItemModelProvider> itemModel(String name) { + return (c, p) -> p.getExistingFile(p.modLoc("item/" + name)); + } + public static NonNullBiConsumer, RegistrateItemModelProvider> itemModelWithPartials() { return (c, p) -> p.withExistingParent("item/" + c.getName(), p.modLoc("item/" + c.getName() + "/item")); } diff --git a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java index 5661543b3..b3bb67a33 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java @@ -87,7 +87,7 @@ public class BlockStateGen { public static

NonNullUnaryOperator> oxidizedBlockstate() { return b -> b.blockstate((ctx, prov) -> prov.getVariantBuilder(ctx.getEntry()) .forAllStates(state -> { - String name = AssetLookup.getOxidizedModel(ctx.getName(), state.get(OxidizingBlock.OXIDIZATION)); + String name = AssetLookup.getOxidizedModel(ctx.getName(), state.getValue(OxidizingBlock.OXIDIZATION)); return ConfiguredModel.builder() .modelFile(prov.models() .cubeAll(name, prov.modLoc(name))) @@ -108,14 +108,14 @@ public class BlockStateGen { RegistrateBlockstateProvider prov, Function modelFunc) { prov.getVariantBuilder(ctx.getEntry()) .forAllStatesExcept(state -> { - Direction dir = state.get(BlockStateProperties.FACING); + Direction dir = state.getValue(BlockStateProperties.FACING); return ConfiguredModel.builder() .modelFile(modelFunc.apply(state)) .rotationX(dir == Direction.DOWN ? 180 : dir.getAxis() .isHorizontal() ? 90 : 0) .rotationY(dir.getAxis() - .isVertical() ? 0 : (((int) dir.getHorizontalAngle()) + 180) % 360) + .isVertical() ? 0 : (((int) dir.toYRot()) + 180) % 360) .build(); }, BlockStateProperties.WATERLOGGED); } @@ -129,7 +129,7 @@ public class BlockStateGen { Function modelFunc, boolean uvLock) { prov.getVariantBuilder(ctx.getEntry()) .forAllStatesExcept(state -> { - Axis axis = state.get(BlockStateProperties.AXIS); + Axis axis = state.getValue(BlockStateProperties.AXIS); return ConfiguredModel.builder() .modelFile(modelFunc.apply(state)) .uvLock(uvLock) @@ -153,7 +153,7 @@ public class BlockStateGen { RegistrateBlockstateProvider prov, Function modelFunc) { prov.getVariantBuilder(ctx.getEntry()) .forAllStates(state -> { - Axis axis = state.get(BlockStateProperties.HORIZONTAL_AXIS); + Axis axis = state.getValue(BlockStateProperties.HORIZONTAL_AXIS); return ConfiguredModel.builder() .modelFile(modelFunc.apply(state)) .rotationY(axis == Axis.X ? 90 : 0) @@ -166,13 +166,13 @@ public class BlockStateGen { prov.getVariantBuilder(ctx.getEntry()) .forAllStates(state -> { - boolean alongFirst = state.get(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE); - Direction direction = state.get(DirectionalAxisKineticBlock.FACING); + boolean alongFirst = state.getValue(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE); + Direction direction = state.getValue(DirectionalAxisKineticBlock.FACING); boolean vertical = direction.getAxis() .isHorizontal() && (direction.getAxis() == Axis.X) == alongFirst; int xRot = direction == Direction.DOWN ? 270 : direction == Direction.UP ? 90 : 0; int yRot = direction.getAxis() - .isVertical() ? alongFirst ? 0 : 90 : (int) direction.getHorizontalAngle(); + .isVertical() ? alongFirst ? 0 : 90 : (int) direction.toYRot(); return ConfiguredModel.builder() .modelFile(modelFunc.apply(state, vertical)) @@ -188,8 +188,8 @@ public class BlockStateGen { .forAllStates(state -> ConfiguredModel.builder() .modelFile(modelFunc.apply(state)) .rotationX(90) - .rotationY(((int) state.get(BlockStateProperties.HORIZONTAL_FACING) - .getHorizontalAngle() + 180) % 360) + .rotationY(((int) state.getValue(BlockStateProperties.HORIZONTAL_FACING) + .toYRot() + 180) % 360) .build()); } @@ -209,17 +209,17 @@ public class BlockStateGen { ModelFile top, ModelFile covered) { prov.getVariantBuilder(ctx.getEntry()) .forAllStates(state -> ConfiguredModel.builder() - .modelFile(state.get(PavedBlock.COVERED) ? covered : top) + .modelFile(state.getValue(PavedBlock.COVERED) ? covered : top) .build()); } public static NonNullBiConsumer, RegistrateBlockstateProvider> cartAssembler() { return (c, p) -> p.getVariantBuilder(c.get()) .forAllStates(state -> { - CartAssembleRailType type = state.get(CartAssemblerBlock.RAIL_TYPE); - Boolean powered = state.get(CartAssemblerBlock.POWERED); - Boolean backwards = state.get(CartAssemblerBlock.BACKWARDS); - RailShape shape = state.get(CartAssemblerBlock.RAIL_SHAPE); + CartAssembleRailType type = state.getValue(CartAssemblerBlock.RAIL_TYPE); + Boolean powered = state.getValue(CartAssemblerBlock.POWERED); + Boolean backwards = state.getValue(CartAssemblerBlock.BACKWARDS); + RailShape shape = state.getValue(CartAssemblerBlock.RAIL_SHAPE); int yRotation = shape == RailShape.EAST_WEST ? 270 : 0; if (backwards) @@ -228,7 +228,7 @@ public class BlockStateGen { return ConfiguredModel.builder() .modelFile(p.models() .getExistingFile(p.modLoc( - "block/" + c.getName() + "/block_" + type.getString() + (powered ? "_powered" : "")))) + "block/" + c.getName() + "/block_" + type.getSerializedName() + (powered ? "_powered" : "")))) .rotationY(yRotation % 360) .build(); }); @@ -247,9 +247,9 @@ public class BlockStateGen { return ConfiguredModel.builder() .modelFile(p.models() .getExistingFile(p.modLoc( - "block/" + c.getName() + "/block" + (state.get(ReinforcedRailBlock.CONNECTS_S) ? "_s" : "") - + (state.get(ReinforcedRailBlock.CONNECTS_N) ? "_n" : "")))) - .rotationY(state.get(ReinforcedRailBlock.RAIL_SHAPE) == RailShape.EAST_WEST ? 90 : 0) + "block/" + c.getName() + "/block" + (state.getValue(ReinforcedRailBlock.CONNECTS_S) ? "_s" : "") + + (state.getValue(ReinforcedRailBlock.CONNECTS_N) ? "_n" : "")))) + .rotationY(state.getValue(ReinforcedRailBlock.RAIL_SHAPE) == RailShape.EAST_WEST ? 90 : 0) .build(); }); } @@ -272,8 +272,8 @@ public class BlockStateGen { .texture("top", isTopSticky ? top_sticky : top)); BiFunction modelFunc = (t, b) -> models.get((t ? 0 : 2) + (b ? 0 : 1)); - axisBlock(c, p, state -> modelFunc.apply(state.get(LinearChassisBlock.STICKY_TOP), - state.get(LinearChassisBlock.STICKY_BOTTOM))); + axisBlock(c, p, state -> modelFunc.apply(state.getValue(LinearChassisBlock.STICKY_TOP), + state.getValue(LinearChassisBlock.STICKY_BOTTOM))); }; } @@ -290,14 +290,14 @@ public class BlockStateGen { Vector stickyFaces = new Vector<>(3); for (Axis axis : Iterate.axes) { - String suffix = "side_" + axis.getString(); + String suffix = "side_" + axis.getSerializedName(); faces.add(p.models() .withExistingParent("block/" + c.getName() + "_" + suffix, p.modLoc(templateModelPath + "/" + suffix)) .texture("side", side)); } for (Axis axis : Iterate.axes) { - String suffix = "side_" + axis.getString(); + String suffix = "side_" + axis.getSerializedName(); stickyFaces.add(p.models() .withExistingParent("block/" + c.getName() + "_" + suffix + "_sticky", p.modLoc(templateModelPath + "/" + suffix)) @@ -306,8 +306,8 @@ public class BlockStateGen { MultiPartBlockStateBuilder builder = p.getMultipartBuilder(c.get()); BlockState propertyGetter = c.get() - .getDefaultState() - .with(RadialChassisBlock.AXIS, Axis.Y); + .defaultBlockState() + .setValue(RadialChassisBlock.AXIS, Axis.Y); for (Axis axis : Iterate.axes) builder.part() @@ -321,7 +321,7 @@ public class BlockStateGen { for (Direction face : Iterate.horizontalDirections) { for (boolean sticky : Iterate.trueAndFalse) { for (Axis axis : Iterate.axes) { - int horizontalAngle = (int) (face.getHorizontalAngle()); + int horizontalAngle = (int) (face.toYRot()); int index = axis.ordinal(); int xRot = 0; int yRot = 0; @@ -367,7 +367,7 @@ public class BlockStateGen { builder.part() .modelFile(flatPass ? flat : open) .rotationX(verticalAngle) - .rotationY((int) (d.getHorizontalAngle() + (d.getAxis() + .rotationY((int) (d.toYRot() + (d.getAxis() .isVertical() ? 90 : 0)) % 360) .addModel() .condition(EncasedPipeBlock.FACING_TO_PROPERTY_MAP.get(d), !flatPass) @@ -403,22 +403,22 @@ public class BlockStateGen { Map, ModelFile> coreModels = new HashMap<>(); for (Axis axis : Iterate.axes) - coreTemplates.put(axis, p.modLoc(path + "/core_" + axis.getString())); + coreTemplates.put(axis, p.modLoc(path + "/core_" + axis.getSerializedName())); ModelFile end = AssetLookup.partialBaseModel(c, p, "end"); for (Axis axis : Iterate.axes) { ResourceLocation parent = coreTemplates.get(axis); for (String s : orientations) { Pair key = Pair.of(s, axis); - String modelName = path + "/" + s + "_" + axis.getString(); + String modelName = path + "/" + s + "_" + axis.getSerializedName(); coreModels.put(key, p.models() .withExistingParent(modelName, parent) .element() .from(4, 4, 4) .to(12, 12, 12) - .face(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis)) + .face(Direction.get(AxisDirection.POSITIVE, axis)) .end() - .face(Direction.getFacingFromAxis(AxisDirection.NEGATIVE, axis)) + .face(Direction.get(AxisDirection.NEGATIVE, axis)) .end() .faces((d, builder) -> { Pair pair = uvs.get(s); @@ -441,9 +441,9 @@ public class BlockStateGen { builder.part() .modelFile(end) .rotationX(d == Direction.UP ? 0 : d == Direction.DOWN ? 180 : 90) - .rotationY((int) (d.getHorizontalAngle() + 180) % 360) + .rotationY((int) (d.toYRot() + 180) % 360) .addModel() - .condition(FluidPipeBlock.FACING_TO_PROPERTY_MAP.get(d), true) + .condition(FluidPipeBlock.PROPERTY_BY_DIRECTION.get(d), true) .end(); for (Axis axis : Iterate.axes) { @@ -464,8 +464,8 @@ public class BlockStateGen { private static void putPart(Map, ModelFile> coreModels, MultiPartBlockStateBuilder builder, Axis axis, String s, boolean up, boolean down, boolean left, boolean right) { - Direction positiveAxis = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); - Map propertyMap = FluidPipeBlock.FACING_TO_PROPERTY_MAP; + Direction positiveAxis = Direction.get(AxisDirection.POSITIVE, axis); + Map propertyMap = FluidPipeBlock.PROPERTY_BY_DIRECTION; builder.part() .modelFile(coreModels.get(Pair.of(s, axis))) .addModel() diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index b8976bad1..a3d1840cc 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -28,6 +28,7 @@ import com.simibubi.create.foundation.config.StressConfigDefaults; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; +import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.client.renderer.RenderType; @@ -47,7 +48,7 @@ public class BuilderTransformers { return b -> b.initialProperties(SharedProperties::wooden) .blockstate((c, p) -> p.horizontalBlock(c.get(), p.models() .getExistingFile(p.modLoc("block/cuckoo_clock/block")))) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .transform(StressConfigDefaults.setImpact(1.0)) .item() .transform(ModelGen.customItemModel("cuckoo_clock", "item")); @@ -56,14 +57,14 @@ public class BuilderTransformers { public static NonNullUnaryOperator> encasedShaft(String casing, CTSpriteShiftEntry casingShift) { return builder -> builder.initialProperties(SharedProperties::stone) - .properties(Block.Properties::nonOpaque) + .properties(AbstractBlock.Properties::noOcclusion) .onRegister(CreateRegistrate.connectedTextures(new EncasedCTBehaviour(casingShift))) .onRegister(CreateRegistrate.casingConnectivity( - (block, cc) -> cc.make(block, casingShift, (s, f) -> f.getAxis() != s.get(EncasedShaftBlock.AXIS)))) + (block, cc) -> cc.make(block, casingShift, (s, f) -> f.getAxis() != s.getValue(EncasedShaftBlock.AXIS)))) .blockstate((c, p) -> axisBlock(c, p, blockState -> p.models() .getExistingFile(p.modLoc("block/encased_shaft/block_" + casing)), true)) .transform(StressConfigDefaults.setNoImpact()) - .loot((p, b) -> p.registerDropping(b, AllBlocks.SHAFT.get())) + .loot((p, b) -> p.dropOther(b, AllBlocks.SHAFT.get())) .item() .model(AssetLookup.customBlockItemModel("encased_shaft", "item_" + casing)) .build(); @@ -73,7 +74,7 @@ public class BuilderTransformers { @Nullable DyeColor color) { return b -> b.initialProperties(SharedProperties::softMetal) .blockstate((c, p) -> { - String variant = color == null ? "copper" : color.getString(); + String variant = color == null ? "copper" : color.getSerializedName(); p.directionalBlock(c.get(), p.models() .withExistingParent(variant + "_valve_handle", p.modLoc("block/valve_handle")) .texture("3", p.modLoc("block/valve_handle/valve_handle_" + variant))); @@ -97,15 +98,15 @@ public class BuilderTransformers { public static NonNullUnaryOperator> beltTunnel( String type, ResourceLocation particleTexture) { return b -> b.initialProperties(SharedProperties::stone) - .addLayer(() -> RenderType::getCutoutMipped) - .properties(Block.Properties::nonOpaque) + .addLayer(() -> RenderType::cutoutMipped) + .properties(AbstractBlock.Properties::noOcclusion) .blockstate((c, p) -> p.getVariantBuilder(c.get()) .forAllStates(state -> { String id = "block/" + type + "_tunnel"; - Shape shape = state.get(BeltTunnelBlock.SHAPE); + Shape shape = state.getValue(BeltTunnelBlock.SHAPE); if (shape == BeltTunnelBlock.Shape.CLOSED) shape = BeltTunnelBlock.Shape.STRAIGHT; - String shapeName = shape.getString(); + String shapeName = shape.getSerializedName(); return ConfiguredModel.builder() .modelFile(p.models() .withExistingParent(id + "/" + shapeName, p.modLoc("block/belt_tunnel/" + shapeName)) @@ -113,7 +114,7 @@ public class BuilderTransformers { .texture("2", p.modLoc(id)) .texture("3", p.modLoc(id + "_top_window")) .texture("particle", particleTexture)) - .rotationY(state.get(BeltTunnelBlock.HORIZONTAL_AXIS) == Axis.X ? 0 : 90) + .rotationY(state.getValue(BeltTunnelBlock.HORIZONTAL_AXIS) == Axis.X ? 0 : 90) .build(); })) .item(BeltTunnelItem::new) @@ -129,12 +130,12 @@ public class BuilderTransformers { public static NonNullUnaryOperator> mechanicalPiston(PistonType type) { return b -> b.initialProperties(SharedProperties::stone) - .properties(p -> p.nonOpaque()) + .properties(p -> p.noOcclusion()) .blockstate(new MechanicalPistonGenerator(type)::generate) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .transform(StressConfigDefaults.setImpact(4.0)) .item() - .transform(ModelGen.customItemModel("mechanical_piston", type.getString(), "item")); + .transform(ModelGen.customItemModel("mechanical_piston", type.getSerializedName(), "item")); } public static NonNullUnaryOperator> bearing(String prefix, @@ -147,7 +148,7 @@ public class BuilderTransformers { ResourceLocation sideTextureLocation = Create.asResource("block/" + prefix + "_bearing_side"); ResourceLocation backTextureLocation = Create.asResource("block/" + backTexture); return b -> b.initialProperties(SharedProperties::stone) - .properties(p -> p.nonOpaque()) + .properties(p -> p.noOcclusion()) .blockstate((c, p) -> p.directionalBlock(c.get(), p.models() .withExistingParent(c.getName(), baseBlockModelLocation) .texture("side", sideTextureLocation) @@ -183,8 +184,8 @@ public class BuilderTransformers { String variant = "single"; int yRot = 0; - if (state.get(CrateBlock.DOUBLE)) { - Direction direction = state.get(CrateBlock.FACING); + if (state.getValue(CrateBlock.DOUBLE)) { + Direction direction = state.getValue(CrateBlock.FACING); if (direction.getAxis() == Axis.X) yRot = 90; @@ -220,14 +221,19 @@ public class BuilderTransformers { public static NonNullUnaryOperator> bell() { return b -> b.initialProperties(SharedProperties::softMetal) - .properties(p -> p.nonOpaque() + .properties(p -> p.noOcclusion() .sound(SoundType.ANVIL)) - .addLayer(() -> RenderType::getCutoutMipped) + .addLayer(() -> RenderType::cutoutMipped) .tag(AllBlockTags.BRITTLE.tag) - .blockstate((c, p) -> p.horizontalBlock(c.getEntry(), state -> - AssetLookup.partialBaseModel(c, p, state.get(BlockStateProperties.BELL_ATTACHMENT).getString()))) + .blockstate((c, p) -> p.horizontalBlock(c.getEntry(), state -> { + String variant = state.getValue(BlockStateProperties.BELL_ATTACHMENT) + .getSerializedName(); + return p.models() + .withExistingParent(c.getName() + "_" + variant, p.modLoc("block/bell_base/block_" + variant)); + })) .item() - .transform(ModelGen.customItemModel()); + .model((c, p) -> p.withExistingParent(c.getName(), p.modLoc("block/" + c.getName()))) + .build(); } } diff --git a/src/main/java/com/simibubi/create/foundation/data/DirectionalAxisBlockStateGen.java b/src/main/java/com/simibubi/create/foundation/data/DirectionalAxisBlockStateGen.java index 64512db71..ec321bd6e 100644 --- a/src/main/java/com/simibubi/create/foundation/data/DirectionalAxisBlockStateGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/DirectionalAxisBlockStateGen.java @@ -14,8 +14,8 @@ public abstract class DirectionalAxisBlockStateGen extends SpecialBlockStateGen @Override protected int getXRotation(BlockState state) { - Direction direction = state.get(GaugeBlock.FACING); - boolean alongFirst = state.get(GaugeBlock.AXIS_ALONG_FIRST_COORDINATE); + Direction direction = state.getValue(GaugeBlock.FACING); + boolean alongFirst = state.getValue(GaugeBlock.AXIS_ALONG_FIRST_COORDINATE); if (direction == Direction.DOWN) return 180; @@ -29,8 +29,8 @@ public abstract class DirectionalAxisBlockStateGen extends SpecialBlockStateGen @Override protected int getYRotation(BlockState state) { - Direction direction = state.get(GaugeBlock.FACING); - boolean alongFirst = state.get(GaugeBlock.AXIS_ALONG_FIRST_COORDINATE); + Direction direction = state.getValue(GaugeBlock.FACING); + boolean alongFirst = state.getValue(GaugeBlock.AXIS_ALONG_FIRST_COORDINATE); if (direction.getAxis() .isVertical()) @@ -45,7 +45,7 @@ public abstract class DirectionalAxisBlockStateGen extends SpecialBlockStateGen @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - boolean vertical = state.get(GaugeBlock.FACING) + boolean vertical = state.getValue(GaugeBlock.FACING) .getAxis() .isVertical(); String partial = vertical ? "" : "_wall"; diff --git a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java index 1f92db23c..0b71d5383 100644 --- a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java +++ b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java @@ -76,7 +76,7 @@ public class LangMerger implements IDataProvider { } @Override - public void act(DirectoryCache cache) throws IOException { + public void run(DirectoryCache cache) throws IOException { Path path = this.gen.getOutputFolder() .resolve("assets/" + Create.ID + "/lang/" + "en_us.json"); @@ -232,9 +232,9 @@ public class LangMerger implements IDataProvider { String data = createString(dataIn, missingKeys); // data = JavaUnicodeEscaper.outsideOf(0, 0x7f) // .translate(data); - String hash = IDataProvider.HASH_FUNCTION.hashUnencodedChars(data) + String hash = IDataProvider.SHA1.hashUnencodedChars(data) .toString(); - if (!Objects.equals(cache.getPreviousHash(target), hash) || !Files.exists(target)) { + if (!Objects.equals(cache.getHash(target), hash) || !Files.exists(target)) { Files.createDirectories(target.getParent()); try (BufferedWriter bufferedwriter = Files.newBufferedWriter(target)) { @@ -244,7 +244,7 @@ public class LangMerger implements IDataProvider { } } - cache.recordHash(target, hash); + cache.putNew(target, hash); } protected String createString(List data, int missingKeys) { diff --git a/src/main/java/com/simibubi/create/foundation/data/NamedTag.java b/src/main/java/com/simibubi/create/foundation/data/NamedTag.java index 066552663..000ff1b05 100644 --- a/src/main/java/com/simibubi/create/foundation/data/NamedTag.java +++ b/src/main/java/com/simibubi/create/foundation/data/NamedTag.java @@ -22,7 +22,7 @@ public class NamedTag implements ITag.INamedTag { } @Override - public ResourceLocation getId() { + public ResourceLocation getName() { return id; } @@ -34,9 +34,9 @@ public class NamedTag implements ITag.INamedTag { } @Override - public List values() { + public List getValues() { if (tag == null) return Collections.emptyList(); - return tag.values(); + return tag.getValues(); } } diff --git a/src/main/java/com/simibubi/create/foundation/data/SharedProperties.java b/src/main/java/com/simibubi/create/foundation/data/SharedProperties.java index f685c4368..c65837850 100644 --- a/src/main/java/com/simibubi/create/foundation/data/SharedProperties.java +++ b/src/main/java/com/simibubi/create/foundation/data/SharedProperties.java @@ -10,7 +10,7 @@ import net.minecraft.block.material.PushReaction; @MethodsReturnNonnullByDefault public class SharedProperties { public static Material beltMaterial = - new Material(MaterialColor.GRAY, false, true, true, true, false, false, PushReaction.NORMAL); + new Material(MaterialColor.COLOR_GRAY, false, true, true, true, false, false, PushReaction.NORMAL); public static Block stone() { return Blocks.ANDESITE; diff --git a/src/main/java/com/simibubi/create/foundation/data/SpecialBlockStateGen.java b/src/main/java/com/simibubi/create/foundation/data/SpecialBlockStateGen.java index 98aea3c9c..1529eac07 100644 --- a/src/main/java/com/simibubi/create/foundation/data/SpecialBlockStateGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/SpecialBlockStateGen.java @@ -31,7 +31,7 @@ public abstract class SpecialBlockStateGen { if (direction.getAxis() .isVertical()) return 0; - return (int) direction.getHorizontalAngle(); + return (int) direction.toYRot(); } protected abstract int getXRotation(BlockState state); diff --git a/src/main/java/com/simibubi/create/foundation/data/WindowGen.java b/src/main/java/com/simibubi/create/foundation/data/WindowGen.java index 3aabbe3d3..8139a6f9b 100644 --- a/src/main/java/com/simibubi/create/foundation/data/WindowGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/WindowGen.java @@ -44,10 +44,10 @@ public class WindowGen { private static final CreateRegistrate REGISTRATE = Create.registrate(); private static Properties glassProperties(Properties p) { - return p.allowsSpawning(WindowGen::never) - .solidBlock(WindowGen::never) - .suffocates(WindowGen::never) - .blockVision(WindowGen::never); + return p.isValidSpawn(WindowGen::never) + .isRedstoneConductor(WindowGen::never) + .isSuffocating(WindowGen::never) + .isViewBlocking(WindowGen::never); } private static boolean never(BlockState p_235436_0_, IBlockReader p_235436_1_, BlockPos p_235436_2_) { @@ -60,7 +60,7 @@ public class WindowGen { } public static BlockEntry woodenWindowBlock(WoodType woodType, Block planksBlock) { - return woodenWindowBlock(woodType, planksBlock, () -> RenderType::getCutoutMipped); + return woodenWindowBlock(woodType, planksBlock, () -> RenderType::cutoutMipped); } public static BlockEntry customWindowBlock(String name, Supplier ingredient, @@ -72,7 +72,7 @@ public class WindowGen { public static BlockEntry woodenWindowBlock(WoodType woodType, Block planksBlock, Supplier> renderType) { - String woodName = woodType.getName(); + String woodName = woodType.name(); String name = woodName + "_window"; NonNullFunction end_texture = $ -> new ResourceLocation("block/" + woodName + "_planks"); @@ -87,16 +87,16 @@ public class WindowGen { return REGISTRATE.block(name, WindowBlock::new) .onRegister(connectedTextures(new HorizontalCTBehaviour(ct))) .addLayer(renderType) - .recipe((c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get(), 2) - .patternLine(" # ") - .patternLine("#X#") - .key('#', ingredient.get()) - .key('X', DataIngredient.tag(Tags.Items.GLASS_COLORLESS)) - .addCriterion("has_ingredient", p.hasItem(ingredient.get())) - .build(p::accept)) + .recipe((c, p) -> ShapedRecipeBuilder.shaped(c.get(), 2) + .pattern(" # ") + .pattern("#X#") + .define('#', ingredient.get()) + .define('X', DataIngredient.tag(Tags.Items.GLASS_COLORLESS)) + .unlockedBy("has_ingredient", p.hasItem(ingredient.get())) + .save(p::accept)) .initialProperties(() -> Blocks.GLASS) .properties(WindowGen::glassProperties) - .loot((t, g) -> t.registerSilkTouch(g)) + .loot((t, g) -> t.dropWhenSilkTouch(g)) .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() .cubeColumn(c.getName(), sideTexture.apply(c.getName()), endTexture.apply(c.getName())))) .tag(BlockTags.IMPERMEABLE) @@ -107,10 +107,10 @@ public class WindowGen { public static BlockEntry framedGlass(String name, ConnectedTextureBehaviour behaviour) { return REGISTRATE.block(name, ConnectedGlassBlock::new) .onRegister(connectedTextures(behaviour)) - .addLayer(() -> RenderType::getTranslucent) + .addLayer(() -> RenderType::translucent) .initialProperties(() -> Blocks.GLASS) .properties(WindowGen::glassProperties) - .loot((t, g) -> t.registerSilkTouch(g)) + .loot((t, g) -> t.dropWhenSilkTouch(g)) .recipe((c, p) -> p.stonecutting(DataIngredient.tag(Tags.Items.GLASS_COLORLESS), c::get)) .blockstate((c, p) -> BlockStateGen.cubeAll(c, p, "palettes/", "framed_glass")) .tag(Tags.Blocks.GLASS_COLORLESS, BlockTags.IMPERMEABLE) @@ -127,7 +127,7 @@ public class WindowGen { ResourceLocation sideTexture = Create.asResource(palettesDir() + "framed_glass"); ResourceLocation itemSideTexture = Create.asResource(palettesDir() + name); ResourceLocation topTexture = Create.asResource(palettesDir() + "framed_glass_pane_top"); - Supplier> renderType = () -> RenderType::getTranslucent; + Supplier> renderType = () -> RenderType::translucent; return connectedGlassPane(name, parent, ctshift, sideTexture, itemSideTexture, topTexture, renderType); } @@ -140,12 +140,12 @@ public class WindowGen { public static BlockEntry woodenWindowPane(WoodType woodType, Supplier parent) { - return woodenWindowPane(woodType, parent, () -> RenderType::getCutoutMipped); + return woodenWindowPane(woodType, parent, () -> RenderType::cutoutMipped); } public static BlockEntry woodenWindowPane(WoodType woodType, Supplier parent, Supplier> renderType) { - String woodName = woodType.getName(); + String woodName = woodType.name(); String name = woodName + "_window"; ResourceLocation topTexture = new ResourceLocation("block/" + woodName + "_planks"); ResourceLocation sideTexture = Create.asResource(palettesDir() + name); @@ -203,14 +203,14 @@ public class WindowGen { .addLayer(renderType) .initialProperties(() -> Blocks.GLASS_PANE) .blockstate(stateProvider) - .recipe((c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get(), 16) - .patternLine("###") - .patternLine("###") - .key('#', parent.get()) - .addCriterion("has_ingredient", p.hasItem(parent.get())) - .build(p::accept)) + .recipe((c, p) -> ShapedRecipeBuilder.shaped(c.get(), 16) + .pattern("###") + .pattern("###") + .define('#', parent.get()) + .unlockedBy("has_ingredient", p.hasItem(parent.get())) + .save(p::accept)) .tag(Tags.Blocks.GLASS_PANES) - .loot((t, g) -> t.registerSilkTouch(g)) + .loot((t, g) -> t.dropWhenSilkTouch(g)) .item() .tag(Tags.Items.GLASS_PANES) .model((c, p) -> p.withExistingParent(c.getName(), new ResourceLocation(Create.ID, "item/pane")) diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java index 46d903c9d..2e4138cec 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java @@ -20,28 +20,28 @@ import net.minecraftforge.common.Tags; public abstract class CreateRecipeProvider extends RecipeProvider { - final List all = new ArrayList<>(); + protected final List all = new ArrayList<>(); - public CreateRecipeProvider(DataGenerator p_i48262_1_) { - super(p_i48262_1_); + public CreateRecipeProvider(DataGenerator generator) { + super(generator); } @Override - protected void registerRecipes(Consumer p_200404_1_) { + protected void buildShapelessRecipes(Consumer p_200404_1_) { all.forEach(c -> c.register(p_200404_1_)); Create.LOGGER.info(getName() + " registered " + all.size() + " recipe" + (all.size() == 1 ? "" : "s")); } - @FunctionalInterface - interface GeneratedRecipe { - void register(Consumer consumer); - } - protected GeneratedRecipe register(GeneratedRecipe recipe) { all.add(recipe); return recipe; } + @FunctionalInterface + public interface GeneratedRecipe { + void register(Consumer consumer); + } + protected static class Marker { } @@ -50,11 +50,15 @@ public abstract class CreateRecipeProvider extends RecipeProvider { static ITag.INamedTag redstone() { return Tags.Items.DUSTS_REDSTONE; } - + static ITag.INamedTag planks() { return ItemTags.PLANKS; } + static ITag.INamedTag woodSlab() { + return ItemTags.WOODEN_SLABS; + } + static ITag.INamedTag gold() { return AllTags.forgeItemTag("ingots/gold"); } @@ -78,7 +82,7 @@ public abstract class CreateRecipeProvider extends RecipeProvider { static IItemProvider cog() { return AllBlocks.COGWHEEL.get(); } - + static IItemProvider largeCog() { return AllBlocks.LARGE_COGWHEEL.get(); } @@ -98,7 +102,7 @@ public abstract class CreateRecipeProvider extends RecipeProvider { static ITag.INamedTag iron() { return Tags.Items.INGOTS_IRON; } - + static ITag.INamedTag ironNugget() { return AllTags.forgeItemTag("nuggets/iron"); } @@ -119,8 +123,8 @@ public abstract class CreateRecipeProvider extends RecipeProvider { return AllItems.ELECTRON_TUBE.get(); } - static IItemProvider clockwork() { - return AllItems.CLOCKWORK_COMPONENT.get(); + static IItemProvider precisionMechanism() { + return AllItems.PRECISION_MECHANISM.get(); } static ITag.INamedTag copperBlock() { @@ -142,7 +146,7 @@ public abstract class CreateRecipeProvider extends RecipeProvider { static ITag.INamedTag copperSheet() { return AllTags.forgeItemTag("plates/copper"); } - + static ITag.INamedTag copperNugget() { return AllTags.forgeItemTag("nuggets/copper"); } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeBuilder.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeBuilder.java index 1bc1314c7..3f806faf7 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeBuilder.java @@ -54,14 +54,14 @@ public class MechanicalCraftingRecipeBuilder { * Adds a key to the recipe pattern. */ public MechanicalCraftingRecipeBuilder key(Character p_200469_1_, Tag p_200469_2_) { - return this.key(p_200469_1_, Ingredient.fromTag(p_200469_2_)); + return this.key(p_200469_1_, Ingredient.of(p_200469_2_)); } /** * Adds a key to the recipe pattern. */ public MechanicalCraftingRecipeBuilder key(Character p_200462_1_, IItemProvider p_200462_2_) { - return this.key(p_200462_1_, Ingredient.fromItems(p_200462_2_)); + return this.key(p_200462_1_, Ingredient.of(p_200462_2_)); } /** @@ -161,7 +161,7 @@ public class MechanicalCraftingRecipeBuilder { this.key = p_i48271_7_; } - public void serialize(JsonObject p_218610_1_) { + public void serializeRecipeData(JsonObject p_218610_1_) { JsonArray jsonarray = new JsonArray(); for (String s : this.pattern) jsonarray.add(s); @@ -170,7 +170,7 @@ public class MechanicalCraftingRecipeBuilder { JsonObject jsonobject = new JsonObject(); for (Entry entry : this.key.entrySet()) jsonobject.add(String.valueOf(entry.getKey()), entry.getValue() - .serialize()); + .toJson()); p_218610_1_.add("key", jsonobject); JsonObject jsonobject1 = new JsonObject(); @@ -182,21 +182,21 @@ public class MechanicalCraftingRecipeBuilder { p_218610_1_.add("result", jsonobject1); } - public IRecipeSerializer getSerializer() { - return AllRecipeTypes.MECHANICAL_CRAFTING.serializer; + public IRecipeSerializer getType() { + return AllRecipeTypes.MECHANICAL_CRAFTING.getSerializer(); } - public ResourceLocation getID() { + public ResourceLocation getId() { return this.id; } @Nullable - public JsonObject getAdvancementJson() { + public JsonObject serializeAdvancement() { return null; } @Nullable - public ResourceLocation getAdvancementID() { + public ResourceLocation getAdvancementId() { return null; } } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeGen.java index b1bbb20ef..d4e5c5eb5 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MechanicalCraftingRecipeGen.java @@ -20,8 +20,8 @@ public class MechanicalCraftingRecipeGen extends CreateRecipeProvider { GeneratedRecipe CRUSHING_WHEEL = create(AllBlocks.CRUSHING_WHEEL::get).returns(2) - .recipe(b -> b.key('P', Ingredient.fromTag(ItemTags.PLANKS)) - .key('S', Ingredient.fromTag(I.stone())) + .recipe(b -> b.key('P', Ingredient.of(ItemTags.PLANKS)) + .key('S', Ingredient.of(I.stone())) .key('A', I.andesite()) .patternLine(" AAA ") .patternLine("AAPAA") @@ -30,37 +30,35 @@ public class MechanicalCraftingRecipeGen extends CreateRecipeProvider { .patternLine(" AAA ")), EXTENDO_GRIP = create(AllItems.EXTENDO_GRIP::get).returns(1) - .recipe(b -> b.key('L', Ingredient.fromTag(I.brass())) - .key('R', I.clockwork()) + .recipe(b -> b.key('L', Ingredient.of(I.brass())) + .key('R', I.precisionMechanism()) .key('H', AllItems.BRASS_HAND.get()) - .key('S', Ingredient.fromTag(Tags.Items.RODS_WOODEN)) + .key('S', Ingredient.of(Tags.Items.RODS_WOODEN)) .patternLine(" L ") .patternLine(" R ") .patternLine("SSS") .patternLine("SSS") .patternLine(" H ")), - + POTATO_CANNON = create(AllItems.POTATO_CANNON::get).returns(1) .recipe(b -> b.key('L', I.andesite()) - .key('R', I.clockwork()) - .key('S', Ingredient.fromTag(I.copper())) - .patternLine("L") - .patternLine("R") - .patternLine("S") - .patternLine("S") - .patternLine("S")), + .key('R', I.precisionMechanism()) + .key('S', AllBlocks.FLUID_PIPE.get()) + .key('C', Ingredient.of(I.copper())) + .patternLine("LRSSS") + .patternLine("CC ")), FURNACE_ENGINE = create(AllBlocks.FURNACE_ENGINE::get).returns(1) - .recipe(b -> b.key('P', Ingredient.fromTag(I.brassSheet())) - .key('B', Ingredient.fromTag(I.brass())) - .key('I', Ingredient.fromItems(Blocks.PISTON, Blocks.STICKY_PISTON)) + .recipe(b -> b.key('P', Ingredient.of(I.brassSheet())) + .key('B', Ingredient.of(I.brass())) + .key('I', Ingredient.of(Blocks.PISTON, Blocks.STICKY_PISTON)) .key('C', I.brassCasing()) .patternLine("PPB") .patternLine("PCI") .patternLine("PPB")), FLYWHEEL = create(AllBlocks.FLYWHEEL::get).returns(1) - .recipe(b -> b.key('B', Ingredient.fromTag(I.brass())) + .recipe(b -> b.key('B', Ingredient.of(I.brass())) .key('C', I.brassCasing()) .patternLine(" BBB") .patternLine("CB B") diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java index e2f38a40c..847efae00 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java @@ -13,7 +13,7 @@ public class PressingRecipeGen extends ProcessingRecipeGen { SUGAR_CANE = create(() -> Items.SUGAR_CANE, b -> b.output(Items.PAPER)), - PATH = create("path", b -> b.require(Ingredient.fromItems(Items.GRASS_BLOCK, Items.DIRT)) + PATH = create("path", b -> b.require(Ingredient.of(Items.GRASS_BLOCK, Items.DIRT)) .output(Items.GRASS_PATH)), IRON = create("iron_ingot", b -> b.require(I.iron()) diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/ProcessingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/ProcessingRecipeGen.java index 920d5ef13..d9b9f2026 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/ProcessingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/ProcessingRecipeGen.java @@ -6,50 +6,51 @@ import java.util.List; import java.util.function.Supplier; import java.util.function.UnaryOperator; -import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer; +import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; import net.minecraft.data.DataGenerator; import net.minecraft.data.DirectoryCache; import net.minecraft.data.IDataProvider; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.IItemProvider; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidAttributes; public abstract class ProcessingRecipeGen extends CreateRecipeProvider { - protected static List generators = new ArrayList<>(); + protected static final List GENERATORS = new ArrayList<>(); protected static final int BUCKET = FluidAttributes.BUCKET_VOLUME; protected static final int BOTTLE = 250; public static void registerAll(DataGenerator gen) { - generators.add(new CrushingRecipeGen(gen)); - generators.add(new MillingRecipeGen(gen)); - generators.add(new CuttingRecipeGen(gen)); - generators.add(new WashingRecipeGen(gen)); - generators.add(new PolishingRecipeGen(gen)); - generators.add(new DeployingRecipeGen(gen)); - generators.add(new MixingRecipeGen(gen)); - generators.add(new CompactingRecipeGen(gen)); - generators.add(new PressingRecipeGen(gen)); - generators.add(new FillingRecipeGen(gen)); - generators.add(new EmptyingRecipeGen(gen)); - + GENERATORS.add(new CrushingRecipeGen(gen)); + GENERATORS.add(new MillingRecipeGen(gen)); + GENERATORS.add(new CuttingRecipeGen(gen)); + GENERATORS.add(new WashingRecipeGen(gen)); + GENERATORS.add(new PolishingRecipeGen(gen)); + GENERATORS.add(new DeployingRecipeGen(gen)); + GENERATORS.add(new MixingRecipeGen(gen)); + GENERATORS.add(new CompactingRecipeGen(gen)); + GENERATORS.add(new PressingRecipeGen(gen)); + GENERATORS.add(new FillingRecipeGen(gen)); + GENERATORS.add(new EmptyingRecipeGen(gen)); + gen.addProvider(new IDataProvider() { - + @Override public String getName() { return "Create's Processing Recipes"; } - + @Override - public void act(DirectoryCache dc) throws IOException { - generators.forEach(g -> { + public void run(DirectoryCache dc) throws IOException { + GENERATORS.forEach(g -> { try { - g.act(dc); + g.run(dc); } catch (IOException e) { e.printStackTrace(); } @@ -57,55 +58,71 @@ public abstract class ProcessingRecipeGen extends CreateRecipeProvider { } }); } - - public ProcessingRecipeGen(DataGenerator p_i48262_1_) { - super(p_i48262_1_); + + public ProcessingRecipeGen(DataGenerator generator) { + super(generator); } - + /** * Create a processing recipe with a single itemstack ingredient, using its id * as the name of the recipe */ - protected > GeneratedRecipe create(Supplier singleIngredient, + protected > GeneratedRecipe create(String namespace, Supplier singleIngredient, UnaryOperator> transform) { ProcessingRecipeSerializer serializer = getSerializer(); GeneratedRecipe generatedRecipe = c -> { IItemProvider iItemProvider = singleIngredient.get(); transform - .apply(new ProcessingRecipeBuilder<>(serializer.getFactory(), Create.asResource(iItemProvider.asItem() + .apply(new ProcessingRecipeBuilder<>(serializer.getFactory(), new ResourceLocation(namespace, iItemProvider.asItem() .getRegistryName() - .getPath())).withItemIngredients(Ingredient.fromItems(iItemProvider))) + .getPath())).withItemIngredients(Ingredient.of(iItemProvider))) .build(c); }; all.add(generatedRecipe); return generatedRecipe; } + /** + * Create a processing recipe with a single itemstack ingredient, using its id + * as the name of the recipe + */ + > GeneratedRecipe create(Supplier singleIngredient, + UnaryOperator> transform) { + return create(Create.ID, singleIngredient, transform); + } + + /** + * Create a new processing recipe, with recipe definitions provided by the + * function + */ + protected > GeneratedRecipe create(ResourceLocation name, + UnaryOperator> transform) { + ProcessingRecipeSerializer serializer = getSerializer(); + GeneratedRecipe generatedRecipe = + c -> transform.apply(new ProcessingRecipeBuilder<>(serializer.getFactory(), name)) + .build(c); + all.add(generatedRecipe); + return generatedRecipe; + } + /** * Create a new processing recipe, with recipe definitions provided by the * function */ - protected > GeneratedRecipe create(String name, - UnaryOperator> transform) { - ProcessingRecipeSerializer serializer = getSerializer(); - GeneratedRecipe generatedRecipe = - c -> transform.apply(new ProcessingRecipeBuilder<>(serializer.getFactory(), Create.asResource(name))) - .build(c); - all.add(generatedRecipe); - return generatedRecipe; + > GeneratedRecipe create(String name, + UnaryOperator> transform) { + return create(Create.asResource(name), transform); } - @SuppressWarnings("unchecked") - private > ProcessingRecipeSerializer getSerializer() { - ProcessingRecipeSerializer serializer = (ProcessingRecipeSerializer) getRecipeType().serializer; - return serializer; + protected abstract IRecipeTypeInfo getRecipeType(); + + protected > ProcessingRecipeSerializer getSerializer() { + return getRecipeType().getSerializer(); } @Override - public final String getName() { - return "Create's Processing Recipes: " + getRecipeType(); + public String getName() { + return "Create's Processing Recipes: " + getRecipeType().getId().getPath(); } - - protected abstract AllRecipeTypes getRecipeType(); } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/SequencedAssemblyRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/SequencedAssemblyRecipeGen.java index 9fae5a6fa..42b653da0 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/SequencedAssemblyRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/SequencedAssemblyRecipeGen.java @@ -6,9 +6,14 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.deployer.DeployerApplicationRecipe; +import com.simibubi.create.content.contraptions.components.saw.CuttingRecipe; import com.simibubi.create.content.contraptions.itemAssembly.SequencedAssemblyRecipeBuilder; +import net.minecraft.block.Blocks; import net.minecraft.data.DataGenerator; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.tags.ItemTags; public class SequencedAssemblyRecipeGen extends CreateRecipeProvider { @@ -27,17 +32,49 @@ public class SequencedAssemblyRecipeGen extends CreateRecipeProvider { // .addStep(CuttingRecipe::new, rb -> rb.averageProcessingDuration()) // .addStep(FillingRecipe::new, rb -> rb.require(Fluids.WATER, 100)) // ) - - CLOCKWORK_COMPONENT = create("clockwork_component", b -> b.require(I.goldSheet()) - .transitionTo(AllItems.INCOMPLETE_CLOCKWORK_COMPONENT.get()) - .addOutput(AllItems.CLOCKWORK_COMPONENT.get(), 12) - .addOutput(AllItems.GOLDEN_SHEET.get(), 2) - .addOutput(AllItems.ANDESITE_ALLOY.get(), 2) - .addOutput(AllBlocks.COGWHEEL.get(), 1) //TODO add more junk + + PRECISION_MECHANISM = create("precision_mechanism", b -> b.require(I.goldSheet()) + .transitionTo(AllItems.INCOMPLETE_PRECISION_MECHANISM.get()) + .addOutput(AllItems.PRECISION_MECHANISM.get(), 120) + .addOutput(AllItems.GOLDEN_SHEET.get(), 8) + .addOutput(AllItems.ANDESITE_ALLOY.get(), 8) + .addOutput(AllBlocks.COGWHEEL.get(), 5) + .addOutput(AllBlocks.SHAFT.get(), 2) + .addOutput(AllItems.CRUSHED_GOLD.get(), 2) + .addOutput(Items.GOLD_NUGGET, 2) + .addOutput(Items.IRON_INGOT, 1) + .addOutput(Items.CLOCK, 1) .loops(5) .addStep(DeployerApplicationRecipe::new, rb -> rb.require(I.cog())) .addStep(DeployerApplicationRecipe::new, rb -> rb.require(I.largeCog())) .addStep(DeployerApplicationRecipe::new, rb -> rb.require(I.ironNugget())) + ), + + COGWHEEL = create("cogwheel", b -> b.require(I.andesite()) + .transitionTo(AllItems.INCOMPLETE_COGWHEEL.get()) + .addOutput(new ItemStack(AllBlocks.COGWHEEL.get(), 12), 32) + .addOutput(AllItems.ANDESITE_ALLOY.get(), 2) + .addOutput(Blocks.ANDESITE, 1) + .addOutput(AllBlocks.LARGE_COGWHEEL.get(), 1) + .addOutput(Items.STICK, 1) + .addOutput(Items.IRON_NUGGET, 1) + .loops(4) + .addStep(DeployerApplicationRecipe::new, rb -> rb.require(ItemTags.WOODEN_BUTTONS)) + .addStep(CuttingRecipe::new, rb -> rb.duration(50)) + ), + + LARGE_COGWHEEL = create("large_cogwheel", b -> b.require(I.andesite()) + .transitionTo(AllItems.INCOMPLETE_LARGE_COGWHEEL.get()) + .addOutput(new ItemStack(AllBlocks.LARGE_COGWHEEL.get(), 6), 32) + .addOutput(AllItems.ANDESITE_ALLOY.get(), 2) + .addOutput(Blocks.ANDESITE, 1) + .addOutput(AllBlocks.COGWHEEL.get(), 1) + .addOutput(Items.STICK, 1) + .addOutput(Items.IRON_NUGGET, 1) + .loops(3) + .addStep(DeployerApplicationRecipe::new, rb -> rb.require(I.planks())) + .addStep(DeployerApplicationRecipe::new, rb -> rb.require(ItemTags.WOODEN_BUTTONS)) + .addStep(CuttingRecipe::new, rb -> rb.duration(50)) ) ; diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 1890fda3a..738ae440d 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -77,699 +77,699 @@ public class StandardRecipeGen extends CreateRecipeProvider { ImmutableList.of(I::zincNugget, I::zinc, I::zincBlock)), ANDESITE_ALLOY = create(AllItems.ANDESITE_ALLOY).unlockedByTag(I::iron) - .viaShaped(b -> b.key('A', Blocks.ANDESITE) - .key('B', Tags.Items.NUGGETS_IRON) - .patternLine("BA") - .patternLine("AB")), + .viaShaped(b -> b.define('A', Blocks.ANDESITE) + .define('B', Tags.Items.NUGGETS_IRON) + .pattern("BA") + .pattern("AB")), ANDESITE_ALLOY_FROM_ZINC = create(AllItems.ANDESITE_ALLOY).withSuffix("_from_zinc") .unlockedByTag(I::zinc) - .viaShaped(b -> b.key('A', Blocks.ANDESITE) - .key('B', I.zincNugget()) - .patternLine("BA") - .patternLine("AB")), + .viaShaped(b -> b.define('A', Blocks.ANDESITE) + .define('B', I.zincNugget()) + .pattern("BA") + .pattern("AB")), ANDESITE_CASING = create(AllBlocks.ANDESITE_CASING).returns(4) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('A', ItemTags.PLANKS) - .key('C', I.andesite()) - .key('S', ItemTags.LOGS) - .patternLine("AAA") - .patternLine("CSC") - .patternLine("AAA")), + .viaShaped(b -> b.define('A', ItemTags.PLANKS) + .define('C', I.andesite()) + .define('S', ItemTags.LOGS) + .pattern("AAA") + .pattern("CSC") + .pattern("AAA")), BRASS_CASING = create(AllBlocks.BRASS_CASING).returns(4) .unlockedByTag(I::brass) - .viaShaped(b -> b.key('A', ItemTags.PLANKS) - .key('C', I.brassSheet()) - .key('S', ItemTags.LOGS) - .patternLine("AAA") - .patternLine("CSC") - .patternLine("AAA")), + .viaShaped(b -> b.define('A', ItemTags.PLANKS) + .define('C', I.brassSheet()) + .define('S', ItemTags.LOGS) + .pattern("AAA") + .pattern("CSC") + .pattern("AAA")), COPPER_CASING = create(AllBlocks.COPPER_CASING).returns(4) .unlockedByTag(I::copper) - .viaShaped(b -> b.key('A', ItemTags.PLANKS) - .key('C', I.copperSheet()) - .key('S', ItemTags.LOGS) - .patternLine("AAA") - .patternLine("CSC") - .patternLine("AAA")), + .viaShaped(b -> b.define('A', ItemTags.PLANKS) + .define('C', I.copperSheet()) + .define('S', ItemTags.LOGS) + .pattern("AAA") + .pattern("CSC") + .pattern("AAA")), RADIANT_CASING = create(AllBlocks.REFINED_RADIANCE_CASING).returns(4) .unlockedBy(I::refinedRadiance) - .viaShaped(b -> b.key('A', ItemTags.PLANKS) - .key('C', I.refinedRadiance()) - .key('S', Tags.Items.GLASS_COLORLESS) - .patternLine("AAA") - .patternLine("CSC") - .patternLine("AAA")), + .viaShaped(b -> b.define('A', ItemTags.PLANKS) + .define('C', I.refinedRadiance()) + .define('S', Tags.Items.GLASS_COLORLESS) + .pattern("AAA") + .pattern("CSC") + .pattern("AAA")), SHADOW_CASING = create(AllBlocks.SHADOW_STEEL_CASING).returns(4) .unlockedBy(I::shadowSteel) - .viaShaped(b -> b.key('A', ItemTags.PLANKS) - .key('C', I.shadowSteel()) - .key('S', Tags.Items.OBSIDIAN) - .patternLine("AAA") - .patternLine("CSC") - .patternLine("AAA")), + .viaShaped(b -> b.define('A', ItemTags.PLANKS) + .define('C', I.shadowSteel()) + .define('S', Tags.Items.OBSIDIAN) + .pattern("AAA") + .pattern("CSC") + .pattern("AAA")), ELECTRON_TUBE = create(AllItems.ELECTRON_TUBE).unlockedBy(AllItems.ROSE_QUARTZ::get) - .viaShaped(b -> b.key('L', AllItems.POLISHED_ROSE_QUARTZ.get()) - .key('R', Items.REDSTONE_TORCH) - .key('N', Tags.Items.NUGGETS_IRON) - .patternLine("L") - .patternLine("R") - .patternLine("N")), + .viaShaped(b -> b.define('L', AllItems.POLISHED_ROSE_QUARTZ.get()) + .define('R', Items.REDSTONE_TORCH) + .define('N', Tags.Items.NUGGETS_IRON) + .pattern("L") + .pattern("R") + .pattern("N")), ROSE_QUARTZ = create(AllItems.ROSE_QUARTZ).unlockedBy(() -> Items.REDSTONE) - .viaShapeless(b -> b.addIngredient(Tags.Items.GEMS_QUARTZ) - .addIngredient(Ingredient.fromTag(I.redstone()), 8)), + .viaShapeless(b -> b.requires(Tags.Items.GEMS_QUARTZ) + .requires(Ingredient.of(I.redstone()), 8)), SAND_PAPER = create(AllItems.SAND_PAPER).unlockedBy(() -> Items.PAPER) - .viaShapeless(b -> b.addIngredient(Items.PAPER) - .addIngredient(Tags.Items.SAND_COLORLESS)), + .viaShapeless(b -> b.requires(Items.PAPER) + .requires(Tags.Items.SAND_COLORLESS)), RED_SAND_PAPER = create(AllItems.RED_SAND_PAPER).unlockedBy(() -> Items.PAPER) - .viaShapeless(b -> b.addIngredient(Items.PAPER) - .addIngredient(Tags.Items.SAND_RED)) + .viaShapeless(b -> b.requires(Items.PAPER) + .requires(Tags.Items.SAND_RED)) ; private Marker CURIOSITIES = enterSection(AllSections.CURIOSITIES); GeneratedRecipe WAND_OF_SYMMETRY = create(AllItems.WAND_OF_SYMMETRY).unlockedBy(I::refinedRadiance) - .viaShaped(b -> b.key('E', I.refinedRadiance()) - .key('G', Tags.Items.GLASS_PANES_WHITE) - .key('O', Tags.Items.OBSIDIAN) - .key('L', I.brass()) - .patternLine(" GE") - .patternLine("LEG") - .patternLine("OL ")), + .viaShaped(b -> b.define('E', I.refinedRadiance()) + .define('G', Tags.Items.GLASS_PANES_WHITE) + .define('O', Tags.Items.OBSIDIAN) + .define('L', I.brass()) + .pattern(" GE") + .pattern("LEG") + .pattern("OL ")), MINECART_COUPLING = create(AllItems.MINECART_COUPLING).unlockedBy(I::andesite) - .viaShaped(b -> b.key('E', I.andesite()) - .key('O', I.ironSheet()) - .patternLine(" E") - .patternLine(" O ") - .patternLine("E ")), + .viaShaped(b -> b.define('E', I.andesite()) + .define('O', I.ironSheet()) + .pattern(" E") + .pattern(" O ") + .pattern("E ")), PECULIAR_BELL = create(AllBlocks.PECULIAR_BELL).unlockedByTag(I::brass) - .viaShaped(b -> b.key('I', I.brassBlock()) - .key('P', I.brassSheet()) - .patternLine("I") - .patternLine("P")) + .viaShaped(b -> b.define('I', I.brassBlock()) + .define('P', I.brassSheet()) + .pattern("I") + .pattern("P")) ; private Marker KINETICS = enterSection(AllSections.KINETICS); GeneratedRecipe BASIN = create(AllBlocks.BASIN).unlockedBy(I::andesite) - .viaShaped(b -> b.key('A', I.andesite()) - .patternLine("A A") - .patternLine("AAA")), + .viaShaped(b -> b.define('A', I.andesite()) + .pattern("A A") + .pattern("AAA")), GOGGLES = create(AllItems.GOGGLES).unlockedBy(I::andesite) - .viaShaped(b -> b.key('G', Tags.Items.GLASS) - .key('P', I.goldSheet()) - .key('S', Tags.Items.STRING) - .patternLine(" S ") - .patternLine("GPG")), + .viaShaped(b -> b.define('G', Tags.Items.GLASS) + .define('P', I.goldSheet()) + .define('S', Tags.Items.STRING) + .pattern(" S ") + .pattern("GPG")), WRENCH = create(AllItems.WRENCH).unlockedBy(I::andesite) - .viaShaped(b -> b.key('G', I.goldSheet()) - .key('P', I.cog()) - .key('S', Tags.Items.RODS_WOODEN) - .patternLine("GG") - .patternLine("GP") - .patternLine(" S")), + .viaShaped(b -> b.define('G', I.goldSheet()) + .define('P', I.cog()) + .define('S', Tags.Items.RODS_WOODEN) + .pattern("GG") + .pattern("GP") + .pattern(" S")), FILTER = create(AllItems.FILTER).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', ItemTags.WOOL) - .key('A', Tags.Items.NUGGETS_IRON) - .patternLine("ASA")), + .viaShaped(b -> b.define('S', ItemTags.WOOL) + .define('A', Tags.Items.NUGGETS_IRON) + .pattern("ASA")), ATTRIBUTE_FILTER = create(AllItems.ATTRIBUTE_FILTER).unlockedByTag(I::brass) - .viaShaped(b -> b.key('S', ItemTags.WOOL) - .key('A', I.brassNugget()) - .patternLine("ASA")), + .viaShaped(b -> b.define('S', ItemTags.WOOL) + .define('A', I.brassNugget()) + .pattern("ASA")), BRASS_HAND = create(AllItems.BRASS_HAND).unlockedByTag(I::brass) - .viaShaped(b -> b.key('A', I.andesite()) - .key('B', I.brassSheet()) - .patternLine(" A ") - .patternLine("BBB") - .patternLine(" B ")), + .viaShaped(b -> b.define('A', I.andesite()) + .define('B', I.brassSheet()) + .pattern(" A ") + .pattern("BBB") + .pattern(" B ")), SUPER_GLUE = create(AllItems.SUPER_GLUE).unlockedByTag(I::ironSheet) - .viaShaped(b -> b.key('A', Tags.Items.SLIMEBALLS) - .key('S', I.ironSheet()) - .key('N', Tags.Items.NUGGETS_IRON) - .patternLine("AS") - .patternLine("NA")), + .viaShaped(b -> b.define('A', Tags.Items.SLIMEBALLS) + .define('S', I.ironSheet()) + .define('N', Tags.Items.NUGGETS_IRON) + .pattern("AS") + .pattern("NA")), CRAFTER_SLOT_COVER = create(AllItems.CRAFTER_SLOT_COVER).unlockedBy(AllBlocks.MECHANICAL_CRAFTER::get) - .viaShaped(b -> b.key('A', I.brassNugget()) - .patternLine("AAA")), + .viaShaped(b -> b.define('A', I.brassNugget()) + .pattern("AAA")), COGWHEEL = create(AllBlocks.COGWHEEL).returns(8) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', ItemTags.WOODEN_BUTTONS) - .key('C', I.andesite()) - .patternLine("SSS") - .patternLine("SCS") - .patternLine("SSS")), + .viaShaped(b -> b.define('S', ItemTags.WOODEN_BUTTONS) + .define('C', I.andesite()) + .pattern("SSS") + .pattern("SCS") + .pattern("SSS")), LARGE_COGWHEEL = create(AllBlocks.LARGE_COGWHEEL).returns(2) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', ItemTags.WOODEN_BUTTONS) - .key('C', I.andesite()) - .key('D', ItemTags.PLANKS) - .patternLine("SDS") - .patternLine("DCD") - .patternLine("SDS")), + .viaShaped(b -> b.define('S', ItemTags.WOODEN_BUTTONS) + .define('C', I.andesite()) + .define('D', ItemTags.PLANKS) + .pattern("SDS") + .pattern("DCD") + .pattern("SDS")), WATER_WHEEL = create(AllBlocks.WATER_WHEEL).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', ItemTags.WOODEN_SLABS) - .key('C', AllBlocks.LARGE_COGWHEEL.get()) - .patternLine("SSS") - .patternLine("SCS") - .patternLine("SSS")), + .viaShaped(b -> b.define('S', ItemTags.WOODEN_SLABS) + .define('C', AllBlocks.LARGE_COGWHEEL.get()) + .pattern("SSS") + .pattern("SCS") + .pattern("SSS")), SHAFT = create(AllBlocks.SHAFT).returns(8) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('A', I.andesite()) - .patternLine("A") - .patternLine("A")), + .viaShaped(b -> b.define('A', I.andesite()) + .pattern("A") + .pattern("A")), MECHANICAL_PRESS = create(AllBlocks.MECHANICAL_PRESS).unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('B', I.andesite()) - .key('S', I.cog()) - .key('C', I.andesiteCasing()) - .key('I', AllTags.forgeItemTag("storage_blocks/iron")) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" I ")), + .viaShaped(b -> b.define('B', I.andesite()) + .define('S', I.cog()) + .define('C', I.andesiteCasing()) + .define('I', AllTags.forgeItemTag("storage_blocks/iron")) + .pattern(" B ") + .pattern("SCS") + .pattern(" I ")), MILLSTONE = create(AllBlocks.MILLSTONE).unlockedBy(I::andesite) - .viaShaped(b -> b.key('B', ItemTags.PLANKS) - .key('S', I.andesite()) - .key('C', I.cog()) - .key('I', I.stone()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" I ")), + .viaShaped(b -> b.define('B', ItemTags.PLANKS) + .define('S', I.andesite()) + .define('C', I.cog()) + .define('I', I.stone()) + .pattern(" B ") + .pattern("SCS") + .pattern(" I ")), MECHANICAL_PISTON = create(AllBlocks.MECHANICAL_PISTON).unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('B', ItemTags.PLANKS) - .key('S', I.cog()) - .key('C', I.andesiteCasing()) - .key('I', AllBlocks.PISTON_EXTENSION_POLE.get()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" I ")), + .viaShaped(b -> b.define('B', ItemTags.PLANKS) + .define('S', I.cog()) + .define('C', I.andesiteCasing()) + .define('I', AllBlocks.PISTON_EXTENSION_POLE.get()) + .pattern(" B ") + .pattern("SCS") + .pattern(" I ")), STICKY_MECHANICAL_PISTON = create(AllBlocks.STICKY_MECHANICAL_PISTON).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', Tags.Items.SLIMEBALLS) - .key('P', AllBlocks.MECHANICAL_PISTON.get()) - .patternLine("S") - .patternLine("P")), + .viaShaped(b -> b.define('S', Tags.Items.SLIMEBALLS) + .define('P', AllBlocks.MECHANICAL_PISTON.get()) + .pattern("S") + .pattern("P")), TURNTABLE = create(AllBlocks.TURNTABLE).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', I.shaft()) - .key('P', ItemTags.WOODEN_SLABS) - .patternLine("P") - .patternLine("S")), + .viaShaped(b -> b.define('S', I.shaft()) + .define('P', ItemTags.WOODEN_SLABS) + .pattern("P") + .pattern("S")), PISTON_EXTENSION_POLE = create(AllBlocks.PISTON_EXTENSION_POLE).returns(8) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('A', I.andesite()) - .key('P', ItemTags.PLANKS) - .patternLine("P") - .patternLine("A") - .patternLine("P")), + .viaShaped(b -> b.define('A', I.andesite()) + .define('P', ItemTags.PLANKS) + .pattern("P") + .pattern("A") + .pattern("P")), GANTRY_PINION = create(AllBlocks.GANTRY_CARRIAGE).unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('B', ItemTags.PLANKS) - .key('S', I.cog()) - .key('C', I.andesiteCasing()) - .key('I', I.shaft()) - .patternLine(" B ") - .patternLine("ICI") - .patternLine(" S ")), + .viaShaped(b -> b.define('B', ItemTags.PLANKS) + .define('S', I.cog()) + .define('C', I.andesiteCasing()) + .define('I', I.shaft()) + .pattern(" B ") + .pattern("ICI") + .pattern(" S ")), GANTRY_SHAFT = create(AllBlocks.GANTRY_SHAFT).returns(8) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('A', I.andesite()) - .key('R', I.redstone()) - .patternLine("A") - .patternLine("R") - .patternLine("A")), + .viaShaped(b -> b.define('A', I.andesite()) + .define('R', I.redstone()) + .pattern("A") + .pattern("R") + .pattern("A")), ANALOG_LEVER = create(AllBlocks.ANALOG_LEVER).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', I.andesiteCasing()) - .key('P', Tags.Items.RODS_WOODEN) - .patternLine("P") - .patternLine("S")), + .viaShaped(b -> b.define('S', I.andesiteCasing()) + .define('P', Tags.Items.RODS_WOODEN) + .pattern("P") + .pattern("S")), BELT_CONNECTOR = create(AllItems.BELT_CONNECTOR).unlockedBy(I::andesite) - .viaShaped(b -> b.key('D', Items.DRIED_KELP) - .patternLine("DDD") - .patternLine("DDD")), + .viaShaped(b -> b.define('D', Items.DRIED_KELP) + .pattern("DDD") + .pattern("DDD")), ADJUSTABLE_PULLEY = create(AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT).unlockedBy(I::brassCasing) - .viaShaped(b -> b.key('A', I.electronTube()) - .key('B', AllBlocks.ENCASED_CHAIN_DRIVE.get()) - .key('C', AllBlocks.LARGE_COGWHEEL.get()) - .patternLine("A") - .patternLine("B") - .patternLine("C")), + .viaShaped(b -> b.define('A', I.electronTube()) + .define('B', AllBlocks.ENCASED_CHAIN_DRIVE.get()) + .define('C', AllBlocks.LARGE_COGWHEEL.get()) + .pattern("A") + .pattern("B") + .pattern("C")), CART_ASSEMBLER = create(AllBlocks.CART_ASSEMBLER).unlockedBy(I::andesite) - .viaShaped(b -> b.key('L', ItemTags.LOGS) - .key('R', I.redstone()) - .key('C', I.andesite()) - .patternLine(" L ") - .patternLine("CRC") - .patternLine("L L")), + .viaShaped(b -> b.define('L', ItemTags.LOGS) + .define('R', I.redstone()) + .define('C', I.andesite()) + .pattern(" L ") + .pattern("CRC") + .pattern("L L")), CONTROLLER_RAIL = create(AllBlocks.CONTROLLER_RAIL).returns(6) .unlockedBy(() -> Items.POWERED_RAIL) - .viaShaped(b -> b.key('A', I.gold()) - .key('E', I.electronTube()) - .key('S', Tags.Items.RODS_WOODEN) - .patternLine("A A") - .patternLine("ASA") - .patternLine("AEA")), + .viaShaped(b -> b.define('A', I.gold()) + .define('E', I.electronTube()) + .define('S', Tags.Items.RODS_WOODEN) + .pattern("A A") + .pattern("ASA") + .pattern("AEA")), HAND_CRANK = create(AllBlocks.HAND_CRANK).unlockedBy(I::andesite) - .viaShaped(b -> b.key('A', I.andesite()) - .key('C', ItemTags.PLANKS) - .key('S', I.shaft()) - .patternLine(" S ") - .patternLine("CCC") - .patternLine(" A")), + .viaShaped(b -> b.define('A', I.andesite()) + .define('C', ItemTags.PLANKS) + .define('S', I.shaft()) + .pattern(" S ") + .pattern("CCC") + .pattern(" A")), COPPER_VALVE_HANDLE = create(AllBlocks.COPPER_VALVE_HANDLE).unlockedByTag(I::copper) - .viaShaped(b -> b.key('S', I.andesite()) - .key('C', I.copperSheet()) - .patternLine("CCC") - .patternLine(" S ")), + .viaShaped(b -> b.define('S', I.andesite()) + .define('C', I.copperSheet()) + .pattern("CCC") + .pattern(" S ")), COPPER_VALVE_HANDLE_FROM_OTHER_HANDLES = create(AllBlocks.COPPER_VALVE_HANDLE).withSuffix("_from_others") .unlockedByTag(I::copper) - .viaShapeless(b -> b.addIngredient(AllItemTags.VALVE_HANDLES.tag)), + .viaShapeless(b -> b.requires(AllItemTags.VALVE_HANDLES.tag)), NOZZLE = create(AllBlocks.NOZZLE).unlockedBy(AllBlocks.ENCASED_FAN::get) - .viaShaped(b -> b.key('S', I.andesite()) - .key('C', ItemTags.WOOL) - .patternLine(" S ") - .patternLine(" C ") - .patternLine("SSS")), + .viaShaped(b -> b.define('S', I.andesite()) + .define('C', ItemTags.WOOL) + .pattern(" S ") + .pattern(" C ") + .pattern("SSS")), PROPELLER = create(AllItems.PROPELLER).unlockedByTag(I::ironSheet) - .viaShaped(b -> b.key('S', I.ironSheet()) - .key('C', I.andesite()) - .patternLine(" S ") - .patternLine("SCS") - .patternLine(" S ")), + .viaShaped(b -> b.define('S', I.ironSheet()) + .define('C', I.andesite()) + .pattern(" S ") + .pattern("SCS") + .pattern(" S ")), WHISK = create(AllItems.WHISK).unlockedByTag(I::ironSheet) - .viaShaped(b -> b.key('S', I.ironSheet()) - .key('C', I.andesite()) - .patternLine(" C ") - .patternLine("SCS") - .patternLine("SSS")), + .viaShaped(b -> b.define('S', I.ironSheet()) + .define('C', I.andesite()) + .pattern(" C ") + .pattern("SCS") + .pattern("SSS")), ENCASED_FAN = create(AllBlocks.ENCASED_FAN).unlockedByTag(I::ironSheet) - .viaShaped(b -> b.key('S', I.shaft()) - .key('A', I.andesiteCasing()) - .key('R', I.cog()) - .key('P', AllItems.PROPELLER.get()) - .patternLine(" S ") - .patternLine("RAR") - .patternLine(" P ")), + .viaShaped(b -> b.define('S', I.shaft()) + .define('A', I.andesiteCasing()) + .define('R', I.cog()) + .define('P', AllItems.PROPELLER.get()) + .pattern(" S ") + .pattern("RAR") + .pattern(" P ")), CUCKOO_CLOCK = create(AllBlocks.CUCKOO_CLOCK).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', ItemTags.PLANKS) - .key('A', Items.CLOCK) - .key('B', ItemTags.LOGS) - .key('P', I.cog()) - .patternLine(" S ") - .patternLine("SAS") - .patternLine("BPB")), + .viaShaped(b -> b.define('S', ItemTags.PLANKS) + .define('A', Items.CLOCK) + .define('B', ItemTags.LOGS) + .define('P', I.cog()) + .pattern(" S ") + .pattern("SAS") + .pattern("BPB")), MECHANICAL_CRAFTER = create(AllBlocks.MECHANICAL_CRAFTER).returns(3) .unlockedBy(I::brassCasing) - .viaShaped(b -> b.key('B', I.electronTube()) - .key('R', Blocks.CRAFTING_TABLE) - .key('C', I.brassCasing()) - .key('S', I.cog()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" R ")), + .viaShaped(b -> b.define('B', I.electronTube()) + .define('R', Blocks.CRAFTING_TABLE) + .define('C', I.brassCasing()) + .define('S', I.cog()) + .pattern(" B ") + .pattern("SCS") + .pattern(" R ")), WINDMILL_BEARING = create(AllBlocks.WINDMILL_BEARING).unlockedBy(I::andesite) - .viaShaped(b -> b.key('I', I.shaft()) - .key('B', AllBlocks.TURNTABLE.get()) - .key('C', I.stone()) - .patternLine(" B ") - .patternLine(" C ") - .patternLine(" I ")), + .viaShaped(b -> b.define('I', I.shaft()) + .define('B', AllBlocks.TURNTABLE.get()) + .define('C', I.stone()) + .pattern(" B ") + .pattern(" C ") + .pattern(" I ")), MECHANICAL_BEARING = create(AllBlocks.MECHANICAL_BEARING).unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('I', I.shaft()) - .key('S', I.andesite()) - .key('B', AllBlocks.TURNTABLE.get()) - .key('C', I.andesiteCasing()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" I ")), + .viaShaped(b -> b.define('I', I.shaft()) + .define('S', I.andesite()) + .define('B', AllBlocks.TURNTABLE.get()) + .define('C', I.andesiteCasing()) + .pattern(" B ") + .pattern("SCS") + .pattern(" I ")), CLOCKWORK_BEARING = create(AllBlocks.CLOCKWORK_BEARING).unlockedBy(I::brassCasing) - .viaShaped(b -> b.key('I', I.shaft()) - .key('S', I.electronTube()) - .key('B', AllBlocks.TURNTABLE.get()) - .key('C', I.brassCasing()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" I ")), + .viaShaped(b -> b.define('I', I.shaft()) + .define('S', I.electronTube()) + .define('B', AllBlocks.TURNTABLE.get()) + .define('C', I.brassCasing()) + .pattern(" B ") + .pattern("SCS") + .pattern(" I ")), WOODEN_BRACKET = create(AllBlocks.WOODEN_BRACKET).returns(4) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', Tags.Items.RODS_WOODEN) - .key('P', I.planks()) - .key('C', I.andesite()) - .patternLine("SSS") - .patternLine("PCP")), + .viaShaped(b -> b.define('S', Tags.Items.RODS_WOODEN) + .define('P', I.planks()) + .define('C', I.andesite()) + .pattern("SSS") + .pattern("PCP")), METAL_BRACKET = create(AllBlocks.METAL_BRACKET).returns(4) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', Tags.Items.NUGGETS_IRON) - .key('P', I.iron()) - .key('C', I.andesite()) - .patternLine("SSS") - .patternLine("PCP")), + .viaShaped(b -> b.define('S', Tags.Items.NUGGETS_IRON) + .define('P', I.iron()) + .define('C', I.andesite()) + .pattern("SSS") + .pattern("PCP")), FLUID_PIPE = create(AllBlocks.FLUID_PIPE).returns(8) .unlockedByTag(I::copper) - .viaShaped(b -> b.key('S', I.copperSheet()) - .key('C', I.copper()) - .patternLine("SCS")), + .viaShaped(b -> b.define('S', I.copperSheet()) + .define('C', I.copper()) + .pattern("SCS")), MECHANICAL_PUMP = create(AllBlocks.MECHANICAL_PUMP).unlockedByTag(I::copper) - .viaShaped(b -> b.key('P', I.cog()) - .key('S', AllBlocks.FLUID_PIPE.get()) - .patternLine("P") - .patternLine("S")), + .viaShaped(b -> b.define('P', I.cog()) + .define('S', AllBlocks.FLUID_PIPE.get()) + .pattern("P") + .pattern("S")), SMART_FLUID_PIPE = create(AllBlocks.SMART_FLUID_PIPE).unlockedByTag(I::copper) - .viaShaped(b -> b.key('P', I.electronTube()) - .key('S', AllBlocks.FLUID_PIPE.get()) - .key('I', I.brassSheet()) - .patternLine("I") - .patternLine("S") - .patternLine("P")), + .viaShaped(b -> b.define('P', I.electronTube()) + .define('S', AllBlocks.FLUID_PIPE.get()) + .define('I', I.brassSheet()) + .pattern("I") + .pattern("S") + .pattern("P")), FLUID_VALVE = create(AllBlocks.FLUID_VALVE).unlockedByTag(I::copper) - .viaShaped(b -> b.key('P', I.shaft()) - .key('S', AllBlocks.FLUID_PIPE.get()) - .key('I', I.ironSheet()) - .patternLine("I") - .patternLine("S") - .patternLine("P")), + .viaShaped(b -> b.define('P', I.shaft()) + .define('S', AllBlocks.FLUID_PIPE.get()) + .define('I', I.ironSheet()) + .pattern("I") + .pattern("S") + .pattern("P")), SPOUT = create(AllBlocks.SPOUT).unlockedBy(I::copperCasing) - .viaShaped(b -> b.key('T', AllBlocks.FLUID_TANK.get()) - .key('P', Items.DRIED_KELP) - .key('S', I.copperNugget()) - .patternLine("T") - .patternLine("P") - .patternLine("S")), + .viaShaped(b -> b.define('T', AllBlocks.FLUID_TANK.get()) + .define('P', Items.DRIED_KELP) + .define('S', I.copperNugget()) + .pattern("T") + .pattern("P") + .pattern("S")), ITEM_DRAIN = create(AllBlocks.ITEM_DRAIN).unlockedBy(I::copperCasing) - .viaShaped(b -> b.key('P', Blocks.IRON_BARS) - .key('S', I.copperCasing()) - .patternLine("P") - .patternLine("S")), + .viaShaped(b -> b.define('P', Blocks.IRON_BARS) + .define('S', I.copperCasing()) + .pattern("P") + .pattern("S")), FLUID_TANK = create(AllBlocks.FLUID_TANK).returns(2) .unlockedBy(I::copperCasing) - .viaShaped(b -> b.key('B', I.copperCasing()) - .key('S', I.copperNugget()) - .key('C', Tags.Items.GLASS) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" B ")), + .viaShaped(b -> b.define('B', I.copperCasing()) + .define('S', I.copperNugget()) + .define('C', Tags.Items.GLASS) + .pattern(" B ") + .pattern("SCS") + .pattern(" B ")), DEPLOYER = create(AllBlocks.DEPLOYER).unlockedBy(I::electronTube) - .viaShaped(b -> b.key('I', AllItems.BRASS_HAND.get()) - .key('B', I.electronTube()) - .key('S', I.cog()) - .key('C', I.andesiteCasing()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" I ")), + .viaShaped(b -> b.define('I', AllItems.BRASS_HAND.get()) + .define('B', I.electronTube()) + .define('S', I.cog()) + .define('C', I.andesiteCasing()) + .pattern(" B ") + .pattern("SCS") + .pattern(" I ")), PORTABLE_STORAGE_INTERFACE = create(AllBlocks.PORTABLE_STORAGE_INTERFACE).unlockedBy(I::brassCasing) - .viaShaped(b -> b.key('I', I.brassCasing()) - .key('B', AllBlocks.ANDESITE_FUNNEL.get()) - .patternLine(" B ") - .patternLine(" I ")), + .viaShaped(b -> b.define('I', I.brassCasing()) + .define('B', AllBlocks.ANDESITE_FUNNEL.get()) + .pattern(" B ") + .pattern(" I ")), PORTABLE_FLUID_INTERFACE = create(AllBlocks.PORTABLE_FLUID_INTERFACE).unlockedBy(I::copperCasing) - .viaShaped(b -> b.key('I', I.copperCasing()) - .key('B', AllBlocks.ANDESITE_FUNNEL.get()) - .patternLine(" B ") - .patternLine(" I ")), + .viaShaped(b -> b.define('I', I.copperCasing()) + .define('B', AllBlocks.ANDESITE_FUNNEL.get()) + .pattern(" B ") + .pattern(" I ")), ROPE_PULLEY = create(AllBlocks.ROPE_PULLEY).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', I.shaft()) - .key('B', I.andesiteCasing()) - .key('C', ItemTags.WOOL) - .key('I', I.ironSheet()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" I ")), + .viaShaped(b -> b.define('S', I.shaft()) + .define('B', I.andesiteCasing()) + .define('C', ItemTags.WOOL) + .define('I', I.ironSheet()) + .pattern(" B ") + .pattern("SCS") + .pattern(" I ")), HOSE_PULLEY = create(AllBlocks.HOSE_PULLEY).unlockedByTag(I::copper) - .viaShaped(b -> b.key('S', I.shaft()) - .key('P', AllBlocks.FLUID_PIPE.get()) - .key('B', I.copperCasing()) - .key('C', Items.DRIED_KELP) - .key('I', I.copperSheet()) - .patternLine(" B ") - .patternLine("SCP") - .patternLine(" I ")), + .viaShaped(b -> b.define('S', I.shaft()) + .define('P', AllBlocks.FLUID_PIPE.get()) + .define('B', I.copperCasing()) + .define('C', Items.DRIED_KELP) + .define('I', I.copperSheet()) + .pattern(" B ") + .pattern("SCP") + .pattern(" I ")), EMPTY_BLAZE_BURNER = create(AllItems.EMPTY_BLAZE_BURNER).unlockedByTag(I::iron) - .viaShaped(b -> b.key('A', Blocks.IRON_BARS) - .key('I', I.ironSheet()) - .patternLine("II") - .patternLine("AA")), + .viaShaped(b -> b.define('A', Blocks.IRON_BARS) + .define('I', I.ironSheet()) + .pattern("II") + .pattern("AA")), CHUTE = create(AllBlocks.CHUTE).unlockedBy(I::andesite) .returns(4) - .viaShaped(b -> b.key('A', I.ironSheet()) - .key('I', I.andesite()) - .patternLine("II") - .patternLine("AA")), + .viaShaped(b -> b.define('A', I.ironSheet()) + .define('I', I.andesite()) + .pattern("II") + .pattern("AA")), SMART_CHUTE = create(AllBlocks.SMART_CHUTE).unlockedBy(AllBlocks.CHUTE::get) - .viaShaped(b -> b.key('P', I.electronTube()) - .key('S', AllBlocks.CHUTE.get()) - .key('I', I.brassSheet()) - .patternLine("I") - .patternLine("S") - .patternLine("P")), + .viaShaped(b -> b.define('P', I.electronTube()) + .define('S', AllBlocks.CHUTE.get()) + .define('I', I.brassSheet()) + .pattern("I") + .pattern("S") + .pattern("P")), DEPOT = create(AllBlocks.DEPOT).unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('A', I.andesite()) - .key('I', I.andesiteCasing()) - .patternLine("A") - .patternLine("I")), + .viaShaped(b -> b.define('A', I.andesite()) + .define('I', I.andesiteCasing()) + .pattern("A") + .pattern("I")), WEIGHTED_EJECTOR = create(AllBlocks.WEIGHTED_EJECTOR).unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('A', I.goldSheet()) - .key('D', AllBlocks.DEPOT.get()) - .key('I', I.cog()) - .patternLine("A") - .patternLine("D") - .patternLine("I")), + .viaShaped(b -> b.define('A', I.goldSheet()) + .define('D', AllBlocks.DEPOT.get()) + .define('I', I.cog()) + .pattern("A") + .pattern("D") + .pattern("I")), MECHANICAL_ARM = create(AllBlocks.MECHANICAL_ARM::get).unlockedBy(I::brassCasing) .returns(1) - .viaShaped(b -> b.key('L', I.brassSheet()) - .key('I', I.clockwork()) - .key('A', I.andesite()) - .key('C', I.brassCasing()) - .patternLine("LLA") - .patternLine("L ") - .patternLine("IC ")), + .viaShaped(b -> b.define('L', I.brassSheet()) + .define('I', I.precisionMechanism()) + .define('A', I.andesite()) + .define('C', I.brassCasing()) + .pattern("LLA") + .pattern("L ") + .pattern("IC ")), MECHANICAL_MIXER = create(AllBlocks.MECHANICAL_MIXER).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', I.cog()) - .key('B', I.andesite()) - .key('C', I.andesiteCasing()) - .key('I', AllItems.WHISK.get()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" I ")), + .viaShaped(b -> b.define('S', I.cog()) + .define('B', I.andesite()) + .define('C', I.andesiteCasing()) + .define('I', AllItems.WHISK.get()) + .pattern(" B ") + .pattern("SCS") + .pattern(" I ")), CLUTCH = create(AllBlocks.CLUTCH).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', I.shaft()) - .key('B', I.redstone()) - .key('C', I.andesiteCasing()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" B ")), + .viaShaped(b -> b.define('S', I.shaft()) + .define('B', I.redstone()) + .define('C', I.andesiteCasing()) + .pattern(" B ") + .pattern("SCS") + .pattern(" B ")), GEARSHIFT = create(AllBlocks.GEARSHIFT).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', I.cog()) - .key('B', I.redstone()) - .key('C', I.andesiteCasing()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" B ")), + .viaShaped(b -> b.define('S', I.cog()) + .define('B', I.redstone()) + .define('C', I.andesiteCasing()) + .pattern(" B ") + .pattern("SCS") + .pattern(" B ")), SAIL_FRAME = create(AllBlocks.SAIL_FRAME).returns(8) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('A', I.andesite()) - .key('S', Tags.Items.RODS_WOODEN) - .patternLine("SSS") - .patternLine("SAS") - .patternLine("SSS")), + .viaShaped(b -> b.define('A', I.andesite()) + .define('S', Tags.Items.RODS_WOODEN) + .pattern("SSS") + .pattern("SAS") + .pattern("SSS")), SAIL = create(AllBlocks.SAIL).returns(8) .unlockedBy(AllBlocks.SAIL_FRAME::get) - .viaShaped(b -> b.key('F', AllBlocks.SAIL_FRAME.get()) - .key('W', ItemTags.WOOL) - .patternLine("FFF") - .patternLine("FWF") - .patternLine("FFF")), + .viaShaped(b -> b.define('F', AllBlocks.SAIL_FRAME.get()) + .define('W', ItemTags.WOOL) + .pattern("FFF") + .pattern("FWF") + .pattern("FFF")), RADIAL_CHASIS = create(AllBlocks.RADIAL_CHASSIS).returns(3) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('P', I.andesite()) - .key('L', ItemTags.LOGS) - .patternLine(" L ") - .patternLine("PLP") - .patternLine(" L ")), + .viaShaped(b -> b.define('P', I.andesite()) + .define('L', ItemTags.LOGS) + .pattern(" L ") + .pattern("PLP") + .pattern(" L ")), LINEAR_CHASIS = create(AllBlocks.LINEAR_CHASSIS).returns(3) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('P', I.andesite()) - .key('L', ItemTags.LOGS) - .patternLine(" P ") - .patternLine("LLL") - .patternLine(" P ")), + .viaShaped(b -> b.define('P', I.andesite()) + .define('L', ItemTags.LOGS) + .pattern(" P ") + .pattern("LLL") + .pattern(" P ")), LINEAR_CHASSIS_CYCLE = conversionCycle(ImmutableList.of(AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS)), STICKER = create(AllBlocks.STICKER).returns(1) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('I', I.andesite()) - .key('C', Tags.Items.COBBLESTONE) - .key('R', I.redstone()) - .key('S', Tags.Items.SLIMEBALLS) - .patternLine("ISI") - .patternLine("CRC")), + .viaShaped(b -> b.define('I', I.andesite()) + .define('C', Tags.Items.COBBLESTONE) + .define('R', I.redstone()) + .define('S', Tags.Items.SLIMEBALLS) + .pattern("ISI") + .pattern("CRC")), MINECART = create(() -> Items.MINECART).withSuffix("_from_contraption_cart") .unlockedBy(AllBlocks.CART_ASSEMBLER::get) - .viaShapeless(b -> b.addIngredient(AllItems.MINECART_CONTRAPTION.get())), + .viaShapeless(b -> b.requires(AllItems.MINECART_CONTRAPTION.get())), FURNACE_MINECART = create(() -> Items.FURNACE_MINECART).withSuffix("_from_contraption_cart") .unlockedBy(AllBlocks.CART_ASSEMBLER::get) - .viaShapeless(b -> b.addIngredient(AllItems.FURNACE_MINECART_CONTRAPTION.get())), + .viaShapeless(b -> b.requires(AllItems.FURNACE_MINECART_CONTRAPTION.get())), GEARBOX = create(AllBlocks.GEARBOX).unlockedBy(I::cog) - .viaShaped(b -> b.key('C', I.cog()) - .key('B', I.andesiteCasing()) - .patternLine(" C ") - .patternLine("CBC") - .patternLine(" C ")), + .viaShaped(b -> b.define('C', I.cog()) + .define('B', I.andesiteCasing()) + .pattern(" C ") + .pattern("CBC") + .pattern(" C ")), GEARBOX_CYCLE = conversionCycle(ImmutableList.of(AllBlocks.GEARBOX, AllItems.VERTICAL_GEARBOX)), MYSTERIOUS_CUCKOO_CLOCK = create(AllBlocks.MYSTERIOUS_CUCKOO_CLOCK).unlockedBy(AllBlocks.CUCKOO_CLOCK::get) - .viaShaped(b -> b.key('C', Tags.Items.GUNPOWDER) - .key('B', AllBlocks.CUCKOO_CLOCK.get()) - .patternLine(" C ") - .patternLine("CBC") - .patternLine(" C ")), + .viaShaped(b -> b.define('C', Tags.Items.GUNPOWDER) + .define('B', AllBlocks.CUCKOO_CLOCK.get()) + .pattern(" C ") + .pattern("CBC") + .pattern(" C ")), ENCASED_CHAIN_DRIVE = create(AllBlocks.ENCASED_CHAIN_DRIVE).returns(2) .unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('S', I.shaft()) - .key('B', Tags.Items.NUGGETS_IRON) - .key('C', I.andesiteCasing()) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" B ")), + .viaShaped(b -> b.define('S', I.shaft()) + .define('B', Tags.Items.NUGGETS_IRON) + .define('C', I.andesiteCasing()) + .pattern(" B ") + .pattern("SCS") + .pattern(" B ")), SPEEDOMETER = create(AllBlocks.SPEEDOMETER).unlockedBy(I::andesite) - .viaShaped(b -> b.key('C', Items.COMPASS) - .key('A', I.andesiteCasing()) - .key('S', I.shaft()) - .patternLine(" C ") - .patternLine("SAS")), + .viaShaped(b -> b.define('C', Items.COMPASS) + .define('A', I.andesiteCasing()) + .define('S', I.shaft()) + .pattern(" C ") + .pattern("SAS")), GAUGE_CYCLE = conversionCycle(ImmutableList.of(AllBlocks.SPEEDOMETER, AllBlocks.STRESSOMETER)), ROTATION_SPEED_CONTROLLER = create(AllBlocks.ROTATION_SPEED_CONTROLLER).unlockedBy(I::brassCasing) - .viaShaped(b -> b.key('B', I.clockwork()) - .key('C', I.brassCasing()) - .key('S', I.shaft()) - .patternLine(" B ") - .patternLine("SCS")), + .viaShaped(b -> b.define('B', I.precisionMechanism()) + .define('C', I.brassCasing()) + .define('S', I.shaft()) + .pattern(" B ") + .pattern("SCS")), - NIXIE_TUBE = create(AllBlocks.NIXIE_TUBE).unlockedBy(I::brassCasing) - .viaShaped(b -> b.key('E', I.electronTube()) - .key('B', I.brassCasing()) - .patternLine("EBE")), + NIXIE_TUBE = create(AllBlocks.ORANGE_NIXIE_TUBE).unlockedBy(I::brassCasing) + .viaShaped(b -> b.define('E', I.electronTube()) + .define('B', I.brassCasing()) + .pattern("EBE")), MECHANICAL_SAW = create(AllBlocks.MECHANICAL_SAW).unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('C', I.andesiteCasing()) - .key('A', I.ironSheet()) - .key('I', I.iron()) - .patternLine(" A ") - .patternLine("AIA") - .patternLine(" C ")), + .viaShaped(b -> b.define('C', I.andesiteCasing()) + .define('A', I.ironSheet()) + .define('I', I.iron()) + .pattern(" A ") + .pattern("AIA") + .pattern(" C ")), MECHANICAL_HARVESTER = create(AllBlocks.MECHANICAL_HARVESTER).unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('C', I.andesiteCasing()) - .key('A', I.andesite()) - .key('I', I.ironSheet()) - .patternLine("AIA") - .patternLine("AIA") - .patternLine(" C ")), + .viaShaped(b -> b.define('C', I.andesiteCasing()) + .define('A', I.andesite()) + .define('I', I.ironSheet()) + .pattern("AIA") + .pattern("AIA") + .pattern(" C ")), MECHANICAL_PLOUGH = create(AllBlocks.MECHANICAL_PLOUGH).unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('C', I.andesiteCasing()) - .key('A', I.andesite()) - .key('I', I.ironSheet()) - .patternLine("III") - .patternLine("AAA") - .patternLine(" C ")), + .viaShaped(b -> b.define('C', I.andesiteCasing()) + .define('A', I.andesite()) + .define('I', I.ironSheet()) + .pattern("III") + .pattern("AAA") + .pattern(" C ")), MECHANICAL_DRILL = create(AllBlocks.MECHANICAL_DRILL).unlockedBy(I::andesiteCasing) - .viaShaped(b -> b.key('C', I.andesiteCasing()) - .key('A', I.andesite()) - .key('I', I.iron()) - .patternLine(" A ") - .patternLine("AIA") - .patternLine(" C ")), + .viaShaped(b -> b.define('C', I.andesiteCasing()) + .define('A', I.andesite()) + .define('I', I.iron()) + .pattern(" A ") + .pattern("AIA") + .pattern(" C ")), SEQUENCED_GEARSHIFT = create(AllBlocks.SEQUENCED_GEARSHIFT).unlockedBy(I::brassCasing) - .viaShaped(b -> b.key('B', I.electronTube()) - .key('S', I.cog()) - .key('C', I.brassCasing()) - .key('I', Items.CLOCK) - .patternLine(" B ") - .patternLine("SCS") - .patternLine(" I ")) + .viaShaped(b -> b.define('B', I.electronTube()) + .define('S', I.cog()) + .define('C', I.brassCasing()) + .define('I', Items.CLOCK) + .pattern(" B ") + .pattern("SCS") + .pattern(" I ")) ; @@ -779,111 +779,111 @@ public class StandardRecipeGen extends CreateRecipeProvider { REDSTONE_CONTACT = create(AllBlocks.REDSTONE_CONTACT).returns(2) .unlockedBy(I::brassCasing) - .viaShaped(b -> b.key('W', I.redstone()) - .key('C', Blocks.COBBLESTONE) - .key('S', I.ironSheet()) - .patternLine(" S ") - .patternLine("CWC") - .patternLine("CCC")), + .viaShaped(b -> b.define('W', I.redstone()) + .define('C', Blocks.COBBLESTONE) + .define('S', I.ironSheet()) + .pattern(" S ") + .pattern("CWC") + .pattern("CCC")), ANDESITE_FUNNEL = create(AllBlocks.ANDESITE_FUNNEL).returns(2) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('A', I.andesite()) - .key('K', Items.DRIED_KELP) - .patternLine("AKA") - .patternLine(" K ")), + .viaShaped(b -> b.define('A', I.andesite()) + .define('K', Items.DRIED_KELP) + .pattern("AKA") + .pattern(" K ")), BRASS_FUNNEL = create(AllBlocks.BRASS_FUNNEL).returns(2) .unlockedByTag(I::brass) - .viaShaped(b -> b.key('A', I.brass()) - .key('K', Items.DRIED_KELP) - .key('E', I.electronTube()) - .patternLine("AEA") - .patternLine(" K ")), + .viaShaped(b -> b.define('A', I.brass()) + .define('K', Items.DRIED_KELP) + .define('E', I.electronTube()) + .pattern("AEA") + .pattern(" K ")), ANDESITE_TUNNEL = create(AllBlocks.ANDESITE_TUNNEL).returns(2) .unlockedBy(I::andesite) - .viaShaped(b -> b.key('A', I.andesite()) - .key('K', Items.DRIED_KELP) - .patternLine("AA") - .patternLine("KK")), + .viaShaped(b -> b.define('A', I.andesite()) + .define('K', Items.DRIED_KELP) + .pattern("AA") + .pattern("KK")), BRASS_TUNNEL = create(AllBlocks.BRASS_TUNNEL).returns(2) .unlockedByTag(I::brass) - .viaShaped(b -> b.key('A', I.brass()) - .key('K', Items.DRIED_KELP) - .key('E', I.electronTube()) - .patternLine("E ") - .patternLine("AA") - .patternLine("KK")), + .viaShaped(b -> b.define('A', I.brass()) + .define('K', Items.DRIED_KELP) + .define('E', I.electronTube()) + .pattern("E ") + .pattern("AA") + .pattern("KK")), ADJUSTABLE_CRATE = create(AllBlocks.ADJUSTABLE_CRATE).returns(4) .unlockedBy(I::brassCasing) - .viaShaped(b -> b.key('B', I.brassCasing()) - .patternLine("BBB") - .patternLine("B B") - .patternLine("BBB")), + .viaShaped(b -> b.define('B', I.brassCasing()) + .pattern("BBB") + .pattern("B B") + .pattern("BBB")), BELT_OBSERVER = create(AllBlocks.CONTENT_OBSERVER).unlockedBy(AllItems.BELT_CONNECTOR::get) - .viaShaped(b -> b.key('B', I.brassCasing()) - .key('R', I.redstone()) - .key('I', I.iron()) - .key('C', Blocks.OBSERVER) - .patternLine("RCI") - .patternLine(" B ")), + .viaShaped(b -> b.define('B', I.brassCasing()) + .define('R', I.redstone()) + .define('I', I.iron()) + .define('C', Blocks.OBSERVER) + .pattern("RCI") + .pattern(" B ")), STOCKPILE_SWITCH = create(AllBlocks.STOCKPILE_SWITCH).unlockedBy(I::brassCasing) - .viaShaped(b -> b.key('B', I.brassCasing()) - .key('R', I.redstone()) - .key('I', I.iron()) - .key('C', Blocks.COMPARATOR) - .patternLine("RCI") - .patternLine(" B ")), + .viaShaped(b -> b.define('B', I.brassCasing()) + .define('R', I.redstone()) + .define('I', I.iron()) + .define('C', Blocks.COMPARATOR) + .pattern("RCI") + .pattern(" B ")), ADJUSTABLE_REPEATER = create(AllBlocks.ADJUSTABLE_REPEATER).unlockedByTag(I::redstone) - .viaShaped(b -> b.key('T', Blocks.REDSTONE_TORCH) - .key('C', Items.CLOCK) - .key('R', I.redstone()) - .key('S', I.stone()) - .patternLine("RCT") - .patternLine("SSS")), + .viaShaped(b -> b.define('T', Blocks.REDSTONE_TORCH) + .define('C', Items.CLOCK) + .define('R', I.redstone()) + .define('S', I.stone()) + .pattern("RCT") + .pattern("SSS")), ADJUSTABLE_PULSE_REPEATER = create(AllBlocks.ADJUSTABLE_PULSE_REPEATER).unlockedByTag(I::redstone) - .viaShaped(b -> b.key('S', AllBlocks.PULSE_REPEATER.get()) - .key('P', AllBlocks.ADJUSTABLE_REPEATER.get()) - .patternLine("SP")), + .viaShaped(b -> b.define('S', AllBlocks.PULSE_REPEATER.get()) + .define('P', AllBlocks.ADJUSTABLE_REPEATER.get()) + .pattern("SP")), PULSE_REPEATER = create(AllBlocks.PULSE_REPEATER).unlockedByTag(I::redstone) - .viaShaped(b -> b.key('T', Blocks.REDSTONE_TORCH) - .key('R', I.redstone()) - .key('S', I.stone()) - .patternLine("RRT") - .patternLine("SSS")), + .viaShaped(b -> b.define('T', Blocks.REDSTONE_TORCH) + .define('R', I.redstone()) + .define('S', I.stone()) + .pattern("RRT") + .pattern("SSS")), POWERED_TOGGLE_LATCH = create(AllBlocks.POWERED_TOGGLE_LATCH).unlockedByTag(I::redstone) - .viaShaped(b -> b.key('T', Blocks.REDSTONE_TORCH) - .key('C', Blocks.LEVER) - .key('S', I.stone()) - .patternLine(" T ") - .patternLine(" C ") - .patternLine("SSS")), + .viaShaped(b -> b.define('T', Blocks.REDSTONE_TORCH) + .define('C', Blocks.LEVER) + .define('S', I.stone()) + .pattern(" T ") + .pattern(" C ") + .pattern("SSS")), POWERED_LATCH = create(AllBlocks.POWERED_LATCH).unlockedByTag(I::redstone) - .viaShaped(b -> b.key('T', Blocks.REDSTONE_TORCH) - .key('C', Blocks.LEVER) - .key('R', I.redstone()) - .key('S', I.stone()) - .patternLine(" T ") - .patternLine("RCR") - .patternLine("SSS")), + .viaShaped(b -> b.define('T', Blocks.REDSTONE_TORCH) + .define('C', Blocks.LEVER) + .define('R', I.redstone()) + .define('S', I.stone()) + .pattern(" T ") + .pattern("RCR") + .pattern("SSS")), REDSTONE_LINK = create(AllBlocks.REDSTONE_LINK).returns(2) .unlockedByTag(I::brass) - .viaShaped(b -> b.key('C', Blocks.REDSTONE_TORCH) - .key('S', I.brassSheet()) - .key('I', ItemTags.PLANKS) - .patternLine(" C") - .patternLine("SIS")) + .viaShaped(b -> b.define('C', Blocks.REDSTONE_TORCH) + .define('S', I.brassSheet()) + .define('I', ItemTags.PLANKS) + .pattern(" C") + .pattern("SIS")) ; @@ -892,29 +892,29 @@ public class StandardRecipeGen extends CreateRecipeProvider { GeneratedRecipe SCHEMATIC_TABLE = create(AllBlocks.SCHEMATIC_TABLE).unlockedBy(AllItems.EMPTY_SCHEMATIC::get) - .viaShaped(b -> b.key('W', ItemTags.WOODEN_SLABS) - .key('S', Blocks.SMOOTH_STONE) - .patternLine("WWW") - .patternLine(" S ") - .patternLine(" S ")), + .viaShaped(b -> b.define('W', ItemTags.WOODEN_SLABS) + .define('S', Blocks.SMOOTH_STONE) + .pattern("WWW") + .pattern(" S ") + .pattern(" S ")), SCHEMATICANNON = create(AllBlocks.SCHEMATICANNON).unlockedBy(AllItems.EMPTY_SCHEMATIC::get) - .viaShaped(b -> b.key('L', ItemTags.LOGS) - .key('D', Blocks.DISPENSER) - .key('C', Blocks.CAULDRON) - .key('S', Blocks.SMOOTH_STONE) - .key('I', Blocks.IRON_BLOCK) - .patternLine(" C ") - .patternLine("LDL") - .patternLine("SIS")), + .viaShaped(b -> b.define('L', ItemTags.LOGS) + .define('D', Blocks.DISPENSER) + .define('C', Blocks.CAULDRON) + .define('S', Blocks.SMOOTH_STONE) + .define('I', Blocks.IRON_BLOCK) + .pattern(" C ") + .pattern("LDL") + .pattern("SIS")), EMPTY_SCHEMATIC = create(AllItems.EMPTY_SCHEMATIC).unlockedBy(() -> Items.PAPER) - .viaShapeless(b -> b.addIngredient(Items.PAPER) - .addIngredient(Tags.Items.DYES_LIGHT_BLUE)), + .viaShapeless(b -> b.requires(Items.PAPER) + .requires(Tags.Items.DYES_LIGHT_BLUE)), SCHEMATIC_AND_QUILL = create(AllItems.SCHEMATIC_AND_QUILL).unlockedBy(() -> Items.PAPER) - .viaShapeless(b -> b.addIngredient(AllItems.EMPTY_SCHEMATIC.get()) - .addIngredient(Tags.Items.FEATHERS)) + .viaShapeless(b -> b.requires(AllItems.EMPTY_SCHEMATIC.get()) + .requires(Tags.Items.FEATHERS)) ; @@ -924,24 +924,24 @@ public class StandardRecipeGen extends CreateRecipeProvider { DARK_SCORIA = create(AllPaletteBlocks.DARK_SCORIA).returns(8) .unlockedBy(() -> AllPaletteBlocks.SCORIA.get()) - .viaShaped(b -> b.key('#', AllPaletteBlocks.SCORIA.get()) - .key('D', Tags.Items.DYES_BLACK) - .patternLine("###") - .patternLine("#D#") - .patternLine("###")), + .viaShaped(b -> b.define('#', AllPaletteBlocks.SCORIA.get()) + .define('D', Tags.Items.DYES_BLACK) + .pattern("###") + .pattern("#D#") + .pattern("###")), COPPER_SHINGLES = create(AllBlocks.COPPER_SHINGLES).returns(16) .unlockedByTag(I::copperSheet) - .viaShaped(b -> b.key('#', I.copperSheet()) - .patternLine("##") - .patternLine("##")), + .viaShaped(b -> b.define('#', I.copperSheet()) + .pattern("##") + .pattern("##")), COPPER_SHINGLES_FROM_TILES = create(AllBlocks.COPPER_SHINGLES).withSuffix("_from_tiles") .unlockedByTag(I::copperSheet) - .viaShapeless(b -> b.addIngredient(AllBlocks.COPPER_TILES.get())), + .viaShapeless(b -> b.requires(AllBlocks.COPPER_TILES.get())), COPPER_TILES = create(AllBlocks.COPPER_TILES).unlockedByTag(I::copperSheet) - .viaShapeless(b -> b.addIngredient(AllBlocks.COPPER_SHINGLES.get())) + .viaShapeless(b -> b.requires(AllBlocks.COPPER_SHINGLES.get())) ; @@ -950,52 +950,52 @@ public class StandardRecipeGen extends CreateRecipeProvider { GeneratedRecipe DOUGH = create(AllItems.DOUGH).unlockedBy(AllItems.WHEAT_FLOUR::get) - .viaShapeless(b -> b.addIngredient(AllItems.WHEAT_FLOUR.get()) - .addIngredient(Items.WATER_BUCKET)), + .viaShapeless(b -> b.requires(AllItems.WHEAT_FLOUR.get()) + .requires(Items.WATER_BUCKET)), DIVING_HELMET = create(AllItems.DIVING_HELMET).unlockedByTag(I::copper) - .viaShaped(b -> b.key('G', Tags.Items.GLASS) - .key('P', I.copper()) - .patternLine("PPP") - .patternLine("PGP")), + .viaShaped(b -> b.define('G', Tags.Items.GLASS) + .define('P', I.copper()) + .pattern("PPP") + .pattern("PGP")), COPPER_BACKTANK = create(AllItems.COPPER_BACKTANK).unlockedByTag(I::copper) - .viaShaped(b -> b.key('G', I.shaft()) - .key('A', I.andesite()) - .key('B', I.copperBlock()) - .key('P', I.copper()) - .patternLine("AGA") - .patternLine("PBP") - .patternLine(" P ")), + .viaShaped(b -> b.define('G', I.shaft()) + .define('A', I.andesite()) + .define('B', I.copperBlock()) + .define('P', I.copper()) + .pattern("AGA") + .pattern("PBP") + .pattern(" P ")), DIVING_BOOTS = create(AllItems.DIVING_BOOTS).unlockedByTag(I::copper) - .viaShaped(b -> b.key('G', I.andesite()) - .key('P', I.copper()) - .patternLine("P P") - .patternLine("P P") - .patternLine("G G")), + .viaShaped(b -> b.define('G', I.andesite()) + .define('P', I.copper()) + .pattern("P P") + .pattern("P P") + .pattern("G G")), LINKED_CONTROLLER = create(AllItems.LINKED_CONTROLLER).unlockedBy(AllBlocks.REDSTONE_LINK::get) - .viaShaped(b -> b.key('S', ItemTags.WOODEN_BUTTONS) - .key('P', AllBlocks.REDSTONE_LINK.get()) - .patternLine("SSS") - .patternLine(" P ") - .patternLine("SSS")), + .viaShaped(b -> b.define('S', ItemTags.WOODEN_BUTTONS) + .define('P', AllBlocks.REDSTONE_LINK.get()) + .pattern("SSS") + .pattern(" P ") + .pattern("SSS")), CRAFTING_BLUEPRINT = create(AllItems.CRAFTING_BLUEPRINT).unlockedBy(() -> Items.CRAFTING_TABLE) - .viaShapeless(b -> b.addIngredient(Items.PAINTING) - .addIngredient(Items.CRAFTING_TABLE)), + .viaShapeless(b -> b.requires(Items.PAINTING) + .requires(Items.CRAFTING_TABLE)), SLIME_BALL = create(() -> Items.SLIME_BALL).unlockedBy(AllItems.DOUGH::get) - .viaShapeless(b -> b.addIngredient(AllItems.DOUGH.get()) - .addIngredient(Tags.Items.DYES_LIME)), + .viaShapeless(b -> b.requires(AllItems.DOUGH.get()) + .requires(Tags.Items.DYES_LIME)), TREE_FERTILIZER = create(AllItems.TREE_FERTILIZER).returns(2) .unlockedBy(() -> Items.BONE_MEAL) - .viaShapeless(b -> b.addIngredient(Ingredient.fromTag(ItemTags.SMALL_FLOWERS), 2) - .addIngredient(Ingredient.fromItems(Items.HORN_CORAL, Items.BRAIN_CORAL, Items.TUBE_CORAL, + .viaShapeless(b -> b.requires(Ingredient.of(ItemTags.SMALL_FLOWERS), 2) + .requires(Ingredient.of(Items.HORN_CORAL, Items.BRAIN_CORAL, Items.TUBE_CORAL, Items.BUBBLE_CORAL, Items.FIRE_CORAL)) - .addIngredient(Items.BONE_MEAL)) + .requires(Items.BONE_MEAL)) ; @@ -1130,15 +1130,15 @@ public class StandardRecipeGen extends CreateRecipeProvider { result = create(nextEntry).withSuffix("_from_compacting") .unlockedBy(currentEntry::get) - .viaShaped(b -> b.patternLine("###") - .patternLine("###") - .patternLine("###") - .key('#', currentIngredient.get())); + .viaShaped(b -> b.pattern("###") + .pattern("###") + .pattern("###") + .define('#', currentIngredient.get())); result = create(currentEntry).returns(9) .withSuffix("_from_decompacting") .unlockedBy(nextEntry::get) - .viaShapeless(b -> b.addIngredient(nextIngredient.get())); + .viaShapeless(b -> b.requires(nextIngredient.get())); } return result; } @@ -1150,7 +1150,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { ItemProviderEntry nextEntry = cycle.get((i + 1) % cycle.size()); result = create(nextEntry).withSuffix("from_conversion") .unlockedBy(currentEntry::get) - .viaShapeless(b -> b.addIngredient(currentEntry.get())); + .viaShapeless(b -> b.requires(currentEntry.get())); } return result; } @@ -1189,15 +1189,15 @@ public class StandardRecipeGen extends CreateRecipeProvider { } GeneratedRecipeBuilder unlockedBy(Supplier item) { - this.unlockedBy = () -> ItemPredicate.Builder.create() - .item(item.get()) + this.unlockedBy = () -> ItemPredicate.Builder.item() + .of(item.get()) .build(); return this; } GeneratedRecipeBuilder unlockedByTag(Supplier> tag) { - this.unlockedBy = () -> ItemPredicate.Builder.create() - .tag(tag.get()) + this.unlockedBy = () -> ItemPredicate.Builder.item() + .of(tag.get()) .build(); return this; } @@ -1222,19 +1222,19 @@ public class StandardRecipeGen extends CreateRecipeProvider { GeneratedRecipe viaShaped(UnaryOperator builder) { return register(consumer -> { - ShapedRecipeBuilder b = builder.apply(ShapedRecipeBuilder.shapedRecipe(result.get(), amount)); + ShapedRecipeBuilder b = builder.apply(ShapedRecipeBuilder.shaped(result.get(), amount)); if (unlockedBy != null) - b.addCriterion("has_item", hasItem(unlockedBy.get())); - b.build(consumer, createLocation("crafting")); + b.unlockedBy("has_item", inventoryTrigger(unlockedBy.get())); + b.save(consumer, createLocation("crafting")); }); } GeneratedRecipe viaShapeless(UnaryOperator builder) { return register(consumer -> { - ShapelessRecipeBuilder b = builder.apply(ShapelessRecipeBuilder.shapelessRecipe(result.get(), amount)); + ShapelessRecipeBuilder b = builder.apply(ShapelessRecipeBuilder.shapeless(result.get(), amount)); if (unlockedBy != null) - b.addCriterion("has_item", hasItem(unlockedBy.get())); - b.build(consumer, createLocation("crafting")); + b.unlockedBy("has_item", inventoryTrigger(unlockedBy.get())); + b.save(consumer, createLocation("crafting")); }); } @@ -1253,11 +1253,11 @@ public class StandardRecipeGen extends CreateRecipeProvider { } GeneratedCookingRecipeBuilder viaCooking(Supplier item) { - return unlockedBy(item).viaCookingIngredient(() -> Ingredient.fromItems(item.get())); + return unlockedBy(item).viaCookingIngredient(() -> Ingredient.of(item.get())); } GeneratedCookingRecipeBuilder viaCookingTag(Supplier> tag) { - return unlockedByTag(tag).viaCookingIngredient(() -> Ingredient.fromTag(tag.get())); + return unlockedByTag(tag).viaCookingIngredient(() -> Ingredient.of(tag.get())); } GeneratedCookingRecipeBuilder viaCookingIngredient(Supplier ingredient) { @@ -1270,9 +1270,9 @@ public class StandardRecipeGen extends CreateRecipeProvider { private float exp; private int cookingTime; - private final CookingRecipeSerializer FURNACE = IRecipeSerializer.SMELTING, - SMOKER = IRecipeSerializer.SMOKING, BLAST = IRecipeSerializer.BLASTING, - CAMPFIRE = IRecipeSerializer.CAMPFIRE_COOKING; + private final CookingRecipeSerializer FURNACE = IRecipeSerializer.SMELTING_RECIPE, + SMOKER = IRecipeSerializer.SMOKING_RECIPE, BLAST = IRecipeSerializer.BLASTING_RECIPE, + CAMPFIRE = IRecipeSerializer.CAMPFIRE_COOKING_RECIPE; GeneratedCookingRecipeBuilder(Supplier ingredient) { this.ingredient = ingredient; @@ -1323,11 +1323,11 @@ public class StandardRecipeGen extends CreateRecipeProvider { boolean isOtherMod = compatDatagenOutput != null; CookingRecipeBuilder b = builder.apply( - CookingRecipeBuilder.cookingRecipe(ingredient.get(), isOtherMod ? Items.DIRT : result.get(), + CookingRecipeBuilder.cooking(ingredient.get(), isOtherMod ? Items.DIRT : result.get(), exp, (int) (cookingTime * cookingTimeModifier), serializer)); if (unlockedBy != null) - b.addCriterion("has_item", hasItem(unlockedBy.get())); - b.build(result -> { + b.unlockedBy("has_item", inventoryTrigger(unlockedBy.get())); + b.save(result -> { consumer.accept( isOtherMod ? new ModdedCookingRecipeResult(result, compatDatagenOutput, recipeConditions) : result); @@ -1361,28 +1361,28 @@ public class StandardRecipeGen extends CreateRecipeProvider { } @Override - public ResourceLocation getID() { - return wrapped.getID(); + public ResourceLocation getId() { + return wrapped.getId(); } @Override - public IRecipeSerializer getSerializer() { - return wrapped.getSerializer(); + public IRecipeSerializer getType() { + return wrapped.getType(); } @Override - public JsonObject getAdvancementJson() { - return wrapped.getAdvancementJson(); + public JsonObject serializeAdvancement() { + return wrapped.serializeAdvancement(); } @Override - public ResourceLocation getAdvancementID() { - return wrapped.getAdvancementID(); + public ResourceLocation getAdvancementId() { + return wrapped.getAdvancementId(); } @Override - public void serialize(JsonObject object) { - wrapped.serialize(object); + public void serializeRecipeData(JsonObject object) { + wrapped.serializeRecipeData(object); object.addProperty("result", outputOverride.toString()); JsonArray conds = new JsonArray(); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java index 8f8bb2a0b..54acfecce 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java @@ -100,7 +100,7 @@ public class WashingRecipeGen extends ProcessingRecipeGen { ResourceLocation nugget = mod.nuggetOf(metalName); create(mod.getId() + "/" + crushed.getId() .getPath(), - b -> b.withItemIngredients(Ingredient.fromItems(crushed::get)) + b -> b.withItemIngredients(Ingredient.of(crushed::get)) .output(1, nugget, 10) .output(.5f, nugget, 5) .whenModLoaded(mod.getId())); diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java index b6494e1d9..2ec01040d 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java @@ -48,9 +48,9 @@ public class FluidHelper { } public static boolean hasBlockState(Fluid fluid) { - BlockState blockState = fluid.getDefaultState() - .getBlockState(); - return blockState != null && blockState != Blocks.AIR.getDefaultState(); + BlockState blockState = fluid.defaultFluidState() + .createLegacyBlock(); + return blockState != null && blockState != Blocks.AIR.defaultBlockState(); } public static FluidStack copyStackWithAmount(FluidStack fs, int amount) { @@ -67,7 +67,7 @@ public class FluidHelper { if (fluid == Fluids.LAVA) return Fluids.FLOWING_LAVA; if (fluid instanceof ForgeFlowingFluid) - return ((ForgeFlowingFluid) fluid).getFlowingFluid(); + return ((ForgeFlowingFluid) fluid).getFlowing(); return fluid; } @@ -77,7 +77,7 @@ public class FluidHelper { if (fluid == Fluids.FLOWING_LAVA) return Fluids.LAVA; if (fluid instanceof ForgeFlowingFluid) - return ((ForgeFlowingFluid) fluid).getStillFluid(); + return ((ForgeFlowingFluid) fluid).getSource(); return fluid; } @@ -94,11 +94,11 @@ public class FluidHelper { } public static FluidStack deserializeFluidStack(JsonObject json) { - ResourceLocation id = new ResourceLocation(JSONUtils.getString(json, "fluid")); + ResourceLocation id = new ResourceLocation(JSONUtils.getAsString(json, "fluid")); Fluid fluid = ForgeRegistries.FLUIDS.getValue(id); if (fluid == null) throw new JsonSyntaxException("Unknown fluid '" + id + "'"); - int amount = JSONUtils.getInt(json, "amount"); + int amount = JSONUtils.getAsInt(json, "amount"); FluidStack stack = new FluidStack(fluid, amount); if (!json.has("nbt")) @@ -106,8 +106,8 @@ public class FluidHelper { try { JsonElement element = json.get("nbt"); - stack.setTag(JsonToNBT.getTagFromJson( - element.isJsonObject() ? Create.GSON.toJson(element) : JSONUtils.getString(element, "nbt"))); + stack.setTag(JsonToNBT.parseTag( + element.isJsonObject() ? Create.GSON.toJson(element) : JSONUtils.convertToString(element, "nbt"))); } catch (CommandSyntaxException e) { e.printStackTrace(); @@ -128,7 +128,7 @@ public class FluidHelper { if (tank == null || fluidStack.getAmount() != tank.fill(fluidStack, FluidAction.SIMULATE)) return false; - if (worldIn.isRemote) + if (worldIn.isClientSide) return true; ItemStack copyOfHeld = heldItem.copy(); @@ -137,9 +137,9 @@ public class FluidHelper { if (!player.isCreative() && !(te instanceof CreativeFluidTankTileEntity)) { if (copyOfHeld.isEmpty()) - player.setHeldItem(handIn, emptyingResult.getSecond()); + player.setItemInHand(handIn, emptyingResult.getSecond()); else { - player.setHeldItem(handIn, copyOfHeld); + player.setItemInHand(handIn, copyOfHeld); player.inventory.placeItemBackInInventory(worldIn, emptyingResult.getSecond()); } } @@ -167,7 +167,7 @@ public class FluidHelper { if (requiredAmountForItem > fluid.getAmount()) continue; - if (world.isRemote) + if (world.isClientSide) return true; if (player.isCreative() || te instanceof CreativeFluidTankTileEntity) diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java index 1082cb755..65e9d416a 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java @@ -131,7 +131,7 @@ public abstract class FluidIngredient implements Predicate { if (!json.has("amount")) throw new JsonSyntaxException("Fluid ingredient has to define an amount"); - ingredient.amountRequired = JSONUtils.getInt(json, "amount"); + ingredient.amountRequired = JSONUtils.getAsInt(json, "amount"); return ingredient; } @@ -146,13 +146,13 @@ public abstract class FluidIngredient implements Predicate { void fixFlowing() { if (fluid instanceof FlowingFluid) - fluid = ((FlowingFluid) fluid).getStillFluid(); + fluid = ((FlowingFluid) fluid).getSource(); } @Override protected boolean testInternal(FluidStack t) { if (!t.getFluid() - .isEquivalentTo(fluid)) + .isSame(fluid)) return false; if (tagToMatch.isEmpty()) return true; @@ -165,13 +165,13 @@ public abstract class FluidIngredient implements Predicate { @Override protected void readInternal(PacketBuffer buffer) { fluid = buffer.readRegistryId(); - tagToMatch = buffer.readCompoundTag(); + tagToMatch = buffer.readNbt(); } @Override protected void writeInternal(PacketBuffer buffer) { buffer.writeRegistryId(fluid); - buffer.writeCompoundTag(tagToMatch); + buffer.writeNbt(tagToMatch); } @Override @@ -205,10 +205,10 @@ public abstract class FluidIngredient implements Predicate { if (tag == null) for (FluidStack accepted : getMatchingFluidStacks()) if (accepted.getFluid() - .isEquivalentTo(t.getFluid())) + .isSame(t.getFluid())) return true; return t.getFluid() - .isIn(tag); + .is(tag); } @Override @@ -230,10 +230,10 @@ public abstract class FluidIngredient implements Predicate { @Override protected void readInternal(JsonObject json) { - ResourceLocation id = new ResourceLocation(JSONUtils.getString(json, "fluidTag")); - Optional> optionalINamedTag = FluidTags.getRequiredTags() + ResourceLocation id = new ResourceLocation(JSONUtils.getAsString(json, "fluidTag")); + Optional> optionalINamedTag = FluidTags.getWrappers() .stream() - .filter(fluidINamedTag -> fluidINamedTag.getId() + .filter(fluidINamedTag -> fluidINamedTag.getName() .equals(id)) .findFirst(); // fixme if (!optionalINamedTag.isPresent()) @@ -243,17 +243,17 @@ public abstract class FluidIngredient implements Predicate { @Override protected void writeInternal(JsonObject json) { - json.addProperty("fluidTag", tag.getId() + json.addProperty("fluidTag", tag.getName() .toString()); } @Override protected List determineMatchingFluidStacks() { - return tag.values() + return tag.getValues() .stream() .map(f -> { if (f instanceof FlowingFluid) - return ((FlowingFluid) f).getStillFluid(); + return ((FlowingFluid) f).getSource(); return f; }) .distinct() diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java index a87676674..ec7bdbe82 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.fluid; import java.util.function.Function; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack.Entry; import com.mojang.blaze3d.vertex.IVertexBuilder; @@ -9,7 +10,6 @@ import com.simibubi.create.foundation.renderState.RenderTypes; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -46,7 +46,7 @@ public class FluidRenderer { Fluid fluid = fluidStack.getFluid(); FluidAttributes fluidAttributes = fluid.getAttributes(); Function spriteAtlas = Minecraft.getInstance() - .getSpriteAtlas(PlayerContainer.BLOCK_ATLAS_TEXTURE); + .getTextureAtlas(PlayerContainer.BLOCK_ATLAS); TextureAtlasSprite flowTexture = spriteAtlas.apply(fluidAttributes.getFlowingTexture(fluidStack)); TextureAtlasSprite stillTexture = spriteAtlas.apply(fluidAttributes.getStillTexture(fluidStack)); @@ -58,8 +58,8 @@ public class FluidRenderer { if (inbound) direction = direction.getOpposite(); - MatrixStacker msr = MatrixStacker.of(ms); - ms.push(); + MatrixTransformStack msr = MatrixTransformStack.of(ms); + ms.pushPose(); msr.centre() .rotateY(AngleHelper.horizontalAngle(direction)) .rotateX(direction == Direction.UP ? 0 : direction == Direction.DOWN ? 180 : 90) @@ -74,10 +74,10 @@ public class FluidRenderer { float yMax = y + MathHelper.clamp(progress * .5f - 1e-6f, 0, 1); for (int i = 0; i < 4; i++) { - ms.push(); + ms.pushPose(); renderTiledHorizontalFace(h, Direction.SOUTH, hMin, yMin, hMax, yMax, builder, ms, light, color, flowTexture); - ms.pop(); + ms.popPose(); msr.rotateY(90); } @@ -85,7 +85,7 @@ public class FluidRenderer { renderTiledVerticalFace(yMax, Direction.UP, hMin, hMin, hMax, hMax, builder, ms, light, color, stillTexture); - ms.pop(); + ms.popPose(); } public static void renderTiledFluidBB(FluidStack fluidStack, float xMin, float yMin, float zMin, float xMax, @@ -98,7 +98,7 @@ public class FluidRenderer { Fluid fluid = fluidStack.getFluid(); FluidAttributes fluidAttributes = fluid.getAttributes(); TextureAtlasSprite fluidTexture = Minecraft.getInstance() - .getSpriteAtlas(PlayerContainer.BLOCK_ATLAS_TEXTURE) + .getTextureAtlas(PlayerContainer.BLOCK_ATLAS) .apply(fluidAttributes.getStillTexture(fluidStack)); int color = fluidAttributes.getColor(fluidStack); @@ -107,12 +107,12 @@ public class FluidRenderer { light = (light & 0xF00000) | luminosity << 4; Vector3d center = new Vector3d(xMin + (xMax - xMin) / 2, yMin + (yMax - yMin) / 2, zMin + (zMax - zMin) / 2); - MatrixStacker msr = MatrixStacker.of(ms); - ms.push(); + MatrixTransformStack msr = MatrixTransformStack.of(ms); + ms.pushPose(); if (fluidStack.getFluid() .getAttributes() .isLighterThanAir()) - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .translate(center) .rotateX(180) .translateBack(center); @@ -123,7 +123,7 @@ public class FluidRenderer { if (side.getAxis() .isHorizontal()) { - ms.push(); + ms.pushPose(); if (side.getAxisDirection() == AxisDirection.NEGATIVE) msr.translate(center) @@ -135,7 +135,7 @@ public class FluidRenderer { renderTiledHorizontalFace(X ? xMax : zMax, side, X ? zMin : xMin, yMin, X ? zMax : xMax, yMax, builder, ms, light, darkColor, fluidTexture); - ms.pop(); + ms.popPose(); continue; } @@ -143,7 +143,7 @@ public class FluidRenderer { light, color, fluidTexture); } - ms.pop(); + ms.popPose(); } @@ -156,10 +156,10 @@ public class FluidRenderer { for (float z1 = zMin; z1 < zMax; z1 = z2) { z2 = Math.min((int) (z1 + 1), zMax); - float u1 = texture.getInterpolatedU(local(x1) * 16); - float v1 = texture.getInterpolatedV(local(z1) * 16); - float u2 = texture.getInterpolatedU(x2 == xMax ? local(x2) * 16 : 16); - float v2 = texture.getInterpolatedV(z2 == zMax ? local(z2) * 16 : 16); + float u1 = texture.getU(local(x1) * 16); + float v1 = texture.getV(local(z1) * 16); + float u2 = texture.getU(x2 == xMax ? local(x2) * 16 : 16); + float v2 = texture.getV(z2 == zMax ? local(z2) * 16 : 16); putVertex(builder, ms, x1, y, z2, color, u1, v2, face, light); putVertex(builder, ms, x2, y, z2, color, u2, v2, face, light); @@ -182,10 +182,10 @@ public class FluidRenderer { y2 = Math.min((int) (y1 + 1), yMax); int multiplier = texture.getWidth() == 32 ? 8 : 16; - float u1 = texture.getInterpolatedU(local(h1) * multiplier); - float v1 = texture.getInterpolatedV(local(y1) * multiplier); - float u2 = texture.getInterpolatedU(h2 == hMax ? local(h2) * multiplier : multiplier); - float v2 = texture.getInterpolatedV(y2 == yMax ? local(y2) * multiplier : multiplier); + float u1 = texture.getU(local(h1) * multiplier); + float v1 = texture.getV(local(y1) * multiplier); + float u2 = texture.getU(h2 == hMax ? local(h2) * multiplier : multiplier); + float v2 = texture.getV(y2 == yMax ? local(y2) * multiplier : multiplier); float x1 = X ? h : h1; float x2 = X ? h : h2; @@ -209,19 +209,19 @@ public class FluidRenderer { private static void putVertex(IVertexBuilder builder, MatrixStack ms, float x, float y, float z, int color, float u, float v, Direction face, int light) { - Vector3i n = face.getDirectionVec(); - Entry peek = ms.peek(); + Vector3i n = face.getNormal(); + Entry peek = ms.last(); int ff = 0xff; int a = color >> 24 & ff; int r = color >> 16 & ff; int g = color >> 8 & ff; int b = color & ff; - builder.vertex(peek.getModel(), x, y, z) + builder.vertex(peek.pose(), x, y, z) .color(r, g, b, a) - .texture(u, v) - .overlay(OverlayTexture.DEFAULT_UV) - .light(light) + .uv(u, v) + .overlayCoords(OverlayTexture.NO_OVERLAY) + .uv2(light) .normal(n.getX(), n.getY(), n.getZ()) .endVertex(); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiContainerScreen.java b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiContainerScreen.java index fe7b26623..acc765909 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiContainerScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiContainerScreen.java @@ -44,8 +44,8 @@ public abstract class AbstractSimiContainerScreen extends C } protected void setWindowSize(int width, int height) { - this.xSize = width; - this.ySize = height; + this.imageWidth = width; + this.imageHeight = height; } protected void setWindowOffset(int xOffset, int yOffset) { @@ -56,12 +56,12 @@ public abstract class AbstractSimiContainerScreen extends C @Override protected void init() { super.init(); - guiLeft += windowXOffset; - guiTop += windowYOffset; + leftPos += windowXOffset; + topPos += windowYOffset; } @Override - protected void drawForeground(MatrixStack p_230451_1_, int p_230451_2_, int p_230451_3_) { + protected void renderLabels(MatrixStack p_230451_1_, int p_230451_2_, int p_230451_3_) { // no-op to prevent screen- and inventory-title from being rendered at incorrect location // could also set this.titleX/Y and this.playerInventoryTitleX/Y to the proper values instead } @@ -69,7 +69,7 @@ public abstract class AbstractSimiContainerScreen extends C @Override public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { partialTicks = Minecraft.getInstance() - .getRenderPartialTicks(); + .getFrameTime(); renderBackground(matrixStack); renderWindow(matrixStack, mouseX, mouseY, partialTicks); @@ -81,7 +81,7 @@ public abstract class AbstractSimiContainerScreen extends C RenderSystem.enableAlphaTest(); RenderSystem.enableBlend(); RenderSystem.disableRescaleNormal(); - RenderHelper.disableStandardItemLighting(); + RenderHelper.turnOff(); RenderSystem.disableLighting(); RenderSystem.disableDepthTest(); renderWindowForeground(matrixStack, mouseX, mouseY, partialTicks); @@ -107,8 +107,8 @@ public abstract class AbstractSimiContainerScreen extends C if (super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_)) return true; - InputMappings.Input mouseKey = InputMappings.getInputByCode(code, p_keyPressed_2_); - if (this.client.gameSettings.keyBindInventory.isActiveAndMatches(mouseKey)) { + InputMappings.Input mouseKey = InputMappings.getKey(code, p_keyPressed_2_); + if (this.minecraft.options.keyInventory.isActiveAndMatches(mouseKey)) { this.onClose(); return true; } @@ -146,18 +146,18 @@ public abstract class AbstractSimiContainerScreen extends C protected abstract void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks); @Override - protected void drawBackground(MatrixStack p_230450_1_, float p_230450_2_, int p_230450_3_, int p_230450_4_) { + protected void renderBg(MatrixStack p_230450_1_, float p_230450_2_, int p_230450_3_, int p_230450_4_) { } protected void renderWindowForeground(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { - drawMouseoverTooltip(matrixStack, mouseX, mouseY); + renderTooltip(matrixStack, mouseX, mouseY); for (Widget widget : widgets) { if (!widget.isHovered()) continue; if (widget instanceof AbstractSimiWidget) { if (!((AbstractSimiWidget) widget).getToolTip().isEmpty()) - renderTooltip(matrixStack, ((AbstractSimiWidget) widget).getToolTip(), mouseX, mouseY); + renderComponentTooltip(matrixStack, ((AbstractSimiWidget) widget).getToolTip(), mouseX, mouseY); } else { widget.renderToolTip(matrixStack, mouseX, mouseY); @@ -166,8 +166,8 @@ public abstract class AbstractSimiContainerScreen extends C } public double getItemCountTextScale() { - int guiScaleFactor = (int) client.getWindow() - .getGuiScaleFactor(); + int guiScaleFactor = (int) minecraft.getWindow() + .getGuiScale(); double scale = 1; switch (guiScaleFactor) { case 1: @@ -194,7 +194,7 @@ public abstract class AbstractSimiContainerScreen extends C public void renderPlayerInventory(MatrixStack ms, int x, int y) { AllGuiTextures.PLAYER_INVENTORY.draw(ms, this, x, y); - textRenderer.draw(ms, playerInventory.getDisplayName(), x + 8, y + 6, 0x404040); + font.draw(ms, inventory.getDisplayName(), x + 8, y + 6, 0x404040); } /** @@ -221,7 +221,7 @@ public abstract class AbstractSimiContainerScreen extends C RenderSystem.disableAlphaTest(); RenderSystem.disableBlend(); Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuffer(); + BufferBuilder bufferbuilder = tessellator.getBuilder(); double health = stack.getItem() .getDurabilityForDisplay(stack); int i = Math.round(13.0F - (float) health * 13.0F); @@ -242,19 +242,19 @@ public abstract class AbstractSimiContainerScreen extends C RenderSystem.disableLighting(); RenderSystem.disableDepthTest(); RenderSystem.disableBlend(); - matrixStack.push(); + matrixStack.pushPose(); - int guiScaleFactor = (int) client.getWindow() - .getGuiScaleFactor(); + int guiScaleFactor = (int) minecraft.getWindow() + .getGuiScale(); matrixStack.translate(xPosition + 16.5f, yPosition + 16.5f, 0); double scale = getItemCountTextScale(); matrixStack.scale((float) scale, (float) scale, 0); - matrixStack.translate(-fr.getStringWidth(s) - (guiScaleFactor > 1 ? 0 : -.5f), - -textRenderer.FONT_HEIGHT + (guiScaleFactor > 1 ? 1 : 1.75f), 0); - fr.drawWithShadow(matrixStack, s, 0, 0, textColor); + matrixStack.translate(-fr.width(s) - (guiScaleFactor > 1 ? 0 : -.5f), + -font.lineHeight + (guiScaleFactor > 1 ? 1 : 1.75f), 0); + fr.drawShadow(matrixStack, s, 0, 0, textColor); - matrixStack.pop(); + matrixStack.popPose(); RenderSystem.enableBlend(); RenderSystem.enableLighting(); RenderSystem.enableDepthTest(); @@ -280,12 +280,12 @@ public abstract class AbstractSimiContainerScreen extends C .color(red, green, blue, alpha) .endVertex(); Tessellator.getInstance() - .draw(); + .end(); } @Deprecated protected void debugWindowArea(MatrixStack matrixStack) { - fill(matrixStack, guiLeft + xSize, guiTop + ySize, guiLeft, guiTop, 0xD3D3D3D3); + fill(matrixStack, leftPos + imageWidth, topPos + imageHeight, leftPos, topPos, 0xD3D3D3D3); } @Deprecated diff --git a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java index a9d07e4ec..1329ee837 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java @@ -62,9 +62,9 @@ public abstract class AbstractSimiScreen extends Screen { public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { partialTicks = partialTicks == 10 ? 0 : Minecraft.getInstance() - .getRenderPartialTicks(); + .getFrameTime(); - ms.push(); + ms.pushPose(); prepareFrame(); @@ -76,7 +76,7 @@ public abstract class AbstractSimiScreen extends Screen { endFrame(); - ms.pop(); + ms.popPose(); } protected void prepareFrame() { @@ -111,8 +111,8 @@ public abstract class AbstractSimiScreen extends Screen { if (super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_)) return true; - InputMappings.Input mouseKey = InputMappings.getInputByCode(code, p_keyPressed_2_); - if (this.client.gameSettings.keyBindInventory.isActiveAndMatches(mouseKey)) { + InputMappings.Input mouseKey = InputMappings.getKey(code, p_keyPressed_2_); + if (this.minecraft.options.keyInventory.isActiveAndMatches(mouseKey)) { this.onClose(); return true; } @@ -166,7 +166,7 @@ public abstract class AbstractSimiScreen extends Screen { if (widget instanceof AbstractSimiWidget) { if (!((AbstractSimiWidget) widget).getToolTip().isEmpty()) - renderTooltip(ms, ((AbstractSimiWidget) widget).getToolTip(), mouseX, mouseY); + renderComponentTooltip(ms, ((AbstractSimiWidget) widget).getToolTip(), mouseX, mouseY); } else { widget.renderToolTip(ms, mouseX, mouseY); diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index a063943d3..54e04197d 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -132,14 +132,14 @@ public enum AllGuiTextures implements IScreenRenderable { public void bind() { Minecraft.getInstance() .getTextureManager() - .bindTexture(location); + .bind(location); } @Override @OnlyIn(Dist.CLIENT) public void draw(MatrixStack ms, AbstractGui screen, int x, int y) { bind(); - screen.drawTexture(ms, x, y, startX, startY, width, height); + screen.blit(ms, x, y, startX, startY, width, height); } public void draw(MatrixStack ms, int x, int y, Color c) { diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index 3351867e7..23d28abe8 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -163,24 +163,24 @@ public class AllIcons implements IScreenRenderable { public void bind() { Minecraft.getInstance() .getTextureManager() - .bindTexture(ICON_ATLAS); + .bind(ICON_ATLAS); } @Override @OnlyIn(Dist.CLIENT) public void draw(MatrixStack matrixStack, AbstractGui screen, int x, int y) { bind(); - screen.drawTexture(matrixStack, x, y, iconX, iconY, 16, 16); + screen.blit(matrixStack, x, y, iconX, iconY, 16, 16); } @OnlyIn(Dist.CLIENT) public void draw(MatrixStack ms, IRenderTypeBuffer buffer, int color) { - IVertexBuilder builder = buffer.getBuffer(RenderType.getTextSeeThrough(ICON_ATLAS)); + IVertexBuilder builder = buffer.getBuffer(RenderType.textSeeThrough(ICON_ATLAS)); float sheetSize = 256; int i = 15 << 20 | 15 << 4; int j = i >> 16 & '\uffff'; int k = i & '\uffff'; - Entry peek = ms.peek(); + Entry peek = ms.last(); Vector3d rgb = ColorHelper.getRGB(color); Vector3d vec4 = new Vector3d(1, 1, 0); @@ -206,10 +206,10 @@ public class AllIcons implements IScreenRenderable { @OnlyIn(Dist.CLIENT) private void vertex(Entry peek, IVertexBuilder builder, int j, int k, Vector3d rgb, Vector3d vec, float u, float v) { - builder.vertex(peek.getModel(), (float) vec.x, (float) vec.y, (float) vec.z) + builder.vertex(peek.pose(), (float) vec.x, (float) vec.y, (float) vec.z) .color((float) rgb.x, (float) rgb.y, (float) rgb.z, 1) - .texture(u, v) - .light(j, k) + .uv(u, v) + .uv2(j, k) .endVertex(); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/BoxElement.java b/src/main/java/com/simibubi/create/foundation/gui/BoxElement.java index 673b057b6..405413920 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/BoxElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/BoxElement.java @@ -100,8 +100,8 @@ public class BoxElement extends RenderElement { Color c2 = ColorHelper.applyAlpha(borderTop, alpha); Color c3 = ColorHelper.applyAlpha(borderBot, alpha); Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder b = tessellator.getBuffer(); - Matrix4f model = ms.peek().getModel(); + BufferBuilder b = tessellator.getBuilder(); + Matrix4f model = ms.last().pose(); b.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR); //outer top b.vertex(model, x - f - 1 , y - f - 2 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); @@ -128,7 +128,7 @@ public class BoxElement extends RenderElement { b.vertex(model, x - f - 1 , y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); b.vertex(model, x + f + 1 + width, y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); b.vertex(model, x + f + 1 + width, y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - tessellator.draw(); + tessellator.end(); b.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR); //inner top - includes corners b.vertex(model, x - f - 1 , y - f - 1 , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); @@ -151,7 +151,7 @@ public class BoxElement extends RenderElement { b.vertex(model, x + f + 1 + width, y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); b.vertex(model, x + f + 1 + width, y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - tessellator.draw(); + tessellator.end(); RenderSystem.shadeModel(GL11.GL_FLAT); RenderSystem.disableBlend(); diff --git a/src/main/java/com/simibubi/create/foundation/gui/ClearContainerPacket.java b/src/main/java/com/simibubi/create/foundation/gui/ClearContainerPacket.java index 4714c273c..24b961302 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ClearContainerPacket.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ClearContainerPacket.java @@ -25,9 +25,9 @@ public class ClearContainerPacket extends SimplePacketBase { .getSender(); if (player == null) return; - if (!(player.openContainer instanceof IClearableContainer)) + if (!(player.containerMenu instanceof IClearableContainer)) return; - ((IClearableContainer) player.openContainer).clearContents(); + ((IClearableContainer) player.containerMenu).clearContents(); }); context.get() .setPacketHandled(true); diff --git a/src/main/java/com/simibubi/create/foundation/gui/CombinedStencilElement.java b/src/main/java/com/simibubi/create/foundation/gui/CombinedStencilElement.java index 374479c69..6382dce01 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/CombinedStencilElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/CombinedStencilElement.java @@ -44,16 +44,16 @@ public class CombinedStencilElement extends StencilElement { @Override protected void renderStencil(MatrixStack ms) { - ms.push(); + ms.pushPose(); element1.transform(ms); element1.withBounds(width, height); element1.renderStencil(ms); - ms.pop(); - ms.push(); + ms.popPose(); + ms.pushPose(); element2.transform(ms); element2.withBounds(width, height); element2.renderStencil(ms); - ms.pop(); + ms.popPose(); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java b/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java index 7dcfd715b..849c1ff51 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java @@ -95,8 +95,8 @@ public class ConfirmationScreen extends AbstractSimiScreen { public void open(@Nonnull Screen source) { this.source = source; Minecraft client = source.getMinecraft(); - this.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight()); - this.client.currentScreen = this; + this.init(client, client.getWindow().getGuiScaledWidth(), client.getWindow().getGuiScaledHeight()); + this.minecraft.screen = this; } @Override @@ -112,9 +112,9 @@ public class ConfirmationScreen extends AbstractSimiScreen { ArrayList copy = new ArrayList<>(text); text.clear(); - copy.forEach(t -> text.addAll(client.fontRenderer.getTextHandler().wrapLines(t, 300, Style.EMPTY))); + copy.forEach(t -> text.addAll(minecraft.font.getSplitter().splitLines(t, 300, Style.EMPTY))); - textHeight = text.size() * (client.fontRenderer.FONT_HEIGHT + 1) + 4; + textHeight = text.size() * (minecraft.font.lineHeight + 1) + 4; textWidth = 300; if (centered) { @@ -136,7 +136,7 @@ public class ConfirmationScreen extends AbstractSimiScreen { int buttonX = x + textWidth / 2 - 6 - (int) (70 * (tristate ? 1.5f : 1)); TextStencilElement confirmText = - new TextStencilElement(client.fontRenderer, tristate ? "Save" : "Confirm").centered(true, true); + new TextStencilElement(minecraft.font, tristate ? "Save" : "Confirm").centered(true, true); confirm = new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.Confirm)); confirm.showingElement(confirmText.withElementRenderer(BoxWidget.gradientFactory.apply(confirm))); widgets.add(confirm); @@ -145,7 +145,7 @@ public class ConfirmationScreen extends AbstractSimiScreen { if (tristate) { TextStencilElement confirmDontSaveText = - new TextStencilElement(client.fontRenderer, "Don't Save").centered(true, true); + new TextStencilElement(minecraft.font, "Don't Save").centered(true, true); confirmDontSave = new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.ConfirmDontSave)); confirmDontSave.showingElement( @@ -154,7 +154,7 @@ public class ConfirmationScreen extends AbstractSimiScreen { buttonX += 12 + 70; } - TextStencilElement cancelText = new TextStencilElement(client.fontRenderer, "Cancel").centered(true, true); + TextStencilElement cancelText = new TextStencilElement(minecraft.font, "Cancel").centered(true, true); cancel = new BoxWidget(buttonX, y + textHeight + 6, 70, 16) .withCallback(() -> accept(Response.Cancel)); cancel.showingElement(cancelText.withElementRenderer(BoxWidget.gradientFactory.apply(cancel))); @@ -173,7 +173,7 @@ public class ConfirmationScreen extends AbstractSimiScreen { } private void accept(Response success) { - client.currentScreen = source; + minecraft.screen = source; action.accept(success); } @@ -181,10 +181,10 @@ public class ConfirmationScreen extends AbstractSimiScreen { protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { textBackground.render(ms); - int offset = client.fontRenderer.FONT_HEIGHT + 1; + int offset = minecraft.font.lineHeight + 1; int lineY = y - offset; - ms.push(); + ms.pushPose(); ms.translate(0, 0, 200); for (ITextProperties line : text) { @@ -193,11 +193,11 @@ public class ConfirmationScreen extends AbstractSimiScreen { continue; int textX = x; if (text.size() == 1) - x = (width - client.fontRenderer.getWidth(line)) / 2; - client.fontRenderer.draw(ms, line.getString(), textX, lineY, 0xeaeaea); + x = (width - minecraft.font.width(line)) / 2; + minecraft.font.draw(ms, line.getString(), textX, lineY, 0xeaeaea); } - ms.pop(); + ms.popPose(); } @@ -215,14 +215,14 @@ public class ConfirmationScreen extends AbstractSimiScreen { @Override protected void prepareFrame() { Framebuffer thisBuffer = UIRenderHelper.framebuffer; - Framebuffer mainBuffer = Minecraft.getInstance().getFramebuffer(); + Framebuffer mainBuffer = Minecraft.getInstance().getMainRenderTarget(); GlCompat functions = Backend.getInstance().compat; - functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, mainBuffer.framebufferObject); - functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, thisBuffer.framebufferObject); - functions.blit.blitFramebuffer(0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, 0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); + functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, mainBuffer.frameBufferId); + functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, thisBuffer.frameBufferId); + functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); - functions.fbo.bindFramebuffer(FramebufferConstants.FRAME_BUFFER, thisBuffer.framebufferObject); + functions.fbo.bindFramebuffer(FramebufferConstants.GL_FRAMEBUFFER, thisBuffer.frameBufferId); GL11.glClear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT); } @@ -231,14 +231,14 @@ public class ConfirmationScreen extends AbstractSimiScreen { protected void endFrame() { Framebuffer thisBuffer = UIRenderHelper.framebuffer; - Framebuffer mainBuffer = Minecraft.getInstance().getFramebuffer(); + Framebuffer mainBuffer = Minecraft.getInstance().getMainRenderTarget(); GlCompat functions = Backend.getInstance().compat; - functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, thisBuffer.framebufferObject); - functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, mainBuffer.framebufferObject); - functions.blit.blitFramebuffer(0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, 0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); + functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, thisBuffer.frameBufferId); + functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, mainBuffer.frameBufferId); + functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); - functions.fbo.bindFramebuffer(FramebufferConstants.FRAME_BUFFER, mainBuffer.framebufferObject); + functions.fbo.bindFramebuffer(FramebufferConstants.GL_FRAMEBUFFER, mainBuffer.frameBufferId); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/gui/CustomLightingSettings.java b/src/main/java/com/simibubi/create/foundation/gui/CustomLightingSettings.java index a66e908b0..392dc76fa 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/CustomLightingSettings.java +++ b/src/main/java/com/simibubi/create/foundation/gui/CustomLightingSettings.java @@ -21,20 +21,20 @@ public class CustomLightingSettings implements ILightingSettings { } protected void init(float yRot1, float xRot1, float yRot2, float xRot2, boolean doubleLight) { - light1 = Vector3f.POSITIVE_Z.copy(); - light1.func_214905_a(Vector3f.POSITIVE_Y.getDegreesQuaternion(yRot1)); - light1.func_214905_a(Vector3f.POSITIVE_X.getDegreesQuaternion(xRot1)); + light1 = Vector3f.ZP.copy(); + light1.transform(Vector3f.YP.rotationDegrees(yRot1)); + light1.transform(Vector3f.XP.rotationDegrees(xRot1)); if (doubleLight) { - light2 = Vector3f.POSITIVE_Z.copy(); - light2.func_214905_a(Vector3f.POSITIVE_Y.getDegreesQuaternion(yRot2)); - light2.func_214905_a(Vector3f.POSITIVE_X.getDegreesQuaternion(xRot2)); + light2 = Vector3f.ZP.copy(); + light2.transform(Vector3f.YP.rotationDegrees(yRot2)); + light2.transform(Vector3f.XP.rotationDegrees(xRot2)); } else { light2 = VecHelper.ZERO_3F; } lightMatrix = new Matrix4f(); - lightMatrix.loadIdentity(); + lightMatrix.setIdentity(); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/gui/GhostItemContainer.java b/src/main/java/com/simibubi/create/foundation/gui/GhostItemContainer.java index 5c553ebce..d2b00bea3 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/GhostItemContainer.java +++ b/src/main/java/com/simibubi/create/foundation/gui/GhostItemContainer.java @@ -50,7 +50,7 @@ public abstract class GhostItemContainer extends Container implements ICleara ghostInventory = createGhostInventory(); readData(contentHolder); addSlots(); - detectAndSendChanges(); + broadcastChanges(); } @Override @@ -68,22 +68,22 @@ public abstract class GhostItemContainer extends Container implements ICleara } @Override - public boolean canMergeSlot(ItemStack stack, Slot slotIn) { - return slotIn.inventory == playerInventory; + public boolean canTakeItemForPickAll(ItemStack stack, Slot slotIn) { + return slotIn.container == playerInventory; } @Override - public boolean canDragIntoSlot(Slot slotIn) { + public boolean canDragTo(Slot slotIn) { if (allowRepeats()) return true; - return slotIn.inventory == playerInventory; + return slotIn.container == playerInventory; } @Override - public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { - ItemStack held = playerInventory.getItemStack(); + public ItemStack clicked(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { + ItemStack held = playerInventory.getCarried(); if (slotId < 36) - return super.slotClick(slotId, dragType, clickTypeIn, player); + return super.clicked(slotId, dragType, clickTypeIn, player); if (clickTypeIn == ClickType.THROW) return ItemStack.EMPTY; @@ -93,7 +93,7 @@ public abstract class GhostItemContainer extends Container implements ICleara ItemStack stackInSlot = ghostInventory.getStackInSlot(slot) .copy(); stackInSlot.setCount(stackInSlot.getMaxStackSize()); - playerInventory.setItemStack(stackInSlot); + playerInventory.setCarried(stackInSlot); return ItemStack.EMPTY; } return ItemStack.EMPTY; @@ -101,21 +101,21 @@ public abstract class GhostItemContainer extends Container implements ICleara if (held.isEmpty()) { ghostInventory.setStackInSlot(slot, ItemStack.EMPTY); - getSlot(slotId).onSlotChanged(); + getSlot(slotId).setChanged(); return ItemStack.EMPTY; } ItemStack insert = held.copy(); insert.setCount(1); ghostInventory.setStackInSlot(slot, insert); - getSlot(slotId).onSlotChanged(); + getSlot(slotId).setChanged(); return held; } @Override - public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { + public ItemStack quickMoveStack(PlayerEntity playerIn, int index) { if (index < 36) { - ItemStack stackToInsert = playerInventory.getStackInSlot(index); + ItemStack stackToInsert = playerInventory.getItem(index); for (int i = 0; i < ghostInventory.getSlots(); i++) { ItemStack stack = ghostInventory.getStackInSlot(i); if (!allowRepeats() && ItemHandlerHelper.canItemStacksStack(stack, stackToInsert)) @@ -124,20 +124,20 @@ public abstract class GhostItemContainer extends Container implements ICleara ItemStack copy = stackToInsert.copy(); copy.setCount(1); ghostInventory.insertItem(i, copy, false); - getSlot(i + 36).onSlotChanged(); + getSlot(i + 36).setChanged(); break; } } } else { ghostInventory.extractItem(index - 36, 1, false); - getSlot(index).onSlotChanged(); + getSlot(index).setChanged(); } return ItemStack.EMPTY; } @Override - public void onContainerClosed(PlayerEntity playerIn) { - super.onContainerClosed(playerIn); + public void removed(PlayerEntity playerIn) { + super.removed(playerIn); saveData(contentHolder); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/GhostItemSubmitPacket.java b/src/main/java/com/simibubi/create/foundation/gui/GhostItemSubmitPacket.java index 54df945ac..3245586b6 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/GhostItemSubmitPacket.java +++ b/src/main/java/com/simibubi/create/foundation/gui/GhostItemSubmitPacket.java @@ -20,13 +20,13 @@ public class GhostItemSubmitPacket extends SimplePacketBase { } public GhostItemSubmitPacket(PacketBuffer buffer) { - item = buffer.readItemStack(); + item = buffer.readItem(); slot = buffer.readInt(); } @Override public void write(PacketBuffer buffer) { - buffer.writeItemStack(item); + buffer.writeItem(item); buffer.writeInt(slot); } @@ -39,10 +39,10 @@ public class GhostItemSubmitPacket extends SimplePacketBase { if (player == null) return; - if (player.openContainer instanceof GhostItemContainer) { - GhostItemContainer c = (GhostItemContainer) player.openContainer; + if (player.containerMenu instanceof GhostItemContainer) { + GhostItemContainer c = (GhostItemContainer) player.containerMenu; c.ghostInventory.setStackInSlot(slot, item); - c.getSlot(36 + slot).onSlotChanged(); + c.getSlot(36 + slot).setChanged(); } }); diff --git a/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java b/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java index b2f1bd5f4..9a7c2df7f 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java @@ -58,9 +58,9 @@ public class GuiGameElement { } public static GuiRenderBuilder of(Fluid fluid) { - return new GuiBlockStateRenderBuilder(fluid.getDefaultState() - .getBlockState() - .with(FlowingFluidBlock.LEVEL, 0)); + return new GuiBlockStateRenderBuilder(fluid.defaultFluidState() + .createLegacyBlock() + .setValue(FlowingFluidBlock.LEVEL, 0)); } public static abstract class GuiRenderBuilder extends RenderElement { @@ -111,7 +111,7 @@ public class GuiGameElement { } protected void prepareMatrix(MatrixStack matrixStack) { - matrixStack.push(); + matrixStack.pushPose(); RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); RenderSystem.alphaFunc(516, 0.1F); RenderSystem.enableAlphaTest(); @@ -128,14 +128,14 @@ public class GuiGameElement { matrixStack.translate(xLocal, yLocal, zLocal); matrixStack.scale(1, -1, 1); matrixStack.translate(rotationOffset.x, rotationOffset.y, rotationOffset.z); - matrixStack.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion((float) zRot)); - matrixStack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion((float) xRot)); - matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion((float) yRot)); + matrixStack.mulPose(Vector3f.ZP.rotationDegrees((float) zRot)); + matrixStack.mulPose(Vector3f.XP.rotationDegrees((float) xRot)); + matrixStack.mulPose(Vector3f.YP.rotationDegrees((float) yRot)); matrixStack.translate(-rotationOffset.x, -rotationOffset.y, -rotationOffset.z); } protected void cleanUpMatrix(MatrixStack matrixStack) { - matrixStack.pop(); + matrixStack.popPose(); RenderSystem.disableRescaleNormal(); RenderSystem.disableAlphaTest(); cleanUpLighting(matrixStack); @@ -145,13 +145,13 @@ public class GuiGameElement { if (customLighting != null) { customLighting.applyLighting(); } else { - RenderHelper.enableGuiDepthLighting(); + RenderHelper.setupFor3DItems(); } } protected void cleanUpLighting(MatrixStack matrixStack) { if (customLighting != null) { - RenderHelper.enableGuiDepthLighting(); + RenderHelper.setupFor3DItems(); } } } @@ -162,7 +162,7 @@ public class GuiGameElement { protected BlockState blockState; public GuiBlockModelRenderBuilder(IBakedModel blockmodel, @Nullable BlockState blockState) { - this.blockState = blockState == null ? Blocks.AIR.getDefaultState() : blockState; + this.blockState = blockState == null ? Blocks.AIR.defaultBlockState() : blockState; this.blockModel = blockmodel; } @@ -171,17 +171,17 @@ public class GuiGameElement { prepareMatrix(matrixStack); Minecraft mc = Minecraft.getInstance(); - BlockRendererDispatcher blockRenderer = mc.getBlockRendererDispatcher(); - IRenderTypeBuffer.Impl buffer = mc.getBufferBuilders() - .getEntityVertexConsumers(); - RenderType renderType = blockState.getBlock() == Blocks.AIR ? Atlases.getEntityTranslucentCull() - : RenderTypeLookup.getEntityBlockLayer(blockState, true); + BlockRendererDispatcher blockRenderer = mc.getBlockRenderer(); + IRenderTypeBuffer.Impl buffer = mc.renderBuffers() + .bufferSource(); + RenderType renderType = blockState.getBlock() == Blocks.AIR ? Atlases.translucentCullBlockSheet() + : RenderTypeLookup.getRenderType(blockState, true); IVertexBuilder vb = buffer.getBuffer(renderType); transformMatrix(matrixStack); mc.getTextureManager() - .bindTexture(PlayerContainer.BLOCK_ATLAS_TEXTURE); + .bind(PlayerContainer.BLOCK_ATLAS); renderModel(blockRenderer, buffer, renderType, vb, matrixStack); cleanUpMatrix(matrixStack); @@ -193,10 +193,10 @@ public class GuiGameElement { .getBlockColors() .getColor(blockState, null, null, 0); Vector3d rgb = ColorHelper.getRGB(color == -1 ? this.color : color); - blockRenderer.getBlockModelRenderer() - .renderModel(ms.peek(), vb, blockState, blockModel, (float) rgb.x, (float) rgb.y, (float) rgb.z, - 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); - buffer.draw(); + blockRenderer.getModelRenderer() + .renderModel(ms.last(), vb, blockState, blockModel, (float) rgb.x, (float) rgb.y, (float) rgb.z, + 0xF000F0, OverlayTexture.NO_OVERLAY, VirtualEmptyModelData.INSTANCE); + buffer.endBatch(); } } @@ -205,19 +205,19 @@ public class GuiGameElement { public GuiBlockStateRenderBuilder(BlockState blockstate) { super(Minecraft.getInstance() - .getBlockRendererDispatcher() - .getModelForState(blockstate), blockstate); + .getBlockRenderer() + .getBlockModel(blockstate), blockstate); } @Override protected void renderModel(BlockRendererDispatcher blockRenderer, IRenderTypeBuffer.Impl buffer, RenderType renderType, IVertexBuilder vb, MatrixStack ms) { if (blockState.getBlock() instanceof FireBlock) { - RenderHelper.disableGuiDepthLighting(); - blockRenderer.renderBlock(blockState, ms, buffer, 0xF000F0, OverlayTexture.DEFAULT_UV, + RenderHelper.setupForFlatItems(); + blockRenderer.renderBlock(blockState, ms, buffer, 0xF000F0, OverlayTexture.NO_OVERLAY, VirtualEmptyModelData.INSTANCE); - buffer.draw(); - RenderHelper.enableGuiDepthLighting(); + buffer.endBatch(); + RenderHelper.setupFor3DItems(); return; } @@ -228,8 +228,8 @@ public class GuiGameElement { return; FluidRenderer.renderTiledFluidBB(new FluidStack(blockState.getFluidState() - .getFluid(), 1000), 0, 0, 0, 1.0001f, 1.0001f, 1.0001f, buffer, ms, 0xF000F0, false); - buffer.draw(); + .getType(), 1000), 0, 0, 0, 1.0001f, 1.0001f, 1.0001f, buffer, ms, 0xF000F0, false); + buffer.endBatch(); } } @@ -263,11 +263,11 @@ public class GuiGameElement { public static void renderItemIntoGUI(MatrixStack matrixStack, ItemStack stack, boolean useDefaultLighting) { ItemRenderer renderer = Minecraft.getInstance().getItemRenderer(); - IBakedModel bakedModel = renderer.getItemModelWithOverrides(stack, null, null); + IBakedModel bakedModel = renderer.getModel(stack, null, null); - matrixStack.push(); - renderer.textureManager.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); - renderer.textureManager.getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).setBlurMipmapDirect(false, false); + matrixStack.pushPose(); + renderer.textureManager.bind(AtlasTexture.LOCATION_BLOCKS); + renderer.textureManager.getTexture(AtlasTexture.LOCATION_BLOCKS).setFilter(false, false); RenderSystem.enableRescaleNormal(); RenderSystem.enableAlphaTest(); RenderSystem.enableCull(); @@ -275,30 +275,30 @@ public class GuiGameElement { RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - matrixStack.translate(0, 0, 100.0F + renderer.zLevel); + matrixStack.translate(0, 0, 100.0F + renderer.blitOffset); matrixStack.translate(8.0F, -8.0F, 0.0F); matrixStack.scale(16.0F, 16.0F, 16.0F); - IRenderTypeBuffer.Impl buffer = Minecraft.getInstance().getBufferBuilders().getEntityVertexConsumers(); - boolean flatLighting = !bakedModel.isSideLit(); + IRenderTypeBuffer.Impl buffer = Minecraft.getInstance().renderBuffers().bufferSource(); + boolean flatLighting = !bakedModel.usesBlockLight(); if (useDefaultLighting) { if (flatLighting) { - RenderHelper.disableGuiDepthLighting(); + RenderHelper.setupForFlatItems(); } } - renderer.renderItem(stack, ItemCameraTransforms.TransformType.GUI, false, matrixStack, buffer, 0xF000F0, OverlayTexture.DEFAULT_UV, bakedModel); - buffer.draw(); + renderer.render(stack, ItemCameraTransforms.TransformType.GUI, false, matrixStack, buffer, 0xF000F0, OverlayTexture.NO_OVERLAY, bakedModel); + buffer.endBatch(); RenderSystem.enableDepthTest(); if (useDefaultLighting) { if (flatLighting) { - RenderHelper.enableGuiDepthLighting(); + RenderHelper.setupFor3DItems(); } } RenderSystem.disableAlphaTest(); RenderSystem.disableRescaleNormal(); RenderSystem.enableCull(); - matrixStack.pop(); + matrixStack.popPose(); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/ILightingSettings.java b/src/main/java/com/simibubi/create/foundation/gui/ILightingSettings.java index bd585d587..4248e4de2 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ILightingSettings.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ILightingSettings.java @@ -6,7 +6,7 @@ public interface ILightingSettings { void applyLighting(); - static final ILightingSettings DEFAULT_3D = () -> RenderHelper.enableGuiDepthLighting(); - static final ILightingSettings DEFAULT_FLAT = () -> RenderHelper.disableGuiDepthLighting(); + static final ILightingSettings DEFAULT_3D = () -> RenderHelper.setupFor3DItems(); + static final ILightingSettings DEFAULT_FLAT = () -> RenderHelper.setupForFlatItems(); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java index cfe1aa1d1..d28fa2eb4 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java @@ -20,7 +20,7 @@ public class ScreenOpener { private static Screen backSteppedFrom = null; public static void open(Screen screen) { - open(Minecraft.getInstance().currentScreen, screen); + open(Minecraft.getInstance().screen, screen); } public static void open(@Nullable Screen current, Screen toOpen) { @@ -70,7 +70,7 @@ public class ScreenOpener { if (!screen.isEquivalentTo((NavigatableSimiScreen) previouslyRenderedScreen)) return false; - openPreviousScreen(Minecraft.getInstance().currentScreen, Optional.of(screen)); + openPreviousScreen(Minecraft.getInstance().screen, Optional.of(screen)); return true; } @@ -89,9 +89,9 @@ public class ScreenOpener { private static void openScreen(Screen screen) { Minecraft.getInstance() - .enqueue(() -> { + .tell(() -> { Minecraft.getInstance() - .displayGuiScreen(screen); + .setScreen(screen); Screen previouslyRenderedScreen = getPreviouslyRenderedScreen(); if (previouslyRenderedScreen != null && screen instanceof NavigatableSimiScreen) previouslyRenderedScreen.init(Minecraft.getInstance(), screen.width, screen.height); diff --git a/src/main/java/com/simibubi/create/foundation/gui/StencilElement.java b/src/main/java/com/simibubi/create/foundation/gui/StencilElement.java index 22c70b75f..6bbdeae75 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/StencilElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/StencilElement.java @@ -11,14 +11,14 @@ public abstract class StencilElement extends RenderElement { @Override public void render(MatrixStack ms) { - ms.push(); + ms.pushPose(); transform(ms); prepareStencil(ms); renderStencil(ms); prepareElement(ms); renderElement(ms); cleanUp(ms); - ms.pop(); + ms.popPose(); } protected abstract void renderStencil(MatrixStack ms); @@ -32,7 +32,7 @@ public abstract class StencilElement extends RenderElement { protected void prepareStencil(MatrixStack ms) { GL11.glDisable(GL11.GL_STENCIL_TEST); RenderSystem.stencilMask(~0); - RenderSystem.clear(GL11.GL_STENCIL_BUFFER_BIT, Minecraft.IS_RUNNING_ON_MAC); + RenderSystem.clear(GL11.GL_STENCIL_BUFFER_BIT, Minecraft.ON_OSX); GL11.glEnable(GL11.GL_STENCIL_TEST); RenderSystem.stencilOp(GL11.GL_REPLACE, GL11.GL_KEEP, GL11.GL_KEEP); RenderSystem.stencilMask(0xFF); diff --git a/src/main/java/com/simibubi/create/foundation/gui/TextStencilElement.java b/src/main/java/com/simibubi/create/foundation/gui/TextStencilElement.java index cdea4f887..9ede69764 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/TextStencilElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/TextStencilElement.java @@ -50,10 +50,10 @@ public class TextStencilElement extends DelegatedStencilElement { float x = 0, y = 0; if (centerHorizontally) - x = width / 2f - font.getWidth(component) / 2f; + x = width / 2f - font.width(component) / 2f; if (centerVertically) - y = height / 2f - (font.FONT_HEIGHT - 1) / 2f; + y = height / 2f - (font.lineHeight - 1) / 2f; font.draw(ms, component, x, y, 0xff_000000); } @@ -62,15 +62,15 @@ public class TextStencilElement extends DelegatedStencilElement { protected void renderElement(MatrixStack ms) { float x = 0, y = 0; if (centerHorizontally) - x = width / 2f - font.getWidth(component) / 2f; + x = width / 2f - font.width(component) / 2f; if (centerVertically) - y = height / 2f - (font.FONT_HEIGHT - 1) / 2f; + y = height / 2f - (font.lineHeight - 1) / 2f; - ms.push(); + ms.pushPose(); ms.translate(x, y, 0); - element.render(ms, font.getWidth(component), font.FONT_HEIGHT + 2, alpha); - ms.pop(); + element.render(ms, font.width(component), font.lineHeight + 2, alpha); + ms.popPose(); } public IFormattableTextComponent getComponent() { diff --git a/src/main/java/com/simibubi/create/foundation/gui/ToolSelectionScreen.java b/src/main/java/com/simibubi/create/foundation/gui/ToolSelectionScreen.java index cb77c8b7d..4748a8742 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ToolSelectionScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ToolSelectionScreen.java @@ -33,7 +33,7 @@ public class ToolSelectionScreen extends Screen { public ToolSelectionScreen(List tools, Consumer callback) { super(new StringTextComponent("Tool Selection")); - this.client = Minecraft.getInstance(); + this.minecraft = Minecraft.getInstance(); this.tools = tools; this.callback = callback; focused = false; @@ -62,12 +62,12 @@ public class ToolSelectionScreen extends Screen { Minecraft mc = Minecraft.getInstance(); MainWindow mainWindow = mc.getWindow(); if (!initialized) - init(mc, mainWindow.getScaledWidth(), mainWindow.getScaledHeight()); + init(mc, mainWindow.getGuiScaledWidth(), mainWindow.getGuiScaledHeight()); - int x = (mainWindow.getScaledWidth() - w) / 2 + 15; - int y = mainWindow.getScaledHeight() - h - 75; + int x = (mainWindow.getGuiScaledWidth() - w) / 2 + 15; + int y = mainWindow.getGuiScaledHeight() - h - 75; - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(0, -yOffset, focused ? 100 : 0); AllGuiTextures gray = AllGuiTextures.HUD_BACKGROUND; @@ -76,8 +76,8 @@ public class ToolSelectionScreen extends Screen { Minecraft.getInstance() .getTextureManager() - .bindTexture(gray.location); - drawTexture(matrixStack, x - 15, y, gray.startX, gray.startY, w, h, gray.width, gray.height); + .bind(gray.location); + blit(matrixStack, x - 15, y, gray.startX, gray.startY, w, h, gray.width, gray.height); float toolTipAlpha = yOffset / 10; List toolTip = tools.get(selection) @@ -86,40 +86,40 @@ public class ToolSelectionScreen extends Screen { if (toolTipAlpha > 0.25f) { RenderSystem.color4f(.7f, .7f, .8f, toolTipAlpha); - drawTexture(matrixStack, x - 15, y + 33, gray.startX, gray.startY, w, h + 22, gray.width, gray.height); + blit(matrixStack, x - 15, y + 33, gray.startX, gray.startY, w, h + 22, gray.width, gray.height); RenderSystem.color4f(1, 1, 1, 1); if (toolTip.size() > 0) - textRenderer.draw(matrixStack, toolTip.get(0), x - 10, y + 38, 0xEEEEEE + stringAlphaComponent); + font.draw(matrixStack, toolTip.get(0), x - 10, y + 38, 0xEEEEEE + stringAlphaComponent); if (toolTip.size() > 1) - textRenderer.draw(matrixStack, toolTip.get(1), x - 10, y + 50, 0xCCDDFF + stringAlphaComponent); + font.draw(matrixStack, toolTip.get(1), x - 10, y + 50, 0xCCDDFF + stringAlphaComponent); if (toolTip.size() > 2) - textRenderer.draw(matrixStack, toolTip.get(2), x - 10, y + 60, 0xCCDDFF + stringAlphaComponent); + font.draw(matrixStack, toolTip.get(2), x - 10, y + 60, 0xCCDDFF + stringAlphaComponent); if (toolTip.size() > 3) - textRenderer.draw(matrixStack, toolTip.get(3), x - 10, y + 72, 0xCCCCDD + stringAlphaComponent); + font.draw(matrixStack, toolTip.get(3), x - 10, y + 72, 0xCCCCDD + stringAlphaComponent); } RenderSystem.color4f(1, 1, 1, 1); if (tools.size() > 1) { String keyName = AllKeys.TOOL_MENU.getBoundKey(); - int width = client.getWindow() - .getScaledWidth(); + int width = minecraft.getWindow() + .getGuiScaledWidth(); if (!focused) - drawCenteredText(matrixStack, client.fontRenderer, Lang.translate(holdToFocus, keyName), width / 2, + drawCenteredString(matrixStack, minecraft.font, Lang.translate(holdToFocus, keyName), width / 2, y - 10, 0xCCDDFF); else - drawCenteredString(matrixStack, client.fontRenderer, scrollToCycle, width / 2, y - 10, 0xCCDDFF); + drawCenteredString(matrixStack, minecraft.font, scrollToCycle, width / 2, y - 10, 0xCCDDFF); } else { x += 65; } for (int i = 0; i < tools.size(); i++) { - matrixStack.push(); + matrixStack.pushPose(); float alpha = focused ? 1 : .2f; if (i == selection) { matrixStack.translate(0, -10, 0); - drawCenteredString(matrixStack, client.fontRenderer, tools.get(i) + drawCenteredString(matrixStack, minecraft.font, tools.get(i) .getDisplayName() .getString(), x + i * 50 + 24, y + 28, 0xCCDDFF); alpha = 1; @@ -133,11 +133,11 @@ public class ToolSelectionScreen extends Screen { .getIcon() .draw(matrixStack, this, x + i * 50 + 16, y + 11); - matrixStack.pop(); + matrixStack.popPose(); } RenderSystem.enableBlend(); - matrixStack.pop(); + matrixStack.popPose(); } public void update() { diff --git a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java index 562751419..70def0c92 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java @@ -32,7 +32,7 @@ public class UIRenderHelper { public static void updateWindowSize(MainWindow mainWindow) { if (framebuffer != null) - framebuffer.func_216491_a(mainWindow.getFramebufferWidth(), mainWindow.getFramebufferHeight(), Minecraft.IS_RUNNING_ON_MAC); + framebuffer.resize(mainWindow.getWidth(), mainWindow.getHeight(), Minecraft.ON_OSX); } public static void init() { @@ -44,9 +44,9 @@ public class UIRenderHelper { } private static Framebuffer createFramebuffer(MainWindow mainWindow) { - Framebuffer framebuffer = new Framebuffer(mainWindow.getFramebufferWidth(), mainWindow.getFramebufferHeight(), true, - Minecraft.IS_RUNNING_ON_MAC); - framebuffer.setFramebufferColor(0, 0, 0, 0); + Framebuffer framebuffer = new Framebuffer(mainWindow.getWidth(), mainWindow.getHeight(), true, + Minecraft.ON_OSX); + framebuffer.setClearColor(0, 0, 0, 0); framebuffer.enableStencil(); return framebuffer; } @@ -55,27 +55,27 @@ public class UIRenderHelper { MainWindow window = Minecraft.getInstance() .getWindow(); - float vx = (float) window.getScaledWidth(); - float vy = (float) window.getScaledHeight(); - float tx = (float) framebuffer.framebufferWidth / (float) framebuffer.framebufferTextureWidth; - float ty = (float) framebuffer.framebufferHeight / (float) framebuffer.framebufferTextureHeight; + float vx = (float) window.getGuiScaledWidth(); + float vy = (float) window.getGuiScaledHeight(); + float tx = (float) framebuffer.viewWidth / (float) framebuffer.width; + float ty = (float) framebuffer.viewHeight / (float) framebuffer.height; RenderSystem.enableTexture(); RenderSystem.enableDepthTest(); - framebuffer.bindFramebufferTexture(); + framebuffer.bindRead(); Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuffer(); - bufferbuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEXTURE); + BufferBuilder bufferbuilder = tessellator.getBuilder(); + bufferbuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEX); - bufferbuilder.vertex(0, vy, 0).color(1, 1, 1, alpha).texture(0, 0).endVertex(); - bufferbuilder.vertex(vx, vy, 0).color(1, 1, 1, alpha).texture(tx, 0).endVertex(); - bufferbuilder.vertex(vx, 0, 0).color(1, 1, 1, alpha).texture(tx, ty).endVertex(); - bufferbuilder.vertex(0, 0, 0).color(1, 1, 1, alpha).texture(0, ty).endVertex(); + bufferbuilder.vertex(0, vy, 0).color(1, 1, 1, alpha).uv(0, 0).endVertex(); + bufferbuilder.vertex(vx, vy, 0).color(1, 1, 1, alpha).uv(tx, 0).endVertex(); + bufferbuilder.vertex(vx, 0, 0).color(1, 1, 1, alpha).uv(tx, ty).endVertex(); + bufferbuilder.vertex(0, 0, 0).color(1, 1, 1, alpha).uv(0, ty).endVertex(); - tessellator.draw(); - framebuffer.unbindFramebufferTexture(); + tessellator.end(); + framebuffer.unbindRead(); } public static void streak(MatrixStack ms, float angle, int x, int y, int breadth, int length) {streak(ms, angle, x, y, breadth, length, Theme.i(Theme.Key.STREAK));} @@ -95,19 +95,19 @@ public class UIRenderHelper { int c3 = a3 | color; int c4 = a4 | color; - ms.push(); + ms.pushPose(); ms.translate(x, y, 0); - ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(angle - 90)); + ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); streak(ms, breadth / 2, length, c1, c2, c3, c4); - ms.pop(); + ms.popPose(); } private static void streak(MatrixStack ms, int width, int height, int c1, int c2, int c3, int c4) { double split1 = .5; double split2 = .75; - Matrix4f model = ms.peek().getModel(); + Matrix4f model = ms.last().pose(); RenderSystem.disableAlphaTest(); GuiUtils.drawGradientRect(model, 0, -width, 0, width, (int) (split1 * height), c1, c2); GuiUtils.drawGradientRect(model, 0, -width, (int) (split1 * height), width, (int) (split2 * height), c2, c3); @@ -145,27 +145,27 @@ public class UIRenderHelper { * @param breadth the total width of the gradient */ public static void angledGradient(@Nonnull MatrixStack ms, float angle, int x, int y, int z, int breadth, int length, int color1, int color2) { - ms.push(); + ms.pushPose(); ms.translate(x, y, z); - ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(angle - 90)); + ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); - Matrix4f model = ms.peek().getModel(); + Matrix4f model = ms.last().pose(); int w = breadth / 2; GuiUtils.drawGradientRect(model, 0, -w, 0, w, length, color1, color2); - ms.pop(); + ms.popPose(); } public static void breadcrumbArrow(MatrixStack matrixStack, int x, int y, int z, int width, int height, int indent, Couple colors) {breadcrumbArrow(matrixStack, x, y, z, width, height, indent, colors.getFirst().getRGB(), colors.getSecond().getRGB());} // draws a wide chevron-style breadcrumb arrow pointing left public static void breadcrumbArrow(MatrixStack matrixStack, int x, int y, int z, int width, int height, int indent, int startColor, int endColor) { - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(x - indent, y, z); breadcrumbArrow(matrixStack, width, height, indent, startColor, endColor); - matrixStack.pop(); + matrixStack.popPose(); } private static void breadcrumbArrow(MatrixStack ms, int width, int height, int indent, int c1, int c2) { @@ -206,8 +206,8 @@ public class UIRenderHelper { RenderSystem.shadeModel(GL11.GL_SMOOTH); Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuffer(); - Matrix4f model = ms.peek().getModel(); + BufferBuilder bufferbuilder = tessellator.getBuilder(); + Matrix4f model = ms.last().pose(); bufferbuilder.begin(GL11.GL_TRIANGLES, DefaultVertexFormats.POSITION_COLOR); bufferbuilder.vertex(model, x0, y0, 0).color(fc1 >> 16 & 0xFF, fc1 >> 8 & 0xFF, fc1 & 0xFF, fc1 >> 24 & 0xFF).endVertex(); @@ -234,7 +234,7 @@ public class UIRenderHelper { bufferbuilder.vertex(model, x5, y5, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex(); bufferbuilder.vertex(model, x8, y8, 0).color(fc4 >> 16 & 0xFF, fc4 >> 8 & 0xFF, fc4 & 0xFF, fc4 >> 24 & 0xFF).endVertex(); - tessellator.draw(); + tessellator.end(); RenderSystem.shadeModel(GL11.GL_FLAT); RenderSystem.disableBlend(); RenderSystem.enableCull(); @@ -252,20 +252,20 @@ public class UIRenderHelper { } private static void drawColoredTexture(MatrixStack ms, Color c, int left, int right, int top, int bot, int z, int tex_width, int tex_height, float tex_left, float tex_top, int sheet_width, int sheet_height) { - drawTexturedQuad(ms.peek().getModel(), c, left, right, top, bot, z, (tex_left + 0.0F) / (float) sheet_width, (tex_left + (float) tex_width) / (float) sheet_width, (tex_top + 0.0F) / (float) sheet_height, (tex_top + (float) tex_height) / (float) sheet_height); + drawTexturedQuad(ms.last().pose(), c, left, right, top, bot, z, (tex_left + 0.0F) / (float) sheet_width, (tex_left + (float) tex_width) / (float) sheet_width, (tex_top + 0.0F) / (float) sheet_height, (tex_top + (float) tex_height) / (float) sheet_height); } private static void drawTexturedQuad(Matrix4f m, Color c, int left, int right, int top, int bot, int z, float u1, float u2, float v1, float v2) { RenderSystem.enableBlend(); - BufferBuilder bufferbuilder = Tessellator.getInstance().getBuffer(); - bufferbuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEXTURE); - bufferbuilder.vertex(m, (float) left , (float) bot, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).texture(u1, v2).endVertex(); - bufferbuilder.vertex(m, (float) right, (float) bot, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).texture(u2, v2).endVertex(); - bufferbuilder.vertex(m, (float) right, (float) top, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).texture(u2, v1).endVertex(); - bufferbuilder.vertex(m, (float) left , (float) top, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).texture(u1, v1).endVertex(); - bufferbuilder.finishDrawing(); + BufferBuilder bufferbuilder = Tessellator.getInstance().getBuilder(); + bufferbuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEX); + bufferbuilder.vertex(m, (float) left , (float) bot, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u1, v2).endVertex(); + bufferbuilder.vertex(m, (float) right, (float) bot, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u2, v2).endVertex(); + bufferbuilder.vertex(m, (float) right, (float) top, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u2, v1).endVertex(); + bufferbuilder.vertex(m, (float) left , (float) top, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u1, v1).endVertex(); + bufferbuilder.end(); RenderSystem.enableAlphaTest(); - WorldVertexBufferUploader.draw(bufferbuilder); + WorldVertexBufferUploader.end(bufferbuilder); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/mainMenu/CreateMainMenuScreen.java b/src/main/java/com/simibubi/create/foundation/gui/mainMenu/CreateMainMenuScreen.java index 2731dfa4f..3eed04d2d 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/mainMenu/CreateMainMenuScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/mainMenu/CreateMainMenuScreen.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.gui.mainMenu; import java.awt.Color; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; @@ -17,7 +18,6 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.ponder.content.PonderTagIndexScreen; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.gui.screen.ConfirmOpenLinkScreen; import net.minecraft.client.gui.screen.MainMenuScreen; @@ -37,12 +37,12 @@ public class CreateMainMenuScreen extends AbstractSimiScreen { protected final Screen parent; protected boolean returnOnClose; - private static final RenderSkyboxCube PANORAMA_RESOURCES = + public static final RenderSkyboxCube PANORAMA_RESOURCES = new RenderSkyboxCube(Create.asResource("textures/gui/title/background/panorama")); - private static final ResourceLocation PANORAMA_OVERLAY_TEXTURES = + public static final ResourceLocation PANORAMA_OVERLAY_TEXTURES = new ResourceLocation("textures/gui/title/background/panorama_overlay.png"); - private RenderSkybox vanillaPanorama = new RenderSkybox(MainMenuScreen.PANORAMA_RESOURCES); - private RenderSkybox panorama = new RenderSkybox(PANORAMA_RESOURCES); + private RenderSkybox vanillaPanorama = new RenderSkybox(MainMenuScreen.CUBE_MAP); + public static RenderSkybox panorama = new RenderSkybox(PANORAMA_RESOURCES); private long firstRenderTime; private Button gettingStarted; @@ -51,73 +51,74 @@ public class CreateMainMenuScreen extends AbstractSimiScreen { returnOnClose = true; if (parent instanceof MainMenuScreen) vanillaPanorama = ObfuscationReflectionHelper.getPrivateValue(MainMenuScreen.class, (MainMenuScreen) parent, - "field_209101_K"); + "panorama"); } @Override public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { if (firstRenderTime == 0L) - this.firstRenderTime = Util.milliTime(); + this.firstRenderTime = Util.getMillis(); super.render(ms, mouseX, mouseY, partialTicks); } @Override protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - float f = (float) (Util.milliTime() - this.firstRenderTime) / 1000.0F; + float f = (float) (Util.getMillis() - this.firstRenderTime) / 1000.0F; float alpha = MathHelper.clamp(f, 0.0F, 1.0F); + float elapsedPartials = minecraft.getDeltaFrameTime(); if (parent instanceof MainMenuScreen) { if (alpha < 1) - vanillaPanorama.render(partialTicks, 1); - panorama.render(partialTicks, alpha); + vanillaPanorama.render(elapsedPartials, 1); + panorama.render(elapsedPartials, alpha); - client.getTextureManager() - .bindTexture(PANORAMA_OVERLAY_TEXTURES); + minecraft.getTextureManager() + .bind(PANORAMA_OVERLAY_TEXTURES); RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - drawTexture(ms, 0, 0, this.width, this.height, 0.0F, 0.0F, 16, 128, 16, 128); + blit(ms, 0, 0, this.width, this.height, 0.0F, 0.0F, 16, 128, 16, 128); } RenderSystem.enableDepthTest(); for (int side : Iterate.positiveAndNegative) { - ms.push(); + ms.pushPose(); ms.translate(width / 2, 60, 200); ms.scale(24 * side, 24 * side, 32); ms.translate(-1.75 * ((alpha * alpha) / 2f + .5f), .25f, 0); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateX(45); GuiGameElement.of(AllBlocks.LARGE_COGWHEEL.getDefaultState()) - .rotateBlock(0, Util.milliTime() / 32f * side, 0) + .rotateBlock(0, Util.getMillis() / 32f * side, 0) .render(ms); ms.translate(-1, 0, -1); GuiGameElement.of(AllBlocks.COGWHEEL.getDefaultState()) - .rotateBlock(0, Util.milliTime() / -16f * side + 22.5f, 0) + .rotateBlock(0, Util.getMillis() / -16f * side + 22.5f, 0) .render(ms); - ms.pop(); + ms.popPose(); } - ms.push(); + ms.pushPose(); ms.translate(width / 2 - 32, 32, -10); - ms.push(); + ms.pushPose(); ms.scale(0.25f, 0.25f, 0.25f); AllGuiTextures.LOGO.draw(ms, 0, 0); - ms.pop(); + ms.popPose(); new BoxElement().withBackground(0x88_000000) .flatBorder(new Color(0x01_000000, true)) .at(-32, 56, 100) .withBounds(128, 11) .render(ms); - ms.pop(); + ms.popPose(); - ms.push(); + ms.pushPose(); ms.translate(0, 0, 200); - drawCenteredText(ms, textRenderer, new StringTextComponent(Create.NAME).formatted(TextFormatting.BOLD) + drawCenteredString(ms, font, new StringTextComponent(Create.NAME).withStyle(TextFormatting.BOLD) .append( - new StringTextComponent(" v" + Create.VERSION).formatted(TextFormatting.BOLD, TextFormatting.WHITE)), + new StringTextComponent(" v" + Create.VERSION).withStyle(TextFormatting.BOLD, TextFormatting.WHITE)), width / 2, 89, 0xff_E4BB67); - ms.pop(); + ms.popPose(); RenderSystem.disableDepthTest(); } @@ -169,7 +170,7 @@ public class CreateMainMenuScreen extends AbstractSimiScreen { return; if (mouseY < gettingStarted.y || mouseY > gettingStarted.y + 20) return; - renderTooltip(ms, TooltipHelper.cutTextComponent(Lang.translate("menu.only_ingame"), TextFormatting.GRAY, + renderComponentTooltip(ms, TooltipHelper.cutTextComponent(Lang.translate("menu.only_ingame"), TextFormatting.GRAY, TextFormatting.GRAY), mouseX, mouseY); } } @@ -187,9 +188,9 @@ public class CreateMainMenuScreen extends AbstractSimiScreen { returnOnClose = false; ScreenOpener.open(new ConfirmOpenLinkScreen((p_213069_2_) -> { if (p_213069_2_) - Util.getOSType() - .openURI(url); - this.client.displayGuiScreen(this); + Util.getPlatform() + .openUri(url); + this.minecraft.setScreen(this); }, url, true)); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/AbstractSimiWidget.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/AbstractSimiWidget.java index f8539a3d3..48e73d983 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/AbstractSimiWidget.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/AbstractSimiWidget.java @@ -56,7 +56,7 @@ public abstract class AbstractSimiWidget extends Widget { @Override public void render(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) { if (visible) { - hovered = isMouseOver(mouseX, mouseY); + isHovered = isMouseOver(mouseX, mouseY); beforeRender(ms, mouseX, mouseY, partialTicks); renderButton(ms, mouseX, mouseY, partialTicks); afterRender(ms, mouseX, mouseY, partialTicks); @@ -73,11 +73,11 @@ public abstract class AbstractSimiWidget extends Widget { } protected void beforeRender(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - ms.push(); + ms.pushPose(); } protected void afterRender(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - ms.pop(); + ms.popPose(); } public void runCallback(double mouseX, double mouseY) { diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/BoxWidget.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/BoxWidget.java index 2e5cac63e..c74606d81 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/BoxWidget.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/BoxWidget.java @@ -103,11 +103,11 @@ public class BoxWidget extends ElementWidget { protected void beforeRender(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) { super.beforeRender(ms, mouseX, mouseY, partialTicks); - if (hovered != wasHovered) { + if (isHovered != wasHovered) { startGradientAnimation( getColorForState(true), getColorForState(false), - hovered + isHovered ); } @@ -137,7 +137,7 @@ public class BoxWidget extends ElementWidget { super.renderButton(ms, mouseX, mouseY, partialTicks); - wasHovered = hovered; + wasHovered = isHovered; } @Override @@ -192,7 +192,7 @@ public class BoxWidget extends ElementWidget { if (!active) return Theme.p(getDisabledTheme()).get(first); - if (hovered) { + if (isHovered) { if (first) return customBorderTop != null ? customBorderTop.darker() : Theme.c(getHoverTheme(), true); else diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/ElementWidget.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/ElementWidget.java index bc782e26f..6bb91486d 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/ElementWidget.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/ElementWidget.java @@ -130,7 +130,7 @@ public class ElementWidget extends AbstractSimiWidget { @Override public void renderButton(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - ms.push(); + ms.pushPose(); ms.translate(x + paddingX, y + paddingY, z); float innerWidth = width - 2 * paddingX; float innerHeight = height - 2 * paddingY; @@ -144,7 +144,7 @@ public class ElementWidget extends AbstractSimiWidget { innerHeight /= yScale; } element.withBounds((int) innerWidth, (int) innerHeight).render(ms); - ms.pop(); + ms.popPose(); if (rescaleElement) { element.at(eX, eY); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/IconButton.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/IconButton.java index fbb6ee950..8209c907a 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/IconButton.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/IconButton.java @@ -22,15 +22,15 @@ public class IconButton extends AbstractSimiWidget { @Override public void renderButton(@Nonnull MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { if (this.visible) { - this.hovered = + this.isHovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; AllGuiTextures button = (pressed || !active) ? button = AllGuiTextures.BUTTON_DOWN - : (hovered) ? AllGuiTextures.BUTTON_HOVER : AllGuiTextures.BUTTON; + : (isHovered) ? AllGuiTextures.BUTTON_HOVER : AllGuiTextures.BUTTON; RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); AllGuiTextures.BUTTON.bind(); - drawTexture(matrixStack, x, y, button.startX, button.startY, button.width, button.height); + blit(matrixStack, x, y, button.startX, button.startY, button.width, button.height); icon.draw(matrixStack, this, x + 1, y + 1); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/Label.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/Label.java index 3c7d904ca..1fc0a881d 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/Label.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/Label.java @@ -20,8 +20,8 @@ public class Label extends AbstractSimiWidget { protected FontRenderer font; public Label(int x, int y, ITextComponent text) { - super(x, y, Minecraft.getInstance().fontRenderer.getWidth(text), 10); - font = Minecraft.getInstance().fontRenderer; + super(x, y, Minecraft.getInstance().font.width(text), 10); + font = Minecraft.getInstance().font; this.text = new StringTextComponent("Label"); color = 0xFFFFFF; hasShadow = false; @@ -44,15 +44,15 @@ public class Label extends AbstractSimiWidget { } public void setTextAndTrim(ITextComponent newText, boolean trimFront, int maxWidthPx) { - FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; + FontRenderer fontRenderer = Minecraft.getInstance().font; - if (fontRenderer.getWidth(newText) <= maxWidthPx) { + if (fontRenderer.width(newText) <= maxWidthPx) { text = newText; return; } String trim = "..."; - int trimWidth = fontRenderer.getStringWidth(trim); + int trimWidth = fontRenderer.width(trim); String raw = newText.getString(); StringBuilder builder = new StringBuilder(raw); @@ -62,7 +62,7 @@ public class Label extends AbstractSimiWidget { for (int i = startIndex; i != endIndex; i += step) { String sub = builder.substring(trimFront ? i : startIndex, trimFront ? endIndex + 1 : i + 1); - if (fontRenderer.getWidth(new StringTextComponent(sub).setStyle(newText.getStyle())) + trimWidth <= maxWidthPx) { + if (fontRenderer.width(new StringTextComponent(sub).setStyle(newText.getStyle())) + trimWidth <= maxWidthPx) { text = new StringTextComponent(trimFront ? trim + sub : sub + trim).setStyle(newText.getStyle()); return; } @@ -78,12 +78,12 @@ public class Label extends AbstractSimiWidget { return; RenderSystem.color4f(1, 1, 1, 1); - IFormattableTextComponent copy = text.copy(); + IFormattableTextComponent copy = text.plainCopy(); if (suffix != null && !suffix.isEmpty()) copy.append(suffix); if (hasShadow) - font.drawWithShadow(matrixStack, copy, x, y, color); + font.drawShadow(matrixStack, copy, x, y, color); else font.draw(matrixStack, copy, x, y, color); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/ScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/ScrollInput.java index 146874bbf..8329c530c 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/ScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/ScrollInput.java @@ -91,7 +91,7 @@ public class ScrollInput extends AbstractSimiWidget { @Override public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - if (!hovered) + if (!isHovered) return false; StepContext context = new StepContext(); @@ -137,9 +137,9 @@ public class ScrollInput extends AbstractSimiWidget { protected void updateTooltip() { toolTip.clear(); - toolTip.add(title.copy().formatted(TextFormatting.BLUE)); - toolTip.add(scrollToModify.copy().formatted(TextFormatting.ITALIC, TextFormatting.DARK_GRAY)); - toolTip.add(shiftScrollsFaster.copy().formatted(TextFormatting.ITALIC, TextFormatting.DARK_GRAY)); + toolTip.add(title.plainCopy().withStyle(TextFormatting.BLUE)); + toolTip.add(scrollToModify.plainCopy().withStyle(TextFormatting.ITALIC, TextFormatting.DARK_GRAY)); + toolTip.add(shiftScrollsFaster.plainCopy().withStyle(TextFormatting.ITALIC, TextFormatting.DARK_GRAY)); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java index c056984fe..4fb8329b7 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java @@ -40,7 +40,7 @@ public class SelectionScrollInput extends ScrollInput { @Override protected void updateTooltip() { toolTip.clear(); - toolTip.add(title.copy().formatted(TextFormatting.BLUE)); + toolTip.add(title.plainCopy().withStyle(TextFormatting.BLUE)); int min = Math.min(this.max - 16, state - 7); int max = Math.max(this.min + 16, state + 8); min = Math.max(min, this.min); @@ -48,19 +48,19 @@ public class SelectionScrollInput extends ScrollInput { if (this.min + 1 == min) min--; if (min > this.min) - toolTip.add(new StringTextComponent("> ...").formatted(TextFormatting.GRAY)); + toolTip.add(new StringTextComponent("> ...").withStyle(TextFormatting.GRAY)); if (this.max - 1 == max) max++; for (int i = min; i < max; i++) { if (i == state) - toolTip.add(StringTextComponent.EMPTY.copy().append("-> ").append(options.get(i)).formatted(TextFormatting.WHITE)); + toolTip.add(StringTextComponent.EMPTY.plainCopy().append("-> ").append(options.get(i)).withStyle(TextFormatting.WHITE)); else - toolTip.add(StringTextComponent.EMPTY.copy().append("> ").append(options.get(i)).formatted(TextFormatting.GRAY)); + toolTip.add(StringTextComponent.EMPTY.plainCopy().append("> ").append(options.get(i)).withStyle(TextFormatting.GRAY)); } if (max < this.max) - toolTip.add(new StringTextComponent("> ...").formatted(TextFormatting.GRAY)); + toolTip.add(new StringTextComponent("> ...").withStyle(TextFormatting.GRAY)); - toolTip.add(scrollToSelect.copy().formatted(TextFormatting.DARK_GRAY, TextFormatting.ITALIC)); + toolTip.add(scrollToSelect.plainCopy().withStyle(TextFormatting.DARK_GRAY, TextFormatting.ITALIC)); } } diff --git a/src/main/java/com/simibubi/create/foundation/item/CreateItemGroupBase.java b/src/main/java/com/simibubi/create/foundation/item/CreateItemGroupBase.java index cc234227a..1b354c712 100644 --- a/src/main/java/com/simibubi/create/foundation/item/CreateItemGroupBase.java +++ b/src/main/java/com/simibubi/create/foundation/item/CreateItemGroupBase.java @@ -30,7 +30,7 @@ public abstract class CreateItemGroupBase extends ItemGroup { @Override @OnlyIn(Dist.CLIENT) - public void fill(NonNullList items) { + public void fillItemList(NonNullList items) { addItems(items, true); addBlocks(items); addItems(items, false); @@ -42,7 +42,7 @@ public abstract class CreateItemGroupBase extends ItemGroup { Block def = entry.get(); Item item = def.asItem(); if (item != Items.AIR) - def.fillItemGroup(this, items); + def.fillItemCategory(this, items); } } @@ -50,17 +50,17 @@ public abstract class CreateItemGroupBase extends ItemGroup { public void addItems(NonNullList items, boolean specialItems) { Minecraft mc = Minecraft.getInstance(); ItemRenderer itemRenderer = mc.getItemRenderer(); - ClientWorld world = mc.world; + ClientWorld world = mc.level; for (RegistryEntry entry : getItems()) { Item item = entry.get(); if (item instanceof BlockItem) continue; ItemStack stack = new ItemStack(item); - IBakedModel model = itemRenderer.getItemModelWithOverrides(stack, world, null); + IBakedModel model = itemRenderer.getModel(stack, world, null); if (model.isGui3d() != specialItems) continue; - item.fillItemGroup(this, items); + item.fillItemCategory(this, items); } } diff --git a/src/main/java/com/simibubi/create/foundation/item/HiddenIngredientItem.java b/src/main/java/com/simibubi/create/foundation/item/HiddenIngredientItem.java index c565d81e9..899dcce8e 100644 --- a/src/main/java/com/simibubi/create/foundation/item/HiddenIngredientItem.java +++ b/src/main/java/com/simibubi/create/foundation/item/HiddenIngredientItem.java @@ -12,10 +12,10 @@ public class HiddenIngredientItem extends Item { } @Override - public void fillItemGroup(ItemGroup p_150895_1_, NonNullList p_150895_2_) { - if (p_150895_1_ != ItemGroup.SEARCH) + public void fillItemCategory(ItemGroup p_150895_1_, NonNullList p_150895_2_) { + if (p_150895_1_ != ItemGroup.TAB_SEARCH) return; - super.fillItemGroup(p_150895_1_, p_150895_2_); + super.fillItemCategory(p_150895_1_, p_150895_2_); } } diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java index ea25a62e8..f564d0456 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java @@ -22,10 +22,12 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.content.contraptions.base.IRotate.StressImpact; +import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; import com.simibubi.create.content.contraptions.components.fan.EncasedFanBlock; import com.simibubi.create.content.contraptions.components.flywheel.engine.EngineBlock; import com.simibubi.create.content.contraptions.components.flywheel.engine.FurnaceEngineBlock; @@ -49,7 +51,7 @@ public class ItemDescription { public static final ItemDescription MISSING = new ItemDescription(null); public static ITextComponent trim = - new StringTextComponent(" ").formatted(WHITE, STRIKETHROUGH); + new StringTextComponent(" ").withStyle(WHITE, STRIKETHROUGH); public enum Palette { @@ -92,6 +94,7 @@ public class ItemDescription { List list = new ArrayList<>(); boolean isEngine = block instanceof EngineBlock; + boolean isHandle = block instanceof ValveHandleBlock; CKinetics config = AllConfigs.SERVER.kinetics; SpeedLevel minimumRequiredSpeedLevel = isEngine ? SpeedLevel.NONE : ((IRotate) block).getMinimumRequiredSpeedLevel(); @@ -101,9 +104,9 @@ public class ItemDescription { Map> capacities = config.stressValues.getCapacities(); boolean hasStressImpact = impacts.containsKey(id) && impacts.get(id) .get() > 0 && StressImpact.isEnabled(); - boolean hasStressCapacity = capacities.containsKey(id) && StressImpact.isEnabled(); + boolean hasStressCapacity = (isHandle || capacities.containsKey(id)) && StressImpact.isEnabled(); boolean hasGlasses = - AllItems.GOGGLES.get() == Minecraft.getInstance().player.getItemStackFromSlot(EquipmentSlotType.HEAD) + AllItems.GOGGLES.get() == Minecraft.getInstance().player.getItemBySlot(EquipmentSlotType.HEAD) .getItem(); ITextComponent rpmUnit = Lang.translate("generic.unit.rpm"); @@ -112,7 +115,7 @@ public class ItemDescription { Lang.translatedOptions("tooltip.speedRequirement", "none", "medium", "high"); int index = minimumRequiredSpeedLevel.ordinal(); IFormattableTextComponent level = - new StringTextComponent(makeProgressBar(3, index)).formatted(minimumRequiredSpeedLevel.getTextColor()); + new StringTextComponent(makeProgressBar(3, index)).withStyle(minimumRequiredSpeedLevel.getTextColor()); if (hasGlasses) level.append(String.valueOf(minimumRequiredSpeedLevel.getSpeedValue())) @@ -122,7 +125,7 @@ public class ItemDescription { level.append(speedLevels.get(index)); list.add(Lang.translate("tooltip.speedRequirement") - .formatted(GRAY)); + .withStyle(GRAY)); list.add(level); } @@ -134,7 +137,7 @@ public class ItemDescription { : (impact >= config.mediumStressImpact.get() ? StressImpact.MEDIUM : StressImpact.LOW); int index = impactId.ordinal(); IFormattableTextComponent level = - new StringTextComponent(makeProgressBar(3, index)).formatted(impactId.getAbsoluteColor()); + new StringTextComponent(makeProgressBar(3, index)).withStyle(impactId.getAbsoluteColor()); if (hasGlasses) level.append(impacts.get(id) @@ -144,20 +147,20 @@ public class ItemDescription { level.append(stressLevels.get(index)); list.add(Lang.translate("tooltip.stressImpact") - .formatted(GRAY)); + .withStyle(GRAY)); list.add(level); } if (hasStressCapacity) { List stressCapacityLevels = Lang.translatedOptions("tooltip.capacityProvided", "low", "medium", "high"); - double capacity = capacities.get(id) + double capacity = capacities.get(isHandle ? AllBlocks.HAND_CRANK.getId() : id) .get(); StressImpact impactId = capacity >= config.highCapacity.get() ? StressImpact.LOW : (capacity >= config.mediumCapacity.get() ? StressImpact.MEDIUM : StressImpact.HIGH); int index = StressImpact.values().length - 2 - impactId.ordinal(); IFormattableTextComponent level = - new StringTextComponent(makeProgressBar(3, index)).formatted(impactId.getAbsoluteColor()); + new StringTextComponent(makeProgressBar(3, index)).withStyle(impactId.getAbsoluteColor()); if (hasGlasses) level.append(capacity + "x ") @@ -170,14 +173,14 @@ public class ItemDescription { // " " + DARK_GRAY + TextFormatting.ITALIC + Lang.translate("tooltip.capacityProvided.asGenerator"); list.add(Lang.translate("tooltip.capacityProvided") - .formatted(GRAY)); + .withStyle(GRAY)); list.add(level); IFormattableTextComponent genSpeed = generatorSpeed(block, rpmUnit); if (!genSpeed.getString() .isEmpty()) list.add(new StringTextComponent(" ").append(genSpeed) - .formatted(DARK_GRAY)); + .withStyle(DARK_GRAY)); } // if (hasSpeedRequirement || hasStressImpact || hasStressCapacity) @@ -196,13 +199,13 @@ public class ItemDescription { } public ItemDescription withBehaviour(String condition, String behaviour) { - add(linesOnShift, new StringTextComponent(condition).formatted(GRAY)); + add(linesOnShift, new StringTextComponent(condition).withStyle(GRAY)); addStrings(linesOnShift, cutStringTextComponent(behaviour, palette.color, palette.hColor, 1)); return this; } public ItemDescription withControl(String condition, String action) { - add(linesOnCtrl, new StringTextComponent(condition).formatted(GRAY)); + add(linesOnCtrl, new StringTextComponent(condition).withStyle(GRAY)); addStrings(linesOnCtrl, cutStringTextComponent(action, palette.color, palette.hColor, 1)); return this; } @@ -227,19 +230,19 @@ public class ItemDescription { if (hasControls) { IFormattableTextComponent tabBuilder = new StringTextComponent(""); - tabBuilder.append(new StringTextComponent(holdCtrl[0]).formatted(DARK_GRAY)); - tabBuilder.append(keyCtrl.copy() - .formatted(ctrl ? WHITE : GRAY)); - tabBuilder.append(new StringTextComponent(holdCtrl[1]).formatted(DARK_GRAY)); + tabBuilder.append(new StringTextComponent(holdCtrl[0]).withStyle(DARK_GRAY)); + tabBuilder.append(keyCtrl.plainCopy() + .withStyle(ctrl ? WHITE : GRAY)); + tabBuilder.append(new StringTextComponent(holdCtrl[1]).withStyle(DARK_GRAY)); list.add(0, tabBuilder); } if (hasDescription) { IFormattableTextComponent tabBuilder = new StringTextComponent(""); - tabBuilder.append(new StringTextComponent(holdDesc[0]).formatted(DARK_GRAY)); - tabBuilder.append(keyShift.copy() - .formatted(shift ? WHITE : GRAY)); - tabBuilder.append(new StringTextComponent(holdDesc[1]).formatted(DARK_GRAY)); + tabBuilder.append(new StringTextComponent(holdDesc[0]).withStyle(DARK_GRAY)); + tabBuilder.append(keyShift.plainCopy() + .withStyle(shift ? WHITE : GRAY)); + tabBuilder.append(new StringTextComponent(holdDesc[1]).withStyle(DARK_GRAY)); list.add(0, tabBuilder); } @@ -322,7 +325,7 @@ public class ItemDescription { } return !value.equals("") ? Lang.translate("tooltip.generationSpeed", value, unitRPM) - : StringTextComponent.EMPTY.copy(); + : StringTextComponent.EMPTY.plainCopy(); } } diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java index 155f4758c..fdcdbb801 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java @@ -26,7 +26,7 @@ public class ItemHelper { public static void dropContents(World world, BlockPos pos, IItemHandler inv) { for (int slot = 0; slot < inv.getSlots(); slot++) - InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), inv.getStackInSlot(slot)); + InventoryHelper.dropItemStack(world, pos.getX(), pos.getY(), pos.getZ(), inv.getStackInSlot(slot)); } public static List multipliedOutput(ItemStack in, ItemStack out) { @@ -98,8 +98,8 @@ public class ItemHelper { Ingredients: for (Ingredient igd : recipeIngredients) { for (Pair pair : actualIngredients) { ItemStack[] stacks1 = pair.getFirst() - .getMatchingStacks(); - ItemStack[] stacks2 = igd.getMatchingStacks(); + .getItems(); + ItemStack[] stacks2 = igd.getItems(); if (stacks1.length != stacks2.length) continue; for (int i = 0; i <= stacks1.length; i++) { @@ -108,7 +108,7 @@ public class ItemHelper { .increment(); continue Ingredients; } - if (!ItemStack.areItemStacksEqual(stacks1[i], stacks2[i])) + if (!ItemStack.matches(stacks1[i], stacks2[i])) break; } } @@ -118,11 +118,11 @@ public class ItemHelper { } public static boolean matchIngredients(Ingredient i1, Ingredient i2) { - ItemStack[] stacks1 = i1.getMatchingStacks(); - ItemStack[] stacks2 = i2.getMatchingStacks(); + ItemStack[] stacks1 = i1.getItems(); + ItemStack[] stacks2 = i2.getItems(); if (stacks1.length == stacks2.length) { for (int i = 0; i < stacks1.length; i++) - if (!ItemStack.areItemsEqual(stacks1[i], stacks2[i])) + if (!ItemStack.isSame(stacks1[i], stacks2[i])) return false; return true; } diff --git a/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java b/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java index 7be383918..f8ab9b2f7 100644 --- a/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java +++ b/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java @@ -105,8 +105,8 @@ public class SmartInventory extends RecipeWrapper } @Override - public ItemStack getStackInSlot(int slot) { - return super.getStackInSlot(slot); + public ItemStack getItem(int slot) { + return super.getItem(slot); } public int getStackLimit(int slot, @Nonnull ItemStack stack) { @@ -162,7 +162,7 @@ public class SmartInventory extends RecipeWrapper @Override public ItemStack getStackInSlotIntermediate(int slot) { - return getStackInSlot(slot); + return getItem(slot); } } diff --git a/src/main/java/com/simibubi/create/foundation/item/TagDependentIngredientItem.java b/src/main/java/com/simibubi/create/foundation/item/TagDependentIngredientItem.java index 55e6f5d8f..0b10e3196 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TagDependentIngredientItem.java +++ b/src/main/java/com/simibubi/create/foundation/item/TagDependentIngredientItem.java @@ -18,15 +18,15 @@ public class TagDependentIngredientItem extends Item { } @Override - public void fillItemGroup(ItemGroup p_150895_1_, NonNullList p_150895_2_) { + public void fillItemCategory(ItemGroup p_150895_1_, NonNullList p_150895_2_) { if (!shouldHide()) - super.fillItemGroup(p_150895_1_, p_150895_2_); + super.fillItemCategory(p_150895_1_, p_150895_2_); } public boolean shouldHide() { - ITag tag = ItemTags.getCollection() - .get(this.tag); - return tag == null || tag.values() + ITag tag = ItemTags.getAllTags() + .getTag(this.tag); + return tag == null || tag.getValues() .isEmpty(); } diff --git a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java index 29f2c2abf..5b1704b5d 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -45,26 +45,26 @@ public class TooltipHelper { public static IFormattableTextComponent holdShift(Palette color, boolean highlighted) { return Lang.translate("tooltip.holdForDescription", Lang.translate("tooltip.keyShift") - .formatted(TextFormatting.GRAY)) - .formatted(TextFormatting.DARK_GRAY); + .withStyle(TextFormatting.GRAY)) + .withStyle(TextFormatting.DARK_GRAY); } public static void addHint(List tooltip, String hintKey, Object... messageParams) { ITextComponent spacing = IHaveGoggleInformation.componentSpacing; - tooltip.add(spacing.copy() + tooltip.add(spacing.plainCopy() .append(Lang.translate(hintKey + ".title")) - .formatted(GOLD)); + .withStyle(GOLD)); ITextComponent hint = Lang.translate(hintKey); List cutComponent = TooltipHelper.cutTextComponent(hint, GRAY, TextFormatting.WHITE); for (ITextComponent component : cutComponent) - tooltip.add(spacing.copy() + tooltip.add(spacing.plainCopy() .append(component)); } public static void referTo(IItemProvider item, Supplier itemWithTooltip) { tooltipReferrals.put(item.asItem(), () -> itemWithTooltip.get() .asItem() - .getTranslationKey()); + .getDescriptionId()); } public static void referTo(IItemProvider item, String string) { @@ -73,7 +73,7 @@ public class TooltipHelper { @Deprecated public static List cutString(ITextComponent s, TextFormatting defaultColor, TextFormatting highlightColor) { - return cutString(s.getUnformattedComponentText(), defaultColor, highlightColor, 0); + return cutString(s.getContents(), defaultColor, highlightColor, 0); } @Deprecated @@ -92,7 +92,7 @@ public class TooltipHelper { words.add(word); } - FontRenderer font = Minecraft.getInstance().fontRenderer; + FontRenderer font = Minecraft.getInstance().font; List lines = FontHelper.cutString(font, markedUp, maxWidthPerLine); // Format @@ -140,12 +140,12 @@ public class TooltipHelper { } // Apply hard wrap - FontRenderer font = Minecraft.getInstance().fontRenderer; + FontRenderer font = Minecraft.getInstance().font; List lines = new LinkedList<>(); StringBuilder currentLine = new StringBuilder(); int width = 0; for (String word : words) { - int newWidth = font.getStringWidth(word.replaceAll("_", "")); + int newWidth = font.width(word.replaceAll("_", "")); if (width + newWidth > maxWidthPerLine) { if (width > 0) { String line = currentLine.toString(); @@ -166,16 +166,16 @@ public class TooltipHelper { // Format IFormattableTextComponent lineStart = new StringTextComponent(Strings.repeat(" ", indent)); - lineStart.formatted(defaultColor); + lineStart.withStyle(defaultColor); List formattedLines = new ArrayList<>(lines.size()); Couple f = Couple.create(highlightColor, defaultColor); boolean currentlyHighlighted = false; for (String string : lines) { - IFormattableTextComponent currentComponent = lineStart.copy(); + IFormattableTextComponent currentComponent = lineStart.plainCopy(); String[] split = string.split("_"); for (String part : split) { - currentComponent.append(new StringTextComponent(part).formatted(f.get(currentlyHighlighted))); + currentComponent.append(new StringTextComponent(part).withStyle(f.get(currentlyHighlighted))); currentlyHighlighted = !currentlyHighlighted; } @@ -228,7 +228,7 @@ public class TooltipHelper { private static void checkLocale() { Language currentLanguage = Minecraft.getInstance() .getLanguageManager() - .getCurrentLanguage(); + .getSelected(); if (cachedLanguage != currentLanguage) { cachedTooltips.clear(); cachedLanguage = currentLanguage; @@ -238,7 +238,7 @@ public class TooltipHelper { public static boolean hasTooltip(ItemStack stack, PlayerEntity player) { checkLocale(); - boolean hasGlasses = AllItems.GOGGLES.isIn(player.getItemStackFromSlot(EquipmentSlotType.HEAD)); + boolean hasGlasses = AllItems.GOGGLES.isIn(player.getItemBySlot(EquipmentSlotType.HEAD)); if (hasGlasses != gogglesMode) { gogglesMode = hasGlasses; @@ -264,7 +264,7 @@ public class TooltipHelper { private static boolean findTooltip(ItemStack stack) { String key = getTooltipTranslationKey(stack); - if (I18n.hasKey(key)) { + if (I18n.exists(key)) { cachedTooltips.put(key, buildToolTip(key, stack)); return true; } @@ -278,8 +278,8 @@ public class TooltipHelper { String summaryKey = translationKey + ".summary"; // Summary - if (I18n.hasKey(summaryKey)) - tooltip = tooltip.withSummary(new StringTextComponent(I18n.format(summaryKey))); + if (I18n.exists(summaryKey)) + tooltip = tooltip.withSummary(new StringTextComponent(I18n.get(summaryKey))); // Requirements // if (stack.getItem() instanceof BlockItem) { @@ -293,21 +293,21 @@ public class TooltipHelper { for (int i = 1; i < 100; i++) { String conditionKey = translationKey + ".condition" + i; String behaviourKey = translationKey + ".behaviour" + i; - if (!I18n.hasKey(conditionKey)) + if (!I18n.exists(conditionKey)) break; if (i == 1) tooltip.getLinesOnShift() .add(new StringTextComponent("")); - tooltip.withBehaviour(I18n.format(conditionKey), I18n.format(behaviourKey)); + tooltip.withBehaviour(I18n.get(conditionKey), I18n.get(behaviourKey)); } // Controls for (int i = 1; i < 100; i++) { String controlKey = translationKey + ".control" + i; String actionKey = translationKey + ".action" + i; - if (!I18n.hasKey(controlKey)) + if (!I18n.exists(controlKey)) break; - tooltip.withControl(I18n.format(controlKey), I18n.format(actionKey)); + tooltip.withControl(I18n.get(controlKey), I18n.get(actionKey)); } return tooltip.createTabs(); @@ -318,7 +318,7 @@ public class TooltipHelper { if (tooltipReferrals.containsKey(item)) return tooltipReferrals.get(item) .get() + ".tooltip"; - return item.getTranslationKey(stack) + ".tooltip"; + return item.getDescriptionId(stack) + ".tooltip"; } // private static int getComponentLength(ITextComponent component) { diff --git a/src/main/java/com/simibubi/create/foundation/item/render/CustomRenderedItemModel.java b/src/main/java/com/simibubi/create/foundation/item/render/CustomRenderedItemModel.java index 6ef18e8cd..23fa7f229 100644 --- a/src/main/java/com/simibubi/create/foundation/item/render/CustomRenderedItemModel.java +++ b/src/main/java/com/simibubi/create/foundation/item/render/CustomRenderedItemModel.java @@ -29,7 +29,7 @@ public abstract class CustomRenderedItemModel extends BakedModelWrapper getIntersectingContraptions() { - Set contraptions = ContraptionHandler.loadedContraptions.get(self.world) + Set contraptions = ContraptionHandler.loadedContraptions.get(self.level) .values() .stream() .map(Reference::get) .filter(cEntity -> cEntity != null && cEntity.collidingEntities.containsKey(self)) .collect(Collectors.toSet()); - contraptions.addAll(self.world.getEntitiesWithinAABB(AbstractContraptionEntity.class, self.getBoundingBox() - .grow(1f))); + contraptions.addAll(self.level.getEntitiesOfClass(AbstractContraptionEntity.class, self.getBoundingBox() + .inflate(1f))); return contraptions; } @@ -89,7 +89,7 @@ public abstract class EntityContraptionInteractionMixin extends CapabilityProvid @Inject(at = @At(value = "JUMP", opcode = 154, // IFNE line 587 injecting before `!blockstate.isAir(this.world, blockpos)` ordinal = 4), method = "move") private void movementMixin(MoverType mover, Vector3d movement, CallbackInfo ci) { - Vector3d worldPos = self.getPositionVec() + Vector3d worldPos = self.position() .add(0, -0.2, 0); AtomicBoolean stepped = new AtomicBoolean(false); @@ -101,22 +101,22 @@ public abstract class EntityContraptionInteractionMixin extends CapabilityProvid }); if (stepped.get()) - this.nextStepDistance = this.determineNextStepDistance(); + this.nextStep = this.nextStep(); } - @Inject(method = { "spawnSprintingParticles" }, at = @At(value = "TAIL")) + @Inject(method = { "spawnSprintParticle" }, at = @At(value = "TAIL")) private void createRunningParticlesMixin(CallbackInfo ci) { - Vector3d worldPos = self.getPositionVec() + Vector3d worldPos = self.position() .add(0, -0.2, 0); BlockPos pos = new BlockPos(worldPos); // pos where particles are spawned forCollision(worldPos, (contraption, blockstate, blockpos) -> { - if (!blockstate.addRunningEffects(self.world, blockpos, self) - && blockstate.getRenderType() != BlockRenderType.INVISIBLE) { - Vector3d vec3d = self.getMotion(); - self.world.addParticle(new BlockParticleData(ParticleTypes.BLOCK, blockstate).setPos(pos), - self.getX() + ((double) rand.nextFloat() - 0.5D) * (double) self.getWidth(), self.getY() + 0.1D, - self.getZ() + ((double) rand.nextFloat() - 0.5D) * (double) self.getWidth(), vec3d.x * -4.0D, 1.5D, + if (!blockstate.addRunningEffects(self.level, blockpos, self) + && blockstate.getRenderShape() != BlockRenderType.INVISIBLE) { + Vector3d vec3d = self.getDeltaMovement(); + self.level.addParticle(new BlockParticleData(ParticleTypes.BLOCK, blockstate).setPos(pos), + self.getX() + ((double) random.nextFloat() - 0.5D) * (double) self.getBbWidth(), self.getY() + 0.1D, + self.getZ() + ((double) random.nextFloat() - 0.5D) * (double) self.getBbWidth(), vec3d.x * -4.0D, 1.5D, vec3d.z * -4.0D); } }); @@ -132,7 +132,7 @@ public abstract class EntityContraptionInteractionMixin extends CapabilityProvid worldPos = worldPos.add(x, y, z); - self.world.playSound(null, worldPos.x + x, worldPos.y + y, worldPos.z + z, event, self.getSoundCategory(), + self.level.playSound(null, worldPos.x + x, worldPos.y + y, worldPos.z + z, event, self.getSoundSource(), pitch, volume); ci.cancel(); diff --git a/src/main/java/com/simibubi/create/foundation/mixin/FixNormalScalingMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/FixNormalScalingMixin.java index 46b35d6e3..b76f2ab3e 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/FixNormalScalingMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/FixNormalScalingMixin.java @@ -17,7 +17,7 @@ public class FixNormalScalingMixin { * applied, which negates the matrix again, resulting in the matrix being the * same as in the beginning. */ - @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/vector/Matrix3f;multiply(F)V", shift = Shift.AFTER), method = "scale(FFF)V", cancellable = true) + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/vector/Matrix3f;mul(F)V", shift = Shift.AFTER), method = "scale(FFF)V", cancellable = true) private void returnAfterNegate(float x, float y, float z, CallbackInfo ci) { ci.cancel(); } @@ -29,7 +29,7 @@ public class FixNormalScalingMixin { * that would invert all normals. Additionally, Minecraft's fastInverseCbrt method * does not work for negative numbers. */ - @ModifyArg(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;fastInverseCbrt(F)F"), method = "scale(FFF)V") + @ModifyArg(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;fastInvCubeRoot(F)F"), method = "scale(FFF)V") private float absInvCbrtInput(float input) { return Math.abs(input); } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/HeavyBootsOnEntityMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/HeavyBootsOnEntityMixin.java deleted file mode 100644 index d295d6fa4..000000000 --- a/src/main/java/com/simibubi/create/foundation/mixin/HeavyBootsOnEntityMixin.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.simibubi.create.foundation.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.entity.Entity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraftforge.common.capabilities.CapabilityProvider; - -@Mixin(Entity.class) -public abstract class HeavyBootsOnEntityMixin extends CapabilityProvider { - - protected HeavyBootsOnEntityMixin(Class baseClass) { - super(baseClass); - } - - @Shadow - public abstract CompoundNBT getPersistentData(); - - @Inject(at = @At("HEAD"), method = "canSwim", cancellable = true) - public void noSwimmingWithHeavyBootsOn(CallbackInfoReturnable cir) { - CompoundNBT persistentData = getPersistentData(); - if (persistentData.contains("HeavyBoots")) - cir.setReturnValue(false); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/HeavyBootsOnPlayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/HeavyBootsOnPlayerMixin.java index 3ab84bb01..8561b404a 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/HeavyBootsOnPlayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/HeavyBootsOnPlayerMixin.java @@ -22,7 +22,7 @@ public abstract class HeavyBootsOnPlayerMixin extends AbstractClientPlayerEntity super(p_i50991_1_, p_i50991_2_); } - @Inject(at = @At("HEAD"), method = "canSwim", cancellable = true) + @Inject(at = @At("HEAD"), method = "isUnderWater", cancellable = true) public void noSwimmingWithHeavyBootsOn(CallbackInfoReturnable cir) { CompoundNBT persistentData = getPersistentData(); if (persistentData.contains("HeavyBoots")) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/ModelDataRefreshMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/ModelDataRefreshMixin.java index cf9babd4d..a7857c1b0 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/ModelDataRefreshMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/ModelDataRefreshMixin.java @@ -27,8 +27,8 @@ public class ModelDataRefreshMixin { @Inject(at = @At("HEAD"), method = "requestModelDataRefresh", cancellable = true, remap = false) private static void requestModelDataRefresh(TileEntity te, CallbackInfo ci) { if (te != null) { - World world = te.getWorld(); - if (world != Minecraft.getInstance().world && world instanceof SchematicWorld) + World world = te.getLevel(); + if (world != Minecraft.getInstance().level && world instanceof SchematicWorld) ci.cancel(); } } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/WindowResizeMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/WindowResizeMixin.java index 21ed291ff..4af9f1243 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/WindowResizeMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/WindowResizeMixin.java @@ -18,11 +18,11 @@ import net.minecraftforge.api.distmarker.OnlyIn; @Mixin(Minecraft.class) public class WindowResizeMixin { - @Shadow @Final private MainWindow mainWindow; + @Shadow @Final private MainWindow window; - @Inject(at = @At("TAIL"), method = "updateWindowSize") + @Inject(at = @At("TAIL"), method = "resizeDisplay") private void updateWindowSize(CallbackInfo ci) { - UIRenderHelper.updateWindowSize(mainWindow); + UIRenderHelper.updateWindowSize(window); } } diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index c5df8bc17..079bc0cbd 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -22,7 +22,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.content.contraptions.fluids.actors.FluidSplashPacket; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.ConfigureSequencedGearshiftPacket; import com.simibubi.create.content.curiosities.bell.SoulPulseEffectPacket; -import com.simibubi.create.content.curiosities.projector.ConfigureProjectorPacket; import com.simibubi.create.content.curiosities.symmetry.SymmetryEffectPacket; import com.simibubi.create.content.curiosities.tools.BlueprintAssignCompleteRecipePacket; import com.simibubi.create.content.curiosities.tools.ExtendoGripInteractionPacket; @@ -74,7 +73,6 @@ public enum AllPackets { CONFIGURE_STOCKSWITCH(ConfigureStockswitchPacket.class, ConfigureStockswitchPacket::new, PLAY_TO_SERVER), CONFIGURE_SEQUENCER(ConfigureSequencedGearshiftPacket.class, ConfigureSequencedGearshiftPacket::new, PLAY_TO_SERVER), - CONFIGURE_PROJECTOR(ConfigureProjectorPacket.class, ConfigureProjectorPacket::new, PLAY_TO_SERVER), PLACE_SCHEMATIC(SchematicPlacePacket.class, SchematicPlacePacket::new, PLAY_TO_SERVER), UPLOAD_SCHEMATIC(SchematicUploadPacket.class, SchematicUploadPacket::new, PLAY_TO_SERVER), CLEAR_CONTAINER(ClearContainerPacket.class, ClearContainerPacket::new, PLAY_TO_SERVER), @@ -145,7 +143,7 @@ public enum AllPackets { public static void sendToNear(World world, BlockPos pos, int range, Object message) { channel.send(PacketDistributor.NEAR - .with(TargetPoint.p(pos.getX(), pos.getY(), pos.getZ(), range, world.getRegistryKey())), message); + .with(TargetPoint.p(pos.getX(), pos.getY(), pos.getZ(), range, world.dimension())), message); } private static class LoadedPacket { diff --git a/src/main/java/com/simibubi/create/foundation/networking/ISyncPersistentData.java b/src/main/java/com/simibubi/create/foundation/networking/ISyncPersistentData.java index f8d30dd44..77d3ccfde 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/ISyncPersistentData.java +++ b/src/main/java/com/simibubi/create/foundation/networking/ISyncPersistentData.java @@ -26,29 +26,29 @@ public interface ISyncPersistentData { public Packet(Entity entity) { this.entity = entity; - this.entityId = entity.getEntityId(); + this.entityId = entity.getId(); } public Packet(PacketBuffer buffer) { entityId = buffer.readInt(); - readData = buffer.readCompoundTag(); + readData = buffer.readNbt(); } @Override public void write(PacketBuffer buffer) { buffer.writeInt(entityId); - buffer.writeCompoundTag(entity.getPersistentData()); + buffer.writeNbt(entity.getPersistentData()); } @Override public void handle(Supplier context) { context.get() .enqueueWork(() -> { - Entity entityByID = Minecraft.getInstance().world.getEntityByID(entityId); + Entity entityByID = Minecraft.getInstance().level.getEntity(entityId); if (!(entityByID instanceof ISyncPersistentData)) return; CompoundNBT data = entityByID.getPersistentData(); - for (Iterator iterator = data.keySet() + for (Iterator iterator = data.getAllKeys() .iterator(); iterator.hasNext(); ) { data.remove(iterator.next()); } diff --git a/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java b/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java index b42262760..92d01609e 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java +++ b/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java @@ -30,13 +30,13 @@ public class NbtPacket extends SimplePacketBase { } public NbtPacket(PacketBuffer buffer) { - stack = buffer.readItemStack(); + stack = buffer.readItem(); slot = buffer.readInt(); hand = Hand.values()[buffer.readInt()]; } public void write(PacketBuffer buffer) { - buffer.writeItemStack(stack); + buffer.writeItem(stack); buffer.writeInt(slot); buffer.writeInt(hand.ordinal()); } @@ -51,16 +51,16 @@ public class NbtPacket extends SimplePacketBase { if (!(stack.getItem() instanceof SymmetryWandItem || stack.getItem() instanceof ZapperItem)) { return; } - stack.removeChildTag("AttributeModifiers"); + stack.removeTagKey("AttributeModifiers"); if (slot == -1) { - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); if (heldItem.getItem() == stack.getItem()) { heldItem.setTag(stack.getTag()); } return; } - ItemStack heldInSlot = player.inventory.getStackInSlot(slot); + ItemStack heldInSlot = player.inventory.getItem(slot); if (heldInSlot.getItem() == stack.getItem()) { heldInSlot.setTag(stack.getTag()); } diff --git a/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java b/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java index 4bb198dcc..9f0ca903d 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java @@ -39,15 +39,15 @@ public abstract class TileEntityConfigurationPacket .getSender(); if (player == null) return; - World world = player.world; + World world = player.level; - if (world == null || !world.isBlockPresent(pos)) + if (world == null || !world.isLoaded(pos)) return; - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof SyncedTileEntity) { applySettings((TE) tileEntity); ((SyncedTileEntity) tileEntity).sendData(); - tileEntity.markDirty(); + tileEntity.setChanged(); } }); context.get() diff --git a/src/main/java/com/simibubi/create/foundation/networking/TileEntityDataPacket.java b/src/main/java/com/simibubi/create/foundation/networking/TileEntityDataPacket.java index 0be7edd6d..4e8acd5f7 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/TileEntityDataPacket.java +++ b/src/main/java/com/simibubi/create/foundation/networking/TileEntityDataPacket.java @@ -38,12 +38,12 @@ public abstract class TileEntityDataPacket extends public void handle(Supplier context) { NetworkEvent.Context ctx = context.get(); ctx.enqueueWork(() -> { - ClientWorld world = Minecraft.getInstance().world; + ClientWorld world = Minecraft.getInstance().level; if (world == null) return; - TileEntity tile = world.getTileEntity(tilePos); + TileEntity tile = world.getBlockEntity(tilePos); if (tile instanceof SyncedTileEntity) { handlePacket((TE) tile); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java index 3ff97cfbb..83291738a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java @@ -45,8 +45,8 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { public NavigatableSimiScreen() { MainWindow window = Minecraft.getInstance() .getWindow(); - depthPointX = window.getScaledWidth() / 2; - depthPointY = window.getScaledHeight() / 2; + depthPointX = window.getGuiScaledWidth() / 2; + depthPointY = window.getGuiScaledHeight() / 2; } @Override @@ -100,18 +100,18 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { if (backTrack == null) return; - ms.push(); + ms.pushPose(); ms.translate(0, 0, 500); if (backTrack.isHovered()) { TranslationTextComponent translate = Lang.translate(backTrackingLangKey()); - textRenderer.draw(ms, translate, 41 - textRenderer.getWidth(translate) / 2, height - 16, + font.draw(ms, translate, 41 - font.width(translate) / 2, height - 16, Theme.i(Theme.Key.TEXT_DARKER)); - if (MathHelper.epsilonEquals(arrowAnimation.getValue(), arrowAnimation.getChaseTarget())) { + if (MathHelper.equal(arrowAnimation.getValue(), arrowAnimation.getChaseTarget())) { arrowAnimation.setValue(1); arrowAnimation.setValue(1);// called twice to also set the previous value to 1 } } - ms.pop(); + ms.popPose(); } protected String backTrackingLangKey() { @@ -145,24 +145,24 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { // draw last screen into buffer if (lastScreen != null && lastScreen != this && !transition.settled()) { - ms.push(); - UIRenderHelper.framebuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC); + ms.pushPose(); + UIRenderHelper.framebuffer.clear(Minecraft.ON_OSX); ms.translate(0, 0, -1000); - UIRenderHelper.framebuffer.bindFramebuffer(true); + UIRenderHelper.framebuffer.bindWrite(true); lastScreen.render(ms, mouseX, mouseY, partialTicks); - ms.pop(); - ms.push(); + ms.popPose(); + ms.pushPose(); // use the buffer texture Minecraft.getInstance() - .getFramebuffer() - .bindFramebuffer(true); + .getMainRenderTarget() + .bindWrite(true); MainWindow window = Minecraft.getInstance() .getWindow(); - int dpx = window.getScaledWidth() / 2; - int dpy = window.getScaledHeight() / 2; + int dpx = window.getGuiScaledWidth() / 2; + int dpy = window.getGuiScaledHeight() / 2; if (lastScreen instanceof AbstractSimiScreen) { dpx = ((NavigatableSimiScreen) lastScreen).depthPointX; dpy = ((NavigatableSimiScreen) lastScreen).depthPointY; @@ -177,7 +177,7 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { UIRenderHelper.drawFramebuffer(1f - Math.abs(transitionValue)); RenderSystem.disableBlend(); RenderSystem.enableAlphaTest(); - ms.pop(); + ms.popPose(); } // modify current screen as well @@ -202,9 +202,9 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { } public void centerScalingOnMouse() { - MainWindow w = client.getWindow(); - double mouseX = client.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); - double mouseY = client.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + MainWindow w = minecraft.getWindow(); + double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); + double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); centerScalingOn((int) mouseX, (int) mouseY); } @@ -219,7 +219,7 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { if (history.isEmpty()) return; - history.add(0, Minecraft.getInstance().currentScreen); + history.add(0, Minecraft.getInstance().screen); int spacing = 20; List names = history.stream() @@ -227,7 +227,7 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { .collect(Collectors.toList()); int bWidth = names.stream() - .mapToInt(s -> textRenderer.getStringWidth(s) + spacing) + .mapToInt(s -> font.width(s) + spacing) .sum(); MutableInt x = new MutableInt(width - bWidth); @@ -237,18 +237,18 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { if (x.getValue() < 25) x.setValue(25); - ms.push(); + ms.pushPose(); ms.translate(0, 0, 600); names.forEach(s -> { - int sWidth = textRenderer.getStringWidth(s); + int sWidth = font.width(s); UIRenderHelper.breadcrumbArrow(ms, x.getValue(), y.getValue(), 0, sWidth + spacing, 14, spacing / 2, 0xdd101010, 0x44101010); - textRenderer.draw(ms, s, x.getValue() + 5, y.getValue() + 3, first.getValue() ? 0xffeeffee : 0xffddeeff); + font.draw(ms, s, x.getValue() + 5, y.getValue() + 3, first.getValue() ? 0xffeeffee : 0xffddeeff); first.setFalse(); x.add(sWidth + spacing); }); - ms.pop(); + ms.popPose(); } private static String screenTitle(Screen screen) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java index d5b6a52cc..53b25a053 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java @@ -7,72 +7,99 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.simibubi.create.Create; import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.content.PonderTag; import com.simibubi.create.foundation.ponder.content.PonderTagIndexScreen; import com.simibubi.create.foundation.ponder.content.PonderTagScreen; +import com.simibubi.create.foundation.ponder.content.SharedText; import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Lang; +import com.tterrag.registrate.AbstractRegistrate; + +import net.minecraft.client.resources.I18n; +import net.minecraft.util.ResourceLocation; public class PonderLocalization { - static Map shared = new HashMap<>(); - static Map> tag = new HashMap<>(); - static Map> specific = new HashMap<>(); + static final Map SHARED = new HashMap<>(); + static final Map> TAG = new HashMap<>(); + static final Map> SPECIFIC = new HashMap<>(); // - public static void registerTag(String key, String enUS, String description) { - tag.put(key, Couple.create(enUS, description)); + public static void registerShared(ResourceLocation key, String enUS) { + SHARED.put(key, enUS); } - public static void registerShared(String key, String enUS) { - shared.put(key, enUS); + public static void registerTag(ResourceLocation key, String enUS, String description) { + TAG.put(key, Couple.create(enUS, description)); } - public static void registerSpecific(String sceneId, String key, String enUS) { - specific.computeIfAbsent(sceneId, $ -> new HashMap<>()) + public static void registerSpecific(ResourceLocation sceneId, String key, String enUS) { + SPECIFIC.computeIfAbsent(sceneId, $ -> new HashMap<>()) .put(key, enUS); } // - public static String getShared(String key) { + public static String getShared(ResourceLocation key) { if (PonderIndex.EDITOR_MODE) - return shared.containsKey(key) ? shared.get(key) : ("unregistered shared entry:" + key); - return Lang.translate(langKeyForShared(key)) - .getString(); + return SHARED.containsKey(key) ? SHARED.get(key) : ("unregistered shared entry:" + key); + return I18n.get(langKeyForShared(key)); } - public static String getSpecific(String sceneId, String k) { + public static String getTag(ResourceLocation key) { if (PonderIndex.EDITOR_MODE) - return specific.get(sceneId) - .get(k); - return Lang.translate(langKeyForSpecific(sceneId, k)) - .getString(); - } - - public static String getTag(String key) { - if (PonderIndex.EDITOR_MODE) - return tag.containsKey(key) ? tag.get(key) + return TAG.containsKey(key) ? TAG.get(key) .getFirst() : ("unregistered tag entry:" + key); - return Lang.translate(langKeyForTag(key)) - .getString(); + return I18n.get(langKeyForTag(key)); } - public static String getTagDescription(String key) { + public static String getTagDescription(ResourceLocation key) { if (PonderIndex.EDITOR_MODE) - return tag.containsKey(key) ? tag.get(key) + return TAG.containsKey(key) ? TAG.get(key) .getSecond() : ("unregistered tag entry:" + key); - return Lang.translate(langKeyForTagDescription(key)) - .getString(); + return I18n.get(langKeyForTagDescription(key)); + } + + public static String getSpecific(ResourceLocation sceneId, String k) { + if (PonderIndex.EDITOR_MODE) + return SPECIFIC.get(sceneId) + .get(k); + return I18n.get(langKeyForSpecific(sceneId, k)); } // public static final String LANG_PREFIX = "ponder."; - public static JsonElement record() { - JsonObject object = new JsonObject(); + public static void record(String namespace, JsonObject object) { + SHARED.forEach((k, v) -> { + if (k.getNamespace().equals(namespace)) { + object.addProperty(langKeyForShared(k), v); + } + }); + TAG.forEach((k, v) -> { + if (k.getNamespace().equals(namespace)) { + object.addProperty(langKeyForTag(k), v.getFirst()); + object.addProperty(langKeyForTagDescription(k), v.getSecond()); + } + }); + + SPECIFIC.entrySet() + .stream() + .filter(entry -> entry.getKey().getNamespace().equals(namespace)) + .sorted(Map.Entry.comparingByKey()) + .forEach(entry -> { + entry.getValue() + .entrySet() + .stream() + .sorted(Map.Entry.comparingByKey()) + .forEach(subEntry -> object.addProperty( + langKeyForSpecific(entry.getKey(), subEntry.getKey()), subEntry.getValue())); + }); + } + + private static void recordGeneral(JsonObject object) { addGeneral(object, PonderTooltipHandler.HOLD_TO_PONDER, "Hold [%1$s] to Ponder"); addGeneral(object, PonderTooltipHandler.SUBJECT, "Subject of this scene"); addGeneral(object, PonderUI.PONDERING, "Pondering about..."); @@ -93,45 +120,62 @@ public class PonderLocalization { addGeneral(object, PonderTagIndexScreen.DESCRIPTION, "Click one of the icons to learn about its associated Items and Blocks"); addGeneral(object, PonderTagIndexScreen.TITLE, "Ponder Index"); - - shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v)); - tag.forEach((k, v) -> { - object.addProperty(Create.ID + "." + langKeyForTag(k), v.getFirst()); - object.addProperty(Create.ID + "." + langKeyForTagDescription(k), v.getSecond()); - }); - - specific.entrySet() - .stream() - .sorted(Map.Entry.comparingByKey()) - .forEach(entry -> { - entry.getValue() - .entrySet() - .stream() - .sorted(Map.Entry.comparingByKey()) - .forEach(subEntry -> object.addProperty( - Create.ID + "." + langKeyForSpecific(entry.getKey(), subEntry.getKey()), subEntry.getValue())); - }); - return object; } private static void addGeneral(JsonObject json, String key, String enUS) { json.addProperty(Create.ID + "." + key, enUS); } - protected static String langKeyForSpecific(String sceneId, String k) { - return LANG_PREFIX + sceneId + "." + k; + public static void generateSceneLang() { + PonderRegistry.ALL.forEach((id, list) -> { + for (int i = 0; i < list.size(); i++) + PonderRegistry.compileScene(i, list.get(i), null); + }); } - protected static String langKeyForShared(String k) { - return LANG_PREFIX + "shared." + k; + /** + * Internal use only. + */ + public static JsonObject provideLangEntries() { + SharedText.gatherText(); + PonderTag.register(); + PonderIndex.register(); + + generateSceneLang(); + + JsonObject object = new JsonObject(); + recordGeneral(object); + record(Create.ID, object); + return object; } - protected static String langKeyForTag(String k) { - return LANG_PREFIX + "tag." + k; + public static void provideRegistrateLang(AbstractRegistrate registrate) { + generateSceneLang(); + + JsonObject object = new JsonObject(); + record(registrate.getModid(), object); + + for (Map.Entry entry : object.entrySet()) { + registrate.addRawLang(entry.getKey(), entry.getValue().getAsString()); + } } - protected static String langKeyForTagDescription(String k) { - return LANG_PREFIX + "tag." + k + ".description"; + // + + protected static String langKeyForShared(ResourceLocation k) { + return k.getNamespace() + "." + LANG_PREFIX + "shared." + k.getPath(); + } + + protected static String langKeyForTag(ResourceLocation k) { + return k.getNamespace() + "." + LANG_PREFIX + "tag." + k.getPath(); + } + + protected static String langKeyForTagDescription(ResourceLocation k) { + return k.getNamespace() + "." + LANG_PREFIX + "tag." + k.getPath() + ".description"; + } + + protected static String langKeyForSpecific(ResourceLocation sceneId, String k) { + return sceneId.getNamespace() + "." + LANG_PREFIX + sceneId.getPath() + "." + k; } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java index bcaf05352..b85cbb1db 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java @@ -90,7 +90,7 @@ public class PonderProgressBar extends AbstractSimiWidget { @Override public void renderButton(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - hovered = clicked(mouseX, mouseY); + isHovered = clicked(mouseX, mouseY); new BoxElement() .withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) @@ -99,20 +99,20 @@ public class PonderProgressBar extends AbstractSimiWidget { .withBounds(width, height) .render(ms); - ms.push(); + ms.pushPose(); ms.translate(x - 2, y - 2, 200); - ms.push(); + ms.pushPose(); ms.scale((width + 4) * progress.getValue(partialTicks), 1, 1); int c1 = Theme.i(Theme.Key.PONDER_PROGRESSBAR, true); int c2 = Theme.i(Theme.Key.PONDER_PROGRESSBAR, false); - GuiUtils.drawGradientRect(ms.peek().getModel(), 110, 0, 3, 1, 4, c1, c1); - GuiUtils.drawGradientRect(ms.peek().getModel(), 110, 0, 4, 1, 5, c2, c2); - ms.pop(); + GuiUtils.drawGradientRect(ms.last().pose(), 110, 0, 3, 1, 4, c1, c1); + GuiUtils.drawGradientRect(ms.last().pose(), 110, 0, 4, 1, 5, c2, c2); + ms.popPose(); renderKeyframes(ms, mouseX, partialTicks); - ms.pop(); + ms.popPose(); } private void renderKeyframes(MatrixStack ms, int mouseX, float partialTicks) { @@ -124,7 +124,7 @@ public class PonderProgressBar extends AbstractSimiWidget { int idleEndColor = Theme.i(Theme.Key.PONDER_IDLE, false) | 0x40_000000; int hoverIndex; - if (hovered) { + if (isHovered) { hoverIndex = getHoveredKeyframeIndex(activeScene, mouseX); } else { hoverIndex = -2; @@ -152,26 +152,26 @@ public class PonderProgressBar extends AbstractSimiWidget { private void drawKeyframe(MatrixStack ms, PonderScene activeScene, boolean selected, int keyframeTime, int keyframePos, int startColor, int endColor, int height) { if (selected) { - FontRenderer font = Minecraft.getInstance().fontRenderer; - GuiUtils.drawGradientRect(ms.peek() - .getModel(), 100, keyframePos, 10, keyframePos + 1, 10 + height, endColor, startColor); - ms.push(); + FontRenderer font = Minecraft.getInstance().font; + GuiUtils.drawGradientRect(ms.last() + .pose(), 100, keyframePos, 10, keyframePos + 1, 10 + height, endColor, startColor); + ms.pushPose(); ms.translate(0, 0, 100); String text; int offset; if (activeScene.currentTime < keyframeTime) { text = ">"; - offset = -1 - font.getStringWidth(text); + offset = -1 - font.width(text); } else { text = "<"; offset = 3; } font.draw(ms, text, keyframePos + offset, 10, endColor); - ms.pop(); + ms.popPose(); } - GuiUtils.drawGradientRect(ms.peek() - .getModel(), 500, keyframePos, -1, keyframePos + 1, 2 + height, startColor, endColor); + GuiUtils.drawGradientRect(ms.last() + .pose(), 500, keyframePos, -1, keyframePos + 1, 2 + height, startColor, endColor); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java index 06348383c..ee420a6f4 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.ponder; import java.io.BufferedInputStream; import java.io.DataInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -12,7 +13,6 @@ import java.util.Map; import java.util.function.Consumer; import java.util.zip.GZIPInputStream; -import com.google.gson.JsonElement; import com.simibubi.create.Create; import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard; import com.simibubi.create.foundation.ponder.content.PonderChapter; @@ -27,6 +27,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTSizeTracker; +import net.minecraft.resources.IResource; +import net.minecraft.resources.IResourceManager; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.gen.feature.template.PlacementSettings; @@ -34,52 +36,75 @@ import net.minecraft.world.gen.feature.template.Template; public class PonderRegistry { - public static final PonderTagRegistry tags = new PonderTagRegistry(); - public static final PonderChapterRegistry chapters = new PonderChapterRegistry(); - public static Map> all = new HashMap<>(); + public static final PonderTagRegistry TAGS = new PonderTagRegistry(); + public static final PonderChapterRegistry CHAPTERS = new PonderChapterRegistry(); + // Map from item ids to all storyboards + public static final Map> ALL = new HashMap<>(); - public static PonderSceneBuilder addStoryBoard(ItemProviderEntry component, String schematic, + private static String currentNamespace; + + public static void startRegistration(String namespace) { + if (currentNamespace != null) { + throw new IllegalStateException("Cannot start registration when already started!"); + } + currentNamespace = namespace; + } + + public static void endRegistration() { + if (currentNamespace == null) { + throw new IllegalStateException("Cannot end registration when not started!"); + } + currentNamespace = null; + } + + private static String getNamespaceOrThrow() { + if (currentNamespace == null) { + throw new IllegalStateException("Cannot register storyboard without starting registration!"); + } + return currentNamespace; + } + + public static PonderSceneBuilder addStoryBoard(ItemProviderEntry component, String schematicPath, PonderStoryBoard storyBoard, PonderTag... tags) { ResourceLocation id = component.getId(); - PonderStoryBoardEntry entry = new PonderStoryBoardEntry(storyBoard, schematic, id); + PonderStoryBoardEntry entry = new PonderStoryBoardEntry(storyBoard, getNamespaceOrThrow(), schematicPath, id); PonderSceneBuilder builder = new PonderSceneBuilder(entry); if (tags.length > 0) builder.highlightTags(tags); - all.computeIfAbsent(id, _$ -> new ArrayList<>()) + ALL.computeIfAbsent(id, _$ -> new ArrayList<>()) .add(entry); return builder; } - public static PonderSceneBuilder addStoryBoard(PonderChapter chapter, ResourceLocation component, String schematic, - PonderStoryBoard storyBoard) { + public static PonderSceneBuilder addStoryBoard(PonderChapter chapter, ResourceLocation component, String schematicPath, PonderStoryBoard storyBoard) { if (component == null) component = new ResourceLocation("minecraft", "stick"); - PonderStoryBoardEntry entry = new PonderStoryBoardEntry(storyBoard, schematic, component); + PonderStoryBoardEntry entry = new PonderStoryBoardEntry(storyBoard, getNamespaceOrThrow(), schematicPath, component); PonderSceneBuilder builder = new PonderSceneBuilder(entry); - chapters.addStoriesToChapter(chapter, entry); + CHAPTERS.addStoriesToChapter(chapter, entry); return builder; } public static MultiSceneBuilder forComponents(ItemProviderEntry... components) { return new MultiSceneBuilder(Arrays.asList(components)); } - + public static MultiSceneBuilder forComponents(Iterable> components) { return new MultiSceneBuilder(components); } public static List compile(ResourceLocation id) { - return compile(all.get(id)); + return compile(ALL.get(id)); } public static List compile(PonderChapter chapter) { - return compile(chapters.getStories(chapter)); + return compile(CHAPTERS.getStories(chapter)); } public static List compile(List entries) { if (PonderIndex.EDITOR_MODE) { - PonderLocalization.shared.clear(); + PonderLocalization.SHARED.clear(); SharedText.gatherText(); } @@ -87,9 +112,9 @@ public class PonderRegistry { for (int i = 0; i < entries.size(); i++) { PonderStoryBoardEntry sb = entries.get(i); - Template activeTemplate = loadSchematic(sb.getSchematicName()); - PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world); - activeTemplate.placeAndNotifyListeners(world, BlockPos.ZERO, new PlacementSettings(), world.rand); + Template activeTemplate = loadSchematic(sb.getSchematicLocation()); + PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().level); + activeTemplate.placeInWorld(world, BlockPos.ZERO, new PlacementSettings(), world.random); world.createBackup(); PonderScene scene = compileScene(i, sb, world); scene.begin(); @@ -100,41 +125,39 @@ public class PonderRegistry { } public static PonderScene compileScene(int i, PonderStoryBoardEntry sb, PonderWorld world) { - PonderScene scene = new PonderScene(world, sb.getComponent(), sb.getTags()); + PonderScene scene = new PonderScene(world, sb.getNamespace(), sb.getComponent(), sb.getTags()); SceneBuilder builder = scene.builder(); sb.getBoard() .program(builder, scene.getSceneBuildingUtil()); return scene; } - public static Template loadSchematic(String path) { - Template t = new Template(); - String filepath = "ponder/" + path + ".nbt"; - InputStream resourceAsStream = Create.class.getClassLoader() - .getResourceAsStream(filepath); - if (resourceAsStream == null) { - Create.LOGGER.error("Ponder schematic missing: " + path); - return t; - } - try (DataInputStream stream = - new DataInputStream(new BufferedInputStream(new GZIPInputStream(resourceAsStream)))) { - CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); - t.read(nbt); - } catch (IOException e) { - Create.LOGGER.warn("Failed to read ponder schematic", e); - } - return t; + public static Template loadSchematic(ResourceLocation location) { + return loadSchematic(Minecraft.getInstance().getResourceManager(), location); } - public static JsonElement provideLangEntries() { - PonderIndex.register(); - PonderTag.register(); - SharedText.gatherText(); - all.forEach((id, list) -> { - for (int i = 0; i < list.size(); i++) - compileScene(i, list.get(i), null); - }); - return PonderLocalization.record(); + public static Template loadSchematic(IResourceManager resourceManager, ResourceLocation location) { + String namespace = location.getNamespace(); + String path = "ponder/" + location.getPath() + ".nbt"; + ResourceLocation location1 = new ResourceLocation(namespace, path); + + try (IResource resource = resourceManager.getResource(location1)) { + return loadSchematic(resource.getInputStream()); + } catch (FileNotFoundException e) { + Create.LOGGER.error("Ponder schematic missing: " + location1, e); + } catch (IOException e) { + Create.LOGGER.error("Failed to read ponder schematic: " + location1, e); + } + return new Template(); + } + + public static Template loadSchematic(InputStream resourceStream) throws IOException { + Template t = new Template(); + DataInputStream stream = + new DataInputStream(new BufferedInputStream(new GZIPInputStream(resourceStream))); + CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); + t.load(nbt); + return t; } public static class MultiSceneBuilder { @@ -183,7 +206,7 @@ public class PonderRegistry { } public PonderSceneBuilder chapter(PonderChapter chapter) { - PonderRegistry.chapters.addStoriesToChapter(chapter, entry); + PonderRegistry.CHAPTERS.addStoriesToChapter(chapter, entry); return this; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index a970431bd..0befcd501 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -16,6 +16,7 @@ import java.util.function.Supplier; import org.apache.commons.lang3.mutable.MutableDouble; import org.apache.commons.lang3.mutable.MutableObject; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.content.PonderTag; @@ -25,7 +26,6 @@ import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.instructions.HideAllInstruction; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.animation.LerpedFloat; @@ -59,7 +59,7 @@ public class PonderScene { boolean finished; int sceneIndex; int textIndex; - String sceneId; + ResourceLocation sceneId; IntList keyframeTimes; @@ -69,6 +69,7 @@ public class PonderScene { List tags; PonderWorld world; + String namespace; ResourceLocation component; SceneTransform transform; SceneRenderInfo info; @@ -90,7 +91,7 @@ public class PonderScene { int totalTime; int currentTime; - public PonderScene(PonderWorld world, ResourceLocation component, Collection tags) { + public PonderScene(PonderWorld world, String namespace, ResourceLocation component, Collection tags) { if (world != null) world.scene = this; @@ -98,6 +99,7 @@ public class PonderScene { textIndex = 1; this.world = world; + this.namespace = namespace; this.component = component; outliner = new Outliner(); @@ -107,7 +109,7 @@ public class PonderScene { schedule = new ArrayList<>(); activeSchedule = new ArrayList<>(); transform = new SceneTransform(); - basePlateSize = getBounds().getXSize(); + basePlateSize = getBounds().getXSpan(); info = new SceneRenderInfo(); baseWorldSection = new WorldSectionElement(); renderViewEntity = new ArmorStandEntity(world, 0, 0, 0); @@ -150,10 +152,10 @@ public class PonderScene { BlockPos origin = new BlockPos(basePlateOffsetX, 0, basePlateOffsetZ); if (!world.getBounds() - .isVecInside(selectedPos)) + .isInside(selectedPos)) return Pair.of(ItemStack.EMPTY, null); - if (new MutableBoundingBox(origin, origin.add(new Vector3i(basePlateSize - 1, 0, basePlateSize - 1))) - .isVecInside(selectedPos)) { + if (new MutableBoundingBox(origin, origin.offset(new Vector3i(basePlateSize - 1, 0, basePlateSize - 1))) + .isInside(selectedPos)) { if (PonderIndex.EDITOR_MODE) nearestHit.getValue() .getFirst() @@ -223,30 +225,30 @@ public class PonderScene { } public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms, float pt) { - ms.push(); + ms.pushPose(); Minecraft mc = Minecraft.getInstance(); - Entity prevRVE = mc.renderViewEntity; + Entity prevRVE = mc.cameraEntity; - mc.renderViewEntity = this.renderViewEntity; + mc.cameraEntity = this.renderViewEntity; forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms, pt)); - mc.renderViewEntity = prevRVE; + mc.cameraEntity = prevRVE; - for (RenderType type : RenderType.getBlockLayers()) + for (RenderType type : RenderType.chunkBufferLayers()) forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms, pt)); - + forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms, pt)); info.set(transform.xRotation.getValue(pt) + 90, transform.yRotation.getValue(pt) + 180); world.renderEntities(ms, buffer, info, pt); world.renderParticles(ms, buffer, info, pt); outliner.renderOutlines(ms, buffer, pt); - ms.pop(); + ms.popPose(); } public void renderOverlay(PonderUI screen, MatrixStack ms, float partialTicks) { - ms.push(); + ms.pushPose(); forEachVisible(PonderOverlayElement.class, e -> e.render(this, screen, ms, partialTicks)); - ms.pop(); + ms.popPose(); } public void setPointOfInterest(Vector3d poi) { @@ -392,10 +394,30 @@ public class PonderScene { return new SceneBuildingUtil(getBounds()); } + public String getNamespace() { + return namespace; + } + + public ResourceLocation getId() { + return sceneId; + } + public SceneTransform getTransform() { return transform; } + public Outliner getOutliner() { + return outliner; + } + + public boolean isFinished() { + return finished; + } + + public void setFinished(boolean finished) { + this.finished = finished; + } + public class SceneTransform { public LerpedFloat xRotation, yRotation; @@ -431,14 +453,14 @@ public class PonderScene { public MatrixStack apply(MatrixStack ms, float pt, boolean overlayCompatible) { ms.translate(width / 2, height / 2, 200 + offset); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateX(-35) .rotateY(55); ms.translate(offset, 0, 0); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(-55) .rotateX(35); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateX(xRotation.getValue(pt)) .rotateY(yRotation.getValue(pt)); @@ -464,7 +486,7 @@ public class PonderScene { public void updateSceneRVE(float pt) { Vector3d v = screenToScene(width / 2, height / 2, 500, pt); - renderViewEntity.setPosition(v.x, v.y, v.z); + renderViewEntity.setPos(v.x, v.y, v.z); } public Vector3d screenToScene(double x, double y, int depth, float pt) { @@ -482,7 +504,7 @@ public class PonderScene { float f = 1f / (30 * scaleFactor); - vec = vec.mul(f, -f, f); + vec = vec.multiply(f, -f, f); vec = vec.subtract((basePlateSize + basePlateOffsetX) / -2f, -1f + yOffset, (basePlateSize + basePlateOffsetZ) / -2f); @@ -493,14 +515,14 @@ public class PonderScene { refreshMatrix(pt); Vector4f vec4 = new Vector4f((float) vec.x, (float) vec.y, (float) vec.z, 1); vec4.transform(cachedMat); - return new Vector2f(vec4.getX(), vec4.getY()); + return new Vector2f(vec4.x(), vec4.y()); } protected void refreshMatrix(float pt) { if (cachedMat != null) return; - cachedMat = apply(new MatrixStack(), pt, false).peek() - .getModel(); + cachedMat = apply(new MatrixStack(), pt, false).last() + .pose(); } } @@ -508,21 +530,9 @@ public class PonderScene { public class SceneRenderInfo extends ActiveRenderInfo { public void set(float xRotation, float yRotation) { - setDirection(yRotation, xRotation); + setRotation(yRotation, xRotation); } } - public Outliner getOutliner() { - return outliner; - } - - public boolean isFinished() { - return finished; - } - - public void setFinished(boolean finished) { - this.finished = finished; - } - } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java index 6d6ab1c98..5938d38e8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java @@ -9,36 +9,47 @@ import net.minecraft.util.ResourceLocation; public class PonderStoryBoardEntry { - private final String schematicName; private final PonderStoryBoard board; - private final List tags; + private final String namespace; + private final String schematicPath; private final ResourceLocation component; + private final List tags; - public PonderStoryBoardEntry(PonderStoryBoard board, String schematicName, ResourceLocation component) { + public PonderStoryBoardEntry(PonderStoryBoard board, String namespace, String schematicPath, ResourceLocation component) { this.board = board; - this.schematicName = schematicName; - this.tags = new ArrayList<>(); + this.namespace = namespace; + this.schematicPath = schematicPath; this.component = component; - } - - public interface PonderStoryBoard { - void program(SceneBuilder scene, SceneBuildingUtil util); - } - - public String getSchematicName() { - return schematicName; + this.tags = new ArrayList<>(); } public PonderStoryBoard getBoard() { return board; } - public List getTags() { - return tags; + public String getNamespace() { + return namespace; + } + + public String getSchematicPath() { + return schematicPath; } public ResourceLocation getComponent() { return component; } + public List getTags() { + return tags; + } + + public ResourceLocation getSchematicLocation() { + return new ResourceLocation(namespace, schematicPath); + } + + @FunctionalInterface + public interface PonderStoryBoard { + void program(SceneBuilder scene, SceneBuildingUtil util); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java index 0cb380252..a04832908 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java @@ -45,12 +45,12 @@ public class PonderTooltipHandler { } Minecraft instance = Minecraft.getInstance(); - Screen currentScreen = instance.currentScreen; + Screen currentScreen = instance.screen; float value = holdWProgress.getValue(); int keyCode = ponderKeybind().getKey() - .getKeyCode(); + .getValue(); long window = instance.getWindow() - .getHandle(); + .getWindow(); if (!subject && InputMappings.isKeyDown(window, keyCode)) { if (value >= 1) { @@ -77,9 +77,9 @@ public class PonderTooltipHandler { return; float renderPartialTicks = Minecraft.getInstance() - .getRenderPartialTicks(); + .getFrameTime(); ITextComponent component = subject ? Lang.createTranslationTextComponent(SUBJECT) - .formatted(TextFormatting.GREEN) + .withStyle(TextFormatting.GREEN) : makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f)); if (toolTip.size() < 2) toolTip.add(component); @@ -89,24 +89,24 @@ public class PonderTooltipHandler { protected static void updateHovered(ItemStack stack) { Minecraft instance = Minecraft.getInstance(); - Screen currentScreen = instance.currentScreen; + Screen currentScreen = instance.screen; ItemStack prevStack = trackingStack; hoveredStack = ItemStack.EMPTY; subject = false; if (currentScreen instanceof PonderUI) { PonderUI ponderUI = (PonderUI) currentScreen; - if (stack.isItemEqual(ponderUI.getSubject())) + if (stack.sameItem(ponderUI.getSubject())) subject = true; } if (stack.isEmpty()) return; - if (!PonderRegistry.all.containsKey(stack.getItem() + if (!PonderRegistry.ALL.containsKey(stack.getItem() .getRegistryName())) return; - if (prevStack.isEmpty() || !prevStack.isItemEqual(stack)) + if (prevStack.isEmpty() || !prevStack.sameItem(stack)) holdWProgress.startWithValue(0); hoveredStack = stack; @@ -119,7 +119,7 @@ public class PonderTooltipHandler { if (holdWProgress.getValue() == 0) return; float renderPartialTicks = Minecraft.getInstance() - .getRenderPartialTicks(); + .getFrameTime(); int start = event.getOriginalBorderStart(); int end = event.getOriginalBorderEnd(); float progress = Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f); @@ -140,12 +140,12 @@ public class PonderTooltipHandler { private static ITextComponent makeProgressBar(float progress) { IFormattableTextComponent holdW = Lang .translate(HOLD_TO_PONDER, - ((IFormattableTextComponent) ponderKeybind().getBoundKeyLocalizedText()).formatted(TextFormatting.GRAY)) - .formatted(TextFormatting.DARK_GRAY); + ((IFormattableTextComponent) ponderKeybind().getTranslatedKeyMessage()).withStyle(TextFormatting.GRAY)) + .withStyle(TextFormatting.DARK_GRAY); - FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; - float charWidth = fontRenderer.getStringWidth("|"); - float tipWidth = fontRenderer.getWidth(holdW); + FontRenderer fontRenderer = Minecraft.getInstance().font; + float charWidth = fontRenderer.width("|"); + float tipWidth = fontRenderer.width(holdW); int total = (int) (tipWidth / charWidth); int current = (int) (progress * total); @@ -162,7 +162,7 @@ public class PonderTooltipHandler { } protected static KeyBinding ponderKeybind() { - return Minecraft.getInstance().gameSettings.keyBindForward; + return Minecraft.getInstance().options.keyUp; } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java index 20a99833a..ae5eb3bee 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -13,6 +13,7 @@ import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; @@ -137,11 +138,11 @@ public class PonderUI extends NavigatableSimiScreen { else stack = new ItemStack(ForgeRegistries.BLOCKS.getValue(component)); - tags = new ArrayList<>(PonderRegistry.tags.getTags(component)); + tags = new ArrayList<>(PonderRegistry.TAGS.getTags(component)); this.scenes = scenes; if (scenes.isEmpty()) { List l = Collections.singletonList(new PonderStoryBoardEntry(DebugScenes::empty, - "debug/scene_1", new ResourceLocation("minecraft", "stick"))); + Create.ID, "debug/scene_1", new ResourceLocation("minecraft", "stick"))); scenes.addAll(PonderRegistry.compile(l)); } lazyIndex = LerpedFloat.linear() @@ -190,7 +191,7 @@ public class PonderUI extends NavigatableSimiScreen { }).showing(chapter)); }*/ - GameSettings bindings = client.gameSettings; + GameSettings bindings = minecraft.options; int spacing = 8; int bX = (width - 20) / 2 - (70 + 2 * spacing); int bY = height - 20 - 31; @@ -203,7 +204,7 @@ public class PonderUI extends NavigatableSimiScreen { } widgets.add(scan = new PonderButton(bX, bY) - .withShortcut(bindings.keyBindDrop) + .withShortcut(bindings.keyDrop) .showing(AllIcons.I_MTD_SCAN) .enableFade(0, 5) .withCallback(() -> { @@ -212,7 +213,7 @@ public class PonderUI extends NavigatableSimiScreen { scenes.get(index) .deselect(); else - ponderPartialTicksPaused = client.getRenderPartialTicks(); + ponderPartialTicksPaused = minecraft.getFrameTime(); })); widgets.add(slowMode = new PonderButton(width - 20 - 31, bY) @@ -229,28 +230,28 @@ public class PonderUI extends NavigatableSimiScreen { bX += 50 + spacing; widgets.add(left = new PonderButton(bX, bY) - .withShortcut(bindings.keyBindLeft) + .withShortcut(bindings.keyLeft) .showing(AllIcons.I_MTD_LEFT) .enableFade(0, 5) .withCallback(() -> this.scroll(false))); bX += 20 + spacing; widgets.add(close = new PonderButton(bX, bY) - .withShortcut(bindings.keyBindInventory) + .withShortcut(bindings.keyInventory) .showing(AllIcons.I_MTD_CLOSE) .enableFade(0, 5) .withCallback(this::onClose)); bX += 20 + spacing; widgets.add(right = new PonderButton(bX, bY) - .withShortcut(bindings.keyBindRight) + .withShortcut(bindings.keyRight) .showing(AllIcons.I_MTD_RIGHT) .enableFade(0, 5) .withCallback(() -> this.scroll(true))); bX += 50 + spacing; widgets.add(replay = new PonderButton(bX, bY) - .withShortcut(bindings.keyBindBack) + .withShortcut(bindings.keyDown) .showing(AllIcons.I_MTD_REPLAY) .enableFade(0, 5) .withCallback(this::replay)); @@ -342,9 +343,9 @@ public class PonderUI extends NavigatableSimiScreen { if (!identifyMode) return; - MainWindow w = client.getWindow(); - double mouseX = client.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); - double mouseY = client.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + MainWindow w = minecraft.getWindow(); + double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); + double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); SceneTransform t = activeScene.getTransform(); Vector3d vec1 = t.screenToScene(mouseX, mouseY, 1000, 0); Vector3d vec2 = t.screenToScene(mouseX, mouseY, -100, 0); @@ -365,11 +366,11 @@ public class PonderUI extends NavigatableSimiScreen { PonderScene scene = scenes.get(index); if (hasShiftDown()) { - List list = PonderRegistry.all.get(scene.component); + List list = PonderRegistry.ALL.get(scene.component); PonderStoryBoardEntry sb = list.get(index); - Template activeTemplate = PonderRegistry.loadSchematic(sb.getSchematicName()); - PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world); - activeTemplate.placeAndNotifyListeners(world, BlockPos.ZERO, new PlacementSettings(), new Random()); + Template activeTemplate = PonderRegistry.loadSchematic(sb.getSchematicLocation()); + PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().level); + activeTemplate.placeInWorld(world, BlockPos.ZERO, new PlacementSettings(), new Random()); world.createBackup(); scene = PonderRegistry.compileScene(index, sb, world); scene.begin(); @@ -420,7 +421,7 @@ public class PonderUI extends NavigatableSimiScreen { protected void renderScene(MatrixStack ms, int mouseX, int mouseY, int i, float partialTicks) { SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); PonderScene story = scenes.get(i); - double value = lazyIndex.getValue(client.getRenderPartialTicks()); + double value = lazyIndex.getValue(minecraft.getFrameTime()); double diff = i - value; double slide = MathHelper.lerp(diff * diff, 200, 600) * diff; @@ -433,7 +434,7 @@ public class PonderUI extends NavigatableSimiScreen { // has to be outside of MS transforms, important for vertex sorting RenderSystem.translated(0, 0, 800); - ms.push(); + ms.pushPose(); ms.translate(0, 0, -800); story.transform.updateScreenParams(width, height, slide); story.transform.apply(ms, partialTicks, false); @@ -442,13 +443,13 @@ public class PonderUI extends NavigatableSimiScreen { buffer.draw(); MutableBoundingBox bounds = story.getBounds(); - ms.push(); + ms.pushPose(); // kool shadow fx { RenderSystem.enableCull(); RenderSystem.enableDepthTest(); - ms.push(); + ms.pushPose(); ms.translate(story.basePlateOffsetX, 0, story.basePlateOffsetZ); ms.scale(1, -1, 1); @@ -461,23 +462,23 @@ public class PonderUI extends NavigatableSimiScreen { for (int f = 0; f < 4; f++) { ms.translate(story.basePlateSize, 0, 0); - ms.push(); + ms.pushPose(); ms.translate(0, 0, -1 / 1024f); if (flash > 0) { - ms.push(); + ms.pushPose(); ms.scale(1, .5f + flash * .75f, 1); - GuiUtils.drawGradientRect(ms.peek() - .getModel(), 0, 0, -1, -story.basePlateSize, 0, 0x00_c6ffc9, + GuiUtils.drawGradientRect(ms.last() + .pose(), 0, 0, -1, -story.basePlateSize, 0, 0x00_c6ffc9, ColorHelper.applyAlpha(0xaa_c6ffc9, alpha)); - ms.pop(); + ms.popPose(); } ms.translate(0, 0, 2 / 1024f); - GuiUtils.drawGradientRect(ms.peek() - .getModel(), 0, 0, 0, -story.basePlateSize, 4, 0x66_000000, 0x00_000000); - ms.pop(); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-90)); + GuiUtils.drawGradientRect(ms.last() + .pose(), 0, 0, 0, -story.basePlateSize, 4, 0x66_000000, 0x00_000000); + ms.popPose(); + ms.mulPose(Vector3f.YP.rotationDegrees(-90)); } - ms.pop(); + ms.popPose(); RenderSystem.disableCull(); RenderSystem.disableDepthTest(); } @@ -490,48 +491,48 @@ public class PonderUI extends NavigatableSimiScreen { ms.translate(1, -8, -1 / 64f); // X AXIS - ms.push(); + ms.pushPose(); ms.translate(4, -3, 0); ms.translate(0, 0, -2 / 1024f); - for (int x = 0; x <= bounds.getXSize(); x++) { + for (int x = 0; x <= bounds.getXSpan(); x++) { ms.translate(-16, 0, 0); - textRenderer.draw(ms, x == bounds.getXSize() ? "x" : "" + x, 0, 0, 0xFFFFFFFF); + font.draw(ms, x == bounds.getXSpan() ? "x" : "" + x, 0, 0, 0xFFFFFFFF); } - ms.pop(); + ms.popPose(); // Z AXIS - ms.push(); + ms.pushPose(); ms.scale(-1, 1, 1); ms.translate(0, -3, -4); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-90)); + ms.mulPose(Vector3f.YP.rotationDegrees(-90)); ms.translate(-8, -2, 2 / 64f); - for (int z = 0; z <= bounds.getZSize(); z++) { + for (int z = 0; z <= bounds.getZSpan(); z++) { ms.translate(16, 0, 0); - textRenderer.draw(ms, z == bounds.getZSize() ? "z" : "" + z, 0, 0, 0xFFFFFFFF); + font.draw(ms, z == bounds.getZSpan() ? "z" : "" + z, 0, 0, 0xFFFFFFFF); } - ms.pop(); + ms.popPose(); // DIRECTIONS - ms.push(); - ms.translate(bounds.getXSize() * -8, 0, bounds.getZSize() * 8); - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-90)); + ms.pushPose(); + ms.translate(bounds.getXSpan() * -8, 0, bounds.getZSpan() * 8); + ms.mulPose(Vector3f.YP.rotationDegrees(-90)); for (Direction d : Iterate.horizontalDirections) { - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(90)); - ms.push(); - ms.translate(0, 0, bounds.getZSize() * 16); - ms.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-90)); - textRenderer.draw(ms, d.name() + ms.mulPose(Vector3f.YP.rotationDegrees(90)); + ms.pushPose(); + ms.translate(0, 0, bounds.getZSpan() * 16); + ms.mulPose(Vector3f.XP.rotationDegrees(-90)); + font.draw(ms, d.name() .substring(0, 1), 0, 0, 0x66FFFFFF); - textRenderer.draw(ms, "|", 2, 10, 0x44FFFFFF); - textRenderer.draw(ms, ".", 2, 14, 0x22FFFFFF); - ms.pop(); + font.draw(ms, "|", 2, 10, 0x44FFFFFF); + font.draw(ms, ".", 2, 14, 0x22FFFFFF); + ms.popPose(); } - ms.pop(); + ms.popPose(); buffer.draw(); } - ms.pop(); - ms.pop(); + ms.popPose(); + ms.popPose(); RenderSystem.popMatrix(); } @@ -550,13 +551,13 @@ public class PonderUI extends NavigatableSimiScreen { int tooltipColor = Theme.i(Theme.Key.TEXT_DARKER); { // Chapter title - ms.push(); + ms.pushPose(); ms.translate(0, 0, 400); int x = 31 + 20 + 8; int y = 31; String title = activeScene.getTitle(); - int wordWrappedHeight = textRenderer.getWordWrappedHeight(title, left.x - 51); + int wordWrappedHeight = font.wordWrapHeight(title, left.x - 51); int streakHeight = 35 - 9 + wordWrappedHeight; UIRenderHelper.streak(ms, 0, x - 4, y - 12 + streakHeight / 2, streakHeight, (int) (150 * fade)); @@ -574,27 +575,27 @@ public class PonderUI extends NavigatableSimiScreen { .at(x - 39, y - 11) .render(ms); - textRenderer.draw(ms, Lang.translate(PONDERING), x, y - 6, tooltipColor); + font.draw(ms, Lang.translate(PONDERING), x, y - 6, tooltipColor); y += 8; x += 0; ms.translate(x, y, 0); - ms.multiply(Vector3f.NEGATIVE_X.getDegreesQuaternion(indexDiff * -75)); + ms.mulPose(Vector3f.XN.rotationDegrees(indexDiff * -75)); ms.translate(0, 0, 5); - FontHelper.drawSplitString(ms, textRenderer, title, 0, 0, left.x - 51, + FontHelper.drawSplitString(ms, font, title, 0, 0, left.x - 51, ColorHelper.applyAlpha(Theme.i(Theme.Key.TEXT), 1 - indexDiff)); - ms.pop(); + ms.popPose(); if (chapter != null) { - ms.push(); + ms.pushPose(); ms.translate(chap.x - 4 - 4, chap.y, 0); UIRenderHelper.streak(ms, 180, 4, 10, 26, (int) (150 * fade)); - drawRightAlignedString(textRenderer, ms, Lang.translate(IN_CHAPTER).getString(), 0, 0, tooltipColor); - drawRightAlignedString(textRenderer, ms, + drawRightAlignedString(font, ms, Lang.translate(IN_CHAPTER).getString(), 0, 0, tooltipColor); + drawRightAlignedString(font, ms, Lang.translate(LANG_PREFIX + "chapter." + chapter.getId()).getString(), 0, 12, Theme.i(Theme.Key.TEXT)); - ms.pop(); + ms.popPose(); } UIRenderHelper.breadcrumbArrow(ms, width / 2 - 20, height - 51, 0, 20, 20, 5, 0x40aa9999, 0x20aa9999); @@ -605,16 +606,16 @@ public class PonderUI extends NavigatableSimiScreen { if (identifyMode) { if (noWidgetsHovered && mouseY < height - 80) { - ms.push(); + ms.pushPose(); ms.translate(mouseX, mouseY, 100); if (hoveredTooltipItem.isEmpty()) { IFormattableTextComponent text = Lang.translate( IDENTIFY_MODE, - ((IFormattableTextComponent) client.gameSettings.keyBindDrop.getBoundKeyLocalizedText()).formatted(TextFormatting.WHITE) - ).formatted(TextFormatting.GRAY); + ((IFormattableTextComponent) minecraft.options.keyDrop.getTranslatedKeyMessage()).withStyle(TextFormatting.WHITE) + ).withStyle(TextFormatting.GRAY); //renderOrderedTooltip(ms, textRenderer.wrapLines(text, width / 3), 0, 0); - renderWrappedToolTip(ms, textRenderer.getTextHandler().wrapLines(text, width / 3, Style.EMPTY), 0, 0, textRenderer); + renderWrappedToolTip(ms, font.getSplitter().splitLines(text, width / 3, Style.EMPTY), 0, 0, font); /*String tooltip = Lang .createTranslationTextComponent(IDENTIFY_MODE, client.gameSettings.keyBindDrop.getBoundKeyLocalizedText().applyTextStyle(TextFormatting.WHITE)) .applyTextStyle(TextFormatting.GRAY) @@ -626,10 +627,10 @@ public class PonderUI extends NavigatableSimiScreen { ms.translate(0, -15, 0); boolean copied = copiedBlockPos != null && hoveredBlockPos.equals(copiedBlockPos); IFormattableTextComponent coords = new StringTextComponent(hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ()) - .formatted(copied ? TextFormatting.GREEN : TextFormatting.GOLD); + .withStyle(copied ? TextFormatting.GREEN : TextFormatting.GOLD); renderTooltip(ms, coords, 0, 0); } - ms.pop(); + ms.popPose(); } scan.flash(); } else { @@ -651,12 +652,12 @@ public class PonderUI extends NavigatableSimiScreen { { // Scene overlay float scenePT = skipCooling > 0 ? 0 : partialTicks; - ms.push(); + ms.pushPose(); ms.translate(0, 0, 100); renderOverlay(ms, index, scenePT); if (indexDiff > 1 / 512f) renderOverlay(ms, lazyIndexValue < index ? index - 1 : index + 1, scenePT); - ms.pop(); + ms.popPose(); } // Widgets @@ -682,10 +683,10 @@ public class PonderUI extends NavigatableSimiScreen { boolean highlightAll = sceneTags.contains(PonderTag.Highlight.ALL); double s = Minecraft.getInstance() .getWindow() - .getGuiScaleFactor(); + .getGuiScale(); IntStream.range(0, tagButtons.size()) .forEach(i -> { - ms.push(); + ms.pushPose(); LerpedFloat chase = tagFades.get(i); PonderButton button = tagButtons.get(i); if (button.isMouseOver(mouseX, mouseY)) { @@ -712,31 +713,31 @@ public class PonderUI extends NavigatableSimiScreen { String tagName = this.tags.get(i) .getTitle(); - textRenderer.draw(ms, tagName, 3, 8, Theme.i(Theme.Key.TEXT_ACCENT_SLIGHT)); + font.draw(ms, tagName, 3, 8, Theme.i(Theme.Key.TEXT_ACCENT_SLIGHT)); GL11.glDisable(GL11.GL_SCISSOR_TEST); - ms.pop(); + ms.popPose(); }); - ms.push(); + ms.pushPose(); ms.translate(0, 0, 500); int tooltipY = height - 16; if (scan.isHovered()) - drawCenteredText(ms, textRenderer, Lang.translate(IDENTIFY), scan.x + 10, tooltipY, tooltipColor); + drawCenteredString(ms, font, Lang.translate(IDENTIFY), scan.x + 10, tooltipY, tooltipColor); if (index != 0 && left.isHovered()) - drawCenteredText(ms, textRenderer, Lang.translate(PREVIOUS), left.x + 10, tooltipY, tooltipColor); + drawCenteredString(ms, font, Lang.translate(PREVIOUS), left.x + 10, tooltipY, tooltipColor); if (close.isHovered()) - drawCenteredText(ms, textRenderer, Lang.translate(CLOSE), close.x + 10, tooltipY, tooltipColor); + drawCenteredString(ms, font, Lang.translate(CLOSE), close.x + 10, tooltipY, tooltipColor); if (index != scenes.size() - 1 && right.isHovered()) - drawCenteredText(ms, textRenderer, Lang.translate(NEXT), right.x + 10, tooltipY, tooltipColor); + drawCenteredString(ms, font, Lang.translate(NEXT), right.x + 10, tooltipY, tooltipColor); if (replay.isHovered()) - drawCenteredText(ms, textRenderer, Lang.translate(REPLAY), replay.x + 10, tooltipY, tooltipColor); + drawCenteredString(ms, font, Lang.translate(REPLAY), replay.x + 10, tooltipY, tooltipColor); if (slowMode.isHovered()) - drawCenteredText(ms, textRenderer, Lang.translate(SLOW_TEXT), slowMode.x + 5, tooltipY, tooltipColor); + drawCenteredString(ms, font, Lang.translate(SLOW_TEXT), slowMode.x + 5, tooltipY, tooltipColor); if (PonderIndex.EDITOR_MODE && userMode.isHovered()) - drawCenteredString(ms, textRenderer, "Editor View", userMode.x + 10, tooltipY, tooltipColor); - ms.pop(); + drawCenteredString(ms, font, "Editor View", userMode.x + 10, tooltipY, tooltipColor); + ms.popPose(); RenderSystem.enableDepthTest(); } @@ -744,19 +745,19 @@ public class PonderUI extends NavigatableSimiScreen { private void renderOverlay(MatrixStack ms, int i, float partialTicks) { if (identifyMode) return; - ms.push(); + ms.pushPose(); PonderScene story = scenes.get(i); story.renderOverlay(this, ms, skipCooling > 0 ? 0 : identifyMode ? ponderPartialTicksPaused : partialTicks); - ms.pop(); + ms.popPose(); } @Override public boolean mouseClicked(double x, double y, int button) { if (identifyMode && hoveredBlockPos != null && PonderIndex.EDITOR_MODE) { - long handle = client.getWindow() - .getHandle(); + long handle = minecraft.getWindow() + .getWindow(); if (copiedBlockPos != null && button == 1) { - clipboardHelper.setClipboardString(handle, + clipboardHelper.setClipboard(handle, "util.select.fromTo(" + copiedBlockPos.getX() + ", " + copiedBlockPos.getY() + ", " + copiedBlockPos.getZ() + ", " + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ() + ")"); @@ -765,10 +766,10 @@ public class PonderUI extends NavigatableSimiScreen { } if (hasShiftDown()) - clipboardHelper.setClipboardString(handle, "util.select.position(" + hoveredBlockPos.getX() + ", " + clipboardHelper.setClipboard(handle, "util.select.position(" + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ() + ")"); else - clipboardHelper.setClipboardString(handle, "util.grid.at(" + hoveredBlockPos.getX() + ", " + clipboardHelper.setClipboard(handle, "util.grid.at(" + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ() + ")"); copiedBlockPos = hoveredBlockPos; return true; @@ -779,15 +780,15 @@ public class PonderUI extends NavigatableSimiScreen { @Override public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) { - GameSettings settings = Minecraft.getInstance().gameSettings; - int sCode = settings.keyBindBack.getKey() - .getKeyCode(); - int aCode = settings.keyBindLeft.getKey() - .getKeyCode(); - int dCode = settings.keyBindRight.getKey() - .getKeyCode(); - int qCode = settings.keyBindDrop.getKey() - .getKeyCode(); + GameSettings settings = Minecraft.getInstance().options; + int sCode = settings.keyDown.getKey() + .getValue(); + int aCode = settings.keyLeft.getKey() + .getValue(); + int dCode = settings.keyRight.getKey() + .getValue(); + int qCode = settings.keyDrop.getKey() + .getValue(); if (code == sCode) { replay(); @@ -822,12 +823,12 @@ public class PonderUI extends NavigatableSimiScreen { .getString(); return stack.getItem() - .getName() + .getDescription() .getString(); } public FontRenderer getFontRenderer() { - return textRenderer; + return font; } protected boolean isMouseOver(double mouseX, double mouseY, int x, int y, int w, int h) { @@ -839,7 +840,7 @@ public class PonderUI extends NavigatableSimiScreen { public static void renderSpeechBox(MatrixStack ms, int x, int y, int w, int h, boolean highlighted, Pointing pointing, boolean returnWithLocalTransform) { if (!returnWithLocalTransform) - ms.push(); + ms.pushPose(); int boxX = x; int boxY = y; @@ -895,20 +896,20 @@ public class PonderUI extends NavigatableSimiScreen { .withBounds(w, h) .render(ms); - ms.push(); + ms.pushPose(); ms.translate(divotX + divotRadius, divotY + divotRadius, 10); - ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(divotRotation)); + ms.mulPose(Vector3f.ZP.rotationDegrees(divotRotation)); ms.translate(-divotRadius, -divotRadius, 0); AllGuiTextures.SPEECH_TOOLTIP_BACKGROUND.draw(ms, 0, 0); AllGuiTextures.SPEECH_TOOLTIP_COLOR.draw(ms, 0, 0, c); - ms.pop(); + ms.popPose(); if (returnWithLocalTransform) { ms.translate(boxX, boxY, 0); return; } - ms.pop(); + ms.popPose(); } @@ -923,7 +924,7 @@ public class PonderUI extends NavigatableSimiScreen { @Override public boolean isEquivalentTo(NavigatableSimiScreen other) { if (other instanceof PonderUI) - return stack.isItemEqual(((PonderUI) other).stack); + return stack.sameItem(((PonderUI) other).stack); return super.isEquivalentTo(other); } @@ -937,10 +938,10 @@ public class PonderUI extends NavigatableSimiScreen { public static float getPartialTicks() { float renderPartialTicks = Minecraft.getInstance() - .getRenderPartialTicks(); + .getFrameTime(); - if (Minecraft.getInstance().currentScreen instanceof PonderUI) { - PonderUI ui = (PonderUI) Minecraft.getInstance().currentScreen; + if (Minecraft.getInstance().screen instanceof PonderUI) { + PonderUI ui = (PonderUI) Minecraft.getInstance().screen; if (ui.identifyMode) return ponderPartialTicksPaused; @@ -967,7 +968,7 @@ public class PonderUI extends NavigatableSimiScreen { public void drawRightAlignedString(FontRenderer fontRenderer, MatrixStack ms, String string, int x, int y, int color) { - fontRenderer.draw(ms, string, (float) (x - fontRenderer.getStringWidth(string)), (float) y, color); + fontRenderer.draw(ms, string, (float) (x - fontRenderer.width(string)), (float) y, color); } public boolean isComfyReadingEnabled() { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java index 83a8d7f46..aa659dc95 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -76,7 +76,7 @@ public class PonderWorld extends SchematicWorld { // ParticleManager.factories - ATs don't seem to like this one particleFactories = ObfuscationReflectionHelper.getPrivateValue(ParticleManager.class, - Minecraft.getInstance().particles, "field_178932_g"); + Minecraft.getInstance().particleEngine, "providers"); } public void createBackup() { @@ -84,8 +84,8 @@ public class PonderWorld extends SchematicWorld { originalTileEntities.clear(); blocks.forEach((k, v) -> originalBlocks.put(k, v)); tileEntities.forEach( - (k, v) -> originalTileEntities.put(k, TileEntity.createFromTag(blocks.get(k), v.write(new CompoundNBT())))); - entities.forEach(e -> EntityType.loadEntityUnchecked(e.serializeNBT(), this) + (k, v) -> originalTileEntities.put(k, TileEntity.loadStatic(blocks.get(k), v.save(new CompoundNBT())))); + entities.forEach(e -> EntityType.create(e.serializeNBT(), this) .ifPresent(originalEntities::add)); } @@ -97,12 +97,12 @@ public class PonderWorld extends SchematicWorld { renderedTileEntities.clear(); originalBlocks.forEach((k, v) -> blocks.put(k, v)); originalTileEntities.forEach((k, v) -> { - TileEntity te = TileEntity.createFromTag(originalBlocks.get(k), v.write(new CompoundNBT())); - onTEadded(te, te.getPos()); + TileEntity te = TileEntity.loadStatic(originalBlocks.get(k), v.save(new CompoundNBT())); + onTEadded(te, te.getBlockPos()); tileEntities.put(k, te); renderedTileEntities.add(te); }); - originalEntities.forEach(e -> EntityType.loadEntityUnchecked(e.serializeNBT(), this) + originalEntities.forEach(e -> EntityType.create(e.serializeNBT(), this) .ifPresent(entities::add)); particles.clearEffects(); fixControllerTileEntities(); @@ -113,9 +113,9 @@ public class PonderWorld extends SchematicWorld { if (originalBlocks.containsKey(p)) blocks.put(p, originalBlocks.get(p)); if (originalTileEntities.containsKey(p)) { - TileEntity te = TileEntity.createFromTag(originalBlocks.get(p), originalTileEntities.get(p) - .write(new CompoundNBT())); - onTEadded(te, te.getPos()); + TileEntity te = TileEntity.loadStatic(originalBlocks.get(p), originalTileEntities.get(p) + .save(new CompoundNBT())); + onTEadded(te, te.getBlockPos()); tileEntities.put(p, te); } }); @@ -136,7 +136,7 @@ public class PonderWorld extends SchematicWorld { } @Override - public int getLightLevel(LightType p_226658_1_, BlockPos p_226658_2_) { + public int getBrightness(LightType p_226658_1_, BlockPos p_226658_2_) { return overrideLight == -1 ? 15 : overrideLight; } @@ -151,46 +151,46 @@ public class PonderWorld extends SchematicWorld { @Override public BlockState getBlockState(BlockPos globalPos) { if (mask != null && !mask.test(globalPos.subtract(anchor))) - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); return super.getBlockState(globalPos); } @Override // For particle collision - public IBlockReader getExistingChunk(int p_225522_1_, int p_225522_2_) { + public IBlockReader getChunkForCollisions(int p_225522_1_, int p_225522_2_) { return this; } public void renderEntities(MatrixStack ms, SuperRenderTypeBuffer buffer, ActiveRenderInfo ari, float pt) { - Vector3d Vector3d = ari.getProjectedView(); - double d0 = Vector3d.getX(); - double d1 = Vector3d.getY(); - double d2 = Vector3d.getZ(); + Vector3d Vector3d = ari.getPosition(); + double d0 = Vector3d.x(); + double d1 = Vector3d.y(); + double d2 = Vector3d.z(); for (Entity entity : entities) { - if (entity.ticksExisted == 0) { - entity.lastTickPosX = entity.getX(); - entity.lastTickPosY = entity.getY(); - entity.lastTickPosZ = entity.getZ(); + if (entity.tickCount == 0) { + entity.xOld = entity.getX(); + entity.yOld = entity.getY(); + entity.zOld = entity.getZ(); } renderEntity(entity, d0, d1, d2, pt, ms, buffer); } - buffer.draw(RenderType.getEntitySolid(PlayerContainer.BLOCK_ATLAS_TEXTURE)); - buffer.draw(RenderType.getEntityCutout(PlayerContainer.BLOCK_ATLAS_TEXTURE)); - buffer.draw(RenderType.getEntityCutoutNoCull(PlayerContainer.BLOCK_ATLAS_TEXTURE)); - buffer.draw(RenderType.getEntitySmoothCutout(PlayerContainer.BLOCK_ATLAS_TEXTURE)); + buffer.draw(RenderType.entitySolid(PlayerContainer.BLOCK_ATLAS)); + buffer.draw(RenderType.entityCutout(PlayerContainer.BLOCK_ATLAS)); + buffer.draw(RenderType.entityCutoutNoCull(PlayerContainer.BLOCK_ATLAS)); + buffer.draw(RenderType.entitySmoothCutout(PlayerContainer.BLOCK_ATLAS)); } private void renderEntity(Entity entity, double x, double y, double z, float pt, MatrixStack ms, IRenderTypeBuffer buffer) { - double d0 = MathHelper.lerp((double) pt, entity.lastTickPosX, entity.getX()); - double d1 = MathHelper.lerp((double) pt, entity.lastTickPosY, entity.getY()); - double d2 = MathHelper.lerp((double) pt, entity.lastTickPosZ, entity.getZ()); - float f = MathHelper.lerp(pt, entity.prevRotationYaw, entity.rotationYaw); + double d0 = MathHelper.lerp((double) pt, entity.xOld, entity.getX()); + double d1 = MathHelper.lerp((double) pt, entity.yOld, entity.getY()); + double d2 = MathHelper.lerp((double) pt, entity.zOld, entity.getZ()); + float f = MathHelper.lerp(pt, entity.yRotO, entity.yRot); EntityRendererManager renderManager = Minecraft.getInstance() - .getRenderManager(); + .getEntityRenderDispatcher(); int light = renderManager.getRenderer(entity) - .getLight(entity, pt); + .getPackedLightCoords(entity, pt); renderManager.render(entity, d0 - x, d1 - y, d2 - z, f, pt, ms, buffer, light); } @@ -204,10 +204,10 @@ public class PonderWorld extends SchematicWorld { for (Iterator iterator = entities.iterator(); iterator.hasNext();) { Entity entity = iterator.next(); - entity.ticksExisted++; - entity.lastTickPosX = entity.getX(); - entity.lastTickPosY = entity.getY(); - entity.lastTickPosZ = entity.getZ(); + entity.tickCount++; + entity.xOld = entity.getX(); + entity.yOld = entity.getY(); + entity.zOld = entity.getZ(); entity.tick(); if (entity.getY() <= -.5f) @@ -224,7 +224,7 @@ public class PonderWorld extends SchematicWorld { } @Override - public void addOptionalParticle(IParticleData data, double x, double y, double z, double mx, double my, double mz) { + public void addAlwaysVisibleParticle(IParticleData data, double x, double y, double z, double mx, double my, double mz) { addParticle(data, x, y, z, mx, my, mz); } @@ -235,12 +235,12 @@ public class PonderWorld extends SchematicWorld { ResourceLocation key = ForgeRegistries.PARTICLE_TYPES.getKey(data.getType()); IParticleFactory iparticlefactory = (IParticleFactory) particleFactories.get(key); return iparticlefactory == null ? null - : iparticlefactory.makeParticle(data, asClientWorld.getValue(), x, y, z, mx, my, mz); + : iparticlefactory.createParticle(data, asClientWorld.get(), x, y, z, mx, my, mz); } @Override - public boolean setBlockState(BlockPos pos, BlockState arg1, int arg2) { - return super.setBlockState(pos, arg1, arg2); + public boolean setBlock(BlockPos pos, BlockState arg1, int arg2) { + return super.setBlock(pos, arg1, arg2); } public void addParticle(Particle p) { @@ -263,9 +263,9 @@ public class PonderWorld extends SchematicWorld { BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; if (!beltTileEntity.isController()) continue; - BlockPos controllerPos = tileEntity.getPos(); + BlockPos controllerPos = tileEntity.getBlockPos(); for (BlockPos blockPos : BeltBlock.getBeltChain(this, controllerPos)) { - TileEntity tileEntity2 = getTileEntity(blockPos); + TileEntity tileEntity2 = getBlockEntity(blockPos); if (!(tileEntity2 instanceof BeltTileEntity)) continue; BeltTileEntity belt2 = (BeltTileEntity) tileEntity2; @@ -275,14 +275,14 @@ public class PonderWorld extends SchematicWorld { if (tileEntity instanceof FluidTankTileEntity) { FluidTankTileEntity fluidTankTileEntity = (FluidTankTileEntity) tileEntity; BlockPos lastKnown = fluidTankTileEntity.getLastKnownPos(); - BlockPos current = fluidTankTileEntity.getPos(); + BlockPos current = fluidTankTileEntity.getBlockPos(); if (lastKnown == null || current == null) continue; if (fluidTankTileEntity.isController()) continue; if (!lastKnown.equals(current)) { BlockPos newControllerPos = fluidTankTileEntity.getController() - .add(current.subtract(lastKnown)); + .offset(current.subtract(lastKnown)); fluidTankTileEntity.setController(newControllerPos); } } @@ -305,7 +305,7 @@ public class PonderWorld extends SchematicWorld { if (voxelshape.isEmpty()) return; - AxisAlignedBB bb = voxelshape.getBoundingBox(); + AxisAlignedBB bb = voxelshape.bounds(); double d1 = Math.min(1.0D, bb.maxX - bb.minX); double d2 = Math.min(1.0D, bb.maxY - bb.minY); double d3 = Math.min(1.0D, bb.maxZ - bb.minZ); @@ -335,22 +335,22 @@ public class PonderWorld extends SchematicWorld { } @Override - public boolean isBlockLoaded(BlockPos pos) { + public boolean hasChunkAt(BlockPos pos) { return true; // fix particle lighting } @Override - public boolean chunkExists(int x, int y) { + public boolean hasChunk(int x, int y) { return true; // fix particle lighting } @Override - public boolean isBlockPresent(BlockPos pos) { + public boolean isLoaded(BlockPos pos) { return true; // fix particle lighting } @Override - public boolean isPlayerWithin(double p_217358_1_, double p_217358_3_, double p_217358_5_, double p_217358_7_) { + public boolean hasNearbyAlivePlayer(double p_217358_1_, double p_217358_3_, double p_217358_5_, double p_217358_7_) { return true; // always enable spawner animations } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java index 6fad6cdb3..79ce37930 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java @@ -61,9 +61,9 @@ public class PonderWorldParticles { public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo renderInfo, float pt) { Minecraft mc = Minecraft.getInstance(); - LightTexture lightTexture = mc.gameRenderer.getLightmapTextureManager(); + LightTexture lightTexture = mc.gameRenderer.lightTexture(); - lightTexture.enableLightmap(); + lightTexture.turnOnLightLayer(); Runnable enable = () -> { RenderSystem.enableAlphaTest(); RenderSystem.defaultAlphaFunc(); @@ -71,8 +71,8 @@ public class PonderWorldParticles { RenderSystem.enableFog(); }; RenderSystem.pushMatrix(); - RenderSystem.multMatrix(ms.peek() - .getModel()); + RenderSystem.multMatrix(ms.last() + .pose()); for (IParticleRenderType iparticlerendertype : this.byType.keySet()) { if (iparticlerendertype == IParticleRenderType.NO_RENDER) @@ -82,13 +82,13 @@ public class PonderWorldParticles { if (iterable != null) { RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuffer(); - iparticlerendertype.beginRender(bufferbuilder, mc.textureManager); + BufferBuilder bufferbuilder = tessellator.getBuilder(); + iparticlerendertype.begin(bufferbuilder, mc.textureManager); for (Particle particle : iterable) - particle.buildGeometry(bufferbuilder, renderInfo, pt); + particle.render(bufferbuilder, renderInfo, pt); - iparticlerendertype.finishRender(tessellator); + iparticlerendertype.end(tessellator); } } @@ -97,7 +97,7 @@ public class PonderWorldParticles { RenderSystem.depthFunc(515); RenderSystem.disableBlend(); RenderSystem.defaultAlphaFunc(); - lightTexture.disableLightmap(); + lightTexture.turnOffLightLayer(); RenderSystem.disableFog(); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java index ed7868ae3..108351609 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -76,6 +76,7 @@ import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3d; @@ -136,8 +137,8 @@ public class SceneBuilder { * @param title */ public void title(String sceneId, String title) { - scene.sceneId = sceneId; - PonderLocalization.registerSpecific(sceneId, PonderScene.TITLE_KEY, title); + scene.sceneId = new ResourceLocation(scene.namespace, sceneId); + PonderLocalization.registerSpecific(scene.sceneId, PonderScene.TITLE_KEY, title); } /** @@ -264,7 +265,7 @@ public class SceneBuilder { private void rotationIndicator(BlockPos pos, boolean direction) { addInstruction(scene -> { BlockState blockState = scene.world.getBlockState(pos); - TileEntity tileEntity = scene.world.getTileEntity(pos); + TileEntity tileEntity = scene.world.getBlockEntity(pos); if (!(blockState.getBlock() instanceof KineticBlock)) return; @@ -564,7 +565,7 @@ public class SceneBuilder { } public void destroyBlock(BlockPos pos) { - setBlock(pos, Blocks.AIR.getDefaultState(), true); + setBlock(pos, Blocks.AIR.defaultBlockState(), true); } public void setBlock(BlockPos pos, BlockState state, boolean spawnParticles) { @@ -581,7 +582,7 @@ public class SceneBuilder { public void cycleBlockProperty(BlockPos pos, Property property) { modifyBlocks(scene.getSceneBuildingUtil().select.position(pos), - s -> s.contains(property) ? s.cycle(property) : s, false); + s -> s.hasProperty(property) ? s.cycle(property) : s, false); } public void modifyBlocks(Selection selection, UnaryOperator stateFunc, boolean spawnParticles) { @@ -590,11 +591,11 @@ public class SceneBuilder { public void toggleRedstonePower(Selection selection) { modifyBlocks(selection, s -> { - if (s.contains(BlockStateProperties.POWER_0_15)) - s = s.with(BlockStateProperties.POWER_0_15, s.get(BlockStateProperties.POWER_0_15) == 0 ? 15 : 0); - if (s.contains(BlockStateProperties.POWERED)) + if (s.hasProperty(BlockStateProperties.POWER)) + s = s.setValue(BlockStateProperties.POWER, s.getValue(BlockStateProperties.POWER) == 0 ? 15 : 0); + if (s.hasProperty(BlockStateProperties.POWERED)) s = s.cycle(BlockStateProperties.POWERED); - if (s.contains(RedstoneTorchBlock.LIT)) + if (s.hasProperty(RedstoneTorchBlock.LIT)) s = s.cycle(RedstoneTorchBlock.LIT); return s; }, false); @@ -607,7 +608,7 @@ public class SceneBuilder { public void modifyEntitiesInside(Class entityClass, Selection area, Consumer entityCallBack) { addInstruction(scene -> scene.forEachWorldEntity(entityClass, e -> { - if (area.test(e.getBlockPos())) + if (area.test(e.blockPosition())) entityCallBack.accept(e); })); } @@ -628,7 +629,7 @@ public class SceneBuilder { EntityElement handle = new EntityElement(entity); scene.addElement(handle); scene.linkElement(handle, link); - world.addEntity(entity); + world.addFreshEntity(entity); }); return link; } @@ -636,7 +637,7 @@ public class SceneBuilder { public ElementLink createItemEntity(Vector3d location, Vector3d motion, ItemStack stack) { return createEntity(world -> { ItemEntity itemEntity = new ItemEntity(world, location.x, location.y, location.z, stack); - itemEntity.setMotion(motion); + itemEntity.setDeltaMovement(motion); return itemEntity; }); } @@ -649,7 +650,7 @@ public class SceneBuilder { public void createItemOnBeltLike(BlockPos location, Direction insertionSide, ItemStack stack) { addInstruction(scene -> { PonderWorld world = scene.getWorld(); - TileEntity tileEntity = world.getTileEntity(location); + TileEntity tileEntity = world.getBlockEntity(location); if (!(tileEntity instanceof SmartTileEntity)) return; SmartTileEntity beltTileEntity = (SmartTileEntity) tileEntity; @@ -658,7 +659,7 @@ public class SceneBuilder { return; behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); }); - flapFunnel(location.up(), true); + flapFunnel(location.above(), true); } public ElementLink createItemOnBelt(BlockPos beltLocation, Direction insertionSide, @@ -666,7 +667,7 @@ public class SceneBuilder { ElementLink link = new ElementLink<>(BeltItemElement.class); addInstruction(scene -> { PonderWorld world = scene.getWorld(); - TileEntity tileEntity = world.getTileEntity(beltLocation); + TileEntity tileEntity = world.getBlockEntity(beltLocation); if (!(tileEntity instanceof BeltTileEntity)) return; @@ -687,14 +688,14 @@ public class SceneBuilder { return TransportedResult.doNothing(); }); }); - flapFunnel(beltLocation.up(), true); + flapFunnel(beltLocation.above(), true); return link; } public void removeItemsFromBelt(BlockPos beltLocation) { addInstruction(scene -> { PonderWorld world = scene.getWorld(); - TileEntity tileEntity = world.getTileEntity(beltLocation); + TileEntity tileEntity = world.getBlockEntity(beltLocation); if (!(tileEntity instanceof SmartTileEntity)) return; SmartTileEntity beltTileEntity = (SmartTileEntity) tileEntity; @@ -757,7 +758,7 @@ public class SceneBuilder { public void modifyTileEntity(BlockPos position, Class teType, Consumer consumer) { addInstruction(scene -> { - TileEntity tileEntity = scene.world.getTileEntity(position); + TileEntity tileEntity = scene.world.getBlockEntity(position); if (teType.isInstance(tileEntity)) consumer.accept(teType.cast(tileEntity)); }); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java index a7eed2600..3af92af68 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java @@ -61,7 +61,7 @@ public class SceneBuildingUtil { } public Vector3d blockSurface(BlockPos pos, Direction face, float margin) { - return centerOf(pos).add(Vector3d.of(face.getDirectionVec()) + return centerOf(pos).add(Vector3d.atLowerCornerOf(face.getNormal()) .scale(.5f + margin)); } @@ -94,7 +94,7 @@ public class SceneBuildingUtil { } public Selection column(int x, int z) { - return cuboid(new BlockPos(x, 1, z), new Vector3i(0, sceneBounds.getYSize(), 0)); + return cuboid(new BlockPos(x, 1, z), new Vector3i(0, sceneBounds.getYSpan(), 0)); } public Selection layer(int y) { @@ -102,16 +102,16 @@ public class SceneBuildingUtil { } public Selection layersFrom(int y) { - return layers(y, sceneBounds.getYSize() - y); + return layers(y, sceneBounds.getYSpan() - y); } public Selection layers(int y, int height) { - return cuboid(new BlockPos(0, y, 0), new Vector3i(sceneBounds.getXSize() - 1, - Math.min(sceneBounds.getYSize() - y, height) - 1, sceneBounds.getZSize() - 1)); + return cuboid(new BlockPos(0, y, 0), new Vector3i(sceneBounds.getXSpan() - 1, + Math.min(sceneBounds.getYSpan() - y, height) - 1, sceneBounds.getZSpan() - 1)); } public Selection cuboid(BlockPos origin, Vector3i size) { - return Selection.of(new MutableBoundingBox(origin, origin.add(size))); + return Selection.of(new MutableBoundingBox(origin, origin.offset(size))); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/Selection.java b/src/main/java/com/simibubi/create/foundation/ponder/Selection.java index 4541f1cbe..f0885bce1 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/Selection.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/Selection.java @@ -56,14 +56,14 @@ public abstract class Selection implements Predicate { @Override public Selection add(Selection other) { - other.forEach(p -> posSet.add(p.toImmutable())); + other.forEach(p -> posSet.add(p.immutable())); center = null; return this; } @Override public Selection substract(Selection other) { - other.forEach(p -> posSet.remove(p.toImmutable())); + other.forEach(p -> posSet.remove(p.immutable())); center = null; return this; } @@ -88,7 +88,7 @@ public abstract class Selection implements Predicate { if (posSet.isEmpty()) return center; for (BlockPos blockPos : posSet) - center = center.add(Vector3d.of(blockPos)); + center = center.add(Vector3d.atLowerCornerOf(blockPos)); center = center.scale(1f / posSet.size()); return center.add(new Vector3d(.5, .5, .5)); } @@ -112,7 +112,7 @@ public abstract class Selection implements Predicate { @Override public boolean test(BlockPos t) { - return bb.isVecInside(t); + return bb.isInside(t); } @Override @@ -127,7 +127,7 @@ public abstract class Selection implements Predicate { @Override public void forEach(Consumer callback) { - BlockPos.stream(bb) + BlockPos.betweenClosedStream(bb) .forEach(callback); } @@ -142,7 +142,7 @@ public abstract class Selection implements Predicate { } private AxisAlignedBB getAABB() { - return new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX + 1, bb.maxY + 1, bb.maxZ + 1); + return new AxisAlignedBB(bb.x0, bb.y0, bb.z0, bb.x1 + 1, bb.y1 + 1, bb.z1 + 1); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java index af26370f7..4ba0e1116 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java @@ -56,8 +56,8 @@ public class ArmScenes { scene.overlay.showControls(new InputWindowElement(depotSurface, Pointing.RIGHT).rightClick() .withItem(armItem), 50); scene.idle(7); - AxisAlignedBB depotBounds = AllShapes.DEPOT.getBoundingBox(); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.offset(4, 2, 1), 400); + AxisAlignedBB depotBounds = AllShapes.DEPOT.bounds(); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(4, 2, 1), 400); scene.overlay.showText(70) .attachKeyFrame() @@ -74,11 +74,11 @@ public class ArmScenes { scene.overlay.showControls(input, 20); scene.idle(7); Object second = new Object(); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, second, depotBounds.offset(0, 2, 1), 100); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, second, depotBounds.move(0, 2, 1), 100); scene.idle(25); scene.overlay.showControls(input, 30); scene.idle(7); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, second, depotBounds.offset(0, 2, 1), 280); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, second, depotBounds.move(0, 2, 1), 280); scene.overlay.showText(70) .colored(PonderPalette.OUTPUT) .text("Right-Click again to toggle between Input (Blue) and Output (Orange)") @@ -88,7 +88,7 @@ public class ArmScenes { scene.idle(80); scene.world.showSection(util.select.position(1, 1, 0), Direction.DOWN); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.offset(1, 1, 0), 43); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(1, 1, 0), 43); scene.overlay.showText(50) .colored(PonderPalette.WHITE) @@ -138,15 +138,15 @@ public class ArmScenes { scene.world.showSection(util.select.position(4, 1, 2), Direction.DOWN); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, new Object(), depotBounds.offset(0, 2, 1), 60); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, new Object(), depotBounds.move(0, 2, 1), 60); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.offset(4, 2, 1), 60); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(4, 2, 1), 60); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, new Object(), depotBounds.offset(1, 1, 0), 60); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, new Object(), depotBounds.move(1, 1, 0), 60); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.offset(1, 3, 4), 60); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(1, 3, 4), 60); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.offset(4, 1, 2), 60); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(4, 1, 2), 60); scene.idle(5); scene.overlay.showText(80) @@ -191,8 +191,8 @@ public class ArmScenes { AxisAlignedBB chestBounds = new AxisAlignedBB(1 / 16f, 0, 1 / 16f, 15 / 16f, 14 / 16f, 15 / 16f); AxisAlignedBB funnelBounds = new AxisAlignedBB(0, 0, 8 / 16f, 16 / 16f, 16 / 16f, 16 / 16f); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, in, chestBounds.offset(4, 2, 3), 120); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, out, chestBounds.offset(0, 2, 3), 120); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, in, chestBounds.move(4, 2, 3), 120); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, out, chestBounds.move(0, 2, 3), 120); scene.overlay.showText(80) .attachKeyFrame() .text("However, not every type of Inventory can be interacted with directly") @@ -206,9 +206,9 @@ public class ArmScenes { scene.world.showSection(util.select.position(0, 2, 2), Direction.SOUTH); scene.idle(10); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, depotBounds.offset(4, 1, 2), 80); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, depotBounds.move(4, 1, 2), 80); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, funnelBounds.offset(0, 2, 2), 80); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, funnelBounds.move(0, 2, 2), 80); scene.idle(5); scene.overlay.showText(60) @@ -381,7 +381,7 @@ public class ArmScenes { public static void modes(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_arm_modes", "Distribution modes of the Mechanical Arm"); scene.configureBasePlate(0, 1, 5); - scene.world.setBlock(util.grid.at(3, 1, 0), Blocks.BARRIER.getDefaultState(), false); + scene.world.setBlock(util.grid.at(3, 1, 0), Blocks.BARRIER.defaultBlockState(), false); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); @@ -392,20 +392,20 @@ public class ArmScenes { scene.world.showSection(util.select.fromTo(1, 1, 1, 5, 1, 2), Direction.SOUTH); scene.idle(10); - AxisAlignedBB depotBox = AllShapes.DEPOT.getBoundingBox(); + AxisAlignedBB depotBox = AllShapes.DEPOT.bounds(); AxisAlignedBB beltBox = depotBox.contract(0, -3 / 16f, 0) - .grow(1, 0, 0); + .inflate(1, 0, 0); BlockPos depotPos = util.grid.at(1, 1, 4); BlockPos armPos = util.grid.at(3, 1, 4); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, depotBox, depotBox.offset(1, 1, 4), 60); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, depotBox, depotBox.move(1, 1, 4), 60); scene.overlay.showText(30) .text("Input") .pointAt(util.vector.blockSurface(depotPos, Direction.WEST)) .placeNearTarget() .colored(PonderPalette.INPUT); scene.idle(40); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, depotBox, beltBox.offset(2, 1, 2), 40); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, depotBox, beltBox.move(2, 1, 2), 40); scene.overlay.showText(40) .text("Outputs") .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.WEST)) @@ -468,13 +468,13 @@ public class ArmScenes { if (i == 12) { scene.world.moveSection(blockage, util.vector.of(-1, 0, 0), 10); - scene.world.setBlock(util.grid.at(3, 1, 0), Blocks.BARRIER.getDefaultState(), false); + scene.world.setBlock(util.grid.at(3, 1, 0), Blocks.BARRIER.defaultBlockState(), false); } int index = i % 3; if (i == 13) { - scene.world.setBlock(util.grid.at(2, 1, 0), Blocks.BARRIER.getDefaultState(), false); + scene.world.setBlock(util.grid.at(2, 1, 0), Blocks.BARRIER.defaultBlockState(), false); ElementLink blockage2 = scene.world.showIndependentSection(util.select.position(4, 1, 0), Direction.UP); scene.world.moveSection(blockage2, util.vector.of(-2, 0, 0), 0); @@ -510,7 +510,7 @@ public class ArmScenes { .colored(PonderPalette.RED); scene.idle(40); scene.world.moveSection(blockage, util.vector.of(1, 0, 0), 10); - scene.world.setBlock(util.grid.at(3, 1, 0), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(3, 1, 0), Blocks.AIR.defaultBlockState(), false); scene.idle(50); scene.world.multiplyKineticSpeed(util.select.fromTo(1, 1, 1, 5, 0, 3), 2); } @@ -557,7 +557,7 @@ public class ArmScenes { scene.overlay.showText(60) .colored(PonderPalette.RED) .attachKeyFrame() - .pointAt(util.vector.topOf(armPos.up())) + .pointAt(util.vector.topOf(armPos.above())) .placeNearTarget() .text("When powered by Redstone, Mechanical Arms will not activate"); scene.idle(70); @@ -582,7 +582,7 @@ public class ArmScenes { scene.world.toggleRedstonePower(redstone); scene.effects.indicateRedstone(leverPos); scene.overlay.showText(60) - .pointAt(util.vector.topOf(armPos.up())) + .pointAt(util.vector.topOf(armPos.above())) .placeNearTarget() .text("Before stopping, it will finish any started cycles"); } @@ -593,7 +593,7 @@ public class ArmScenes { scene.overlay.showText(100) .colored(PonderPalette.GREEN) .attachKeyFrame() - .pointAt(util.vector.topOf(armPos.up())) + .pointAt(util.vector.topOf(armPos.above())) .placeNearTarget() .text("Thus, a negative pulse can be used to trigger exactly one activation cycle"); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java index 34d878e95..394241ae8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java @@ -31,7 +31,7 @@ public class BearingScenes { scene.world.showSection(util.select.fromTo(1, 0, 1, 5, 0, 5), Direction.UP); scene.world.setBlock(util.grid.at(2, -1, 0), AllBlocks.SAIL.getDefaultState() - .with(SailBlock.FACING, Direction.NORTH), false); + .setValue(SailBlock.FACING, Direction.NORTH), false); scene.idle(5); Selection kinetics = util.select.fromTo(3, 1, 1, 4, 1, 4); Selection largeCog = util.select.position(3, 2, 2); @@ -56,35 +56,35 @@ public class BearingScenes { scene.idle(10); for (Direction d : Iterate.directions) if (d.getAxis() != Axis.Z) - scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.offset(d, 1), anchorPos.offset(d, 2)), + scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.relative(d, 1), anchorPos.relative(d, 2)), d.getOpposite(), structure); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.up() + scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.above() .east(), - anchorPos.up(3) + anchorPos.above(3) .east()), Direction.WEST, structure); - scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.down() + scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.below() .west(), - anchorPos.down(3) + anchorPos.below(3) .west()), Direction.EAST, structure); scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.east() - .down(), + .below(), anchorPos.east(3) - .down()), + .below()), Direction.UP, structure); scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.west() - .up(), + .above(), anchorPos.west(3) - .up()), + .above()), Direction.DOWN, structure); scene.idle(5); for (Direction d : Iterate.directions) if (d.getAxis() != Axis.Z) - scene.effects.superGlue(anchorPos.offset(d, 1), d.getOpposite(), false); + scene.effects.superGlue(anchorPos.relative(d, 1), d.getOpposite(), false); scene.idle(10); scene.overlay.showText(60) @@ -166,7 +166,7 @@ public class BearingScenes { scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); scene.idle(10); ElementLink contraption = - scene.world.showIndependentSection(util.select.position(bearingPos.up()), Direction.DOWN); + scene.world.showIndependentSection(util.select.position(bearingPos.above()), Direction.DOWN); scene.idle(10); scene.world.showSectionAndMerge(util.select.fromTo(3, 2, 2, 3, 3, 1), Direction.SOUTH, contraption); scene.world.showSectionAndMerge(util.select.fromTo(3, 2, 4, 3, 3, 5), Direction.NORTH, contraption); @@ -177,8 +177,8 @@ public class BearingScenes { scene.world.showSectionAndMerge(util.select.position(2, 1, 5), Direction.EAST, contraption); scene.world.showSectionAndMerge(util.select.position(3, 3, 3), Direction.DOWN, contraption); scene.idle(5); - scene.effects.superGlue(bearingPos.up(), Direction.SOUTH, true); - scene.effects.superGlue(bearingPos.up(), Direction.NORTH, true); + scene.effects.superGlue(bearingPos.above(), Direction.SOUTH, true); + scene.effects.superGlue(bearingPos.above(), Direction.NORTH, true); scene.idle(5); scene.effects.superGlue(util.grid.at(3, 1, 5), Direction.UP, true); scene.idle(5); @@ -226,7 +226,7 @@ public class BearingScenes { .add(cog4); BlockPos bearingPos = util.grid.at(3, 2, 3); - scene.overlay.showSelectionWithText(util.select.position(bearingPos.up()), 60) + scene.overlay.showSelectionWithText(util.select.position(bearingPos.above()), 60) .colored(PonderPalette.GREEN) .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) .placeNearTarget() @@ -234,7 +234,7 @@ public class BearingScenes { .text("Mechanical Bearings attach to the block in front of them"); scene.idle(50); - ElementLink plank = scene.world.showIndependentSection(util.select.position(bearingPos.up() + ElementLink plank = scene.world.showIndependentSection(util.select.position(bearingPos.above() .east() .north()), Direction.DOWN); scene.world.moveSection(plank, util.vector.of(-1, 0, 1), 0); @@ -244,12 +244,12 @@ public class BearingScenes { scene.world.setKineticSpeed(cog2, 8); scene.world.setKineticSpeed(cog3, -16); scene.world.setKineticSpeed(cog4, 16); - scene.effects.rotationSpeedIndicator(bearingPos.down()); + scene.effects.rotationSpeedIndicator(bearingPos.below()); scene.world.rotateBearing(bearingPos, 360, 37 * 2); scene.world.rotateSection(plank, 0, 360, 0, 37 * 2); scene.overlay.showText(80) - .pointAt(util.vector.topOf(bearingPos.up())) + .pointAt(util.vector.topOf(bearingPos.above())) .placeNearTarget() .attachKeyFrame() .text("Upon receiving Rotational Force, it will assemble it into a Rotating Contraption"); @@ -273,12 +273,12 @@ public class BearingScenes { scene.world.setKineticSpeed(cog2, 8); scene.world.setKineticSpeed(cog3, -16); scene.world.setKineticSpeed(cog4, 16); - scene.effects.rotationSpeedIndicator(bearingPos.down()); + scene.effects.rotationSpeedIndicator(bearingPos.below()); scene.world.rotateBearing(bearingPos, 360 * 2, 37 * 4); scene.world.rotateSection(contraption, 0, 360 * 2, 0, 37 * 4); scene.overlay.showText(120) - .pointAt(util.vector.topOf(bearingPos.up())) + .pointAt(util.vector.topOf(bearingPos.above())) .placeNearTarget() .attachKeyFrame() .sharedText("movement_anchors"); @@ -329,7 +329,7 @@ public class BearingScenes { scene.world.rotateSection(contraption, 0, 35, 0, 0); scene.world.rotateBearing(bearingPos, 35, 0); - Vector3d target = util.vector.topOf(bearingPos.down()); + Vector3d target = util.vector.topOf(bearingPos.below()); scene.overlay.showLine(PonderPalette.RED, target.add(-2.5, 0, 3.5), target, 50); scene.overlay.showLine(PonderPalette.GREEN, target.add(0, 0, 4.5), target, 50); @@ -606,16 +606,16 @@ public class BearingScenes { scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); scene.idle(5); ElementLink plank = - scene.world.showIndependentSection(util.select.position(bearingPos.up()), Direction.DOWN); + scene.world.showIndependentSection(util.select.position(bearingPos.above()), Direction.DOWN); scene.idle(10); for (int i = 0; i < 3; i++) { for (Direction d : Iterate.horizontalDirections) { - BlockPos location = bearingPos.up(i + 1) - .offset(d); + BlockPos location = bearingPos.above(i + 1) + .relative(d); if (frame) scene.world.modifyBlock(location, s -> AllBlocks.SAIL_FRAME.getDefaultState() - .with(SailBlock.FACING, s.get(SailBlock.FACING)), false); + .setValue(SailBlock.FACING, s.getValue(SailBlock.FACING)), false); scene.world.showSectionAndMerge(util.select.position(location), d.getOpposite(), plank); scene.idle(2); } @@ -628,7 +628,7 @@ public class BearingScenes { .attachKeyFrame(); scene.idle(80); - scene.overlay.showSelectionWithText(util.select.position(bearingPos.up()), 80) + scene.overlay.showSelectionWithText(util.select.position(bearingPos.above()), 80) .colored(PonderPalette.GREEN) .text("They will attach to blocks and each other without the need of Super Glue or Chassis Blocks") .attachKeyFrame() @@ -650,7 +650,7 @@ public class BearingScenes { scene.overlay.showControls(input, 30); scene.idle(7); scene.world.setBlock(util.grid.at(2, 3, 1), AllBlocks.DYED_SAILS.get(DyeColor.BLUE).getDefaultState() - .with(SailBlock.FACING, Direction.WEST), false); + .setValue(SailBlock.FACING, Direction.WEST), false); scene.idle(10); scene.overlay.showText(40) .colored(PonderPalette.BLUE) @@ -663,7 +663,7 @@ public class BearingScenes { scene.idle(7); scene.world.replaceBlocks(util.select.fromTo(2, 2, 1, 2, 4, 1), AllBlocks.DYED_SAILS.get(DyeColor.BLUE).getDefaultState() - .with(SailBlock.FACING, Direction.WEST), + .setValue(SailBlock.FACING, Direction.WEST), false); scene.idle(20); @@ -678,7 +678,7 @@ public class BearingScenes { scene.overlay.showControls(input, 30); scene.idle(7); scene.world.setBlock(util.grid.at(3, 3, 2), AllBlocks.SAIL_FRAME.getDefaultState() - .with(SailBlock.FACING, Direction.NORTH), false); + .setValue(SailBlock.FACING, Direction.NORTH), false); scene.idle(10); scene.overlay.showText(40) .text("Right-Click with Shears to turn them back into frames") @@ -689,7 +689,7 @@ public class BearingScenes { scene.overlay.showControls(input, 30); scene.idle(7); scene.world.replaceBlocks(util.select.fromTo(3, 2, 2, 3, 4, 2), AllBlocks.SAIL_FRAME.getDefaultState() - .with(SailBlock.FACING, Direction.NORTH), false); + .setValue(SailBlock.FACING, Direction.NORTH), false); scene.idle(20); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java index a2d45e769..aabb1480d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java @@ -61,15 +61,15 @@ public class BeltScenes { Vector3d backEndCenter = util.vector.centerOf(backEnd); AxisAlignedBB connectBB = new AxisAlignedBB(backEndCenter, backEndCenter); AxisAlignedBB shaftBB = AllBlocks.SHAFT.getDefaultState() - .with(ShaftBlock.AXIS, Axis.Z) + .setValue(ShaftBlock.AXIS, Axis.Z) .getShape(null, null) - .getBoundingBox(); + .bounds(); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(backEnd), Pointing.DOWN).rightClick() .withItem(beltItem), 57); scene.idle(7); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, backEnd, shaftBB.offset(backEnd), 42); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, backEnd, shaftBB.move(backEnd), 42); scene.overlay.chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB, 50); scene.idle(20); @@ -77,8 +77,8 @@ public class BeltScenes { .withItem(beltItem), 37); scene.idle(7); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, frontEnd, shaftBB.offset(frontEnd), 17); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB.expand(-4, 0, 0), 20); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, frontEnd, shaftBB.move(frontEnd), 17); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB.expandTowards(-4, 0, 0), 20); scene.idle(20); scene.world.moveSection(shafts, util.vector.of(0, -2, 0), 0); @@ -96,7 +96,7 @@ public class BeltScenes { scene.overlay.showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick() .withItem(beltItem), 37); scene.idle(7); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, backEnd, shaftBB.offset(backEnd.south(1)), 50); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, backEnd, shaftBB.move(backEnd.south(1)), 50); scene.overlay.showText(80) .colored(PonderPalette.RED) @@ -115,7 +115,7 @@ public class BeltScenes { scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftLocation), Pointing.DOWN).rightClick() .withItem(AllBlocks.SHAFT.asStack()), 50); scene.idle(7); - scene.world.modifyBlock(shaftLocation, s -> s.with(BeltBlock.PART, BeltPart.PULLEY), true); + scene.world.modifyBlock(shaftLocation, s -> s.setValue(BeltBlock.PART, BeltPart.PULLEY), true); scene.idle(10); scene.overlay.showText(43) @@ -145,7 +145,7 @@ public class BeltScenes { scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftLocation), Pointing.DOWN).rightClick() .withWrench(), 50); scene.idle(7); - scene.world.modifyBlock(shaftLocation, s -> s.with(BeltBlock.PART, BeltPart.MIDDLE), true); + scene.world.modifyBlock(shaftLocation, s -> s.setValue(BeltBlock.PART, BeltPart.MIDDLE), true); scene.idle(10); scene.overlay.showText(50) .text("Added shafts can be removed using the wrench") @@ -412,13 +412,13 @@ public class BeltScenes { scene.overlay.showControls(new InputWindowElement(util.vector.topOf(beltPos), Pointing.DOWN).rightClick() .withItem(brassCasingItem), 20); scene.idle(7); - scene.world.modifyBlock(beltPos, s -> s.with(BeltBlock.CASING, true), true); + scene.world.modifyBlock(beltPos, s -> s.setValue(BeltBlock.CASING, true), true); scene.idle(20); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(beltPos2), Pointing.DOWN).rightClick() .withItem(andesiteCasingItem), 20); scene.idle(7); - scene.world.modifyBlock(beltPos2, s -> s.with(BeltBlock.CASING, true), true); + scene.world.modifyBlock(beltPos2, s -> s.setValue(BeltBlock.CASING, true), true); scene.world.modifyTileNBT(util.select.position(beltPos2), BeltTileEntity.class, nbt -> { NBTHelper.writeEnum(nbt, "Casing", BeltTileEntity.CasingType.ANDESITE); }); @@ -429,7 +429,7 @@ public class BeltScenes { .withItem(brassCasingItem), 20); scene.idle(7); - scene.world.modifyBlock(beltPos3, s -> s.with(BeltBlock.CASING, true), true); + scene.world.modifyBlock(beltPos3, s -> s.setValue(BeltBlock.CASING, true), true); scene.idle(20); scene.overlay.showText(80) @@ -446,7 +446,7 @@ public class BeltScenes { brassBelts.add(beltPos.south(z)); for (int x = 1; x <= 3; x++) brassBelts.add(beltPos3.east(x) - .down(x)); + .below(x)); for (int x = 1; x <= 3; x++) andesiteBelts.add(beltPos2.east(x)); @@ -455,14 +455,14 @@ public class BeltScenes { for (BlockPos pos : andesiteBelts) { scene.idle(4); - scene.world.modifyBlock(pos, s -> s.with(BeltBlock.CASING, true), true); + scene.world.modifyBlock(pos, s -> s.setValue(BeltBlock.CASING, true), true); scene.world.modifyTileNBT(util.select.position(pos), BeltTileEntity.class, nbt -> { NBTHelper.writeEnum(nbt, "Casing", BeltTileEntity.CasingType.ANDESITE); }); } for (BlockPos pos : brassBelts) { scene.idle(4); - scene.world.modifyBlock(pos, s -> s.with(BeltBlock.CASING, true), true); + scene.world.modifyBlock(pos, s -> s.setValue(BeltBlock.CASING, true), true); } scene.idle(30); scene.addKeyframe(); @@ -471,7 +471,7 @@ public class BeltScenes { .showControls(new InputWindowElement(util.vector.topOf(beltPos.south()), Pointing.DOWN).rightClick() .withWrench(), 40); scene.idle(7); - scene.world.modifyBlock(beltPos.south(), s -> s.with(BeltBlock.CASING, false), true); + scene.world.modifyBlock(beltPos.south(), s -> s.setValue(BeltBlock.CASING, false), true); scene.overlay.showText(80) .text("A wrench can be used to remove the casing") .placeNearTarget() @@ -483,7 +483,7 @@ public class BeltScenes { scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); scene.idle(5); - scene.world.setBlock(util.grid.at(3, 2, 2), Blocks.WATER.getDefaultState(), false); + scene.world.setBlock(util.grid.at(3, 2, 2), Blocks.WATER.defaultBlockState(), false); BlockPos depotPos = util.grid.at(2, 1, 2); scene.world.showSection(util.select.position(2, 1, 2), Direction.DOWN); @@ -513,31 +513,31 @@ public class BeltScenes { scene.effects.indicateSuccess(depotPos); scene.idle(20); - scene.world.showSection(util.select.position(depotPos.up(2)), Direction.SOUTH); + scene.world.showSection(util.select.position(depotPos.above(2)), Direction.SOUTH); scene.overlay.showText(70) .attachKeyFrame() .text("Just like Mechanical Belts, it can provide items to processing") .placeNearTarget() - .pointAt(util.vector.blockSurface(depotPos.up(2), Direction.WEST)); + .pointAt(util.vector.blockSurface(depotPos.above(2), Direction.WEST)); ItemStack bottle = new ItemStack(Items.BUCKET); scene.world.createItemOnBeltLike(depotPos, Direction.NORTH, bottle); scene.idle(20); - scene.world.modifyTileNBT(util.select.position(depotPos.up(2)), SpoutTileEntity.class, + scene.world.modifyTileNBT(util.select.position(depotPos.above(2)), SpoutTileEntity.class, nbt -> nbt.putInt("ProcessingTicks", 20)); scene.idle(20); scene.world.removeItemsFromBelt(depotPos); scene.world.createItemOnBeltLike(depotPos, Direction.UP, new ItemStack(Items.WATER_BUCKET)); - scene.world.modifyTileNBT(util.select.position(depotPos.up(2)), SpoutTileEntity.class, + scene.world.modifyTileNBT(util.select.position(depotPos.above(2)), SpoutTileEntity.class, nbt -> nbt.putBoolean("Splash", true)); scene.idle(30); scene.world.removeItemsFromBelt(depotPos); - scene.world.hideSection(util.select.position(depotPos.up(2)), Direction.SOUTH); + scene.world.hideSection(util.select.position(depotPos.above(2)), Direction.SOUTH); scene.idle(20); - ElementLink spout = scene.world.showIndependentSection(util.select.position(depotPos.up(2) + ElementLink spout = scene.world.showIndependentSection(util.select.position(depotPos.above(2) .west()), Direction.SOUTH); scene.world.moveSection(spout, util.vector.of(1, 0, 0), 0); - BlockPos pressPos = depotPos.up(2) + BlockPos pressPos = depotPos.above(2) .west(); ItemStack copper = AllItems.COPPER_INGOT.asStack(); scene.world.createItemOnBeltLike(depotPos, Direction.NORTH, copper); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java index 4da325070..046cde559 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java @@ -38,7 +38,7 @@ public class CartAssemblerScenes { scene.idle(5); BlockPos assemblerPos = util.grid.at(2, 1, 2); - scene.world.setBlock(assemblerPos, Blocks.RAIL.getDefaultState(), false); + scene.world.setBlock(assemblerPos, Blocks.RAIL.defaultBlockState(), false); for (int z = 0; z < 5; z++) { scene.world.showSection(util.select.position(2, 1, z), Direction.DOWN); scene.idle(2); @@ -54,8 +54,8 @@ public class CartAssemblerScenes { .withItem(AllBlocks.CART_ASSEMBLER.asStack()), 30); scene.idle(7); scene.world.setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() - .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.NORTH_SOUTH) - .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.NORTH_SOUTH) + .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); scene.idle(20); scene.world.showSection(util.select.fromTo(0, 1, 2, 1, 1, 2), Direction.EAST); scene.idle(20); @@ -72,12 +72,12 @@ public class CartAssemblerScenes { ElementLink cart = scene.special.createCart(util.vector.topOf(2, 0, 4), 90, MinecartEntity::new); - scene.world.showSection(util.select.position(assemblerPos.up()), Direction.DOWN); + scene.world.showSection(util.select.position(assemblerPos.above()), Direction.DOWN); scene.idle(10); scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); scene.idle(20); ElementLink plank = - scene.world.makeSectionIndependent(util.select.position(assemblerPos.up())); + scene.world.makeSectionIndependent(util.select.position(assemblerPos.above())); ElementLink anchor = scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.east())); scene.world.moveSection(anchor, util.vector.of(-1, 0, 0), 0); @@ -111,7 +111,7 @@ public class CartAssemblerScenes { scene.special.moveCart(cart, util.vector.of(0, 0, 2), 20); scene.idle(30); - scene.world.destroyBlock(assemblerPos.up()); + scene.world.destroyBlock(assemblerPos.above()); scene.idle(5); ElementLink contraption = scene.world.showIndependentSection(util.select.fromTo(1, 4, 2, 3, 3, 2), Direction.DOWN); @@ -187,8 +187,8 @@ public class CartAssemblerScenes { BlockPos assemblerPos = util.grid.at(3, 1, 3); scene.idle(5); scene.world.setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() - .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) - .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); scene.idle(5); scene.world.showSection(util.select.fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); ElementLink contraption = @@ -317,17 +317,17 @@ public class CartAssemblerScenes { scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 2), Direction.SOUTH); scene.idle(5); ElementLink cart = - scene.special.createCart(util.vector.topOf(assembler1.down()), 0, MinecartEntity::new); + scene.special.createCart(util.vector.topOf(assembler1.below()), 0, MinecartEntity::new); ElementLink cart2 = - scene.special.createCart(util.vector.topOf(assembler2.down()), 0, ChestMinecartEntity::new); + scene.special.createCart(util.vector.topOf(assembler2.below()), 0, ChestMinecartEntity::new); scene.idle(15); scene.world.setBlock(assembler1, AllBlocks.CART_ASSEMBLER.getDefaultState() - .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) - .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.CONTROLLER_RAIL), true); + .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.CONTROLLER_RAIL), true); scene.idle(5); scene.world.setBlock(assembler2, AllBlocks.CART_ASSEMBLER.getDefaultState() - .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) - .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); scene.idle(5); ElementLink contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); @@ -429,17 +429,17 @@ public class CartAssemblerScenes { .text("Cart Assemblers on Regular Tracks will not affect the passing carts' motion"); scene.idle(10); scene.world.setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() - .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) - .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); scene.idle(70); ElementLink cart = scene.special.createCart(util.vector.topOf(assembler.east(2) - .down()), 0, MinecartEntity::new); + .below()), 0, MinecartEntity::new); ElementLink anchor = scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN); ElementLink contraption = scene.world.showIndependentSection(util.select.position(assembler.south() - .up()), Direction.DOWN); + .above()), Direction.DOWN); scene.world.moveSection(contraption, util.vector.of(2, 0, -1), 0); scene.world.moveSection(anchor, util.vector.of(2, 0, -1), 0); scene.idle(10); @@ -456,8 +456,8 @@ public class CartAssemblerScenes { .withItem(new ItemStack(Items.POWERED_RAIL)), 50); scene.idle(7); scene.world.setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() - .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) - .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.POWERED_RAIL), true); + .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.POWERED_RAIL), true); scene.overlay.showText(100) .attachKeyFrame() .pointAt(util.vector.topOf(assembler)) @@ -467,10 +467,10 @@ public class CartAssemblerScenes { scene.world.hideIndependentSection(anchor, Direction.DOWN); cart = scene.special.createCart(util.vector.topOf(assembler.east(2) - .down()), 0, MinecartEntity::new); + .below()), 0, MinecartEntity::new); anchor = scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN); contraption = scene.world.showIndependentSection(util.select.position(assembler.south() - .up()), Direction.DOWN); + .above()), Direction.DOWN); scene.world.moveSection(contraption, util.vector.of(2, 0, -1), 0); scene.world.moveSection(anchor, util.vector.of(2, 0, -1), 0); scene.idle(10); @@ -495,7 +495,7 @@ public class CartAssemblerScenes { scene.idle(20); cart = scene.special.createCart(util.vector.topOf(assembler.east(2) - .down()), 0, FurnaceMinecartEntity::new); + .below()), 0, FurnaceMinecartEntity::new); scene.idle(10); scene.overlay.showText(50) .attachKeyFrame() @@ -505,14 +505,14 @@ public class CartAssemblerScenes { scene.idle(50); contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); scene.idle(5); - scene.world.glueBlockOnto(assembler.up(2), Direction.DOWN, contraption); + scene.world.glueBlockOnto(assembler.above(2), Direction.DOWN, contraption); scene.idle(15); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(assembler.up()), Pointing.UP) + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(assembler.above()), Pointing.UP) .withItem(new ItemStack(Items.CHARCOAL)), 40); scene.idle(7); scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(assembler.up(2), Direction.WEST)) + .pointAt(util.vector.blockSurface(assembler.above(2), Direction.WEST)) .placeNearTarget() .text("Furnace Carts will keep themselves powered, pulling fuel from any attached inventories"); scene.idle(85); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java index b20d88216..8ece78aac 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java @@ -57,7 +57,7 @@ public class ChainDriveScenes { Selection shafts = util.select.fromTo(2, 1, 0, 2, 1, 1); BlockPos rotatedECD = util.grid.at(3, 1, 0); - Selection verticalShaft = util.select.fromTo(rotatedECD.up(), rotatedECD.up(2)); + Selection verticalShaft = util.select.fromTo(rotatedECD.above(), rotatedECD.above(2)); scene.world.showSection(shafts, Direction.EAST); scene.idle(10); @@ -77,7 +77,7 @@ public class ChainDriveScenes { scene.overlay.showControls(new InputWindowElement(util.vector.topOf(rotatedECD), Pointing.DOWN).rightClick() .withWrench(), 30); scene.idle(7); - scene.world.modifyBlock(rotatedECD, s -> s.with(EncasedBeltBlock.AXIS, Axis.Y), true); + scene.world.modifyBlock(rotatedECD, s -> s.setValue(EncasedBeltBlock.AXIS, Axis.Y), true); scene.idle(40); scene.world.showSection(verticalShaft, Direction.DOWN); @@ -102,11 +102,11 @@ public class ChainDriveScenes { BlockPos leverPos = util.grid.at(3, 1, 0); BlockPos eastDrive = util.grid.at(3, 1, 2); - BlockPos eastGauge = eastDrive.up(3); + BlockPos eastGauge = eastDrive.above(3); BlockPos middleGauge = eastGauge.west() - .down(); + .below(); BlockPos westGauge = eastGauge.west(2) - .down(2); + .below(2); ElementLink lever = scene.world.showIndependentSection(util.select.fromTo(leverPos, leverPos.south()), Direction.UP); @@ -115,7 +115,7 @@ public class ChainDriveScenes { scene.world.showSection(util.select.fromTo(4, 1, 3, 4, 2, 3), Direction.DOWN); scene.idle(10); scene.world.showSection(util.select.fromTo(eastDrive, eastDrive.west(2)) - .add(util.select.position(eastDrive.up())), Direction.DOWN); + .add(util.select.position(eastDrive.above())), Direction.DOWN); scene.idle(10); scene.overlay.showText(60) @@ -125,9 +125,9 @@ public class ChainDriveScenes { .pointAt(util.vector.blockSurface(eastDrive, Direction.NORTH)); scene.idle(60); - scene.world.showSection(util.select.fromTo(eastGauge, eastGauge.down()), Direction.DOWN); + scene.world.showSection(util.select.fromTo(eastGauge, eastGauge.below()), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(middleGauge, middleGauge.down()), Direction.DOWN); + scene.world.showSection(util.select.fromTo(middleGauge, middleGauge.below()), Direction.DOWN); scene.idle(5); scene.world.showSection(util.select.position(westGauge), Direction.DOWN); scene.idle(5); @@ -145,14 +145,14 @@ public class ChainDriveScenes { scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(util.select.fromTo(westGauge.down(), middleGauge), f -> 2 * f); + scene.world.modifyKineticSpeed(util.select.fromTo(westGauge.below(), middleGauge), f -> 2 * f); scene.idle(10); AxisAlignedBB bb = new AxisAlignedBB(eastDrive); scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb, 160); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.FAST, eastDrive.west(), bb.offset(-2, 0, 0) - .expand(15 / 16f, 0, 0), 160); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.FAST, eastDrive.west(), bb.move(-2, 0, 0) + .expandTowards(15 / 16f, 0, 0), 160); scene.idle(20); scene.overlay.showText(80) @@ -180,7 +180,7 @@ public class ChainDriveScenes { Selection newDriveSelect = util.select.fromTo(eastDrive.south(2), eastDrive.south(2) .west(2)); ElementLink drives = scene.world.showIndependentSection(newDriveSelect, Direction.NORTH); - scene.world.modifyKineticSpeed(util.select.fromTo(westGauge.down(), middleGauge), f -> .5f * f); + scene.world.modifyKineticSpeed(util.select.fromTo(westGauge.below(), middleGauge), f -> .5f * f); scene.world.setKineticSpeed(newDriveSelect, -32); scene.world.moveSection(drives, util.vector.of(0, 0, -2), 0); scene.world.moveSection(lever, util.vector.of(-2, 0, 0), 10); @@ -196,8 +196,8 @@ public class ChainDriveScenes { scene.idle(10); bb = new AxisAlignedBB(eastDrive); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb.expand(-15 / 16f, 0, 0), 160); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.SLOW, eastDrive.west(), bb.offset(-2, 0, 0), 160); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb.expandTowards(-15 / 16f, 0, 0), 160); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.SLOW, eastDrive.west(), bb.move(-2, 0, 0), 160); scene.idle(20); scene.overlay.showText(80) @@ -238,7 +238,7 @@ public class ChainDriveScenes { scene.world.modifyTileNBT(util.select.position(analogPos), AnalogLeverTileEntity.class, nbt -> { nbt.putInt("State", 8); }); - scene.world.modifyBlock(analogPos.south(), s -> s.with(RedstoneWireBlock.POWER, 8), false); + scene.world.modifyBlock(analogPos.south(), s -> s.setValue(RedstoneWireBlock.POWER, 8), false); scene.world.toggleRedstonePower(util.select.position(1, 1, 4)); scene.world.modifyKineticSpeed(util.select.position(westGauge), f -> .75f * f); scene.effects.indicateRedstone(analogPos); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java index 24c7a768f..831e857a8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java @@ -43,9 +43,9 @@ public class ChassisScenes { scene.world.showSectionAndMerge(util.select.position(centralChassis.east() .north()), Direction.SOUTH, chassis); scene.idle(3); - scene.world.showSectionAndMerge(util.select.position(centralChassis.up()), Direction.DOWN, chassis); + scene.world.showSectionAndMerge(util.select.position(centralChassis.above()), Direction.DOWN, chassis); scene.idle(2); - scene.world.showSectionAndMerge(util.select.position(centralChassis.up() + scene.world.showSectionAndMerge(util.select.position(centralChassis.above() .east()), Direction.DOWN, chassis); scene.idle(10); @@ -107,7 +107,7 @@ public class ChassisScenes { .withItem(new ItemStack(Items.SLIME_BALL)); scene.overlay.showControls(input, 30); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.with(LinearChassisBlock.STICKY_BOTTOM, true), false); + scene.world.modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_BOTTOM, true), false); scene.effects.superGlue(chassisPos, Direction.WEST, false); scene.idle(30); @@ -119,7 +119,7 @@ public class ChassisScenes { scene.overlay.showControls(input, 15); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.with(LinearChassisBlock.STICKY_TOP, true), false); + scene.world.modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_TOP, true), false); scene.effects.superGlue(chassisPos, Direction.EAST, false); scene.idle(15); @@ -138,7 +138,7 @@ public class ChassisScenes { .whileSneaking(), 30); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.with(LinearChassisBlock.STICKY_BOTTOM, false), false); + scene.world.modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_BOTTOM, false), false); scene.effects.superGlue(chassisPos, Direction.WEST, false); scene.idle(30); @@ -152,7 +152,7 @@ public class ChassisScenes { scene.idle(20); ElementLink glassSection = - scene.world.showIndependentSection(util.select.position(chassisPos.up()), Direction.DOWN); + scene.world.showIndependentSection(util.select.position(chassisPos.above()), Direction.DOWN); scene.world.moveSection(glassSection, util.vector.of(0, -1, 0), 0); scene.idle(25); scene.addKeyframe(); @@ -281,7 +281,7 @@ public class ChassisScenes { scene.idle(20); scene.overlay.showText(80) - .pointAt(util.vector.topOf(chassisPos.up(2))) + .pointAt(util.vector.topOf(chassisPos.above(2))) .text("Using these mechanics, structures of any shape can move as a Contraption") .placeNearTarget(); scene.idle(30); @@ -307,14 +307,14 @@ public class ChassisScenes { ElementLink contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); scene.idle(5); ElementLink top = - scene.world.showIndependentSection(util.select.position(chassisPos.up()), Direction.DOWN); + scene.world.showIndependentSection(util.select.position(chassisPos.above()), Direction.DOWN); scene.idle(10); scene.overlay.showText(50) .attachKeyFrame() .placeNearTarget() .text("Radial Chassis connect to identical Chassis blocks in a row") - .pointAt(util.vector.topOf(chassisPos.up())); + .pointAt(util.vector.topOf(chassisPos.above())); scene.idle(60); BlockPos bearingPos = util.grid.at(2, 1, 2); @@ -340,7 +340,7 @@ public class ChassisScenes { .withItem(new ItemStack(Items.SLIME_BALL)); scene.overlay.showControls(input, 30); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.with(RadialChassisBlock.STICKY_WEST, true), false); + scene.world.modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_WEST, true), false); scene.effects.superGlue(chassisPos, Direction.WEST, false); scene.idle(30); @@ -352,9 +352,9 @@ public class ChassisScenes { scene.overlay.showControls(input, 15); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.with(RadialChassisBlock.STICKY_EAST, true) - .with(RadialChassisBlock.STICKY_NORTH, true) - .with(RadialChassisBlock.STICKY_SOUTH, true), false); + scene.world.modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_EAST, true) + .setValue(RadialChassisBlock.STICKY_NORTH, true) + .setValue(RadialChassisBlock.STICKY_SOUTH, true), false); scene.effects.superGlue(chassisPos, Direction.EAST, false); scene.effects.superGlue(chassisPos, Direction.SOUTH, false); scene.effects.superGlue(chassisPos, Direction.NORTH, false); @@ -375,7 +375,7 @@ public class ChassisScenes { .whileSneaking(), 30); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.with(RadialChassisBlock.STICKY_WEST, false), false); + scene.world.modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_WEST, false), false); scene.effects.superGlue(chassisPos, Direction.WEST, false); scene.idle(30); @@ -407,7 +407,7 @@ public class ChassisScenes { scene.world.showSection(util.select.fromTo(0, 3, 3, 1, 3, 4), Direction.DOWN); scene.idle(10); Vector3d blockSurface = util.vector.blockSurface(chassisPos, Direction.NORTH); - AxisAlignedBB bb = new AxisAlignedBB(blockSurface, blockSurface).grow(.501, .501, 0); + AxisAlignedBB bb = new AxisAlignedBB(blockSurface, blockSurface).inflate(.501, .501, 0); scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 60); scene.overlay.showOutline(PonderPalette.WHITE, s, s, 80); scene.overlay.showText(40) @@ -535,7 +535,7 @@ public class ChassisScenes { scene.world.glueBlockOnto(central.north() .east(), Direction.WEST, plank); scene.idle(5); - scene.world.glueBlockOnto(central.up(), Direction.DOWN, plank); + scene.world.glueBlockOnto(central.above(), Direction.DOWN, plank); scene.idle(5); scene.world.glueBlockOnto(central.south() .west(), Direction.EAST, plank); @@ -553,7 +553,7 @@ public class ChassisScenes { scene.idle(90); glueEntity = scene.world.createGlueEntity(central, Direction.UP); - scene.world.destroyBlock(central.up()); + scene.world.destroyBlock(central.above()); scene.idle(20); scene.addKeyframe(); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(central), Pointing.DOWN).leftClick(), 40); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java index 0c168ee13..766f6beb5 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java @@ -65,7 +65,7 @@ public class ChuteScenes { .withWrench(), 40); scene.idle(7); - scene.world.modifyBlock(util.grid.at(3, 3, 3), s -> s.with(ChuteBlock.SHAPE, ChuteBlock.Shape.WINDOW), false); + scene.world.modifyBlock(util.grid.at(3, 3, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.WINDOW), false); scene.overlay.showText(50) .attachKeyFrame() .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.WEST)) @@ -73,7 +73,7 @@ public class ChuteScenes { .text("Using the Wrench, a window can be created"); scene.idle(10); - scene.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.with(SHAPE, Shape.WINDOW), false); + scene.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.setValue(SHAPE, Shape.WINDOW), false); for (int i = 0; i < 8; i++) { scene.idle(10); @@ -85,7 +85,7 @@ public class ChuteScenes { scene.idle(15); scene.rotateCameraY(-90); - scene.world.modifyBlock(util.grid.at(2, 2, 1), s -> s.with(SHAPE, Shape.NORMAL), false); + scene.world.modifyBlock(util.grid.at(2, 2, 1), s -> s.setValue(SHAPE, Shape.NORMAL), false); scene.world.showSection(util.select.fromTo(2, 1, 1, 2, 2, 1), Direction.DOWN); scene.idle(30); ItemStack chuteItem = AllBlocks.CHUTE.asStack(); @@ -120,14 +120,14 @@ public class ChuteScenes { Direction offset = Direction.NORTH; for (int i = 0; i < 3; i++) { remove = scene.world.createItemEntity(util.vector.centerOf(util.grid.at(2, 6, 3) - .offset(offset)), util.vector.of(0, 0.1, 0) - .add(Vector3d.of(offset.getDirectionVec()).scale(-.1)), + .relative(offset)), util.vector.of(0, 0.1, 0) + .add(Vector3d.atLowerCornerOf(offset.getNormal()).scale(-.1)), stack); scene.idle(12); scene.world.createItemOnBeltLike(util.grid.at(2, 4, 3), Direction.UP, stack); scene.world.modifyEntity(remove, Entity::remove); scene.idle(3); - offset = offset.rotateY(); + offset = offset.getClockWise(); } scene.idle(10); @@ -143,7 +143,7 @@ public class ChuteScenes { scene.scaleSceneView(.9f); scene.showBasePlate(); Selection chute = util.select.fromTo(1, 2, 2, 1, 4, 2); - scene.world.setBlocks(chute, Blocks.AIR.getDefaultState(), false); + scene.world.setBlocks(chute, Blocks.AIR.defaultBlockState(), false); scene.world.showSection(util.select.position(1, 1, 2), Direction.UP); scene.idle(20); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/CrafterScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CrafterScenes.java index a4da5da9f..14a0e2cf9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/CrafterScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/CrafterScenes.java @@ -39,7 +39,7 @@ public class CrafterScenes { BlockPos depotPos = util.grid.at(0, 1, 2); Selection crafters = util.select.fromTo(1, 1, 2, 3, 3, 2); - scene.world.modifyBlocks(crafters, s -> s.with(MechanicalCrafterBlock.POINTING, Pointing.DOWN), false); + scene.world.modifyBlocks(crafters, s -> s.setValue(MechanicalCrafterBlock.POINTING, Pointing.DOWN), false); scene.world.setKineticSpeed(crafters, 0); for (int y = 0; y < 3; y++) { @@ -280,7 +280,7 @@ public class CrafterScenes { scene.idle(40); Vector3d v = util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.WEST); - AxisAlignedBB bb = new AxisAlignedBB(v, v).grow(.125f, .5, .5); + AxisAlignedBB bb = new AxisAlignedBB(v, v).inflate(.125f, .5, .5); v = v.add(0, 0, .5); scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, new Object(), bb, 45); @@ -348,7 +348,7 @@ public class CrafterScenes { scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); - scene.world.setBlock(util.grid.at(2, 2, 2), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(2, 2, 2), Blocks.AIR.defaultBlockState(), false); Selection kinetics = util.select.fromTo(3, 1, 2, 3, 1, 5); scene.world.setKineticSpeed(util.select.fromTo(1, 2, 2, 3, 1, 2), 0); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index 5261f9437..b2ed9efe7 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -100,7 +100,7 @@ public class DebugScenes { scene.world.replaceBlocks(util.select.fromTo(1, 1, 3, 2, 2, 4), AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), true); scene.idle(10); - scene.world.replaceBlocks(util.select.position(3, 1, 1), Blocks.GOLD_BLOCK.getDefaultState(), true); + scene.world.replaceBlocks(util.select.position(3, 1, 1), Blocks.GOLD_BLOCK.defaultBlockState(), true); scene.rotateCameraY(180); scene.markAsFinished(); } @@ -121,10 +121,10 @@ public class DebugScenes { Vector3d vec1 = util.vector.topOf(1, 0, 0); Vector3d vec2 = util.vector.topOf(0, 0, 1); - AxisAlignedBB boundingBox1 = new AxisAlignedBB(vec1, vec1).expand(0, 2.5, 0) - .grow(.15, 0, .15); - AxisAlignedBB boundingBox2 = new AxisAlignedBB(vec2, vec2).expand(0, .125, 0) - .grow(.45, 0, .45); + AxisAlignedBB boundingBox1 = new AxisAlignedBB(vec1, vec1).expandTowards(0, 2.5, 0) + .inflate(.15, 0, .15); + AxisAlignedBB boundingBox2 = new AxisAlignedBB(vec2, vec2).expandTowards(0, .125, 0) + .inflate(.45, 0, .45); Vector3d poi1 = boundingBox1.getCenter(); Vector3d poi2 = boundingBox2.getCenter(); @@ -229,7 +229,7 @@ public class DebugScenes { Object chassisEffectHighlight = new Object(); AxisAlignedBB point = new AxisAlignedBB(chassisSurface, chassisSurface); - AxisAlignedBB expanded = point.grow(1 / 4f, 1 / 4f, 1 / 16f); + AxisAlignedBB expanded = point.inflate(1 / 4f, 1 / 4f, 1 / 16f); Selection singleBlock = util.select.position(1, 2, 3); Selection twoBlocks = util.select.fromTo(1, 2, 3, 1, 3, 3); @@ -302,11 +302,11 @@ public class DebugScenes { BlockPos poi1 = util.grid.at(4, 1, 0); BlockPos poi2 = util.grid.at(0, 1, 4); - scene.world.setBlock(poi1, Blocks.GOLD_BLOCK.getDefaultState(), true); + scene.world.setBlock(poi1, Blocks.GOLD_BLOCK.defaultBlockState(), true); scene.special.movePointOfInterest(poi1); scene.idle(20); - scene.world.setBlock(poi2, Blocks.GOLD_BLOCK.getDefaultState(), true); + scene.world.setBlock(poi2, Blocks.GOLD_BLOCK.defaultBlockState(), true); scene.special.movePointOfInterest(poi2); scene.overlay.showText(20) .text("Point of Interest") @@ -419,15 +419,15 @@ public class DebugScenes { scene.idle(20); scene.world.modifyEntities(ItemEntity.class, entity -> { - if (copperItem.isItemEqual(entity.getItem())) + if (copperItem.sameItem(entity.getItem())) entity.setNoGravity(true); }); scene.idle(20); scene.world.modifyEntities(ItemEntity.class, entity -> { - if (brassItem.isItemEqual(entity.getItem())) - entity.setMotion(util.vector.of(-.15f, .5f, 0)); + if (brassItem.sameItem(entity.getItem())) + entity.setDeltaMovement(util.vector.of(-.15f, .5f, 0)); }); scene.idle(27); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java index 89d1a3f96..543cef424 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java @@ -37,7 +37,7 @@ public class DeployerScenes { BlockPos deployerPos = util.grid.at(3, 1, 2); Selection deployerSelection = util.select.position(deployerPos); - scene.world.setBlock(potPosition, Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(potPosition, Blocks.AIR.defaultBlockState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(1, 1, 2)), Direction.UP); scene.idle(5); @@ -126,10 +126,10 @@ public class DeployerScenes { scene.world.moveDeployer(deployerPos, -1, 25); scene.idle(20); - scene.world.showSection(util.select.position(deployerPos.up()), Direction.DOWN); + scene.world.showSection(util.select.position(deployerPos.above()), Direction.DOWN); ItemStack tulip = new ItemStack(Items.RED_TULIP); - Vector3d entitySpawn = util.vector.topOf(deployerPos.up(3)); + Vector3d entitySpawn = util.vector.topOf(deployerPos.above(3)); ElementLink entity1 = scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), tulip); @@ -144,13 +144,13 @@ public class DeployerScenes { scene.idle(30); scene.world.moveDeployer(deployerPos, 1, 25); scene.idle(26); - scene.world.setBlock(potPosition, Blocks.POTTED_RED_TULIP.getDefaultState(), false); + scene.world.setBlock(potPosition, Blocks.POTTED_RED_TULIP.defaultBlockState(), false); scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); scene.world.moveDeployer(deployerPos, -1, 25); scene.idle(25); scene.world.hideSection(util.select.position(potPosition), Direction.UP); - scene.world.hideSection(util.select.position(deployerPos.up()), Direction.EAST); + scene.world.hideSection(util.select.position(deployerPos.above()), Direction.EAST); scene.idle(20); Vector3d filterSlot = frontVec.add(0.375, 0.25, 0); @@ -176,21 +176,21 @@ public class DeployerScenes { ElementLink sheep = scene.world.createEntity(w -> { SheepEntity entity = EntityType.SHEEP.create(w); - entity.setFleeceColor(DyeColor.PINK); + entity.setColor(DyeColor.PINK); Vector3d p = util.vector.topOf(util.grid.at(1, 0, 2)); - entity.setPosition(p.x, p.y, p.z); - entity.prevPosX = p.x; - entity.prevPosY = p.y; - entity.prevPosZ = p.z; - entity.limbSwing = 0; - entity.prevRotationYaw = 210; - entity.rotationYaw = 210; - entity.prevRotationYawHead = 210; - entity.rotationYawHead = 210; + entity.setPos(p.x, p.y, p.z); + entity.xo = p.x; + entity.yo = p.y; + entity.zo = p.z; + entity.animationPosition = 0; + entity.yRotO = 210; + entity.yRot = 210; + entity.yHeadRotO = 210; + entity.yHeadRot = 210; return entity; }); scene.idle(20); - scene.world.showSection(util.select.position(deployerPos.up()), Direction.WEST); + scene.world.showSection(util.select.position(deployerPos.above()), Direction.WEST); entity1 = scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), shears); scene.idle(17); scene.world.modifyEntity(entity1, Entity::remove); @@ -208,7 +208,7 @@ public class DeployerScenes { scene.world.modifyEntity(sheep, e -> ((SheepEntity) e).setSheared(true)); scene.effects.emitParticles(util.vector.topOf(deployerPos.west(2)) .add(0, -.25, 0), - Emitter.withinBlockSpace(new BlockParticleData(ParticleTypes.BLOCK, Blocks.PINK_WOOL.getDefaultState()), + Emitter.withinBlockSpace(new BlockParticleData(ParticleTypes.BLOCK, Blocks.PINK_WOOL.defaultBlockState()), util.vector.of(0, 0, 0)), 25, 1); scene.world.moveDeployer(deployerPos, -1, 25); @@ -271,7 +271,7 @@ public class DeployerScenes { .text("By default, a Deployer imitates a Right-click interaction"); scene.idle(26); - scene.world.replaceBlocks(grassBlock, Blocks.FARMLAND.getDefaultState(), false); + scene.world.replaceBlocks(grassBlock, Blocks.FARMLAND.defaultBlockState(), false); scene.world.moveDeployer(deployerPos, -1, 25); scene.idle(46); @@ -334,7 +334,7 @@ public class DeployerScenes { scene.idle(10); ItemStack tool = AllItems.SAND_PAPER.asStack(); - scene.overlay.showControls(new InputWindowElement(util.vector.blockSurface(pressPos.down(), Direction.EAST) + scene.overlay.showControls(new InputWindowElement(util.vector.blockSurface(pressPos.below(), Direction.EAST) .add(0, 0.15, 0), Pointing.RIGHT).withItem(tool), 30); scene.idle(7); scene.world.modifyTileNBT(pressS, DeployerTileEntity.class, nbt -> nbt.put("HeldItem", tool.serializeNBT())); @@ -404,8 +404,8 @@ public class DeployerScenes { scene.idle(30); scene.world.moveDeployer(pressPos, -1, 30); scene.debug.enqueueCallback(s -> SandPaperItem.spawnParticles(targetV, quartz, s.getWorld())); - scene.world.removeItemsFromBelt(pressPos.down(2)); - ingot = scene.world.createItemOnBelt(pressPos.down(2), Direction.UP, polished); + scene.world.removeItemsFromBelt(pressPos.below(2)); + ingot = scene.world.createItemOnBelt(pressPos.below(2), Direction.UP, polished); scene.world.stallBeltItem(ingot, true); scene.idle(15); scene.world.stallBeltItem(ingot, false); @@ -415,8 +415,8 @@ public class DeployerScenes { scene.idle(30); scene.world.moveDeployer(pressPos, -1, 30); scene.debug.enqueueCallback(s -> SandPaperItem.spawnParticles(targetV, quartz, s.getWorld())); - scene.world.removeItemsFromBelt(pressPos.down(2)); - ingot2 = scene.world.createItemOnBelt(pressPos.down(2), Direction.UP, polished); + scene.world.removeItemsFromBelt(pressPos.below(2)); + ingot2 = scene.world.createItemOnBelt(pressPos.below(2), Direction.UP, polished); scene.world.stallBeltItem(ingot2, true); scene.idle(15); scene.world.stallBeltItem(ingot2, false); @@ -492,7 +492,7 @@ public class DeployerScenes { scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(.9f); Selection flowers = util.select.fromTo(4, 1, 1, 1, 1, 1); - scene.world.replaceBlocks(flowers, Blocks.AIR.getDefaultState(), false); + scene.world.replaceBlocks(flowers, Blocks.AIR.defaultBlockState(), false); Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 3); BlockPos deployerPos = util.grid.at(4, 1, 3); @@ -541,7 +541,7 @@ public class DeployerScenes { scene.world.hideSection(flowers, Direction.UP); scene.idle(15); - scene.world.replaceBlocks(flowers, Blocks.AIR.getDefaultState(), false); + scene.world.replaceBlocks(flowers, Blocks.AIR.defaultBlockState(), false); scene.world.showSection(flowers, Direction.UP); Vector3d frontVec = util.vector.blockSurface(deployerPos.west(3), Direction.NORTH) @@ -570,7 +570,7 @@ public class DeployerScenes { scene.world.moveDeployer(deployerPos, 1, 9); scene.idle(10); scene.world.moveDeployer(deployerPos, -1, 9); - scene.world.setBlock(util.grid.at(1 + x, 1, 1), Blocks.POPPY.getDefaultState(), false); + scene.world.setBlock(util.grid.at(1 + x, 1, 1), Blocks.POPPY.defaultBlockState(), false); scene.idle(18); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java index 4b31f95fb..2ae78d4a9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java @@ -77,7 +77,7 @@ public class EjectorScenes { AxisAlignedBB bb = new AxisAlignedBB(ejectorPos.west()); scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, slot, bb, 20); scene.idle(10); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, slot, bb.expand(-15, 15, 0), 100); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, slot, bb.expandTowards(-15, 15, 0), 100); scene.idle(10); scene.overlay.showText(60) @@ -87,7 +87,7 @@ public class EjectorScenes { .pointAt(util.vector.blockSurface(targetPos, Direction.WEST)) .placeNearTarget(); scene.idle(70); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, new Object(), bb.offset(-2, 0, -1), 60); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, new Object(), bb.move(-2, 0, -1), 60); scene.idle(10); scene.overlay.showText(50) .colored(PonderPalette.RED) @@ -303,7 +303,7 @@ public class EjectorScenes { scene.world.showSection(redstone, Direction.EAST); BlockPos ejectorPos = util.grid.at(4, 1, 2); - Vector3d topOf = util.vector.topOf(ejectorPos.up(2)); + Vector3d topOf = util.vector.topOf(ejectorPos.above(2)); ItemStack copper = AllItems.COPPER_INGOT.asStack(); for (int i = 0; i < 3; i++) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java index 04ac6a0fe..cbdf38ea6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java @@ -60,7 +60,7 @@ public class FanScenes { BlockPos leverPos = util.grid.at(3, 2, 4); Selection reverse = util.select.fromTo(3, 1, 5, 1, 1, 4); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.effects.indicateRedstone(leverPos); scene.addKeyframe(); scene.world.modifyKineticSpeed(reverse, f -> -f); @@ -76,7 +76,7 @@ public class FanScenes { scene.markAsFinished(); scene.idle(70); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.effects.indicateRedstone(leverPos); scene.world.modifyKineticSpeed(reverse, f -> -f); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 4 * f); @@ -103,7 +103,7 @@ public class FanScenes { ElementLink blockInFront = scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.SOUTH); scene.world.moveSection(blockInFront, util.vector.of(1, 0, 2), 0); - scene.world.setBlock(blockPos, Blocks.LAVA.getDefaultState(), false); + scene.world.setBlock(blockPos, Blocks.LAVA.defaultBlockState(), false); scene.idle(10); scene.overlay.showSelectionWithText(util.select.fromTo(blockPos, blockPos.west(2)), 80) @@ -115,9 +115,9 @@ public class FanScenes { ItemStack smelted = new ItemStack(Items.GOLD_INGOT); ElementLink entityLink = scene.world.createItemEntity(util.vector.centerOf(blockPos.west(2) - .up(2)), util.vector.of(0, 0.1, 0), stack); + .above(2)), util.vector.of(0, 0.1, 0), stack); scene.idle(15); - scene.world.modifyEntity(entityLink, e -> e.setMotion(-0.2f, 0, 0)); + scene.world.modifyEntity(entityLink, e -> e.setDeltaMovement(-0.2f, 0, 0)); Vector3d itemVec = util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.EAST) .add(0.1, 0, 0); scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20); @@ -149,7 +149,7 @@ public class FanScenes { // smoking start - BlockState campfire = Blocks.FIRE.getDefaultState(); + BlockState campfire = Blocks.FIRE.defaultBlockState(); scene.world.hideIndependentSection(blockInFront, Direction.NORTH); scene.idle(15); scene.world.setBlock(util.grid.at(3, 1, 0), campfire, false); @@ -166,7 +166,7 @@ public class FanScenes { // washing start - BlockState water = Blocks.WATER.getDefaultState(); + BlockState water = Blocks.WATER.defaultBlockState(); scene.world.hideIndependentSection(blockInFront, Direction.NORTH); scene.idle(15); scene.world.setBlock(util.grid.at(3, 1, 0), water, false); @@ -185,9 +185,9 @@ public class FanScenes { ItemStack washed = new ItemStack(Items.GOLD_NUGGET, 16); entityLink = scene.world.createItemEntity(util.vector.centerOf(blockPos.west(2) - .up(2)), util.vector.of(0, 0.1, 0), stack); + .above(2)), util.vector.of(0, 0.1, 0), stack); scene.idle(15); - scene.world.modifyEntity(entityLink, e -> e.setMotion(-0.2f, 0, 0)); + scene.world.modifyEntity(entityLink, e -> e.setDeltaMovement(-0.2f, 0, 0)); scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20); scene.idle(20); scene.effects.emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.SPIT, Vector3d.ZERO), 1, 60); @@ -221,8 +221,8 @@ public class FanScenes { scene.world.moveSection(blockInFront, util.vector.of(0, 1, 0), 15); scene.world.destroyBlock(blockPos.east()); scene.world.showSection(util.select.position(blockPos.east() - .up()), Direction.DOWN); - scene.world.setBlock(blockPos.up(), Blocks.WATER.getDefaultState(), false); + .above()), Direction.DOWN); + scene.world.setBlock(blockPos.above(), Blocks.WATER.defaultBlockState(), false); ItemStack sand = new ItemStack(Items.SAND); ItemStack clay = new ItemStack(Items.CLAY_BALL); @@ -290,8 +290,8 @@ public class FanScenes { scene.idle(10); scene.world.toggleRedstonePower(util.select.position(pos.north())); scene.effects.indicateRedstone(pos.north()); - scene.world.setKineticSpeed(util.select.fromTo(pos, pos.up()), 4); - scene.effects.rotationSpeedIndicator(pos.up()); + scene.world.setKineticSpeed(util.select.fromTo(pos, pos.above()), 4); + scene.effects.rotationSpeedIndicator(pos.above()); } scene.overlay.showText(90) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java index 366547173..069484e61 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java @@ -56,7 +56,7 @@ public class FunnelScenes { for (int i = 0; i < 8; i++) { scene.idle(8); scene.world.removeItemsFromBelt(exitBeltPos); - scene.world.flapFunnel(exitBeltPos.up(), false); + scene.world.flapFunnel(exitBeltPos.above(), false); if (i == 2) scene.rotateCameraY(70); if (i < 6) @@ -67,7 +67,7 @@ public class FunnelScenes { scene.idle(10); Selection outputFunnel = util.select.position(1, 2, 4); - scene.world.setBlocks(outputFunnel, Blocks.AIR.getDefaultState(), false); + scene.world.setBlocks(outputFunnel, Blocks.AIR.defaultBlockState(), false); scene.world.setBlocks(util.select.fromTo(2, -1, 4, 2, 0, 4), AllBlocks.ANDESITE_CASING.getDefaultState(), true); ElementLink independentSection = scene.world.showIndependentSection(verticalFunnel, Direction.UP); @@ -88,8 +88,8 @@ public class FunnelScenes { scene.world.moveSection(independentSection, util.vector.of(0, 1, 0), 15); scene.idle(10); scene.world.setBlocks(outputFunnel, AllBlocks.ANDESITE_FUNNEL.getDefaultState() - .with(FunnelBlock.FACING, Direction.WEST) - .with(FunnelBlock.EXTRACTING, true), false); + .setValue(FunnelBlock.FACING, Direction.WEST) + .setValue(FunnelBlock.EXTRACTING, true), false); for (int i = 0; i < 3; i++) { scene.idle(8); @@ -144,7 +144,7 @@ public class FunnelScenes { scene.idle(20); // Placing funnels with sneak - scene.world.modifyBlock(topFunnel, s -> s.with(FunnelBlock.EXTRACTING, false), false); + scene.world.modifyBlock(topFunnel, s -> s.setValue(FunnelBlock.EXTRACTING, false), false); scene.idle(5); scene.world.showSection(topFunnelSelection, Direction.DOWN); @@ -188,7 +188,7 @@ public class FunnelScenes { // Side funnel BlockPos sideFunnel = util.grid.at(3, 2, 1); - Selection sideFunnelSelection = util.select.fromTo(sideFunnel.down(), sideFunnel); + Selection sideFunnelSelection = util.select.fromTo(sideFunnel.below(), sideFunnel); Vector3d sideCenter = util.vector.centerOf(sideFunnel); scene.world.modifyBlock(sideFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), false); @@ -276,9 +276,9 @@ public class FunnelScenes { .text("Vertical Saws") .colored(PonderPalette.BLUE) .placeNearTarget() - .pointAt(util.vector.centerOf(sawFunnel.down())); + .pointAt(util.vector.centerOf(sawFunnel.below())); scene.idle(8); - scene.world.createItemOnBeltLike(sawFunnel.down(), Direction.SOUTH, new ItemStack(Blocks.OAK_LOG)); + scene.world.createItemOnBeltLike(sawFunnel.below(), Direction.SOUTH, new ItemStack(Blocks.OAK_LOG)); scene.idle(40); scene.world.showSection(util.select.position(depotFunnel), Direction.DOWN); @@ -286,9 +286,9 @@ public class FunnelScenes { .text("Depots") .colored(PonderPalette.BLUE) .placeNearTarget() - .pointAt(util.vector.centerOf(depotFunnel.down())); + .pointAt(util.vector.centerOf(depotFunnel.below())); scene.idle(8); - scene.world.createItemOnBeltLike(depotFunnel.down(), Direction.SOUTH, new ItemStack(Items.GOLDEN_PICKAXE)); + scene.world.createItemOnBeltLike(depotFunnel.below(), Direction.SOUTH, new ItemStack(Items.GOLDEN_PICKAXE)); scene.idle(40); scene.world.showSection(util.select.position(drainFunnel), Direction.DOWN); @@ -296,9 +296,9 @@ public class FunnelScenes { .text("Item Drains") .colored(PonderPalette.BLUE) .placeNearTarget() - .pointAt(util.vector.centerOf(drainFunnel.down())); + .pointAt(util.vector.centerOf(drainFunnel.below())); scene.idle(8); - scene.world.createItemOnBeltLike(drainFunnel.down(), Direction.SOUTH, new ItemStack(Items.WATER_BUCKET)); + scene.world.createItemOnBeltLike(drainFunnel.below(), Direction.SOUTH, new ItemStack(Items.WATER_BUCKET)); scene.idle(40); scene.markAsFinished(); @@ -319,8 +319,8 @@ public class FunnelScenes { BlockPos redstone = util.grid.at(2, 2, 2); BlockPos funnel = util.grid.at(3, 2, 2); - AxisAlignedBB redstoneBB = new AxisAlignedBB(funnel).grow(-1 / 16f, -6 / 16f, -1 / 16f) - .offset(0, -5 / 16f, 0); + AxisAlignedBB redstoneBB = new AxisAlignedBB(funnel).inflate(-1 / 16f, -6 / 16f, -1 / 16f) + .move(0, -5 / 16f, 0); for (int i = 0; i < 4; i++) { if (lastItemEntity != null) @@ -330,7 +330,7 @@ public class FunnelScenes { if (i == 3) { scene.world.modifyBlock(lever, s -> s.cycle(LeverBlock.POWERED), false); - scene.world.modifyBlock(redstone, s -> s.with(RedstoneWireBlock.POWER, 15), false); + scene.world.modifyBlock(redstone, s -> s.setValue(RedstoneWireBlock.POWER, 15), false); scene.world.modifyBlock(funnel, s -> s.cycle(FunnelBlock.POWERED), false); scene.effects.indicateRedstone(lever); scene.idle(4); @@ -377,7 +377,7 @@ public class FunnelScenes { .pointAt(util.vector.topOf(andesiteFunnel)) .placeNearTarget(); scene.idle(10); - scene.world.createItemOnBeltLike(andesiteFunnel.down() + scene.world.createItemOnBeltLike(andesiteFunnel.below() .north(), Direction.SOUTH, itemStack); scene.world.flapFunnel(andesiteFunnel, true); scene.idle(60); @@ -388,13 +388,13 @@ public class FunnelScenes { .pointAt(util.vector.topOf(brassFunnel)) .placeNearTarget(); scene.idle(10); - scene.world.createItemOnBeltLike(brassFunnel.down() + scene.world.createItemOnBeltLike(brassFunnel.below() .north(), Direction.SOUTH, ItemHandlerHelper.copyStackWithSize(itemStack, 64)); scene.world.flapFunnel(brassFunnel, true); scene.idle(60); - AxisAlignedBB filterSlot = new AxisAlignedBB(brassFunnel).grow(-.35, -.35, -.35) - .offset(0, 0.2, 0); + AxisAlignedBB filterSlot = new AxisAlignedBB(brassFunnel).inflate(-.35, -.35, -.35) + .move(0, 0.2, 0); scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, filterSlot, filterSlot, 80); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).scroll(), 60); scene.idle(10); @@ -422,12 +422,12 @@ public class FunnelScenes { for (int i = 0; i < 14; i++) { if (i < 12) - scene.world.createItemOnBelt(andesiteFunnel.down(), Direction.SOUTH, + scene.world.createItemOnBelt(andesiteFunnel.below(), Direction.SOUTH, i % 3 == 0 ? dirt : i % 3 == 1 ? gravel : emerald); scene.idle(10); if (i > 0 && (i < 3 || i % 3 == 0)) { - scene.world.removeItemsFromBelt(brassFunnel.down()); + scene.world.removeItemsFromBelt(brassFunnel.below()); scene.world.flapFunnel(brassFunnel, false); } @@ -504,7 +504,7 @@ public class FunnelScenes { scene.idle(20); Selection belt = util.select.layer(1); - scene.world.setBlocks(funnelSelect, Blocks.AIR.getDefaultState(), false); + scene.world.setBlocks(funnelSelect, Blocks.AIR.defaultBlockState(), false); scene.world.showSection(belt, Direction.DOWN); scene.world.showSection(util.select.fromTo(0, 2, 2, 4, 2, 2), Direction.DOWN); scene.overlay.showText(120) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java index d1642ccfd..64e0bd06f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java @@ -122,7 +122,7 @@ public class GantryScenes { scene.overlay.showText(60) .attachKeyFrame() .colored(PonderPalette.RED) - .pointAt(util.vector.centerOf(cogPos.down() + .pointAt(util.vector.centerOf(cogPos.below() .south())) .text("Redstone-powered gantry shafts stop moving their carriages") .placeNearTarget(); @@ -210,7 +210,7 @@ public class GantryScenes { BlockPos leverPos = util.grid.at(4, 1, 0); scene.world.modifyBlocks(util.select.fromTo(1, 1, 0, 3, 1, 1), - s -> s.contains(RedstoneWireBlock.POWER) ? s.with(RedstoneWireBlock.POWER, 15) : s, false); + s -> s.hasProperty(RedstoneWireBlock.POWER) ? s.setValue(RedstoneWireBlock.POWER, 15) : s, false); scene.world.toggleRedstonePower(util.select.position(leverPos)); scene.world.toggleRedstonePower(shafts); scene.effects.indicateRedstone(leverPos); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index 3f68a5bfc..427b31083 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -90,7 +90,7 @@ public class KineticsScenes { .withItem(andesiteCasingItem), 60); scene.idle(7); scene.world.setBlocks(andesite, andesiteEncased.getDefaultState() - .with(EncasedShaftBlock.AXIS, Axis.X), true); + .setValue(EncasedShaftBlock.AXIS, Axis.X), true); scene.world.setKineticSpeed(shaft, 32); scene.idle(10); @@ -101,7 +101,7 @@ public class KineticsScenes { .withItem(brassCasingItem), 60); scene.idle(7); scene.world.setBlocks(brass, brassEncased.getDefaultState() - .with(EncasedShaftBlock.AXIS, Axis.X), true); + .setValue(EncasedShaftBlock.AXIS, Axis.X), true); scene.world.setKineticSpeed(shaft, 32); scene.idle(10); @@ -154,7 +154,7 @@ public class KineticsScenes { scene.title("large_cogwheel", "Relaying rotational force using Large Cogwheels"); scene.configureBasePlate(1, 1, 5); scene.world.setBlock(util.grid.at(4, 2, 3), AllBlocks.LARGE_COGWHEEL.getDefaultState() - .with(CogWheelBlock.AXIS, Axis.X), false); + .setValue(CogWheelBlock.AXIS, Axis.X), false); scene.showBasePlate(); scene.idle(5); @@ -177,7 +177,7 @@ public class KineticsScenes { scene.world.hideSection(util.select.fromTo(3, 2, 1, 3, 2, 5), Direction.SOUTH); scene.idle(15); - scene.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.with(ShaftBlock.AXIS, Axis.X), false); + scene.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.setValue(ShaftBlock.AXIS, Axis.X), false); scene.world.setKineticSpeed(util.select.fromTo(1, 2, 3, 5, 2, 3), 16); scene.world.showSection(util.select.position(4, 2, 3), Direction.WEST); @@ -209,9 +209,9 @@ public class KineticsScenes { BlockPos lowerCog = util.grid.at(3, 1, 2); BlockPos upperCog = util.grid.at(3, 2, 3); BlockState largeCogState = AllBlocks.LARGE_COGWHEEL.getDefaultState() - .with(CogWheelBlock.AXIS, Axis.X); + .setValue(CogWheelBlock.AXIS, Axis.X); BlockState smallCogState = AllBlocks.COGWHEEL.getDefaultState() - .with(CogWheelBlock.AXIS, Axis.X); + .setValue(CogWheelBlock.AXIS, Axis.X); scene.world.setBlock(lowerCog, largeCogState, false); scene.world.setBlock(upperCog, smallCogState, false); @@ -330,10 +330,10 @@ public class KineticsScenes { BlockState defaultState = AllBlocks.SHAFT.getDefaultState(); BlockState cogState = AllBlocks.COGWHEEL.getDefaultState(); - scene.world.setBlock(largeCogBack, defaultState.with(CogWheelBlock.AXIS, Axis.Z), false); - scene.world.setBlock(largeCogFront, defaultState.with(CogWheelBlock.AXIS, Axis.Z), false); - scene.world.setBlock(largeCogRight, defaultState.with(CogWheelBlock.AXIS, Axis.X), false); - scene.world.setBlock(largeCogLeft, defaultState.with(CogWheelBlock.AXIS, Axis.X), false); + scene.world.setBlock(largeCogBack, defaultState.setValue(CogWheelBlock.AXIS, Axis.Z), false); + scene.world.setBlock(largeCogFront, defaultState.setValue(CogWheelBlock.AXIS, Axis.Z), false); + scene.world.setBlock(largeCogRight, defaultState.setValue(CogWheelBlock.AXIS, Axis.X), false); + scene.world.setBlock(largeCogLeft, defaultState.setValue(CogWheelBlock.AXIS, Axis.X), false); scene.world.showSection(util.select.fromTo(4, 2, 2, 2, 2, 4), Direction.DOWN); scene.idle(20); @@ -345,8 +345,8 @@ public class KineticsScenes { .text("A gearbox is the more compact equivalent of this setup"); scene.idle(90); - scene.world.setBlock(largeCogFront.north(), cogState.with(CogWheelBlock.AXIS, Axis.Z), true); - scene.world.setBlock(largeCogRight.west(), cogState.with(CogWheelBlock.AXIS, Axis.X), true); + scene.world.setBlock(largeCogFront.north(), cogState.setValue(CogWheelBlock.AXIS, Axis.Z), true); + scene.world.setBlock(largeCogRight.west(), cogState.setValue(CogWheelBlock.AXIS, Axis.X), true); scene.idle(10); scene.effects.rotationDirectionIndicator(largeCogFront.north()); scene.effects.rotationDirectionIndicator(largeCogRight.west()); @@ -360,7 +360,7 @@ public class KineticsScenes { scene.world.hideSection(util.select.fromTo(1, 2, 3, 2, 2, 3), Direction.WEST); scene.world.hideSection(util.select.fromTo(4, 2, 3, 5, 2, 3), Direction.EAST); - scene.world.setBlock(largeCogBack.south(), cogState.with(CogWheelBlock.AXIS, Axis.Z), true); + scene.world.setBlock(largeCogBack.south(), cogState.setValue(CogWheelBlock.AXIS, Axis.Z), true); scene.idle(10); scene.effects.rotationDirectionIndicator(largeCogFront.north()); @@ -498,7 +498,7 @@ public class KineticsScenes { Vector3d blockSurface = util.vector.blockSurface(motor, Direction.EAST); AxisAlignedBB point = new AxisAlignedBB(blockSurface, blockSurface); - AxisAlignedBB expanded = point.grow(1 / 16f, 1 / 5f, 1 / 5f); + AxisAlignedBB expanded = point.inflate(1 / 16f, 1 / 5f, 1 / 5f); scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1); scene.idle(1); @@ -533,7 +533,7 @@ public class KineticsScenes { for (int i = 0; i < 4; i++) { scene.idle(5); scene.world.showSection(util.select.fromTo(gaugePos.east(i) - .down(), gaugePos.east(i)), Direction.DOWN); + .below(), gaugePos.east(i)), Direction.DOWN); } scene.idle(10); @@ -557,17 +557,17 @@ public class KineticsScenes { .pointAt(util.vector.topOf(wheel)); scene.idle(50); - AxisAlignedBB bb = new AxisAlignedBB(wheel).grow(.125f, 0, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, 1.2, 0) + AxisAlignedBB bb = new AxisAlignedBB(wheel).inflate(.125f, 0, 0); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 1.2, 0) .contract(0, .75, 0), 80); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, 0, 1.2) + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, 1.2) .contract(0, 0, .75), 80); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, -1.2, 0) + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, -1.2, 0) .contract(0, -.75, 0), 80); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, 0, -1.2) + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, -1.2) .contract(0, 0, -.75), 80); scene.idle(5); scene.overlay.showText(50) @@ -595,7 +595,7 @@ public class KineticsScenes { scene.idle(10); scene.world.rotateSection(wheelElement, 0, 180, 0, 5); scene.idle(10); - scene.world.modifyBlock(wheel, s -> s.with(WaterWheelBlock.HORIZONTAL_FACING, Direction.WEST), false); + scene.world.modifyBlock(wheel, s -> s.setValue(WaterWheelBlock.FACING, Direction.WEST), false); scene.world.rotateSection(wheelElement, 0, -180, 0, 0); scene.idle(1); scene.world.moveSection(water, util.vector.of(0, -2, 2), 10); @@ -618,7 +618,7 @@ public class KineticsScenes { scene.rotateCameraY(30); scene.world.rotateSection(wheelElement, 0, 180, 0, 5); scene.idle(10); - scene.world.modifyBlock(wheel, s -> s.with(WaterWheelBlock.HORIZONTAL_FACING, Direction.EAST), false); + scene.world.modifyBlock(wheel, s -> s.setValue(WaterWheelBlock.FACING, Direction.EAST), false); scene.world.rotateSection(wheelElement, 0, -180, 0, 0); scene.idle(1); scene.world.moveSection(water, util.vector.of(0, -2, 2), 10); @@ -641,7 +641,7 @@ public class KineticsScenes { .withItem(new ItemStack(Items.BLUE_DYE)), 40); scene.idle(7); scene.world.modifyBlock(util.grid.at(2, 2, 2), s -> AllBlocks.DYED_VALVE_HANDLES.get(DyeColor.BLUE).getDefaultState() - .with(ValveHandleBlock.FACING, Direction.UP), true); + .setValue(ValveHandleBlock.FACING, Direction.UP), true); scene.idle(10); scene.overlay.showText(70) .text("Valve handles can be dyed for aesthetic purposes") @@ -861,7 +861,7 @@ public class KineticsScenes { scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.modifyBlock(wire, s -> s.with(RedstoneWireBlock.POWER, 0), false); + scene.world.modifyBlock(wire, s -> s.setValue(RedstoneWireBlock.POWER, 0), false); scene.world.toggleRedstonePower(util.select.position(5, 1, 1)); scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); scene.world.setKineticSpeed(outputKinetics, 0); @@ -937,9 +937,9 @@ public class KineticsScenes { scene.idle(10); scene.world.hideSection(furnaceSelect, Direction.NORTH); scene.idle(15); - scene.world.setBlock(furnacePos, Blocks.BLAST_FURNACE.getDefaultState() - .with(FurnaceBlock.FACING, Direction.NORTH) - .with(FurnaceBlock.LIT, true), false); + scene.world.setBlock(furnacePos, Blocks.BLAST_FURNACE.defaultBlockState() + .setValue(FurnaceBlock.FACING, Direction.NORTH) + .setValue(FurnaceBlock.LIT, true), false); scene.world.showSection(furnaceSelect, Direction.NORTH); scene.idle(10); scene.world.moveSection(engine, util.vector.of(0, -1, 0), 15); @@ -1052,7 +1052,7 @@ public class KineticsScenes { scene.idle(10); scene.world.setBlock(gaugePos, (speed ? AllBlocks.SPEEDOMETER : AllBlocks.STRESSOMETER).getDefaultState() - .with(GaugeBlock.FACING, Direction.UP), true); + .setValue(GaugeBlock.FACING, Direction.UP), true); scene.world.setKineticSpeed(util.select.position(gaugePos), 32); scene.idle(10); @@ -1072,7 +1072,7 @@ public class KineticsScenes { } else { BlockState state = AllBlocks.CRUSHING_WHEEL.getDefaultState() - .with(CrushingWheelBlock.AXIS, Axis.X); + .setValue(CrushingWheelBlock.AXIS, Axis.X); scene.world.setBlock(util.grid.at(5, 1, 3), state, true); scene.world.setKineticSpeed(util.select.position(5, 1, 3), 32); scene.world.modifyTileNBT(util.select.position(gaugePos), StressGaugeTileEntity.class, diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java index ea3e48654..6d17ab6cb 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java @@ -60,7 +60,7 @@ public class MechanicalDrillScenes { scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 4 * f); scene.effects.rotationSpeedIndicator(breakingPos.east(3)); scene.idle(5); - scene.world.setBlock(breakingPos, Blocks.OAK_PLANKS.getDefaultState(), false); + scene.world.setBlock(breakingPos, Blocks.OAK_PLANKS.defaultBlockState(), false); scene.world.showSection(util.select.position(breakingPos), Direction.DOWN); scene.idle(5); @@ -161,7 +161,7 @@ public class MechanicalDrillScenes { scene.world.hideSection(planks, Direction.UP); scene.idle(40); - scene.world.setBlocks(planks, Blocks.OAK_PLANKS.getDefaultState(), false); + scene.world.setBlocks(planks, Blocks.OAK_PLANKS.defaultBlockState(), false); scene.world.modifyEntities(ItemEntity.class, Entity::remove); scene.world.glueBlockOnto(util.grid.at(4, 3, 2), Direction.DOWN, contraption); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java index a916b39e4..6c254844e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java @@ -31,7 +31,7 @@ public class MechanicalSawScenes { BlockPos shaftPos = util.grid.at(2, 1, 3); scene.world.setBlock(shaftPos, AllBlocks.SHAFT.getDefaultState() - .with(ShaftBlock.AXIS, Axis.Z), false); + .setValue(ShaftBlock.AXIS, Axis.Z), false); BlockPos sawPos = util.grid.at(2, 1, 2); Selection sawSelect = util.select.position(sawPos); @@ -54,7 +54,7 @@ public class MechanicalSawScenes { ItemStack strippedLog = new ItemStack(Items.STRIPPED_OAK_LOG); ItemStack planks = new ItemStack(Items.OAK_PLANKS); - Vector3d itemSpawn = util.vector.centerOf(sawPos.up() + Vector3d itemSpawn = util.vector.centerOf(sawPos.above() .west()); ElementLink logItem = scene.world.createItemEntity(itemSpawn, util.vector.of(0, 0, 0), log); scene.idle(12); @@ -62,7 +62,7 @@ public class MechanicalSawScenes { scene.overlay.showControls(new InputWindowElement(itemSpawn, Pointing.DOWN).withItem(log), 20); scene.idle(10); - scene.world.modifyEntity(logItem, e -> e.setMotion(util.vector.of(0.05, 0.2, 0))); + scene.world.modifyEntity(logItem, e -> e.setDeltaMovement(util.vector.of(0.05, 0.2, 0))); scene.idle(12); scene.world.modifyEntity(logItem, Entity::remove); @@ -85,7 +85,7 @@ public class MechanicalSawScenes { scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); scene.effects.rotationDirectionIndicator(shaftPos); - scene.world.modifyEntity(logItem, e -> e.setMotion(util.vector.of(-0.05, 0.2, 0))); + scene.world.modifyEntity(logItem, e -> e.setDeltaMovement(util.vector.of(-0.05, 0.2, 0))); scene.idle(12); scene.world.modifyEntity(logItem, Entity::remove); @@ -104,7 +104,7 @@ public class MechanicalSawScenes { scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); scene.world.modifyEntity(logItem, Entity::remove); scene.world.setBlock(shaftPos, AllBlocks.COGWHEEL.getDefaultState() - .with(ShaftBlock.AXIS, Axis.Z), true); + .setValue(ShaftBlock.AXIS, Axis.Z), true); scene.idle(3); scene.addKeyframe(); @@ -174,7 +174,7 @@ public class MechanicalSawScenes { scene.title("mechanical_saw_breaker", "Cutting Trees with the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); - scene.world.setBlock(util.grid.at(2, 0, 2), Blocks.GRASS_BLOCK.getDefaultState(), false); + scene.world.setBlock(util.grid.at(2, 0, 2), Blocks.GRASS_BLOCK.defaultBlockState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(3, 1, 1)) .add(util.select.position(1, 1, 2)), Direction.UP); @@ -205,7 +205,7 @@ public class MechanicalSawScenes { } } - scene.world.replaceBlocks(util.select.fromTo(2, 2, 2, 2, 6, 2), Blocks.AIR.getDefaultState(), true); + scene.world.replaceBlocks(util.select.fromTo(2, 2, 2, 2, 6, 2), Blocks.AIR.defaultBlockState(), true); scene.world.destroyBlock(util.grid.at(3, 5, 0)); scene.world.destroyBlock(util.grid.at(0, 4, 1)); @@ -215,10 +215,10 @@ public class MechanicalSawScenes { scene.world.destroyBlock(util.grid.at(1, 5, 3)); scene.world.destroyBlock(util.grid.at(0, 4, 3)); - scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.getDefaultState(), false); + scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.defaultBlockState(), false); for (int i = 0; i < 5; i++) { - Vector3d dropPos = util.vector.centerOf(breakingPos.up(i)); + Vector3d dropPos = util.vector.centerOf(breakingPos.above(i)); float distance = (float) dropPos.distanceTo(util.vector.centerOf(breakingPos)); scene.world.createItemEntity(dropPos, util.vector.of(-distance / 20, 0, 0), new ItemStack(Items.OAK_LOG)); } @@ -229,7 +229,7 @@ public class MechanicalSawScenes { .add(util.select.fromTo(2, 1, 2, 1, 1, 3)), Direction.UP); scene.world.modifyEntities(ItemEntity.class, Entity::remove); scene.idle(15); - scene.world.setBlocks(util.select.fromTo(2, 1, 2, 1, 20, 3), Blocks.JUNGLE_LOG.getDefaultState(), false); + scene.world.setBlocks(util.select.fromTo(2, 1, 2, 1, 20, 3), Blocks.JUNGLE_LOG.defaultBlockState(), false); scene.world.showSection(util.select.layersFrom(2) .add(util.select.fromTo(2, 1, 2, 1, 1, 3)), Direction.UP); scene.idle(15); @@ -250,7 +250,7 @@ public class MechanicalSawScenes { } for (int i = 0; i < 30; i++) { - scene.world.replaceBlocks(util.select.fromTo(2, i + 1, 2, 1, i + 1, 3), Blocks.AIR.getDefaultState(), true); + scene.world.replaceBlocks(util.select.fromTo(2, i + 1, 2, 1, i + 1, 3), Blocks.AIR.defaultBlockState(), true); for (int x = 1; x <= 2; x++) { for (int z = 2; z <= 3; z++) { Vector3d dropPos = util.vector.centerOf(x, i + 1, z); @@ -267,7 +267,7 @@ public class MechanicalSawScenes { scene.title("mechanical_saw_contraption", "Using Mechanical Saws on Contraptions"); scene.configureBasePlate(1, 0, 6); scene.scaleSceneView(.9f); - scene.world.setBlock(util.grid.at(2, 0, 3), Blocks.GRASS_BLOCK.getDefaultState(), false); + scene.world.setBlock(util.grid.at(2, 0, 3), Blocks.GRASS_BLOCK.defaultBlockState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(3, 1, 1)) .add(util.select.position(1, 1, 2)) @@ -321,7 +321,7 @@ public class MechanicalSawScenes { } } - scene.world.replaceBlocks(util.select.fromTo(2, 2, 3, 2, 6, 3), Blocks.AIR.getDefaultState(), true); + scene.world.replaceBlocks(util.select.fromTo(2, 2, 3, 2, 6, 3), Blocks.AIR.defaultBlockState(), true); scene.world.destroyBlock(util.grid.at(4, 5, 1)); scene.world.destroyBlock(util.grid.at(1, 4, 2)); scene.world.destroyBlock(util.grid.at(3, 6, 2)); @@ -329,10 +329,10 @@ public class MechanicalSawScenes { scene.world.destroyBlock(util.grid.at(2, 6, 3)); scene.world.destroyBlock(util.grid.at(2, 5, 2)); scene.world.destroyBlock(util.grid.at(1, 4, 2)); - scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.getDefaultState(), false); + scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.defaultBlockState(), false); for (int i = 0; i < 5; i++) { - Vector3d dropPos = util.vector.centerOf(breakingPos.up(i)); + Vector3d dropPos = util.vector.centerOf(breakingPos.above(i)); float distance = (float) dropPos.distanceTo(util.vector.centerOf(breakingPos)); scene.world.createItemEntity(dropPos, util.vector.of(-distance / 20, 0, 0), new ItemStack(Items.OAK_LOG)); } @@ -372,7 +372,7 @@ public class MechanicalSawScenes { scene.world.incrementBlockBreakingProgress(breakingPos); } - scene.world.replaceBlocks(util.select.fromTo(2, 2, 3, 2, 6, 3), Blocks.AIR.getDefaultState(), true); + scene.world.replaceBlocks(util.select.fromTo(2, 2, 3, 2, 6, 3), Blocks.AIR.defaultBlockState(), true); scene.world.destroyBlock(util.grid.at(4, 5, 1)); scene.world.destroyBlock(util.grid.at(1, 4, 2)); scene.world.destroyBlock(util.grid.at(3, 6, 2)); @@ -380,7 +380,7 @@ public class MechanicalSawScenes { scene.world.destroyBlock(util.grid.at(2, 6, 3)); scene.world.destroyBlock(util.grid.at(2, 5, 2)); scene.world.destroyBlock(util.grid.at(1, 4, 2)); - scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.getDefaultState(), false); + scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.defaultBlockState(), false); scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java index b34014ada..db1125dbe 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java @@ -47,7 +47,7 @@ public class MovementActorScenes { scene.world.rotateBearing(bearing, 360, 70); scene.world.rotateSection(contraption, 0, 360, 0, 70); scene.overlay.showText(60) - .pointAt(util.vector.topOf(bearing.up(2))) + .pointAt(util.vector.topOf(bearing.above(2))) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() @@ -115,7 +115,7 @@ public class MovementActorScenes { .text("Items can now be inserted..."); ItemStack itemStack = AllItems.COPPER_INGOT.asStack(); - Vector3d entitySpawn = util.vector.topOf(hopper.up(3)); + Vector3d entitySpawn = util.vector.topOf(hopper.above(3)); ElementLink entity1 = scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), itemStack); @@ -140,7 +140,7 @@ public class MovementActorScenes { scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack.copy()); scene.overlay.showText(40) .placeNearTarget() - .pointAt(util.vector.topOf(beltPos.up())) + .pointAt(util.vector.topOf(beltPos.above())) .text("...or extracted from the contraption"); scene.idle(15); scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack); @@ -213,8 +213,8 @@ public class MovementActorScenes { .add(util.select.position(2, 1, 3)) .add(util.select.position(1, 1, 2))); - scene.world.setBlocks(crops, Blocks.WHEAT.getDefaultState() - .with(CropsBlock.AGE, 7), false); + scene.world.setBlocks(crops, Blocks.WHEAT.defaultBlockState() + .setValue(CropsBlock.AGE, 7), false); scene.world.showSection(util.select.layer(0), Direction.UP); BlockPos bearingPos = util.grid.at(4, 1, 4); @@ -247,7 +247,7 @@ public class MovementActorScenes { scene.world.rotateBearing(bearingPos, -360, 140); scene.world.rotateSection(contraption, 0, -360, 0, 140); - BlockState harvested = Blocks.WHEAT.getDefaultState(); + BlockState harvested = Blocks.WHEAT.defaultBlockState(); ItemStack wheatItem = new ItemStack(Items.WHEAT); scene.idle(5); @@ -283,8 +283,8 @@ public class MovementActorScenes { scene.world.hideSection(crops, Direction.DOWN); scene.idle(15); scene.world.modifyEntities(ItemEntity.class, Entity::remove); - scene.world.setBlocks(crops, Blocks.WHEAT.getDefaultState() - .with(CropsBlock.AGE, 7), false); + scene.world.setBlocks(crops, Blocks.WHEAT.defaultBlockState() + .setValue(CropsBlock.AGE, 7), false); scene.world.showSection(crops, Direction.UP); for (int i = 0; i < 3; i++) @@ -399,7 +399,7 @@ public class MovementActorScenes { scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); scene.world.hideSection(garbage, Direction.UP); scene.idle(40); - scene.world.setBlocks(garbage, Blocks.SNOW.getDefaultState(), false); + scene.world.setBlocks(garbage, Blocks.SNOW.defaultBlockState(), false); scene.world.modifyEntities(ItemEntity.class, Entity::remove); ElementLink chest = scene.world.showIndependentSection(util.select.position(4, 2, 2), Direction.DOWN); @@ -440,7 +440,7 @@ public class MovementActorScenes { Selection dirt = util.select.fromTo(2, 0, 3, 1, 0, 2); scene.world.hideSection(dirt, Direction.DOWN); scene.idle(15); - scene.world.setBlocks(dirt, Blocks.GRASS_BLOCK.getDefaultState(), false); + scene.world.setBlocks(dirt, Blocks.GRASS_BLOCK.defaultBlockState(), false); scene.world.showSection(dirt, Direction.UP); scene.overlay.showText(60) .placeNearTarget() @@ -454,9 +454,9 @@ public class MovementActorScenes { scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); scene.idle(15); - scene.world.setBlocks(util.select.fromTo(2, 0, 2, 2, 0, 3), Blocks.FARMLAND.getDefaultState(), true); + scene.world.setBlocks(util.select.fromTo(2, 0, 2, 2, 0, 3), Blocks.FARMLAND.defaultBlockState(), true); scene.idle(30); - scene.world.setBlocks(util.select.fromTo(1, 0, 2, 1, 0, 3), Blocks.FARMLAND.getDefaultState(), true); + scene.world.setBlocks(util.select.fromTo(1, 0, 2, 1, 0, 3), Blocks.FARMLAND.defaultBlockState(), true); scene.idle(20); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java index 65e73a6cf..8994e1667 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java @@ -51,7 +51,7 @@ public class PistonScenes { scene.idle(15); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.modifyKineticSpeed(kinetics, f -> -f); scene.effects.rotationDirectionIndicator(shaft); scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); @@ -66,10 +66,10 @@ public class PistonScenes { .pointAt(util.vector.blockSurface(shaft, Direction.SOUTH)) .placeNearTarget() .text("Speed and direction of movement depend on the Rotational Input"); - scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.AIR.getDefaultState(), false); - scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.OAK_PLANKS.getDefaultState(), false); + scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.AIR.defaultBlockState(), false); + scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.OAK_PLANKS.defaultBlockState(), false); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.modifyKineticSpeed(kinetics, f -> -f); scene.effects.rotationDirectionIndicator(shaft); scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); @@ -80,12 +80,12 @@ public class PistonScenes { .withItem(new ItemStack(Items.SLIME_BALL)), 30); scene.idle(7); - scene.world.modifyBlock(piston.north(), s -> s.with(MechanicalPistonHeadBlock.TYPE, PistonType.STICKY), false); + scene.world.modifyBlock(piston.north(), s -> s.setValue(MechanicalPistonHeadBlock.TYPE, PistonType.STICKY), false); scene.effects.superGlue(piston, Direction.WEST, true); scene.idle(33); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.modifyKineticSpeed(kinetics, f -> -f); scene.effects.rotationDirectionIndicator(shaft); scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); @@ -97,16 +97,16 @@ public class PistonScenes { .attachKeyFrame() .text("Sticky Mechanical Pistons can pull the attached blocks back"); scene.idle(20); - scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.OAK_PLANKS.getDefaultState(), false); - scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.AIR.defaultBlockState(), false); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.modifyKineticSpeed(kinetics, f -> -f); scene.effects.rotationDirectionIndicator(shaft); scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); scene.idle(50); - scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.AIR.defaultBlockState(), false); ElementLink chassis = scene.world.showIndependentSection(util.select.fromTo(2, 2, 0, 2, 3, 2), Direction.DOWN); scene.world.moveSection(chassis, util.vector.of(0, -1, 1), 0); @@ -123,7 +123,7 @@ public class PistonScenes { scene.idle(90); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.modifyKineticSpeed(kinetics, f -> -f); scene.effects.rotationDirectionIndicator(shaft); scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); @@ -150,7 +150,7 @@ public class PistonScenes { BlockPos leverPos = util.grid.at(3, 2, 4); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.setKineticSpeed(kinetics, 16); scene.idle(10); @@ -162,7 +162,7 @@ public class PistonScenes { scene.idle(60); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.setKineticSpeed(kinetics, 0); scene.idle(5); scene.world.showSectionAndMerge(util.select.position(piston.north() @@ -189,7 +189,7 @@ public class PistonScenes { scene.idle(15); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.setKineticSpeed(kinetics, 16); scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); scene.special.moveParrot(birb, util.vector.of(-2, 0, 0), 40); @@ -226,13 +226,13 @@ public class PistonScenes { scene.idle(5); scene.world.showSectionAndMerge(util.select.position(piston.north() .west() - .up()), Direction.DOWN, contraption); + .above()), Direction.DOWN, contraption); scene.idle(15); scene.effects.superGlue(piston.west(), Direction.UP, true); scene.idle(10); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.modifyKineticSpeed(kinetics, f -> -f); scene.effects.rotationDirectionIndicator(shaft); scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); @@ -248,16 +248,16 @@ public class PistonScenes { scene.idle(80); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.modifyKineticSpeed(kinetics, f -> -f); scene.effects.rotationDirectionIndicator(shaft); scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); scene.world.hideSection(rose, Direction.UP); scene.idle(50); - scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.ROSE_BUSH.getDefaultState(), false); - scene.world.setBlock(util.grid.at(0, 2, 2), Blocks.ROSE_BUSH.getDefaultState() - .with(DoublePlantBlock.HALF, DoubleBlockHalf.UPPER), false); + scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.ROSE_BUSH.defaultBlockState(), false); + scene.world.setBlock(util.grid.at(0, 2, 2), Blocks.ROSE_BUSH.defaultBlockState() + .setValue(DoublePlantBlock.HALF, DoubleBlockHalf.UPPER), false); scene.world.showIndependentSection(rose, Direction.DOWN); scene.overlay.showCenteredScrollInput(piston, Direction.UP, 60); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(piston), Pointing.DOWN).scroll() @@ -270,7 +270,7 @@ public class PistonScenes { scene.idle(80); scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); scene.world.modifyKineticSpeed(kinetics, f -> -f); scene.effects.rotationDirectionIndicator(shaft); scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapter.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapter.java index 616708342..9bedf775d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapter.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapter.java @@ -23,19 +23,19 @@ public class PonderChapter implements IScreenRenderable { @Override public void draw(MatrixStack ms, AbstractGui screen, int x, int y) { - ms.push(); - Minecraft.getInstance().getTextureManager().bindTexture(icon); + ms.pushPose(); + Minecraft.getInstance().getTextureManager().bind(icon); ms.scale(0.25f, 0.25f, 1); //x and y offset, blit z offset, tex x and y, tex width and height, entire tex sheet width and height - AbstractGui.drawTexture(ms, x, y, 0, 0, 0, 64, 64, 64, 64); - ms.pop(); + AbstractGui.blit(ms, x, y, 0, 0, 0, 64, 64, 64, 64); + ms.popPose(); } @Nonnull public static PonderChapter of(String id) { - PonderChapter chapter = PonderRegistry.chapters.getChapter(id); + PonderChapter chapter = PonderRegistry.CHAPTERS.getChapter(id); if (chapter == null) { - chapter = PonderRegistry.chapters.addChapter(new PonderChapter(id)); + chapter = PonderRegistry.CHAPTERS.addChapter(new PonderChapter(id)); } return chapter; @@ -43,7 +43,7 @@ public class PonderChapter implements IScreenRenderable { public PonderChapter addTagsToChapter(PonderTag... tags) { for (PonderTag t : tags) - PonderRegistry.tags.add(t, this); + PonderRegistry.TAGS.add(t, this); return this; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index 88ba91352..62241e7fc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.Create; import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.ponder.content.fluid.DrainScenes; import com.simibubi.create.foundation.ponder.content.fluid.FluidMovementActorScenes; @@ -19,6 +20,8 @@ public class PonderIndex { public static final boolean EDITOR_MODE = false; public static void register() { + PonderRegistry.startRegistration(Create.ID); + // Register storyboards here // (!) Added entries require re-launch // (!) Modifications inside storyboard methods only require re-opening the ui @@ -285,7 +288,7 @@ public class PonderIndex { .addStoryBoard("powered_toggle_latch", RedstoneScenes::poweredToggleLatch); PonderRegistry.forComponents(AllBlocks.ANALOG_LEVER) .addStoryBoard("analog_lever", RedstoneScenes::analogLever); - PonderRegistry.forComponents(AllBlocks.NIXIE_TUBE) + PonderRegistry.forComponents(AllBlocks.ORANGE_NIXIE_TUBE) .addStoryBoard("nixie_tube", RedstoneScenes::nixieTube); PonderRegistry.forComponents(AllBlocks.REDSTONE_LINK) .addStoryBoard("redstone_link", RedstoneScenes::redstoneLink); @@ -293,12 +296,14 @@ public class PonderIndex { // Debug scenes, can be found in game via the Brass Hand if (EDITOR_MODE) DebugScenes.registerAll(); + + PonderRegistry.endRegistration(); } public static void registerTags() { // Add items to tags here - PonderRegistry.tags.forTag(PonderTag.KINETIC_RELAYS) + PonderRegistry.TAGS.forTag(PonderTag.KINETIC_RELAYS) .add(AllBlocks.SHAFT) .add(AllBlocks.COGWHEEL) .add(AllBlocks.LARGE_COGWHEEL) @@ -311,7 +316,7 @@ public class PonderIndex { .add(AllBlocks.SEQUENCED_GEARSHIFT) .add(AllBlocks.ROTATION_SPEED_CONTROLLER); - PonderRegistry.tags.forTag(PonderTag.KINETIC_SOURCES) + PonderRegistry.TAGS.forTag(PonderTag.KINETIC_SOURCES) .add(AllBlocks.HAND_CRANK) .add(AllBlocks.COPPER_VALVE_HANDLE) .add(AllBlocks.WATER_WHEEL) @@ -321,7 +326,7 @@ public class PonderIndex { .add(AllBlocks.FLYWHEEL) .add(AllBlocks.CREATIVE_MOTOR); - PonderRegistry.tags.forTag(PonderTag.KINETIC_APPLIANCES) + PonderRegistry.TAGS.forTag(PonderTag.KINETIC_APPLIANCES) .add(AllBlocks.MILLSTONE) .add(AllBlocks.TURNTABLE) .add(AllBlocks.ENCASED_FAN) @@ -342,7 +347,7 @@ public class PonderIndex { .add(AllBlocks.CLOCKWORK_BEARING) .add(AllBlocks.CRUSHING_WHEEL); - PonderRegistry.tags.forTag(PonderTag.FLUIDS) + PonderRegistry.TAGS.forTag(PonderTag.FLUIDS) .add(AllBlocks.FLUID_PIPE) .add(AllBlocks.MECHANICAL_PUMP) .add(AllBlocks.FLUID_VALVE) @@ -354,7 +359,7 @@ public class PonderIndex { .add(AllBlocks.FLUID_TANK) .add(AllBlocks.CREATIVE_FLUID_TANK); - PonderRegistry.tags.forTag(PonderTag.ARM_TARGETS) + PonderRegistry.TAGS.forTag(PonderTag.ARM_TARGETS) .add(AllBlocks.MECHANICAL_ARM) .add(AllItems.BELT_CONNECTOR) .add(AllBlocks.CHUTE) @@ -372,7 +377,7 @@ public class PonderIndex { .add(Blocks.COMPOSTER) .add(Blocks.JUKEBOX); - PonderRegistry.tags.forTag(PonderTag.LOGISTICS) + PonderRegistry.TAGS.forTag(PonderTag.LOGISTICS) .add(AllItems.BELT_CONNECTOR) .add(AllItems.FILTER) .add(AllItems.ATTRIBUTE_FILTER) @@ -391,8 +396,8 @@ public class PonderIndex { .add(AllBlocks.CREATIVE_CRATE) .add(AllBlocks.PORTABLE_STORAGE_INTERFACE); - PonderRegistry.tags.forTag(PonderTag.DECORATION) - .add(AllBlocks.NIXIE_TUBE) + PonderRegistry.TAGS.forTag(PonderTag.DECORATION) + .add(AllBlocks.ORANGE_NIXIE_TUBE) .add(AllBlocks.CUCKOO_CLOCK) .add(AllBlocks.WOODEN_BRACKET) .add(AllBlocks.METAL_BRACKET) @@ -400,18 +405,18 @@ public class PonderIndex { .add(AllBlocks.BRASS_CASING) .add(AllBlocks.COPPER_CASING); - PonderRegistry.tags.forTag(PonderTag.CREATIVE) + PonderRegistry.TAGS.forTag(PonderTag.CREATIVE) .add(AllBlocks.CREATIVE_CRATE) .add(AllBlocks.CREATIVE_FLUID_TANK) .add(AllBlocks.CREATIVE_MOTOR); - PonderRegistry.tags.forTag(PonderTag.SAILS) + PonderRegistry.TAGS.forTag(PonderTag.SAILS) .add(AllBlocks.SAIL) .add(AllBlocks.SAIL_FRAME) .add(Blocks.WHITE_WOOL); - PonderRegistry.tags.forTag(PonderTag.REDSTONE) - .add(AllBlocks.NIXIE_TUBE) + PonderRegistry.TAGS.forTag(PonderTag.REDSTONE) + .add(AllBlocks.ORANGE_NIXIE_TUBE) .add(AllBlocks.REDSTONE_CONTACT) .add(AllBlocks.ANALOG_LEVER) .add(AllBlocks.REDSTONE_LINK) @@ -421,7 +426,7 @@ public class PonderIndex { .add(AllBlocks.POWERED_LATCH) .add(AllBlocks.POWERED_TOGGLE_LATCH); - PonderRegistry.tags.forTag(PonderTag.MOVEMENT_ANCHOR) + PonderRegistry.TAGS.forTag(PonderTag.MOVEMENT_ANCHOR) .add(AllBlocks.MECHANICAL_PISTON) .add(AllBlocks.WINDMILL_BEARING) .add(AllBlocks.MECHANICAL_BEARING) @@ -430,7 +435,7 @@ public class PonderIndex { .add(AllBlocks.GANTRY_CARRIAGE) .add(AllBlocks.CART_ASSEMBLER); - PonderRegistry.tags.forTag(PonderTag.CONTRAPTION_ASSEMBLY) + PonderRegistry.TAGS.forTag(PonderTag.CONTRAPTION_ASSEMBLY) .add(AllBlocks.LINEAR_CHASSIS) .add(AllBlocks.SECONDARY_LINEAR_CHASSIS) .add(AllBlocks.RADIAL_CHASSIS) @@ -439,7 +444,7 @@ public class PonderIndex { .add(Blocks.SLIME_BLOCK) .add(Blocks.HONEY_BLOCK); - PonderRegistry.tags.forTag(PonderTag.CONTRAPTION_ACTOR) + PonderRegistry.TAGS.forTag(PonderTag.CONTRAPTION_ACTOR) .add(AllBlocks.MECHANICAL_HARVESTER) .add(AllBlocks.MECHANICAL_PLOUGH) .add(AllBlocks.MECHANICAL_DRILL) @@ -455,7 +460,6 @@ public class PonderIndex { .add(Blocks.BELL) .add(Blocks.DISPENSER) .add(Blocks.DROPPER); - } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java index 3e7936354..5a140bf69 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java @@ -55,7 +55,7 @@ public class PonderIndexScreen extends NavigatableSimiScreen { // chapters.addAll(PonderRegistry.chapters.getAllChapters()); items.clear(); - PonderRegistry.all.keySet() + PonderRegistry.ALL.keySet() .stream() .map(key -> { Item item = ForgeRegistries.ITEMS.getValue(key); @@ -108,7 +108,7 @@ public class PonderIndexScreen extends NavigatableSimiScreen { PonderButton b = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4) .showing(new ItemStack(item)) .withCallback((x, y) -> { - if (!PonderRegistry.all.containsKey(item.getRegistryName())) + if (!PonderRegistry.ALL.containsKey(item.getRegistryName())) return; centerScalingOn(x, y); @@ -137,9 +137,9 @@ public class PonderIndexScreen extends NavigatableSimiScreen { PonderUI.ponderTicks++; hoveredItem = ItemStack.EMPTY; - MainWindow w = client.getWindow(); - double mouseX = client.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); - double mouseY = client.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + MainWindow w = minecraft.getWindow(); + double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); + double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); for (Widget widget : widgets) { if (widget instanceof PonderButton) if (widget.isMouseOver(mouseX, mouseY)) { @@ -154,25 +154,25 @@ public class PonderIndexScreen extends NavigatableSimiScreen { int y = (int) (height * chapterYmult); if (!chapters.isEmpty()) { - ms.push(); + ms.pushPose(); ms.translate(x, y, 0); UIRenderHelper.streak(ms, 0, chapterArea.getX() - 10, chapterArea.getY() - 20, 20, 220); - textRenderer.draw(ms, "Topics to Ponder about", chapterArea.getX() - 5, chapterArea.getY() - 25, Theme.i(Theme.Key.TEXT)); + font.draw(ms, "Topics to Ponder about", chapterArea.getX() - 5, chapterArea.getY() - 25, Theme.i(Theme.Key.TEXT)); - ms.pop(); + ms.popPose(); } x = (int) (width * itemXmult); y = (int) (height * itemYmult); - ms.push(); + ms.pushPose(); ms.translate(x, y, 0); UIRenderHelper.streak(ms, 0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 220); - textRenderer.draw(ms, "Items to inspect", itemArea.getX() - 5, itemArea.getY() - 25, Theme.i(Theme.Key.TEXT)); + font.draw(ms, "Items to inspect", itemArea.getX() - 5, itemArea.getY() - 25, Theme.i(Theme.Key.TEXT)); - ms.pop(); + ms.popPose(); } @Override @@ -180,12 +180,12 @@ public class PonderIndexScreen extends NavigatableSimiScreen { if (hoveredItem.isEmpty()) return; - ms.push(); + ms.pushPose(); ms.translate(0, 0, 200); renderTooltip(ms, hoveredItem, mouseX, mouseY); - ms.pop(); + ms.popPose(); } /*@Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java index db8f3385f..f96f8e5eb 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java @@ -6,6 +6,7 @@ import java.util.List; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.Create; import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.IScreenRenderable; import com.simibubi.create.foundation.ponder.PonderLocalization; @@ -26,65 +27,65 @@ public class PonderTag implements IScreenRenderable { public static final PonderTag - KINETIC_RELAYS = new PonderTag("kinetic_relays").item(AllBlocks.COGWHEEL.get(), true, false) + KINETIC_RELAYS = create("kinetic_relays").item(AllBlocks.COGWHEEL.get(), true, false) .defaultLang("Kinetic Blocks", "Components which help relaying Rotational Force elsewhere") .addToIndex(), - KINETIC_SOURCES = new PonderTag("kinetic_sources").item(AllBlocks.WATER_WHEEL.get(), true, false) + KINETIC_SOURCES = create("kinetic_sources").item(AllBlocks.WATER_WHEEL.get(), true, false) .defaultLang("Kinetic Sources", "Components which generate Rotational Force") .addToIndex(), - KINETIC_APPLIANCES = new PonderTag("kinetic_appliances").item(AllBlocks.MECHANICAL_PRESS.get(), true, false) + KINETIC_APPLIANCES = create("kinetic_appliances").item(AllBlocks.MECHANICAL_PRESS.get(), true, false) .defaultLang("Kinetic Appliances", "Components which make use of Rotational Force") .addToIndex(), - FLUIDS = new PonderTag("fluids").item(AllBlocks.FLUID_PIPE.get(), true, false) + FLUIDS = create("fluids").item(AllBlocks.FLUID_PIPE.get(), true, false) .defaultLang("Fluid Manipulators", "Components which help relaying and making use of Fluids") .addToIndex(), - LOGISTICS = new PonderTag("logistics").item(Blocks.CHEST, true, false) + LOGISTICS = create("logistics").item(Blocks.CHEST, true, false) .defaultLang("Item Transportation", "Components which help moving items around") .addToIndex(), - REDSTONE = new PonderTag("redstone").item(Items.REDSTONE, true, false) + REDSTONE = create("redstone").item(Items.REDSTONE, true, false) .defaultLang("Logic Components", "Components which help with redstone engineering") .addToIndex(), - DECORATION = new PonderTag("decoration").item(Items.ROSE_BUSH, true, false) + DECORATION = create("decoration").item(Items.ROSE_BUSH, true, false) .defaultLang("Aesthetics", "Components used mostly for decorative purposes"), - CREATIVE = new PonderTag("creative").item(AllBlocks.CREATIVE_CRATE.get(), true, false) + CREATIVE = create("creative").item(AllBlocks.CREATIVE_CRATE.get(), true, false) .defaultLang("Creative Mode", "Components not usually available for Survival Mode") .addToIndex(), - MOVEMENT_ANCHOR = new PonderTag("movement_anchor").item(AllBlocks.MECHANICAL_PISTON.get(), true, false) + MOVEMENT_ANCHOR = create("movement_anchor").item(AllBlocks.MECHANICAL_PISTON.get(), true, false) .defaultLang("Movement Anchors", "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways") .addToIndex(), - CONTRAPTION_ACTOR = new PonderTag("contraption_actor").item(AllBlocks.MECHANICAL_HARVESTER.get(), true, false) + CONTRAPTION_ACTOR = create("contraption_actor").item(AllBlocks.MECHANICAL_HARVESTER.get(), true, false) .defaultLang("Contraption Actors", "Components which expose special behaviour when attached to a moving contraption") .addToIndex(), - CONTRAPTION_ASSEMBLY = new PonderTag("contraption_assembly").item(AllItems.SUPER_GLUE.get(), true, false) + CONTRAPTION_ASSEMBLY = create("contraption_assembly").item(AllItems.SUPER_GLUE.get(), true, false) .defaultLang("Block Attachment Utility", "Tools and Components used to assemble structures moved as an animated Contraption") .addToIndex(), - SAILS = new PonderTag("windmill_sails").item(AllBlocks.WINDMILL_BEARING.get(), true, true) + SAILS = create("windmill_sails").item(AllBlocks.WINDMILL_BEARING.get(), true, true) .defaultLang("Sails for Windmill Bearings", "Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so."), - ARM_TARGETS = new PonderTag("arm_targets").item(AllBlocks.MECHANICAL_ARM.get()) + ARM_TARGETS = create("arm_targets").item(AllBlocks.MECHANICAL_ARM.get()) .defaultLang("Targets for Mechanical Arms", "Components which can be selected as inputs or outputs to the Mechanical Arm"); public static class Highlight { - public static final PonderTag ALL = new PonderTag("_all"); + public static final PonderTag ALL = create("_all"); } - private final String id; + private final ResourceLocation id; private ResourceLocation icon; private ItemStack itemIcon = ItemStack.EMPTY; private ItemStack mainItem = ItemStack.EMPTY; @@ -99,11 +100,11 @@ public class PonderTag implements IScreenRenderable { // Builder - public PonderTag(String id) { + public PonderTag(ResourceLocation id) { this.id = id; } - public String getId() { + public ResourceLocation getId() { return id; } @@ -126,7 +127,12 @@ public class PonderTag implements IScreenRenderable { } public PonderTag icon(String location) { - this.icon = new ResourceLocation(com.simibubi.create.Create.ID, "textures/ponder/tag/" + location + ".png"); + this.icon = new ResourceLocation(id.getNamespace(), "textures/ponder/tag/" + location + ".png"); + return this; + } + + public PonderTag icon(ResourceLocation location) { + this.icon = new ResourceLocation(location.getNamespace(), "textures/ponder/tag/" + location.getPath() + ".png"); return this; } @@ -145,23 +151,27 @@ public class PonderTag implements IScreenRenderable { @Override @OnlyIn(Dist.CLIENT) public void draw(MatrixStack ms, AbstractGui screen, int x, int y) { - ms.push(); + ms.pushPose(); ms.translate(x, y, 0); if (icon != null) { Minecraft.getInstance() .getTextureManager() - .bindTexture(icon); + .bind(icon); ms.scale(0.25f, 0.25f, 1); // x and y offset, blit z offset, tex x and y, tex width and height, entire tex // sheet width and height - AbstractGui.drawTexture(ms, 0, 0, 0, 0, 0, 64, 64, 64, 64); + AbstractGui.blit(ms, 0, 0, 0, 0, 0, 64, 64, 64, 64); } else if (!itemIcon.isEmpty()) { ms.translate(-4, -4, 0); ms.scale(1.5f, 1.5f, 1.5f); GuiGameElement.of(itemIcon) .render(ms); } - ms.pop(); + ms.popPose(); + } + + private static PonderTag create(String id) { + return new PonderTag(Create.asResource(id)); } // Load class diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagIndexScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagIndexScreen.java index ff6ae2a10..24b4dc107 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagIndexScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagIndexScreen.java @@ -83,9 +83,9 @@ public class PonderTagIndexScreen extends NavigatableSimiScreen { PonderUI.ponderTicks++; hoveredItem = null; - MainWindow w = client.getWindow(); - double mouseX = client.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); - double mouseY = client.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + MainWindow w = minecraft.getWindow(); + double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); + double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); for (Widget widget : widgets) { if (widget == backTrack) continue; @@ -104,10 +104,10 @@ public class PonderTagIndexScreen extends NavigatableSimiScreen { protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { renderItems(ms, mouseX, mouseY, partialTicks); - ms.push(); + ms.pushPose(); ms.translate(width / 2 - 120, height * mainYmult - 40, 0); - ms.push(); + ms.pushPose(); // ms.translate(0, 0, 800); int x = 31 + 20 + 8; int y = 31; @@ -124,32 +124,32 @@ public class PonderTagIndexScreen extends NavigatableSimiScreen { .withBounds(30, 30) .render(ms); - textRenderer.draw(ms, title, x + 8, y + 1, Theme.i(Theme.Key.TEXT)); + font.draw(ms, title, x + 8, y + 1, Theme.i(Theme.Key.TEXT)); // y += 8; // x += 0; // ms.translate(x, y, 0); // ms.translate(0, 0, 5); // textRenderer.draw(ms, title, 0, 0, Theme.i(Theme.Key.TEXT)); - ms.pop(); + ms.popPose(); - ms.push(); + ms.pushPose(); ms.translate(23, 23, 10); ms.scale(1.66f, 1.66f, 1.66f); ms.translate(-4, -4, 0); ms.scale(1.5f, 1.5f, 1.5f); GuiGameElement.of(AllItems.WRENCH.asStack()) .render(ms); - ms.pop(); - ms.pop(); + ms.popPose(); + ms.popPose(); - ms.push(); + ms.pushPose(); int w = (int) (width * .45); x = (width - w) / 2; y = getItemsY() - 10 + Math.max(itemArea.getHeight(), 48); String desc = Lang.translate(DESCRIPTION) .getString(); - int h = textRenderer.getWordWrappedHeight(desc, w); + int h = font.wordWrapHeight(desc, w); // PonderUI.renderBox(ms, x - 3, y - 3, w + 6, h + 6, false); new BoxElement().withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) @@ -159,8 +159,8 @@ public class PonderTagIndexScreen extends NavigatableSimiScreen { .render(ms); ms.translate(0, 0, 100); - FontHelper.drawSplitString(ms, textRenderer, desc, x, y, w, Theme.i(Theme.Key.TEXT)); - ms.pop(); + FontHelper.drawSplitString(ms, font, desc, x, y, w, Theme.i(Theme.Key.TEXT)); + ms.popPose(); } protected void renderItems(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { @@ -173,9 +173,9 @@ public class PonderTagIndexScreen extends NavigatableSimiScreen { String relatedTitle = Lang.translate(CATEGORIES) .getString(); - int stringWidth = textRenderer.getStringWidth(relatedTitle); + int stringWidth = font.width(relatedTitle); - ms.push(); + ms.pushPose(); ms.translate(x, y, 0); // PonderUI.renderBox(ms, (sWidth - stringWidth) / 2 - 5, itemArea.getY() - 21, // stringWidth + 10, 10, false); @@ -188,14 +188,14 @@ public class PonderTagIndexScreen extends NavigatableSimiScreen { ms.translate(0, 0, 200); // UIRenderHelper.streak(0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 180, 0x101010); - drawCenteredString(ms, textRenderer, relatedTitle, windowWidth / 2, itemArea.getY() - 20, Theme.i(Theme.Key.TEXT)); + drawCenteredString(ms, font, relatedTitle, windowWidth / 2, itemArea.getY() - 20, Theme.i(Theme.Key.TEXT)); ms.translate(0, 0, -200); UIRenderHelper.streak(ms, 0, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth() / 2 + 75); UIRenderHelper.streak(ms, 180, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth() / 2 + 75); - ms.pop(); + ms.popPose(); } @@ -205,7 +205,7 @@ public class PonderTagIndexScreen extends NavigatableSimiScreen { @Override protected void renderWindowForeground(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - ms.push(); + ms.pushPose(); RenderSystem.disableRescaleNormal(); RenderSystem.disableDepthTest(); @@ -214,11 +214,11 @@ public class PonderTagIndexScreen extends NavigatableSimiScreen { List list = TooltipHelper.cutStringTextComponent(hoveredItem.getDescription(), TextFormatting.GRAY, TextFormatting.GRAY); list.add(0, new StringTextComponent(hoveredItem.getTitle())); - renderTooltip(ms, list, mouseX, mouseY); + renderComponentTooltip(ms, list, mouseX, mouseY); } RenderSystem.enableDepthTest(); RenderSystem.enableRescaleNormal(); - ms.pop(); + ms.popPose(); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java index 9ff0a6763..f13fc6cdc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java @@ -73,7 +73,7 @@ public class PonderTagRegistry { } public ItemBuilder add(PonderTag tag) { - items.forEach(i -> PonderRegistry.tags.add(tag, i)); + items.forEach(i -> PonderRegistry.TAGS.add(tag, i)); return this; } @@ -88,7 +88,7 @@ public class PonderTagRegistry { } public TagBuilder add(ResourceLocation item) { - PonderRegistry.tags.add(tag, item); + PonderRegistry.TAGS.add(tag, item); return this; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java index c861360e2..203c4890f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java @@ -60,7 +60,7 @@ public class PonderTagScreen extends NavigatableSimiScreen { // items items.clear(); - PonderRegistry.tags.getItems(tag) + PonderRegistry.TAGS.getItems(tag) .stream() .map(key -> { Item item = ForgeRegistries.ITEMS.getValue(key); @@ -87,7 +87,7 @@ public class PonderTagScreen extends NavigatableSimiScreen { PonderButton b = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4) .showing(new ItemStack(i)); - if (PonderRegistry.all.containsKey(i.getRegistryName())) { + if (PonderRegistry.ALL.containsKey(i.getRegistryName())) { b.withCallback((mouseX, mouseY) -> { centerScalingOn(mouseX, mouseY); ScreenOpener.transitionTo(PonderUI.of(new ItemStack(i), tag)); @@ -115,7 +115,7 @@ public class PonderTagScreen extends NavigatableSimiScreen { PonderButton b = new PonderButton(itemCenterX - layout.getTotalWidth() / 2 - 42, itemCenterY - 10) .showing(tag.getMainItem()); - if (PonderRegistry.all.containsKey(registryName)) { + if (PonderRegistry.ALL.containsKey(registryName)) { b.withCallback((mouseX, mouseY) -> { centerScalingOn(mouseX, mouseY); ScreenOpener.transitionTo(PonderUI.of(tag.getMainItem(), tag)); @@ -135,7 +135,7 @@ public class PonderTagScreen extends NavigatableSimiScreen { // chapters chapters.clear(); - chapters.addAll(PonderRegistry.tags.getChapters(tag)); + chapters.addAll(PonderRegistry.TAGS.getChapters(tag)); rowCount = MathHelper.clamp((int) Math.ceil(chapters.size() / 3f), 1, 3); layout = LayoutHelper.centeredHorizontal(chapters.size(), rowCount, 200, 38, 16); @@ -162,9 +162,9 @@ public class PonderTagScreen extends NavigatableSimiScreen { PonderUI.ponderTicks++; hoveredItem = ItemStack.EMPTY; - MainWindow w = client.getWindow(); - double mouseX = client.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); - double mouseY = client.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + MainWindow w = minecraft.getWindow(); + double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); + double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); for (Widget widget : widgets) { if (widget == backTrack) continue; @@ -181,10 +181,10 @@ public class PonderTagScreen extends NavigatableSimiScreen { renderChapters(ms, mouseX, mouseY, partialTicks); - ms.push(); + ms.pushPose(); ms.translate(width / 2 - 120, height * mainYmult - 40, 0); - ms.push(); + ms.pushPose(); //ms.translate(0, 0, 800); int x = 31 + 20 + 8; int y = 31; @@ -201,28 +201,28 @@ public class PonderTagScreen extends NavigatableSimiScreen { .withBounds(30, 30) .render(ms); - textRenderer.draw(ms, Lang.translate(PonderUI.PONDERING), x, y - 6, Theme.i(Theme.Key.TEXT_DARKER)); + font.draw(ms, Lang.translate(PonderUI.PONDERING), x, y - 6, Theme.i(Theme.Key.TEXT_DARKER)); y += 8; x += 0; ms.translate(x, y, 0); ms.translate(0, 0, 5); - textRenderer.draw(ms, title, 0, 0, Theme.i(Theme.Key.TEXT)); - ms.pop(); + font.draw(ms, title, 0, 0, Theme.i(Theme.Key.TEXT)); + ms.popPose(); - ms.push(); + ms.pushPose(); ms.translate(23, 23, 10); ms.scale(1.66f, 1.66f, 1.66f); tag.draw(ms, this, 0, 0); - ms.pop(); - ms.pop(); + ms.popPose(); + ms.popPose(); - ms.push(); + ms.pushPose(); int w = (int) (width * .45); x = (width - w) / 2; y = getItemsY() - 10 + Math.max(itemArea.getHeight(), 48); String desc = tag.getDescription(); - int h = textRenderer.getWordWrappedHeight(desc, w); + int h = font.wordWrapHeight(desc, w); //PonderUI.renderBox(ms, x - 3, y - 3, w + 6, h + 6, false); @@ -234,8 +234,8 @@ public class PonderTagScreen extends NavigatableSimiScreen { .render(ms); ms.translate(0, 0, 100); - FontHelper.drawSplitString(ms, textRenderer, desc, x, y, w, Theme.i(Theme.Key.TEXT)); - ms.pop(); + FontHelper.drawSplitString(ms, font, desc, x, y, w, Theme.i(Theme.Key.TEXT)); + ms.popPose(); } protected void renderItems(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { @@ -246,9 +246,9 @@ public class PonderTagScreen extends NavigatableSimiScreen { int y = getItemsY(); String relatedTitle = Lang.translate(ASSOCIATED).getString(); - int stringWidth = textRenderer.getStringWidth(relatedTitle); + int stringWidth = font.width(relatedTitle); - ms.push(); + ms.pushPose(); ms.translate(x, y, 0); //PonderUI.renderBox(ms, (sWidth - stringWidth) / 2 - 5, itemArea.getY() - 21, stringWidth + 10, 10, false); new BoxElement() @@ -261,14 +261,14 @@ public class PonderTagScreen extends NavigatableSimiScreen { ms.translate(0, 0, 200); // UIRenderHelper.streak(0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 180, 0x101010); - drawCenteredString(ms, textRenderer, relatedTitle, windowWidth / 2, itemArea.getY() - 20, Theme.i(Theme.Key.TEXT)); + drawCenteredString(ms, font, relatedTitle, windowWidth / 2, itemArea.getY() - 20, Theme.i(Theme.Key.TEXT)); ms.translate(0,0, -200); UIRenderHelper.streak(ms, 0, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth() / 2 + 75); UIRenderHelper.streak(ms, 180, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth() / 2 + 75); - ms.pop(); + ms.popPose(); } @@ -283,18 +283,18 @@ public class PonderTagScreen extends NavigatableSimiScreen { int chapterX = (int) (width * chapterXmult); int chapterY = (int) (height * chapterYmult); - ms.push(); + ms.pushPose(); ms.translate(chapterX, chapterY, 0); UIRenderHelper.streak(ms, 0, chapterArea.getX() - 10, chapterArea.getY() - 20, 20, 220); - textRenderer.draw(ms, "More Topics to Ponder about", chapterArea.getX() - 5, chapterArea.getY() - 25, Theme.i(Theme.Key.TEXT_ACCENT_SLIGHT)); + font.draw(ms, "More Topics to Ponder about", chapterArea.getX() - 5, chapterArea.getY() - 25, Theme.i(Theme.Key.TEXT_ACCENT_SLIGHT)); - ms.pop(); + ms.popPose(); } @Override protected void renderWindowForeground(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { - ms.push(); + ms.pushPose(); RenderSystem.disableRescaleNormal(); RenderSystem.disableDepthTest(); @@ -304,7 +304,7 @@ public class PonderTagScreen extends NavigatableSimiScreen { } RenderSystem.enableDepthTest(); RenderSystem.enableRescaleNormal(); - ms.pop(); + ms.popPose(); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java index d852322d9..342b530f8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.contraptions.processing.BasinBlock; import com.simibubi.create.content.contraptions.processing.BasinTileEntity; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.content.contraptions.processing.burner.LitBlazeBurnerBlock; import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuildingUtil; @@ -86,7 +87,7 @@ public class ProcessingScenes { scene.idle(70); ItemStack itemStack = new ItemStack(Items.WHEAT); - Vector3d entitySpawn = util.vector.topOf(millstone.up(3)); + Vector3d entitySpawn = util.vector.topOf(millstone.above(3)); ElementLink entity1 = scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), itemStack); @@ -150,7 +151,7 @@ public class ProcessingScenes { Selection kinetics2 = util.select.fromTo(0, 2, 5, 4, 2, 3); Selection beltCog = util.select.position(5, 0, 1); scene.world.setKineticSpeed(wheels, 0); - scene.world.setBlock(util.grid.at(2, 3, 2), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(2, 3, 2), Blocks.AIR.defaultBlockState(), false); scene.world.showSection(util.select.layer(0) .substract(beltCog), Direction.UP); @@ -202,7 +203,7 @@ public class ProcessingScenes { ItemStack input = new ItemStack(Items.GOLD_ORE); ItemStack output = AllItems.CRUSHED_GOLD.asStack(); - Vector3d entitySpawn = util.vector.topOf(center.up(2)); + Vector3d entitySpawn = util.vector.topOf(center.above(2)); ElementLink entity1 = scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), input); @@ -253,9 +254,9 @@ public class ProcessingScenes { scene.world.createItemOnBelt(util.grid.at(4, 4, 2), Direction.EAST, input); scene.idle(15); if (i > 0) { - scene.world.createItemOnBelt(center.down(), Direction.UP, output); + scene.world.createItemOnBelt(center.below(), Direction.UP, output); scene.idle(15); - scene.world.createItemOnBelt(center.down(), Direction.UP, output); + scene.world.createItemOnBelt(center.below(), Direction.UP, output); } scene.world.removeItemsFromBelt(util.grid.at(3, 3, 2)); if (i < 4) @@ -353,8 +354,8 @@ public class ProcessingScenes { scene.idle(30); scene.world.modifyTileEntity(pressPos, type, pte -> pte.makePressingParticleEffect(depotCenter.add(0, 8 / 16f, 0), copper)); - scene.world.removeItemsFromBelt(pressPos.down(2)); - ingot = scene.world.createItemOnBelt(pressPos.down(2), Direction.UP, sheet); + scene.world.removeItemsFromBelt(pressPos.below(2)); + ingot = scene.world.createItemOnBelt(pressPos.below(2), Direction.UP, sheet); scene.world.stallBeltItem(ingot, true); scene.idle(15); scene.world.stallBeltItem(ingot, false); @@ -364,8 +365,8 @@ public class ProcessingScenes { scene.idle(30); scene.world.modifyTileEntity(pressPos, type, pte -> pte.makePressingParticleEffect(depotCenter.add(0, 8 / 16f, 0), copper)); - scene.world.removeItemsFromBelt(pressPos.down(2)); - ingot2 = scene.world.createItemOnBelt(pressPos.down(2), Direction.UP, sheet); + scene.world.removeItemsFromBelt(pressPos.below(2)); + ingot2 = scene.world.createItemOnBelt(pressPos.below(2), Direction.UP, sheet); scene.world.stallBeltItem(ingot2, true); scene.idle(15); scene.world.stallBeltItem(ingot2, false); @@ -432,7 +433,7 @@ public class ProcessingScenes { scene.rotateCameraY(-30); scene.idle(10); scene.world.setBlock(util.grid.at(1, 1, 2), AllBlocks.BLAZE_BURNER.getDefaultState() - .with(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), true); + .setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), true); scene.idle(10); scene.overlay.showText(80) @@ -531,7 +532,7 @@ public class ProcessingScenes { scene.rotateCameraY(-30); scene.idle(10); scene.world.setBlock(util.grid.at(1, 1, 2), AllBlocks.BLAZE_BURNER.getDefaultState() - .with(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), true); + .setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), true); scene.idle(10); scene.overlay.showText(80) @@ -563,20 +564,20 @@ public class ProcessingScenes { scene.world.createEntity(w -> { BlazeEntity blazeEntity = EntityType.BLAZE.create(w); Vector3d v = util.vector.topOf(center); - blazeEntity.setPos(v.x, v.y, v.z); - blazeEntity.prevRotationYaw = blazeEntity.rotationYaw = 180; + blazeEntity.setPosRaw(v.x, v.y, v.z); + blazeEntity.yRotO = blazeEntity.yRot = 180; return blazeEntity; }); scene.idle(20); scene.overlay - .showControls(new InputWindowElement(util.vector.centerOf(center.up(2)), Pointing.DOWN).rightClick() + .showControls(new InputWindowElement(util.vector.centerOf(center.above(2)), Pointing.DOWN).rightClick() .withItem(AllItems.EMPTY_BLAZE_BURNER.asStack()), 40); scene.idle(10); scene.overlay.showText(60) .text("Right-click a Blaze with the empty burner to capture it") .attachKeyFrame() - .pointAt(util.vector.blockSurface(center.up(2), Direction.WEST)) + .pointAt(util.vector.blockSurface(center.above(2), Direction.WEST)) .placeNearTarget(); scene.idle(50); @@ -585,13 +586,13 @@ public class ProcessingScenes { scene.world.showSection(util.select.position(2, 1, 2), Direction.DOWN); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(center.up()), Pointing.DOWN).rightClick() + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(center.above()), Pointing.DOWN).rightClick() .withItem(AllItems.EMPTY_BLAZE_BURNER.asStack()), 40); scene.idle(10); scene.overlay.showText(60) .text("Alternatively, Blazes can be collected from their Spawners directly") .attachKeyFrame() - .pointAt(util.vector.blockSurface(center.up(), Direction.WEST)) + .pointAt(util.vector.blockSurface(center.above(), Direction.WEST)) .placeNearTarget(); scene.idle(50); scene.world.hideSection(util.select.position(2, 1, 2), Direction.UP); @@ -599,37 +600,50 @@ public class ProcessingScenes { scene.world.showSection(util.select.position(1, 1, 2), Direction.DOWN); scene.idle(20); - scene.world.modifyBlock(util.grid.at(1, 1, 2), s -> s.with(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), + scene.world.modifyBlock(util.grid.at(1, 1, 2), s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), false); scene.overlay.showText(70) .text("You now have an ideal heat source for various machines") .attachKeyFrame() .pointAt(util.vector.blockSurface(center.west() - .up(), Direction.WEST)) + .above(), Direction.WEST)) .placeNearTarget(); scene.idle(80); scene.world.showSection(util.select.position(3, 1, 2), Direction.DOWN); scene.idle(20); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(center.east() - .up()), Pointing.DOWN).rightClick() + .above()), Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.FLINT_AND_STEEL)), 40); scene.idle(7); - scene.world.setBlock(util.grid.at(3, 1, 2), AllBlocks.LIT_BLAZE_BURNER.getDefaultState(), true); + scene.world.setBlock(util.grid.at(3, 1, 2), AllBlocks.LIT_BLAZE_BURNER.getDefaultState(), false); scene.idle(10); scene.overlay.showText(70) .text("For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel") .attachKeyFrame() .pointAt(util.vector.blockSurface(center.east() - .up(), Direction.UP)) + .above(), Direction.UP)) .placeNearTarget(); scene.idle(80); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(center.east() + .above()), Pointing.DOWN).rightClick() + .withItem(new ItemStack(Items.SOUL_SAND)), + 40); + scene.idle(7); + scene.world.modifyBlock(util.grid.at(3, 1, 2), s -> s.setValue(LitBlazeBurnerBlock.FLAME_TYPE, LitBlazeBurnerBlock.FlameType.SOUL), + false); scene.overlay.showText(60) - .colored(PonderPalette.RED) - .text("However, these are not suitable for industrial heating") + .text("The flame can be transformed using a soul-infused item") .pointAt(util.vector.blockSurface(center.east() - .up(), Direction.UP)) + .above(), Direction.UP)) + .placeNearTarget(); + scene.idle(80); + scene.overlay.showText(90) + .colored(PonderPalette.RED) + .text("However, without a blaze they are not suitable for industrial heating") + .pointAt(util.vector.blockSurface(center.east() + .above(), Direction.UP)) .placeNearTarget(); scene.idle(70); } @@ -643,7 +657,7 @@ public class ProcessingScenes { BlockPos burner = util.grid.at(2, 1, 2); scene.world.showSection(util.select.position(burner), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(burner.up()), Direction.DOWN); + scene.world.showSection(util.select.position(burner.above()), Direction.DOWN); scene.idle(10); scene.overlay.showText(70) @@ -653,18 +667,18 @@ public class ProcessingScenes { .placeNearTarget(); scene.idle(80); - scene.world.hideSection(util.select.position(burner.up()), Direction.UP); + scene.world.hideSection(util.select.position(burner.above()), Direction.UP); scene.idle(20); - scene.world.setBlock(burner.up(), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(burner.above(), Blocks.AIR.defaultBlockState(), false); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(burner), Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.OAK_PLANKS)), 15); scene.idle(7); - scene.world.modifyBlock(burner, s -> s.with(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.FADING), false); + scene.world.modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.FADING), false); scene.idle(15); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(burner), Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.OAK_PLANKS)), 15); scene.idle(7); - scene.world.modifyBlock(burner, s -> s.with(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), false); + scene.world.modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), false); scene.idle(20); scene.overlay.showText(70) @@ -678,7 +692,7 @@ public class ProcessingScenes { scene.overlay.showControls(new InputWindowElement(util.vector.topOf(burner), Pointing.DOWN).rightClick() .withItem(AllItems.BLAZE_CAKE.asStack()), 30); scene.idle(7); - scene.world.modifyBlock(burner, s -> s.with(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.SEETHING), false); + scene.world.modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.SEETHING), false); scene.idle(20); scene.overlay.showText(80) @@ -717,7 +731,7 @@ public class ProcessingScenes { scene.world.showSection(util.select.position(1, 1, 2), Direction.DOWN); scene.idle(10); BlockPos basinPos = util.grid.at(1, 2, 2); - scene.world.modifyBlock(basinPos, s -> s.with(BasinBlock.FACING, Direction.DOWN), false); + scene.world.modifyBlock(basinPos, s -> s.setValue(BasinBlock.FACING, Direction.DOWN), false); scene.world.showSection(util.select.position(basinPos), Direction.DOWN); scene.idle(10); Vector3d basinSide = util.vector.blockSurface(basinPos, Direction.WEST); @@ -730,7 +744,7 @@ public class ProcessingScenes { ItemStack stack = new ItemStack(Items.BRICK); for (int i = 0; i < 4; i++) { - scene.world.createItemEntity(util.vector.centerOf(basinPos.up(3)), util.vector.of(0, 0, 0), stack); + scene.world.createItemEntity(util.vector.centerOf(basinPos.above(3)), util.vector.of(0, 0, 0), stack); scene.idle(10); } scene.idle(10); @@ -739,8 +753,8 @@ public class ProcessingScenes { scene.idle(30); for (Direction d : Iterate.horizontalDirections) { - scene.overlay.showOutline(PonderPalette.GREEN, new Object(), util.select.position(basinPos.down() - .offset(d)), 60); + scene.overlay.showOutline(PonderPalette.GREEN, new Object(), util.select.position(basinPos.below() + .relative(d)), 60); scene.idle(4); } @@ -756,7 +770,7 @@ public class ProcessingScenes { scene.world.showIndependentSection(util.select.position(3, 1, 1), Direction.EAST); scene.world.moveSection(depot, util.vector.of(-2, 0, 0), 0); scene.idle(10); - scene.world.modifyBlock(basinPos, s -> s.with(BasinBlock.FACING, Direction.NORTH), false); + scene.world.modifyBlock(basinPos, s -> s.setValue(BasinBlock.FACING, Direction.NORTH), false); scene.idle(10); scene.overlay.showText(80) @@ -817,7 +831,7 @@ public class ProcessingScenes { .serializeNBT())); }); scene.idle(4); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basinPos.down() + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basinPos.below() .north()), Pointing.RIGHT).withItem(new ItemStack(Items.BRICKS)), 30); scene.overlay.showText(60) @@ -830,7 +844,7 @@ public class ProcessingScenes { scene.world.hideIndependentSection(depot, Direction.NORTH); scene.idle(10); - scene.world.modifyBlock(basinPos, s -> s.with(BasinBlock.FACING, Direction.DOWN), false); + scene.world.modifyBlock(basinPos, s -> s.setValue(BasinBlock.FACING, Direction.DOWN), false); scene.idle(20); scene.overlay.showText(80) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java index b228d4f60..8cc9fff31 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java @@ -123,7 +123,7 @@ public class PulleyScenes { scene.world.showSection(util.select.position(pulleyPos), Direction.SOUTH); ElementLink glass = - scene.world.showIndependentSection(util.select.position(pulleyPos.down()), Direction.UP); + scene.world.showIndependentSection(util.select.position(pulleyPos.below()), Direction.UP); scene.idle(20); scene.world.toggleRedstonePower(redstoneStuff); @@ -152,7 +152,7 @@ public class PulleyScenes { scene.world.hideSection(util.select.position(flowerPos), Direction.DOWN); scene.idle(40); - scene.world.setBlock(flowerPos, Blocks.BLUE_ORCHID.getDefaultState(), false); + scene.world.setBlock(flowerPos, Blocks.BLUE_ORCHID.defaultBlockState(), false); scene.world.showSection(util.select.position(flowerPos), Direction.DOWN); scene.overlay.showCenteredScrollInput(pulleyPos, Direction.UP, 60); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pulleyPos), Pointing.DOWN).scroll() diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java index ef4a004be..b77a3fc5b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.ponder.content; +import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerTileEntity; import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity; @@ -9,6 +10,7 @@ import com.simibubi.create.content.logistics.block.diodes.PoweredLatchBlock; import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterBlock; import com.simibubi.create.content.logistics.block.diodes.ToggleLatchBlock; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity; +import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlock; import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity; @@ -22,6 +24,7 @@ import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.utility.Pointing; import net.minecraft.block.RedstoneWireBlock; +import net.minecraft.item.DyeColor; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; @@ -64,7 +67,7 @@ public class RedstoneScenes { scene.idle(70); scene.world.toggleRedstonePower(redstone); - scene.world.modifyBlock(stickerPos, s -> s.with(StickerBlock.EXTENDED, true), false); + scene.world.modifyBlock(stickerPos, s -> s.setValue(StickerBlock.EXTENDED, true), false); scene.effects.indicateRedstone(buttonPos); scene.world.modifyTileNBT(stickerSelect, StickerTileEntity.class, nbt -> { }); @@ -90,7 +93,7 @@ public class RedstoneScenes { scene.addKeyframe(); scene.world.toggleRedstonePower(redstone); - scene.world.modifyBlock(stickerPos, s -> s.with(StickerBlock.EXTENDED, false), false); + scene.world.modifyBlock(stickerPos, s -> s.setValue(StickerBlock.EXTENDED, false), false); scene.effects.indicateRedstone(buttonPos); scene.world.modifyTileNBT(stickerSelect, StickerTileEntity.class, nbt -> { }); @@ -399,8 +402,8 @@ public class RedstoneScenes { scene.idle(30); scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 3, 1, 2)); - AxisAlignedBB bb = new AxisAlignedBB(circuitPos).grow(-.48f, -.45f, -.05f) - .offset(.575, -.45, 0); + AxisAlignedBB bb = new AxisAlignedBB(circuitPos).inflate(-.48f, -.45f, -.05f) + .move(.575, -.45, 0); scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 40); scene.overlay.showText(40) .colored(PonderPalette.GREEN) @@ -416,10 +419,10 @@ public class RedstoneScenes { scene.idle(30); scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 0, 2, 1, 1)); - bb = new AxisAlignedBB(circuitPos).grow(-.05f, -.45f, -.48f) - .offset(0, -.45, .575); - AxisAlignedBB bb2 = new AxisAlignedBB(circuitPos).grow(-.05f, -.45f, -.48f) - .offset(0, -.45, -.575); + bb = new AxisAlignedBB(circuitPos).inflate(-.05f, -.45f, -.48f) + .move(0, -.45, .575); + AxisAlignedBB bb2 = new AxisAlignedBB(circuitPos).inflate(-.05f, -.45f, -.48f) + .move(0, -.45, -.575); scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 40); scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2, 40); scene.overlay.showText(40) @@ -479,8 +482,8 @@ public class RedstoneScenes { scene.idle(30); scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 3, 1, 2)); - AxisAlignedBB bb = new AxisAlignedBB(circuitPos).grow(-.48f, -.45f, -.05f) - .offset(.575, -.45, 0); + AxisAlignedBB bb = new AxisAlignedBB(circuitPos).inflate(-.48f, -.45f, -.05f) + .move(.575, -.45, 0); scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 40); scene.overlay.showText(40) .colored(PonderPalette.GREEN) @@ -562,7 +565,7 @@ public class RedstoneScenes { scene.idle(2); final int state = i + 1; scene.world.modifyTileNBT(leverSelection, AnalogLeverTileEntity.class, nbt -> nbt.putInt("State", state)); - scene.world.modifyBlock(wireLocations[i], s -> s.with(power, 7 - state), false); + scene.world.modifyBlock(wireLocations[i], s -> s.setValue(power, 7 - state), false); scene.effects.indicateRedstone(wireLocations[i]); } scene.idle(20); @@ -585,9 +588,9 @@ public class RedstoneScenes { nbt -> nbt.putInt("State", state)); scene.effects.indicateRedstone(wireLocations[i]); } - scene.world.modifyBlock(wireLocations[i], s -> s.with(power, state > 2 ? 0 : 3 - state), false); + scene.world.modifyBlock(wireLocations[i], s -> s.setValue(power, state > 2 ? 0 : 3 - state), false); } - scene.world.modifyBlock(wireLocations[0], s -> s.with(power, 3), false); + scene.world.modifyBlock(wireLocations[0], s -> s.setValue(power, 3), false); scene.idle(20); scene.overlay.showText(60) @@ -607,7 +610,7 @@ public class RedstoneScenes { nbt -> nbt.putInt("State", state)); scene.effects.indicateRedstone(wireLocations[i]); } - scene.world.modifyBlock(wireLocations[i], s -> s.with(power, 15 - state), false); + scene.world.modifyBlock(wireLocations[i], s -> s.setValue(power, 15 - state), false); } scene.world.toggleRedstonePower(lamp); @@ -630,7 +633,7 @@ public class RedstoneScenes { scene.effects.indicateRedstone(util.grid.at(2, 1, 1)); scene.world.modifyTileNBT(util.select.position(2, 1, 1), AnalogLeverTileEntity.class, nbt -> nbt.putInt("State", 11)); - scene.world.modifyBlock(util.grid.at(2, 1, 2), s -> s.with(RedstoneWireBlock.POWER, 11), false); + scene.world.modifyBlock(util.grid.at(2, 1, 2), s -> s.setValue(RedstoneWireBlock.POWER, 11), false); scene.world.modifyTileNBT(tubes, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 11)); scene.idle(20); @@ -676,8 +679,26 @@ public class RedstoneScenes { .placeNearTarget() .text("Using name tags edited with an anvil, custom text can be displayed") .pointAt(util.vector.topOf(util.grid.at(3, 1, 3)) - .add(.25, -.05f, 0)); - scene.idle(70); + .add(-.75, -.05f, 0)); + scene.idle(90); + + InputWindowElement input = + new InputWindowElement(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.UP), Pointing.DOWN) + .withItem(new ItemStack(Items.BLUE_DYE)); + scene.overlay.showControls(input, 30); + scene.idle(7); + scene.world.setBlocks(util.select.fromTo(1, 1, 3, 3, 1, 3), AllBlocks.NIXIE_TUBES.get(DyeColor.BLUE) + .getDefaultState() + .setValue(NixieTubeBlock.FACING, Direction.NORTH), false); + scene.idle(10); + scene.overlay.showText(80) + .colored(PonderPalette.BLUE) + .text("Right-Click with Dye to change their display colour") + .attachKeyFrame() + .pointAt(util.vector.topOf(util.grid.at(3, 1, 3)) + .add(-.75, -.05f, 0)) + .placeNearTarget(); + scene.idle(60); } public static void redstoneLink(SceneBuilder scene, SceneBuildingUtil util) { @@ -788,30 +809,30 @@ public class RedstoneScenes { scene.idle(7); scene.overlay.showControls(new InputWindowElement(frontSlot, Pointing.UP).withItem(sapling), 40); scene.world.modifyTileNBT(link1Select, RedstoneLinkTileEntity.class, - nbt -> nbt.put("FrequencyLast", iron.write(new CompoundNBT()))); + nbt -> nbt.put("FrequencyLast", iron.save(new CompoundNBT()))); scene.idle(7); scene.world.modifyTileNBT(link1Select, RedstoneLinkTileEntity.class, - nbt -> nbt.put("FrequencyFirst", sapling.write(new CompoundNBT()))); + nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundNBT()))); scene.idle(20); scene.overlay.showControls(new InputWindowElement(top2Slot, Pointing.DOWN).withItem(iron), 40); scene.idle(7); scene.overlay.showControls(new InputWindowElement(bottom2Slot, Pointing.UP).withItem(sapling), 40); scene.world.modifyTileNBT(link2Select, RedstoneLinkTileEntity.class, - nbt -> nbt.put("FrequencyLast", iron.write(new CompoundNBT()))); + nbt -> nbt.put("FrequencyLast", iron.save(new CompoundNBT()))); scene.idle(7); scene.world.modifyTileNBT(link2Select, RedstoneLinkTileEntity.class, - nbt -> nbt.put("FrequencyFirst", sapling.write(new CompoundNBT()))); + nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundNBT()))); scene.idle(20); scene.overlay.showControls(new InputWindowElement(top3Slot, Pointing.DOWN).withItem(gold), 40); scene.idle(7); scene.overlay.showControls(new InputWindowElement(bottom3Slot, Pointing.UP).withItem(sapling), 40); scene.world.modifyTileNBT(link3Select, RedstoneLinkTileEntity.class, - nbt -> nbt.put("FrequencyLast", gold.write(new CompoundNBT()))); + nbt -> nbt.put("FrequencyLast", gold.save(new CompoundNBT()))); scene.idle(7); scene.world.modifyTileNBT(link3Select, RedstoneLinkTileEntity.class, - nbt -> nbt.put("FrequencyFirst", sapling.write(new CompoundNBT()))); + nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundNBT()))); scene.idle(20); scene.world.toggleRedstonePower(redstone); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java index bd83c5bd6..7875705ac 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java @@ -1,7 +1,10 @@ package com.simibubi.create.foundation.ponder.content; +import com.simibubi.create.Create; import com.simibubi.create.foundation.ponder.PonderLocalization; +import net.minecraft.util.ResourceLocation; + public class SharedText { public static void gatherText() { @@ -18,15 +21,18 @@ public class SharedText { add("movement_anchors", "With the help of Chassis or Super Glue, larger structures can be moved."); add("behaviour_modify_wrench", "This behaviour can be modified using a Wrench"); add("storage_on_contraption", "Inventories attached to the Contraption will pick up their drops automatically"); - } - public static String get(String key) { + public static String get(ResourceLocation key) { return PonderLocalization.getShared(key); } - private static void add(String k, String v) { + public static void add(ResourceLocation k, String v) { PonderLocalization.registerShared(k, v); } + private static void add(String k, String v) { + add(Create.asResource(k), v); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java index 6c80f52b5..28874b1b0 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java @@ -268,7 +268,7 @@ public class TunnelScenes { ItemStack item3 = new ItemStack(Items.SWEET_BERRIES); tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.WEST); - BlockPos newTunnelPos = tunnelPos.up(2) + BlockPos newTunnelPos = tunnelPos.above(2) .south(); scene.overlay .showControls(new InputWindowElement(tunnelFilterVec.add(0, 0, -1), Pointing.RIGHT).withItem(item1), 20); @@ -313,7 +313,7 @@ public class TunnelScenes { scene.world.showSectionAndMerge(util.select.position(3, 5, 2), Direction.DOWN, newBelt); scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(tunnelPos.up() + .pointAt(util.vector.blockSurface(tunnelPos.above() .north(), Direction.WEST)) .placeNearTarget() .text("For this, items can also be inserted into the Tunnel block directly"); @@ -339,14 +339,14 @@ public class TunnelScenes { protected static Vector3d getTunnelFilterVec(BlockPos pos, Direction d) { return VecHelper.getCenterOf(pos) - .add(Vector3d.of(d.getDirectionVec()).scale(.5)) + .add(Vector3d.atLowerCornerOf(d.getNormal()).scale(.5)) .add(0, 0.3, 0); } public static void brassModes(SceneBuilder scene, SceneBuildingUtil util) { scene.title("brass_tunnel_modes", "Distribution Modes of the Brass Tunnel"); scene.configureBasePlate(0, 1, 5); - BlockState barrier = Blocks.BARRIER.getDefaultState(); + BlockState barrier = Blocks.BARRIER.defaultBlockState(); scene.world.setBlock(util.grid.at(1, 1, 0), barrier, false); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); @@ -419,7 +419,7 @@ public class TunnelScenes { .colored(PonderPalette.RED); scene.idle(60); scene.world.moveSection(blockage, util.vector.of(-1, 0, 0), 10); - scene.world.setBlock(util.grid.at(1, 1, 0), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(1, 1, 0), Blocks.AIR.defaultBlockState(), false); scene.world.multiplyKineticSpeed(util.select.everywhere(), 1.5f); } @@ -466,7 +466,7 @@ public class TunnelScenes { .colored(PonderPalette.RED); scene.idle(30); scene.world.moveSection(blockage, util.vector.of(-1, 0, 0), 10); - scene.world.setBlock(util.grid.at(1, 1, 0), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(1, 1, 0), Blocks.AIR.defaultBlockState(), false); } if (i == 19) { @@ -486,16 +486,16 @@ public class TunnelScenes { } if (i == 21) { - scene.world.setBlock(util.grid.at(2, 1, 0), Blocks.BARRIER.getDefaultState(), false); + scene.world.setBlock(util.grid.at(2, 1, 0), Blocks.BARRIER.defaultBlockState(), false); blockage2 = scene.world.showIndependentSection(util.select.position(4, 1, 0), Direction.UP); scene.world.moveSection(blockage2, util.vector.of(-2, 0, 0), 0); } if (i == 25) { scene.world.hideIndependentSection(blockage, Direction.DOWN); - scene.world.setBlock(util.grid.at(1, 1, 0), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(1, 1, 0), Blocks.AIR.defaultBlockState(), false); scene.world.hideIndependentSection(blockage2, Direction.DOWN); - scene.world.setBlock(util.grid.at(2, 1, 0), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(2, 1, 0), Blocks.AIR.defaultBlockState(), false); } if (i == 26) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java index 05f81806a..a98b6e93c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java @@ -61,7 +61,7 @@ public class FluidMovementActorScenes { scene.world.rotateBearing(bearing, 360, 70); scene.world.rotateSection(contraption, 0, 360, 0, 70); scene.overlay.showText(60) - .pointAt(util.vector.topOf(bearing.up(2))) + .pointAt(util.vector.topOf(bearing.above(2))) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java index 68605765d..10a6f4b9b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java @@ -82,7 +82,7 @@ public class FluidTankScenes { scene.world.hideIndependentSection(chocLink, Direction.DOWN); scene.idle(5); FluidStack content = new FluidStack(AllFluids.CHOCOLATE.get() - .getStillFluid(), 16000); + .getSource(), 16000); scene.world.modifyTileEntity(tankPos, FluidTankTileEntity.class, te -> te.getTankInventory() .fill(content, FluidAction.EXECUTE)); scene.idle(25); @@ -337,7 +337,7 @@ public class FluidTankScenes { .withWrench(), 60); scene.idle(7); - scene.world.modifyBlocks(full2, s -> s.with(FluidTankBlock.SHAPE, FluidTankBlock.Shape.PLAIN), false); + scene.world.modifyBlocks(full2, s -> s.setValue(FluidTankBlock.SHAPE, FluidTankBlock.Shape.PLAIN), false); scene.idle(30); scene.overlay.showText(60) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java index dc09e0e45..a8cacb2f6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java @@ -44,12 +44,12 @@ public class HosePulleyScenes { scene.world.moveSection(hoselink, util.vector.of(0, -1, 0), 0); scene.idle(10); - Vector3d shaftInput = util.vector.blockSurface(hosePos.down(), Direction.WEST); + Vector3d shaftInput = util.vector.blockSurface(hosePos.below(), Direction.WEST); scene.overlay.showText(70) .text("Hose Pulleys can be used to fill or drain large bodies of Fluid") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(hosePos.down())); + .pointAt(util.vector.topOf(hosePos.below())); scene.idle(80); scene.overlay.showText(80) @@ -71,7 +71,7 @@ public class HosePulleyScenes { .text("The Pulley retracts while the input rotation is inverted") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.centerOf(hosePos.down(3))); + .pointAt(util.vector.centerOf(hosePos.below(3))); scene.idle(30); scene.world.setKineticSpeed(kinetics, -32); @@ -85,7 +85,7 @@ public class HosePulleyScenes { .text("On the opposite side, pipes can be connected") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(hosePos.down(), Direction.EAST)); + .pointAt(util.vector.blockSurface(hosePos.below(), Direction.EAST)); scene.idle(70); scene.rotateCameraY(-70); @@ -116,7 +116,7 @@ public class HosePulleyScenes { } for (BlockPos blockPos : blocks) { - scene.world.setBlock(blockPos, Blocks.WATER.getDefaultState(), false); + scene.world.setBlock(blockPos, Blocks.WATER.defaultBlockState(), false); scene.idle(3); } @@ -176,7 +176,7 @@ public class HosePulleyScenes { } for (BlockPos blockPos : blocks) - scene.world.setBlock(blockPos, Blocks.WATER.getDefaultState(), false); + scene.world.setBlock(blockPos, Blocks.WATER.defaultBlockState(), false); scene.idle(5); Selection water = util.select.fromTo(2, 1, 0, 0, 4, 2); @@ -197,12 +197,12 @@ public class HosePulleyScenes { scene.world.showSectionAndMerge(crank, Direction.EAST, hoselink); scene.idle(20); - scene.overlay.showSelectionWithText(util.select.position(hosePos.down()), 50) + scene.overlay.showSelectionWithText(util.select.position(hosePos.below()), 50) .text("While fully retracted, the Hose Pulley cannot operate") .placeNearTarget() .colored(PonderPalette.RED) .attachKeyFrame() - .pointAt(util.vector.blockSurface(hosePos.down(), Direction.UP)); + .pointAt(util.vector.blockSurface(hosePos.below(), Direction.UP)); scene.idle(55); Selection kinetics = util.select.fromTo(1, 6, 1, 0, 6, 1); @@ -214,7 +214,7 @@ public class HosePulleyScenes { .text("Draining runs from top to bottom") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.centerOf(hosePos.down(3))); + .pointAt(util.vector.centerOf(hosePos.below(3))); scene.idle(10); scene.world.showSectionAndMerge(cogs, Direction.NORTH, hoselink); @@ -228,10 +228,10 @@ public class HosePulleyScenes { Vector3d surface = util.vector.topOf(1, 3, 1) .subtract(0, 2 / 8f, 0); - AxisAlignedBB bb = new AxisAlignedBB(surface, surface).grow(1.5, 0, 1.5); + AxisAlignedBB bb = new AxisAlignedBB(surface, surface).inflate(1.5, 0, 1.5); scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb, 3); scene.idle(3); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.expand(0, -2, 0), 70); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.expandTowards(0, -2, 0), 70); scene.idle(20); Collections.reverse(blocks); @@ -243,7 +243,7 @@ public class HosePulleyScenes { scene.idle(3); } - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb.offset(0, -2, 0), 60); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb.move(0, -2, 0), 60); scene.overlay.showText(60) .text("The surface level will end up just below where the hose ends") .attachKeyFrame() @@ -269,22 +269,22 @@ public class HosePulleyScenes { .text("Filling runs from bottom to top") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.centerOf(hosePos.down(3))); + .pointAt(util.vector.centerOf(hosePos.below(3))); scene.idle(10); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.offset(0, -3 + 2 / 8f, 0), 3); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.move(0, -3 + 2 / 8f, 0), 3); scene.idle(3); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.expand(0, -3 + 2 / 8f, 0), 120); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.expandTowards(0, -3 + 2 / 8f, 0), 120); scene.idle(20); - scene.world.setBlock(util.grid.at(1, 3, 1), Blocks.WATER.getDefaultState(), false); + scene.world.setBlock(util.grid.at(1, 3, 1), Blocks.WATER.defaultBlockState(), false); scene.idle(3); - scene.world.setBlock(util.grid.at(1, 2, 1), Blocks.WATER.getDefaultState(), false); + scene.world.setBlock(util.grid.at(1, 2, 1), Blocks.WATER.defaultBlockState(), false); scene.idle(3); Collections.reverse(blocks); for (BlockPos blockPos : blocks) { - scene.world.setBlock(blockPos, Blocks.WATER.getDefaultState(), false); + scene.world.setBlock(blockPos, Blocks.WATER.defaultBlockState(), false); scene.idle(3); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java index 3dbbcca81..adc80a419 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java @@ -48,13 +48,13 @@ public class PipeScenes { scene.idle(5); BlockState pipeState = AllBlocks.FLUID_PIPE.getDefaultState() - .with(FluidPipeBlock.UP, false) - .with(FluidPipeBlock.DOWN, false); + .setValue(FluidPipeBlock.UP, false) + .setValue(FluidPipeBlock.DOWN, false); - scene.world.setBlock(util.grid.at(2, 1, 1), pipeState.with(FluidPipeBlock.NORTH, false) - .with(FluidPipeBlock.SOUTH, false), false); - scene.world.setBlock(util.grid.at(1, 1, 2), pipeState.with(FluidPipeBlock.WEST, false) - .with(FluidPipeBlock.EAST, false), false); + scene.world.setBlock(util.grid.at(2, 1, 1), pipeState.setValue(FluidPipeBlock.NORTH, false) + .setValue(FluidPipeBlock.SOUTH, false), false); + scene.world.setBlock(util.grid.at(1, 1, 2), pipeState.setValue(FluidPipeBlock.WEST, false) + .setValue(FluidPipeBlock.EAST, false), false); Selection largeCog = util.select.position(5, 0, 1); Selection kinetics = util.select.fromTo(5, 1, 0, 3, 1, 0); @@ -108,9 +108,9 @@ public class PipeScenes { scene.idle(40); Vector3d center = util.vector.centerOf(2, 1, 2); - AxisAlignedBB bb = new AxisAlignedBB(center, center).grow(1 / 6f); - AxisAlignedBB bb1 = bb.offset(-0.5, 0, 0); - AxisAlignedBB bb2 = bb.offset(0, 0, -0.5); + AxisAlignedBB bb = new AxisAlignedBB(center, center).inflate(1 / 6f); + AxisAlignedBB bb1 = bb.move(-0.5, 0, 0); + AxisAlignedBB bb2 = bb.move(0, 0, -0.5); scene.world.showSection(strayPipes, Direction.DOWN); scene.idle(10); @@ -132,7 +132,7 @@ public class PipeScenes { BlockPos pumpPos = util.grid.at(3, 1, 1); scene.world.setBlock(pumpPos, AllBlocks.MECHANICAL_PUMP.getDefaultState() - .with(PumpBlock.FACING, Direction.WEST), true); + .setValue(PumpBlock.FACING, Direction.WEST), true); scene.idle(10); scene.world.showSection(largeCog, Direction.UP); scene.world.showSection(kinetics, Direction.SOUTH); @@ -243,21 +243,21 @@ public class PipeScenes { scene.idle(5); scene.world.hideSection(tank, Direction.EAST); scene.idle(5); - scene.world.setBlock(drainPos, Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(drainPos, Blocks.AIR.defaultBlockState(), false); scene.world.propagatePipeChange(pumpPos); scene.world.hideSection(basin, Direction.NORTH); scene.idle(5); - scene.world.setBlock(util.grid.at(3, 1, 1), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(3, 1, 1), Blocks.AIR.defaultBlockState(), false); scene.idle(5); scene.world.setBlock(util.grid.at(3, 1, 3), AllBlocks.GLASS_FLUID_PIPE.getDefaultState() - .with(AxisPipeBlock.AXIS, Axis.Z), false); + .setValue(AxisPipeBlock.AXIS, Axis.Z), false); scene.idle(10); scene.world.multiplyKineticSpeed(util.select.everywhere(), 2); scene.world.propagatePipeChange(pumpPos); ElementLink water = scene.world.showIndependentSection(waterSourceS, Direction.DOWN); scene.world.moveSection(water, util.vector.of(0, 0, 1), 0); scene.idle(10); - scene.world.setBlock(drainPos, Blocks.WATER.getDefaultState(), false); + scene.world.setBlock(drainPos, Blocks.WATER.defaultBlockState(), false); scene.idle(20); scene.overlay.showText(60) @@ -267,7 +267,7 @@ public class PipeScenes { .pointAt(util.vector.blockSurface(drainPos, Direction.SOUTH)); scene.idle(40); - scene.world.setBlock(drainPos.north(), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(drainPos.north(), Blocks.AIR.defaultBlockState(), false); scene.idle(40); ElementLink target = scene.world.showIndependentSection(waterTargetS, Direction.UP); scene.world.moveSection(target, util.vector.of(-1, 0, 0), 0); @@ -283,8 +283,8 @@ public class PipeScenes { scene.idle(80); scene.world.hideIndependentSection(target, Direction.DOWN); scene.idle(5); - scene.world.setBlock(drainPos, Blocks.BEE_NEST.getDefaultState() - .with(BeehiveBlock.HONEY_LEVEL, 5), false); + scene.world.setBlock(drainPos, Blocks.BEE_NEST.defaultBlockState() + .setValue(BeehiveBlock.HONEY_LEVEL, 5), false); scene.world.showSection(drain, Direction.DOWN); scene.world.setBlock(util.grid.at(3, 1, 2), AllBlocks.FLUID_TANK.getDefaultState(), false); scene.world.propagatePipeChange(pumpPos); @@ -297,8 +297,8 @@ public class PipeScenes { .pointAt(util.vector.topOf(drainPos)); scene.idle(60); - scene.world.setBlock(drainPos, Blocks.BEE_NEST.getDefaultState() - .with(BeehiveBlock.HONEY_LEVEL, 0), false); + scene.world.setBlock(drainPos, Blocks.BEE_NEST.defaultBlockState() + .setValue(BeehiveBlock.HONEY_LEVEL, 0), false); } public static void encasing(SceneBuilder scene, SceneBuildingUtil util) { @@ -312,8 +312,8 @@ public class PipeScenes { scene.idle(15); BlockState copperEncased = AllBlocks.ENCASED_FLUID_PIPE.getDefaultState() - .with(FluidPipeBlock.SOUTH, true) - .with(FluidPipeBlock.WEST, true); + .setValue(FluidPipeBlock.SOUTH, true) + .setValue(FluidPipeBlock.WEST, true); ItemStack casingItem = AllBlocks.COPPER_CASING.asStack(); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(3, 1, 1), Pointing.DOWN).rightClick() @@ -330,8 +330,8 @@ public class PipeScenes { scene.idle(70); scene.world.destroyBlock(util.grid.at(2, 1, 1)); - scene.world.modifyBlock(util.grid.at(1, 1, 1), s -> s.with(FluidPipeBlock.EAST, false) - .with(FluidPipeBlock.NORTH, true), false); + scene.world.modifyBlock(util.grid.at(1, 1, 1), s -> s.setValue(FluidPipeBlock.EAST, false) + .setValue(FluidPipeBlock.NORTH, true), false); scene.idle(5); scene.overlay.showLine(PonderPalette.RED, util.vector.of(1.5, 1.75, 1), util.vector.of(1.5, 1.75, 2), 80); @@ -348,17 +348,17 @@ public class PipeScenes { scene.idle(70); BlockState defaultState = AllBlocks.FLUID_PIPE.getDefaultState(); - for (BooleanProperty booleanProperty : FluidPipeBlock.FACING_TO_PROPERTY_MAP.values()) - defaultState = defaultState.with(booleanProperty, false); + for (BooleanProperty booleanProperty : FluidPipeBlock.PROPERTY_BY_DIRECTION.values()) + defaultState = defaultState.setValue(booleanProperty, false); - scene.world.setBlock(util.grid.at(3, 2, 1), defaultState.with(FluidPipeBlock.EAST, true) - .with(FluidPipeBlock.WEST, true), false); - scene.world.setBlock(util.grid.at(1, 2, 1), defaultState.with(FluidPipeBlock.UP, true) - .with(FluidPipeBlock.DOWN, true), false); + scene.world.setBlock(util.grid.at(3, 2, 1), defaultState.setValue(FluidPipeBlock.EAST, true) + .setValue(FluidPipeBlock.WEST, true), false); + scene.world.setBlock(util.grid.at(1, 2, 1), defaultState.setValue(FluidPipeBlock.UP, true) + .setValue(FluidPipeBlock.DOWN, true), false); scene.world.showSection(util.select.layer(2), Direction.DOWN); scene.idle(10); - scene.world.modifyBlock(util.grid.at(1, 1, 1), s -> s.with(FluidPipeBlock.UP, true) - .with(FluidPipeBlock.NORTH, false), false); + scene.world.modifyBlock(util.grid.at(1, 1, 1), s -> s.setValue(FluidPipeBlock.UP, true) + .setValue(FluidPipeBlock.NORTH, false), false); scene.idle(20); scene.overlay.showText(60) @@ -389,9 +389,9 @@ public class PipeScenes { scene.world.propagatePipeChange(pumpPos); scene.world.setBlock(valvePos, AllBlocks.FLUID_PIPE.get() .getAxisState(Axis.X), false); - scene.world.setBlock(util.grid.at(3, 1, 1), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(3, 1, 1), Blocks.AIR.defaultBlockState(), false); scene.world.setBlock(util.grid.at(3, 1, 1), AllBlocks.GLASS_FLUID_PIPE.getDefaultState() - .with(GlassFluidPipeBlock.AXIS, Axis.X), false); + .setValue(GlassFluidPipeBlock.AXIS, Axis.X), false); scene.idle(5); scene.world.showSection(tank1, Direction.NORTH); @@ -434,7 +434,7 @@ public class PipeScenes { scene.effects.rotationSpeedIndicator(handlePos); scene.world.modifyTileEntity(valvePos, FluidValveTileEntity.class, te -> te.onSpeedChanged(0)); scene.idle(22); - scene.world.modifyBlock(valvePos, s -> s.with(FluidValveBlock.ENABLED, true), false); + scene.world.modifyBlock(valvePos, s -> s.setValue(FluidValveBlock.ENABLED, true), false); scene.effects.indicateSuccess(valvePos); scene.idle(5); scene.world.setKineticSpeed(valveKinetics, 0); @@ -457,7 +457,7 @@ public class PipeScenes { scene.effects.rotationSpeedIndicator(handlePos); scene.world.modifyTileEntity(valvePos, FluidValveTileEntity.class, te -> te.onSpeedChanged(0)); scene.idle(22); - scene.world.modifyBlock(valvePos, s -> s.with(FluidValveBlock.ENABLED, false), false); + scene.world.modifyBlock(valvePos, s -> s.setValue(FluidValveBlock.ENABLED, false), false); scene.effects.indicateRedstone(valvePos); scene.world.propagatePipeChange(pumpPos); scene.idle(5); @@ -487,11 +487,11 @@ public class PipeScenes { scene.world.setBlock(smartPos, AllBlocks.FLUID_PIPE.get() .getAxisState(Axis.X), false); scene.world.setBlock(util.grid.at(2, 1, 3), AllBlocks.GLASS_FLUID_PIPE.getDefaultState() - .with(GlassFluidPipeBlock.AXIS, Axis.X), false); + .setValue(GlassFluidPipeBlock.AXIS, Axis.X), false); scene.world.setBlock(util.grid.at(1, 1, 3), AllBlocks.FLUID_PIPE.get() .getAxisState(Axis.X) - .with(FluidPipeBlock.NORTH, true) - .with(FluidPipeBlock.WEST, false), false); + .setValue(FluidPipeBlock.NORTH, true) + .setValue(FluidPipeBlock.WEST, false), false); scene.world.showSection(basin, Direction.DOWN); scene.idle(5); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java index bc1c1bca0..6c1a89f4f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java @@ -82,17 +82,17 @@ public class PumpScenes { .pointAt(util.vector.topOf(pumpPos) .subtract(0.5f, 0.125f, 0)); - AxisAlignedBB bb1 = new AxisAlignedBB(Vector3d.ZERO, Vector3d.ZERO).grow(.25, .25, 0) - .offset(0, 0, .25); - AxisAlignedBB bb2 = new AxisAlignedBB(Vector3d.ZERO, Vector3d.ZERO).grow(.25, .25, 1.25); + AxisAlignedBB bb1 = new AxisAlignedBB(Vector3d.ZERO, Vector3d.ZERO).inflate(.25, .25, 0) + .move(0, 0, .25); + AxisAlignedBB bb2 = new AxisAlignedBB(Vector3d.ZERO, Vector3d.ZERO).inflate(.25, .25, 1.25); scene.idle(65); Object in = new Object(); Object out = new Object(); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.offset(util.vector.centerOf(3, 1, 3)), 3); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.move(util.vector.centerOf(3, 1, 3)), 3); scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.offset(util.vector.centerOf(3, 1, 2)), 50); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.move(util.vector.centerOf(3, 1, 2)), 50); scene.idle(10); scene.overlay.showText(50) @@ -104,10 +104,10 @@ public class PumpScenes { scene.idle(60); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.offset(util.vector.centerOf(1, 1, 1) + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.move(util.vector.centerOf(1, 1, 1) .add(0, 0, -.5)), 3); scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.offset(util.vector.centerOf(1, 1, 2)), 50); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.move(util.vector.centerOf(1, 1, 2)), 50); scene.idle(10); scene.overlay.showText(50) @@ -132,20 +132,20 @@ public class PumpScenes { .subtract(0.5f, 0.125f, 0)); scene.idle(25); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.offset(util.vector.centerOf(1, 1, 3)), 3); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.move(util.vector.centerOf(1, 1, 3)), 3); scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.offset(util.vector.centerOf(1, 1, 2)), 30); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.move(util.vector.centerOf(1, 1, 2)), 30); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.offset(util.vector.centerOf(3, 1, 1) + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.move(util.vector.centerOf(3, 1, 1) .add(0, 0, -.5)), 3); scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.offset(util.vector.centerOf(3, 1, 2)), 30); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.move(util.vector.centerOf(3, 1, 2)), 30); scene.idle(55); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pumpPos), Pointing.DOWN).rightClick() .withWrench(), 40); scene.idle(7); - scene.world.modifyBlock(pumpPos, s -> s.with(PumpBlock.FACING, Direction.EAST), true); + scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.EAST), true); scene.overlay.showText(70) .attachKeyFrame() .pointAt(util.vector.centerOf(2, 1, 1)) @@ -154,14 +154,14 @@ public class PumpScenes { scene.world.propagatePipeChange(pumpPos); scene.idle(40); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.offset(util.vector.centerOf(3, 1, 3)), 3); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.move(util.vector.centerOf(3, 1, 3)), 3); scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.offset(util.vector.centerOf(3, 1, 2)), 30); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.move(util.vector.centerOf(3, 1, 2)), 30); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.offset(util.vector.centerOf(1, 1, 1) + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.move(util.vector.centerOf(1, 1, 1) .add(0, 0, -.5)), 3); scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.offset(util.vector.centerOf(1, 1, 2)), 30); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.move(util.vector.centerOf(1, 1, 2)), 30); scene.idle(25); } @@ -187,12 +187,12 @@ public class PumpScenes { .drain(3000, FluidAction.EXECUTE)); BlockPos east = pumpPos.east(); - scene.world.setBlock(east, Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(east, Blocks.AIR.defaultBlockState(), false); scene.world.setBlock(east, AllBlocks.GLASS_FLUID_PIPE.getDefaultState() - .with(GlassFluidPipeBlock.AXIS, Axis.X), false); + .setValue(GlassFluidPipeBlock.AXIS, Axis.X), false); scene.world.setBlock(pumpPos.south(), AllBlocks.COGWHEEL.getDefaultState() - .with(CogWheelBlock.AXIS, Axis.X), false); + .setValue(CogWheelBlock.AXIS, Axis.X), false); Selection southPump = util.select.position(pumpPos.south()); scene.world.setKineticSpeed(southPump, 32); @@ -255,34 +255,34 @@ public class PumpScenes { scene.idle(60); BlockState pipeState = AllBlocks.FLUID_PIPE.getDefaultState() - .with(FluidPipeBlock.DOWN, false) - .with(FluidPipeBlock.UP, false); + .setValue(FluidPipeBlock.DOWN, false) + .setValue(FluidPipeBlock.UP, false); scene.world.setKineticSpeed(util.select.everywhere(), 0); scene.idle(10); scene.world.setBlock(east, pipeState, true); scene.world.setBlock(west, pipeState, true); - scene.world.setBlock(east.north(), pipeState.with(FluidPipeBlock.NORTH, false) - .with(FluidPipeBlock.EAST, false), false); - scene.world.setBlock(east.south(), pipeState.with(FluidPipeBlock.SOUTH, false) - .with(FluidPipeBlock.EAST, false), false); + scene.world.setBlock(east.north(), pipeState.setValue(FluidPipeBlock.NORTH, false) + .setValue(FluidPipeBlock.EAST, false), false); + scene.world.setBlock(east.south(), pipeState.setValue(FluidPipeBlock.SOUTH, false) + .setValue(FluidPipeBlock.EAST, false), false); scene.world.showSection(util.select.position(east.north()), Direction.DOWN); scene.world.showSection(util.select.position(east.south()), Direction.DOWN); Selection northPump = util.select.position(pumpPos.north()); - scene.world.setBlock(west.north(), pipeState.with(FluidPipeBlock.NORTH, false) - .with(FluidPipeBlock.WEST, false), false); - scene.world.setBlock(west.south(), pipeState.with(FluidPipeBlock.SOUTH, false) - .with(FluidPipeBlock.WEST, false), false); + scene.world.setBlock(west.north(), pipeState.setValue(FluidPipeBlock.NORTH, false) + .setValue(FluidPipeBlock.WEST, false), false); + scene.world.setBlock(west.south(), pipeState.setValue(FluidPipeBlock.SOUTH, false) + .setValue(FluidPipeBlock.WEST, false), false); scene.world.showSection(util.select.position(west.north()), Direction.DOWN); scene.world.showSection(util.select.position(west.south()), Direction.DOWN); scene.world.restoreBlocks(southPump); - scene.world.modifyBlock(pumpPos.south(), s -> s.with(PumpBlock.FACING, Direction.EAST), false); + scene.world.modifyBlock(pumpPos.south(), s -> s.setValue(PumpBlock.FACING, Direction.EAST), false); scene.world.setKineticSpeed(util.select.everywhere(), 0); scene.world.showSection(northPump, Direction.DOWN); - scene.world.modifyBlock(pumpPos.north(), s -> s.with(PumpBlock.FACING, Direction.EAST), false); + scene.world.modifyBlock(pumpPos.north(), s -> s.setValue(PumpBlock.FACING, Direction.EAST), false); scene.idle(4); scene.world.setKineticSpeed(util.select.everywhere(), -16); @@ -303,13 +303,13 @@ public class PumpScenes { .showControls(new InputWindowElement(util.vector.topOf(pumpPos.south()), Pointing.DOWN).rightClick() .withWrench(), 30); scene.idle(7); - scene.world.modifyBlock(pumpPos.south(), s -> s.with(PumpBlock.FACING, Direction.WEST), true); + scene.world.modifyBlock(pumpPos.south(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true); scene.idle(30); scene.overlay .showControls(new InputWindowElement(util.vector.topOf(pumpPos.north()), Pointing.DOWN).rightClick() .withWrench(), 30); scene.idle(7); - scene.world.modifyBlock(pumpPos.north(), s -> s.with(PumpBlock.FACING, Direction.WEST), true); + scene.world.modifyBlock(pumpPos.north(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true); scene.idle(30); scene.overlay.showText(70) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java index 6a7f9cd1e..e28dbe06d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java @@ -151,8 +151,8 @@ public class SpoutScenes { .add(0, 1 / 16f, 0), Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vector3d.ZERO, Create.RANDOM, .1f)), 1, 1); } - scene.world.removeItemsFromBelt(spoutPos.down(2)); - ingot = scene.world.createItemOnBelt(spoutPos.down(2), Direction.UP, potion); + scene.world.removeItemsFromBelt(spoutPos.below(2)); + ingot = scene.world.createItemOnBelt(spoutPos.below(2), Direction.UP, potion); scene.world.stallBeltItem(ingot, true); scene.idle(5); scene.world.stallBeltItem(ingot, false); @@ -165,8 +165,8 @@ public class SpoutScenes { .add(0, 1 / 16f, 0), Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vector3d.ZERO, Create.RANDOM, .1f)), 1, 1); } - scene.world.removeItemsFromBelt(spoutPos.down(2)); - ingot2 = scene.world.createItemOnBelt(spoutPos.down(2), Direction.UP, potion); + scene.world.removeItemsFromBelt(spoutPos.below(2)); + ingot2 = scene.world.createItemOnBelt(spoutPos.below(2), Direction.UP, potion); scene.world.stallBeltItem(ingot2, true); scene.idle(5); scene.world.stallBeltItem(ingot2, false); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java index d4c619e61..3adc64113 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java @@ -1,8 +1,8 @@ package com.simibubi.create.foundation.ponder.elements; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -34,33 +34,33 @@ public abstract class AnimatedSceneElement extends PonderSceneElement { @Override public final void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) { - ms.push(); + ms.pushPose(); float currentFade = applyFade(ms, pt); renderFirst(world, buffer, ms, currentFade, pt); - ms.pop(); + ms.popPose(); } @Override public final void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float pt) { - ms.push(); + ms.pushPose(); float currentFade = applyFade(ms, pt); renderLayer(world, buffer, type, ms, currentFade, pt); - ms.pop(); + ms.popPose(); } @Override public final void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) { - ms.push(); + ms.pushPose(); float currentFade = applyFade(ms, pt); renderLast(world, buffer, ms, currentFade, pt); - ms.pop(); + ms.popPose(); } protected float applyFade(MatrixStack ms, float pt) { float currentFade = fade.getValue(pt); if (fadeVec != null) - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .translate(fadeVec.scale(-1 + currentFade)); return currentFade; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java index f87c70c28..b99fb8b1b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.ponder.elements; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllItems; +import com.simibubi.create.Create; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.ponder.PonderLocalization; @@ -14,13 +15,14 @@ import com.simibubi.create.foundation.utility.Pointing; import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.vector.Vector2f; import net.minecraft.util.math.vector.Vector3d; public class InputWindowElement extends AnimatedOverlayElement { private Pointing direction; - String key; + ResourceLocation key; AllIcons icon; ItemStack item = ItemStack.EMPTY; private Vector3d sceneSpace; @@ -69,12 +71,12 @@ public class InputWindowElement extends AnimatedOverlayElement { } public InputWindowElement whileSneaking() { - key = "sneak_and"; + key = Create.asResource("sneak_and"); return this; } public InputWindowElement whileCTRL() { - key = "ctrl_and"; + key = Create.asResource("ctrl_and"); return this; } @@ -106,7 +108,7 @@ public class InputWindowElement extends AnimatedOverlayElement { } if (hasText) { - keyWidth = font.getStringWidth(text); + keyWidth = font.width(text); width += keyWidth; } @@ -115,7 +117,7 @@ public class InputWindowElement extends AnimatedOverlayElement { height = 24; } - ms.push(); + ms.pushPose(); ms.translate(sceneToScreen.x + xFade, sceneToScreen.y + yFade, 400); PonderUI.renderSpeechBox(ms, 0, 0, width, height, false, direction, true); @@ -123,15 +125,15 @@ public class InputWindowElement extends AnimatedOverlayElement { ms.translate(0, 0, 100); if (hasText) - font.draw(ms, text, 2, (height - font.FONT_HEIGHT) / 2f + 2, + font.draw(ms, text, 2, (height - font.lineHeight) / 2f + 2, ColorHelper.applyAlpha(PonderPalette.WHITE.getColor(), fade)); if (hasIcon) { - ms.push(); + ms.pushPose(); ms.translate(keyWidth, 0, 0); ms.scale(1.5f, 1.5f, 1.5f); icon.draw(ms, screen, 0, 0); - ms.pop(); + ms.popPose(); } if (hasItem) { @@ -142,7 +144,7 @@ public class InputWindowElement extends AnimatedOverlayElement { RenderSystem.disableDepthTest(); } - ms.pop(); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java index 93c0be467..d088ba165 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java @@ -1,9 +1,9 @@ package com.simibubi.create.foundation.ponder.elements; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.client.Minecraft; @@ -37,13 +37,13 @@ public class MinecartElement extends AnimatedSceneElement { @Override public void reset(PonderScene scene) { super.reset(scene); - entity.setPos(0, 0, 0); - entity.prevPosX = 0; - entity.prevPosY = 0; - entity.prevPosZ = 0; - entity.lastTickPosX = 0; - entity.lastTickPosY = 0; - entity.lastTickPosZ = 0; + entity.setPosRaw(0, 0, 0); + entity.xo = 0; + entity.yo = 0; + entity.zo = 0; + entity.xOld = 0; + entity.yOld = 0; + entity.zOld = 0; rotation.startWithValue(initialRotation); } @@ -53,25 +53,25 @@ public class MinecartElement extends AnimatedSceneElement { if (entity == null) entity = constructor.create(scene.getWorld(), 0, 0, 0); - entity.ticksExisted++; + entity.tickCount++; entity.onGround = true; - entity.prevPosX = entity.getX(); - entity.prevPosY = entity.getY(); - entity.prevPosZ = entity.getZ(); - entity.lastTickPosX = entity.getX(); - entity.lastTickPosY = entity.getY(); - entity.lastTickPosZ = entity.getZ(); + entity.xo = entity.getX(); + entity.yo = entity.getY(); + entity.zo = entity.getZ(); + entity.xOld = entity.getX(); + entity.yOld = entity.getY(); + entity.zOld = entity.getZ(); } public void setPositionOffset(Vector3d position, boolean immediate) { if (entity == null) return; - entity.setPosition(position.x, position.y, position.z); + entity.setPos(position.x, position.y, position.z); if (!immediate) return; - entity.prevPosX = position.x; - entity.prevPosY = position.y; - entity.prevPosZ = position.z; + entity.xo = position.x; + entity.yo = position.y; + entity.zo = position.z; } public void setRotation(float angle, boolean immediate) { @@ -84,7 +84,7 @@ public class MinecartElement extends AnimatedSceneElement { } public Vector3d getPositionOffset() { - return entity != null ? entity.getPositionVec() : Vector3d.ZERO; + return entity != null ? entity.position() : Vector3d.ZERO; } public Vector3d getRotation() { @@ -94,20 +94,20 @@ public class MinecartElement extends AnimatedSceneElement { @Override protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) { EntityRendererManager entityrenderermanager = Minecraft.getInstance() - .getRenderManager(); + .getEntityRenderDispatcher(); if (entity == null) entity = constructor.create(world, 0, 0, 0); - ms.push(); + ms.pushPose(); ms.translate(location.x, location.y, location.z); - ms.translate(MathHelper.lerp(pt, entity.prevPosX, entity.getX()), - MathHelper.lerp(pt, entity.prevPosY, entity.getY()), MathHelper.lerp(pt, entity.prevPosZ, entity.getZ())); + ms.translate(MathHelper.lerp(pt, entity.xo, entity.getX()), + MathHelper.lerp(pt, entity.yo, entity.getY()), MathHelper.lerp(pt, entity.zo, entity.getZ())); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(rotation.getValue(pt)); entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); - ms.pop(); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java index b43efb782..9b07cc2ec 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.ponder.elements; import java.util.function.Supplier; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -9,7 +10,6 @@ import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderUI; import com.simibubi.create.foundation.ponder.PonderWorld; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; @@ -43,15 +43,15 @@ public class ParrotElement extends AnimatedSceneElement { public void reset(PonderScene scene) { super.reset(scene); setPose(initialPose.get()); - entity.setPos(0, 0, 0); - entity.prevPosX = 0; - entity.prevPosY = 0; - entity.prevPosZ = 0; - entity.lastTickPosX = 0; - entity.lastTickPosY = 0; - entity.lastTickPosZ = 0; - entity.prevRotationPitch = entity.rotationPitch = 0; - entity.prevRotationYaw = entity.rotationYaw = 180; + entity.setPosRaw(0, 0, 0); + entity.xo = 0; + entity.yo = 0; + entity.zo = 0; + entity.xOld = 0; + entity.yOld = 0; + entity.zOld = 0; + entity.xRotO = entity.xRot = 0; + entity.yRotO = entity.yRot = 180; } @Override @@ -59,78 +59,78 @@ public class ParrotElement extends AnimatedSceneElement { super.tick(scene); if (entity == null) { entity = pose.create(scene.getWorld()); - entity.prevRotationYaw = entity.rotationYaw = 180; + entity.yRotO = entity.yRot = 180; } - entity.ticksExisted++; - entity.prevRotationYawHead = entity.rotationYawHead; + entity.tickCount++; + entity.yHeadRotO = entity.yHeadRot; entity.oFlapSpeed = entity.flapSpeed; entity.oFlap = entity.flap; entity.onGround = true; - entity.prevPosX = entity.getX(); - entity.prevPosY = entity.getY(); - entity.prevPosZ = entity.getZ(); - entity.prevRotationYaw = entity.rotationYaw; - entity.prevRotationPitch = entity.rotationPitch; + entity.xo = entity.getX(); + entity.yo = entity.getY(); + entity.zo = entity.getZ(); + entity.yRotO = entity.yRot; + entity.xRotO = entity.xRot; pose.tick(scene, entity, location); - entity.lastTickPosX = entity.getX(); - entity.lastTickPosY = entity.getY(); - entity.lastTickPosZ = entity.getZ(); + entity.xOld = entity.getX(); + entity.yOld = entity.getY(); + entity.zOld = entity.getZ(); } public void setPositionOffset(Vector3d position, boolean immediate) { if (entity == null) return; - entity.setPosition(position.x, position.y, position.z); + entity.setPos(position.x, position.y, position.z); if (!immediate) return; - entity.prevPosX = position.x; - entity.prevPosY = position.y; - entity.prevPosZ = position.z; + entity.xo = position.x; + entity.yo = position.y; + entity.zo = position.z; } public void setRotation(Vector3d eulers, boolean immediate) { if (entity == null) return; - entity.rotationPitch = (float) eulers.x; - entity.rotationYaw = (float) eulers.y; + entity.xRot = (float) eulers.x; + entity.yRot = (float) eulers.y; if (!immediate) return; - entity.prevRotationPitch = entity.rotationPitch; - entity.prevRotationYaw = entity.rotationYaw; + entity.xRotO = entity.xRot; + entity.yRotO = entity.yRot; } public Vector3d getPositionOffset() { - return entity != null ? entity.getPositionVec() : Vector3d.ZERO; + return entity != null ? entity.position() : Vector3d.ZERO; } public Vector3d getRotation() { - return entity != null ? new Vector3d(entity.rotationPitch, entity.rotationYaw, 0) : Vector3d.ZERO; + return entity != null ? new Vector3d(entity.xRot, entity.yRot, 0) : Vector3d.ZERO; } @Override protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) { EntityRendererManager entityrenderermanager = Minecraft.getInstance() - .getRenderManager(); + .getEntityRenderDispatcher(); if (entity == null) { entity = pose.create(world); - entity.prevRotationYaw = entity.rotationYaw = 180; + entity.yRotO = entity.yRot = 180; } - ms.push(); + ms.pushPose(); ms.translate(location.x, location.y, location.z); - ms.translate(MathHelper.lerp(pt, entity.prevPosX, entity.getX()), - MathHelper.lerp(pt, entity.prevPosY, entity.getY()), MathHelper.lerp(pt, entity.prevPosZ, entity.getZ())); + ms.translate(MathHelper.lerp(pt, entity.xo, entity.getX()), + MathHelper.lerp(pt, entity.yo, entity.getY()), MathHelper.lerp(pt, entity.zo, entity.getZ())); - MatrixStacker.of(ms) - .rotateY(AngleHelper.angleLerp(pt, entity.prevRotationYaw, entity.rotationYaw)); + MatrixTransformStack.of(ms) + .rotateY(AngleHelper.angleLerp(pt, entity.yRotO, entity.yRot)); entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); - ms.pop(); + ms.popPose(); } public void setPose(ParrotPose pose) { @@ -155,14 +155,14 @@ public class ParrotElement extends AnimatedSceneElement { @Override ParrotEntity create(PonderWorld world) { ParrotEntity entity = super.create(world); - entity.setPartying(BlockPos.ZERO, true); + entity.setRecordPlayingNearby(BlockPos.ZERO, true); return entity; } @Override void tick(PonderScene scene, ParrotEntity entity, Vector3d location) { - entity.prevRotationYaw = entity.rotationYaw; - entity.rotationYaw -= 2; + entity.yRotO = entity.yRot; + entity.yRot -= 2; } } @@ -171,8 +171,8 @@ public class ParrotElement extends AnimatedSceneElement { @Override void tick(PonderScene scene, ParrotEntity entity, Vector3d location) { - double length = entity.getPositionVec() - .subtract(entity.lastTickPosX, entity.lastTickPosY, entity.lastTickPosZ) + double length = entity.position() + .subtract(entity.xOld, entity.yOld, entity.zOld) .length(); entity.onGround = false; double phase = Math.min(length * 15, 8); @@ -195,12 +195,12 @@ public class ParrotElement extends AnimatedSceneElement { @Override void tick(PonderScene scene, ParrotEntity entity, Vector3d location) { TileEntity tileEntity = scene.getWorld() - .getTileEntity(componentPos); + .getBlockEntity(componentPos); if (!(tileEntity instanceof KineticTileEntity)) return; float rpm = ((KineticTileEntity) tileEntity).getSpeed(); - entity.prevRotationYaw = entity.rotationYaw; - entity.rotationYaw += (rpm * .3f); + entity.yRotO = entity.yRot; + entity.yRot += (rpm * .3f); } } @@ -220,8 +220,8 @@ public class ParrotElement extends AnimatedSceneElement { float targetYaw = MathHelper.wrapDegrees((float) -(MathHelper.atan2(d2, d0) * (double) (180F / (float) Math.PI)) + 90); - entity.rotationPitch = AngleHelper.angleLerp(.4f, entity.rotationPitch, targetPitch); - entity.rotationYaw = AngleHelper.angleLerp(.4f, entity.rotationYaw, targetYaw); + entity.xRot = AngleHelper.angleLerp(.4f, entity.xRot, targetPitch); + entity.yRot = AngleHelper.angleLerp(.4f, entity.yRot, targetYaw); } protected abstract Vector3d getFacedVec(PonderScene scene); @@ -243,8 +243,8 @@ public class ParrotElement extends AnimatedSceneElement { protected Vector3d getFacedVec(PonderScene scene) { Minecraft minecraft = Minecraft.getInstance(); MainWindow w = minecraft.getWindow(); - double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); - double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); + double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); return scene.getTransform() .screenToScene(mouseX, mouseY, 300, 0); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java index 31da2fb41..aef8a7a25 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java @@ -12,6 +12,7 @@ import com.simibubi.create.foundation.ponder.PonderUI; import com.simibubi.create.foundation.ponder.content.PonderPalette; import com.simibubi.create.foundation.utility.ColorHelper; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Matrix4f; import net.minecraft.util.math.vector.Vector2f; @@ -65,11 +66,15 @@ public class TextWindowElement extends AnimatedOverlayElement { return this; } - public Builder sharedText(String key) { + public Builder sharedText(ResourceLocation key) { textGetter = () -> PonderLocalization.getShared(key); return this; } + public Builder sharedText(String key) { + return sharedText(new ResourceLocation(scene.getNamespace(), key)); + } + public Builder placeNearTarget() { TextWindowElement.this.nearScene = true; return this; @@ -100,16 +105,16 @@ public class TextWindowElement extends AnimatedOverlayElement { int textWidth = Math.min(screen.width - targetX, 180); - List lines = screen.getFontRenderer().getTextHandler().wrapLines(bakedText, textWidth, Style.EMPTY); + List lines = screen.getFontRenderer().getSplitter().splitLines(bakedText, textWidth, Style.EMPTY); int boxWidth = 0; for (ITextProperties line : lines) - boxWidth = Math.max(boxWidth, screen.getFontRenderer().getWidth(line)); + boxWidth = Math.max(boxWidth, screen.getFontRenderer().width(line)); int boxHeight = screen.getFontRenderer() - .getWordWrappedHeight(bakedText, boxWidth); + .wordWrapHeight(bakedText, boxWidth); - ms.push(); + ms.pushPose(); ms.translate(0, sceneToScreen.y, 400); new BoxElement() @@ -123,14 +128,14 @@ public class TextWindowElement extends AnimatedOverlayElement { int brighterColor = ColorHelper.mixAlphaColors(color, 0xFFffffdd, 1 / 2f); if (vec != null) { - ms.push(); + ms.pushPose(); ms.translate(sceneToScreen.x, 0, 0); double lineTarget = (targetX - sceneToScreen.x) * fade; ms.scale((float) lineTarget, 1, 1); - Matrix4f model = ms.peek().getModel(); + Matrix4f model = ms.last().pose(); GuiUtils.drawGradientRect(model, -100, 0, 0, 1, 1, brighterColor, brighterColor); GuiUtils.drawGradientRect(model, -100, 0, 1, 1, 2, 0xFF494949, 0xFF393939); - ms.pop(); + ms.popPose(); } ms.translate(0, 0, 400); @@ -139,7 +144,7 @@ public class TextWindowElement extends AnimatedOverlayElement { .draw(ms, lines.get(i) .getString(), targetX - 10, 3 + 9 * i, ColorHelper.applyAlpha(brighterColor, fade)); } - ms.pop(); + ms.popPose(); } public int getColor() { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index 9646753ee..d8c05fbdf 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -8,6 +8,7 @@ import java.util.Random; import org.lwjgl.opengl.GL11; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.IVertexBuilder; @@ -21,7 +22,6 @@ import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.TileEntityRenderHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; @@ -180,22 +180,22 @@ public class WorldSectionElement extends AnimatedSceneElement { public Pair rayTrace(PonderWorld world, Vector3d source, Vector3d target) { world.setMask(this.section); Vector3d transformedTarget = reverseTransformVec(target); - BlockRayTraceResult rayTraceBlocks = world.rayTraceBlocks(new RayTraceContext(reverseTransformVec(source), + BlockRayTraceResult rayTraceBlocks = world.clip(new RayTraceContext(reverseTransformVec(source), transformedTarget, BlockMode.OUTLINE, FluidMode.NONE, null)); world.clearMask(); if (rayTraceBlocks == null) return null; - if (rayTraceBlocks.getHitVec() == null) + if (rayTraceBlocks.getLocation() == null) return null; - double t = rayTraceBlocks.getHitVec() + double t = rayTraceBlocks.getLocation() .subtract(transformedTarget) - .lengthSquared() + .lengthSqr() / source.subtract(target) - .lengthSquared(); + .lengthSqr(); Vector3d actualHit = VecHelper.lerp((float) t, target, source); - return Pair.of(actualHit, rayTraceBlocks.getPos()); + return Pair.of(actualHit, rayTraceBlocks.getBlockPos()); } private Vector3d reverseTransformVec(Vector3d in) { @@ -224,7 +224,7 @@ public class WorldSectionElement extends AnimatedSceneElement { } public void transformMS(MatrixStack ms, float pt) { - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); if (!animatedRotation.equals(Vector3d.ZERO) || !prevAnimatedRotation.equals(Vector3d.ZERO)) { if (centerOfRotation == null) @@ -232,14 +232,14 @@ public class WorldSectionElement extends AnimatedSceneElement { double rotX = MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x); double rotZ = MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z); double rotY = MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y); - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .translate(centerOfRotation) .rotateX(rotX) .rotateZ(rotZ) .rotateY(rotY) .translateBack(centerOfRotation); if (stabilizationAnchor != null) { - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .translate(stabilizationAnchor) .rotateX(-rotX) .rotateZ(-rotZ) @@ -256,9 +256,9 @@ public class WorldSectionElement extends AnimatedSceneElement { return; loadTEsIfMissing(scene.getWorld()); renderedTileEntities.removeIf(te -> scene.getWorld() - .getTileEntity(te.getPos()) != te); + .getBlockEntity(te.getBlockPos()) != te); tickableTileEntities.removeIf(te -> scene.getWorld() - .getTileEntity(te.getPos()) != te); + .getBlockEntity(te.getBlockPos()) != te); tickableTileEntities.forEach(te -> { if (te instanceof ITickableTileEntity) ((ITickableTileEntity) te).tick(); @@ -280,12 +280,12 @@ public class WorldSectionElement extends AnimatedSceneElement { tickableTileEntities = new ArrayList<>(); renderedTileEntities = new ArrayList<>(); section.forEach(pos -> { - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity == null) return; tickableTileEntities.add(tileEntity); renderedTileEntities.add(tileEntity); - tileEntity.updateContainingBlockInfo(); + tileEntity.clearCache(); }); } @@ -323,16 +323,16 @@ public class WorldSectionElement extends AnimatedSceneElement { .apply(overlayMS, pt, true); transformMS(overlayMS, pt); } - ms.push(); + ms.pushPose(); ms.translate(pos.getX(), pos.getY(), pos.getZ()); IVertexBuilder builder = new MatrixApplyingVertexBuilder( - buffer.getBuffer(ModelBakery.BLOCK_DESTRUCTION_RENDER_LAYERS.get(entry.getValue())), - overlayMS.peek().getModel(), - overlayMS.peek().getNormal()); + buffer.getBuffer(ModelBakery.DESTROY_TYPES.get(entry.getValue())), + overlayMS.last().pose(), + overlayMS.last().normal()); Minecraft.getInstance() - .getBlockRendererDispatcher() - .renderModel(world.getBlockState(pos), pos, world, ms, builder, true, world.rand, EmptyModelData.INSTANCE); - ms.pop(); + .getBlockRenderer() + .renderModel(world.getBlockState(pos), pos, world, ms, builder, true, world.random, EmptyModelData.INSTANCE); + ms.popPose(); } } @@ -341,7 +341,7 @@ public class WorldSectionElement extends AnimatedSceneElement { SuperByteBufferCache bufferCache = CreateClient.BUFFER_CACHE; int code = hashCode() ^ world.hashCode(); - Pair key = Pair.of(code, RenderType.getBlockLayers() + Pair key = Pair.of(code, RenderType.chunkBufferLayers() .indexOf(type)); if (redraw) bufferCache.invalidate(DOC_WORLD_SECTION, key); @@ -364,16 +364,16 @@ public class WorldSectionElement extends AnimatedSceneElement { if (blockState.isAir()) return; VoxelShape shape = - blockState.getShape(world, selectedBlock, ISelectionContext.forEntity(Minecraft.getInstance().player)); + blockState.getShape(world, selectedBlock, ISelectionContext.of(Minecraft.getInstance().player)); if (shape.isEmpty()) return; - ms.push(); + ms.pushPose(); transformMS(ms, pt); RenderSystem.disableTexture(); - WorldRenderer.drawBox(ms, buffer.getBuffer(RenderType.getLines()), shape.getBoundingBox() - .offset(selectedBlock), 1, 1, 1, 0.6f); - ms.pop(); + WorldRenderer.renderLineBox(ms, buffer.getBuffer(RenderType.lines()), shape.bounds() + .move(selectedBlock), 1, 1, 1, 0.6f); + ms.popPose(); } private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float pt) { @@ -385,8 +385,8 @@ public class WorldSectionElement extends AnimatedSceneElement { ForgeHooksClient.setRenderLayer(layer); MatrixStack ms = new MatrixStack(); BlockRendererDispatcher dispatcher = Minecraft.getInstance() - .getBlockRendererDispatcher(); - BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer(); + .getBlockRenderer(); + BlockModelRenderer blockRenderer = dispatcher.getModelRenderer(); Random random = new Random(); BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize()); builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); @@ -396,25 +396,25 @@ public class WorldSectionElement extends AnimatedSceneElement { BlockState state = world.getBlockState(pos); FluidState ifluidstate = world.getFluidState(pos); - ms.push(); + ms.pushPose(); ms.translate(pos.getX(), pos.getY(), pos.getZ()); - if (state.getRenderType() != BlockRenderType.ENTITYBLOCK_ANIMATED && state.getBlock() != Blocks.AIR + if (state.getRenderShape() != BlockRenderType.ENTITYBLOCK_ANIMATED && state.getBlock() != Blocks.AIR && RenderTypeLookup.canRenderInLayer(state, layer)) { - TileEntity tileEntity = world.getTileEntity(pos); - blockRenderer.renderModel(world, dispatcher.getModelForState(state), state, pos, ms, builder, true, - random, 42, OverlayTexture.DEFAULT_UV, + TileEntity tileEntity = world.getBlockEntity(pos); + blockRenderer.renderModel(world, dispatcher.getBlockModel(state), state, pos, ms, builder, true, + random, 42, OverlayTexture.NO_OVERLAY, tileEntity != null ? tileEntity.getModelData() : EmptyModelData.INSTANCE); } if (!ifluidstate.isEmpty() && RenderTypeLookup.canRenderInLayer(ifluidstate, layer)) - dispatcher.renderFluid(pos, world, builder, ifluidstate); + dispatcher.renderLiquid(pos, world, builder, ifluidstate); - ms.pop(); + ms.popPose(); }); world.clearMask(); - builder.finishDrawing(); + builder.end(); return new SuperByteBuffer(builder); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java index 273d520b2..74d943fd0 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java @@ -74,7 +74,7 @@ public class AnimateTileEntityInstruction extends TickingInstruction { } private static Optional castIfPresent(PonderWorld world, BlockPos pos, Class teType) { - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); if (teType.isInstance(tileEntity)) return Optional.of(teType.cast(tileEntity)); return Optional.empty(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java index ff4fa77b9..d66a4c2a9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java @@ -29,7 +29,7 @@ public class EmitParticlesInstruction extends TickingInstruction { } static ParticleManager paticleManager() { - return Minecraft.getInstance().particles; + return Minecraft.getInstance().particleEngine; } public void create(PonderWorld world, double x, double y, double z); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java index 10a1bbaa9..be5faf3e2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java @@ -25,7 +25,7 @@ public abstract class FadeIntoSceneInstruction e scene.addElement(element); element.setVisible(true); element.setFade(0); - element.setFadeVec(Vector3d.of(fadeInFrom.getDirectionVec()).scale(.5f)); + element.setFadeVec(Vector3d.atLowerCornerOf(fadeInFrom.getNormal()).scale(.5f)); if (elementLink != null) scene.linkElement(element, elementLink); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java index 269ca682a..83680d1a2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java @@ -27,7 +27,7 @@ public class FadeOutOfSceneInstruction extends T return; element.setVisible(true); element.setFade(1); - element.setFadeVec(Vector3d.of(fadeOutTo.getDirectionVec()).scale(.5f)); + element.setFadeVec(Vector3d.atLowerCornerOf(fadeOutTo.getNormal()).scale(.5f)); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/HideAllInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/HideAllInstruction.java index 227893e68..63e0f91ef 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/HideAllInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/HideAllInstruction.java @@ -25,7 +25,7 @@ public class HideAllInstruction extends TickingInstruction { AnimatedSceneElement animatedSceneElement = (AnimatedSceneElement) element; animatedSceneElement.setFade(1); animatedSceneElement - .setFadeVec(fadeOutTo == null ? null : Vector3d.of(fadeOutTo.getDirectionVec()).scale(.5f)); + .setFadeVec(fadeOutTo == null ? null : Vector3d.atLowerCornerOf(fadeOutTo.getNormal()).scale(.5f)); } else if (element instanceof AnimatedOverlayElement) { AnimatedOverlayElement animatedSceneElement = (AnimatedOverlayElement) element; animatedSceneElement.setFade(1); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/HighlightValueBoxInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/HighlightValueBoxInstruction.java index b00f89dd2..95207ad96 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/HighlightValueBoxInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/HighlightValueBoxInstruction.java @@ -21,7 +21,7 @@ public class HighlightValueBoxInstruction extends TickingInstruction { public void tick(PonderScene scene) { super.tick(scene); AxisAlignedBB point = new AxisAlignedBB(vec, vec); - AxisAlignedBB expanded = point.grow(expands.x, expands.y, expands.z); + AxisAlignedBB expanded = point.inflate(expands.x, expands.y, expands.z); scene.getOutliner() .chaseAABB(vec, remainingTicks == totalTicks ? point : expanded) .lineWidth(1 / 32f) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java index d71ad0919..e2e9d016b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java @@ -28,14 +28,14 @@ public class ReplaceBlocksInstruction extends WorldModifyInstruction { PonderWorld world = scene.getWorld(); selection.forEach(pos -> { if (!world.getBounds() - .isVecInside(pos)) + .isInside(pos)) return; BlockState prevState = world.getBlockState(pos); - if (!replaceAir && prevState == Blocks.AIR.getDefaultState()) + if (!replaceAir && prevState == Blocks.AIR.defaultBlockState()) return; if (spawnParticles) world.addBlockDestroyEffects(pos, prevState); - world.setBlockState(pos, stateToUse.apply(prevState)); + world.setBlockAndUpdate(pos, stateToUse.apply(prevState)); }); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java index 391b73063..2a8a46b3d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java @@ -30,16 +30,16 @@ public class TileEntityDataInstruction extends WorldModifyInstruction { PonderWorld world = scene.getWorld(); selection.forEach(pos -> { if (!world.getBounds() - .isVecInside(pos)) + .isInside(pos)) return; - TileEntity tileEntity = world.getTileEntity(pos); + TileEntity tileEntity = world.getBlockEntity(pos); if (!type.isInstance(tileEntity)) return; - CompoundNBT apply = data.apply(tileEntity.write(new CompoundNBT())); + CompoundNBT apply = data.apply(tileEntity.save(new CompoundNBT())); BlockState state = world.getBlockState(pos); if (tileEntity instanceof SyncedTileEntity) ((SyncedTileEntity) tileEntity).readClientUpdate(state, apply); - tileEntity.fromTag(state, apply); + tileEntity.load(state, apply); }); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java index c77273bab..7390a2457 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java @@ -31,7 +31,7 @@ public class ChapterLabel extends AbstractSimiWidget { @Override public void render(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) { UIRenderHelper.streak(ms, 0, x, y + height / 2, height - 2, width); - Minecraft.getInstance().fontRenderer.draw(ms, Lang.translate("ponder.chapter." + chapter.getId()), x + 50, + Minecraft.getInstance().font.draw(ms, Lang.translate("ponder.chapter." + chapter.getId()), x + 50, y + 20, Theme.i(Theme.Key.TEXT_ACCENT_SLIGHT)); button.renderButton(ms, mouseX, mouseY, partialTicks); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java index 66d348cfe..b26c91ba6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java @@ -102,7 +102,7 @@ public class PonderButton extends BoxWidget { if (shortcut != null) { ms.translate(0, 0, z + 50); - drawCenteredText(ms, Minecraft.getInstance().fontRenderer, shortcut.getBoundKeyLocalizedText(), x + width / 2 + 8, y + height - 6, ColorHelper.applyAlpha(Theme.i(Theme.Key.TEXT_DARKER), fadeValue)); + drawCenteredString(ms, Minecraft.getInstance().font, shortcut.getTranslatedKeyMessage(), x + width / 2 + 8, y + height - 6, ColorHelper.applyAlpha(Theme.i(Theme.Key.TEXT_DARKER), fadeValue)); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllMaterialSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllMaterialSpecs.java index 0bf3868a0..82e1a5928 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllMaterialSpecs.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllMaterialSpecs.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.render; -import com.jozufozu.flywheel.backend.instancing.MaterialSpec; +import com.jozufozu.flywheel.backend.material.MaterialSpec; import com.jozufozu.flywheel.core.Formats; import com.jozufozu.flywheel.event.GatherContextEvent; import com.simibubi.create.Create; diff --git a/src/main/java/com/simibubi/create/foundation/render/CreateContexts.java b/src/main/java/com/simibubi/create/foundation/render/CreateContexts.java index c472dc157..60ab31a97 100644 --- a/src/main/java/com/simibubi/create/foundation/render/CreateContexts.java +++ b/src/main/java/com/simibubi/create/foundation/render/CreateContexts.java @@ -9,7 +9,6 @@ import com.jozufozu.flywheel.backend.loading.ModelTemplate; import com.jozufozu.flywheel.core.WorldContext; import com.jozufozu.flywheel.event.GatherContextEvent; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionProgram; -import com.simibubi.create.foundation.render.effects.EffectsContext; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -19,7 +18,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; public class CreateContexts { private static final ResourceLocation CONTRAPTION = new ResourceLocation("create", "context/contraption"); - public static EffectsContext EFFECTS; public static WorldContext CWORLD; public static WorldContext STRUCTURE; @@ -28,7 +26,6 @@ public class CreateContexts { SpecMetaRegistry.register(RainbowDebugStateProvider.INSTANCE); - EFFECTS = backend.register(new EffectsContext(backend)); CWORLD = backend.register(contraptionContext(backend)); STRUCTURE = backend.register(contraptionContext(backend) .withSpecStream(() -> Stream.of(AllProgramSpecs.STRUCTURE)) diff --git a/src/main/java/com/simibubi/create/foundation/render/PartialBufferer.java b/src/main/java/com/simibubi/create/foundation/render/PartialBufferer.java index 7a8af4c23..9c5c4d59d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/PartialBufferer.java +++ b/src/main/java/com/simibubi/create/foundation/render/PartialBufferer.java @@ -5,10 +5,10 @@ import static net.minecraft.state.properties.BlockStateProperties.FACING; import java.util.function.Supplier; import com.jozufozu.flywheel.core.PartialModel; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.util.Direction; @@ -20,7 +20,7 @@ public class PartialBufferer { } public static SuperByteBuffer getFacing(PartialModel partial, BlockState referenceState) { - Direction facing = referenceState.get(FACING); + Direction facing = referenceState.getValue(FACING); return getFacing(partial, referenceState, facing); } @@ -31,7 +31,7 @@ public class PartialBufferer { public static Supplier rotateToFace(Direction facing) { return () -> { MatrixStack stack = new MatrixStack(); - MatrixStacker.of(stack) + MatrixTransformStack.of(stack) .centre() .rotateY(AngleHelper.horizontalAngle(facing)) .rotateX(AngleHelper.verticalAngle(facing)) diff --git a/src/main/java/com/simibubi/create/foundation/render/ShadowRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/ShadowRenderHelper.java index e5d31c07f..57296b74b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/ShadowRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/ShadowRenderHelper.java @@ -23,26 +23,26 @@ import net.minecraft.world.IWorldReader; public class ShadowRenderHelper { private static final RenderType SHADOW_LAYER = - RenderType.getEntityNoOutline(new ResourceLocation("textures/misc/shadow.png")); + RenderType.entityNoOutline(new ResourceLocation("textures/misc/shadow.png")); public static void renderShadow(MatrixStack p_229096_0_, IRenderTypeBuffer p_229096_1_, Vector3d pos, float p_229096_3_, float p_229096_6_) { float f = p_229096_6_; - double d2 = pos.getX(); - double d0 = pos.getY(); - double d1 = pos.getZ(); + double d2 = pos.x(); + double d0 = pos.y(); + double d1 = pos.z(); int i = MathHelper.floor(d2 - (double) f); int j = MathHelper.floor(d2 + (double) f); int k = MathHelper.floor(d0 - (double) f); int l = MathHelper.floor(d0); int i1 = MathHelper.floor(d1 - (double) f); int j1 = MathHelper.floor(d1 + (double) f); - MatrixStack.Entry matrixstack$entry = p_229096_0_.peek(); + MatrixStack.Entry matrixstack$entry = p_229096_0_.last(); IVertexBuilder ivertexbuilder = p_229096_1_.getBuffer(SHADOW_LAYER); - for (BlockPos blockpos : BlockPos.getAllInBoxMutable(new BlockPos(i, k, i1), new BlockPos(j, l, j1))) { - renderShadowPart(matrixstack$entry, ivertexbuilder, Minecraft.getInstance().world, blockpos, d2, d0, d1, f, + for (BlockPos blockpos : BlockPos.betweenClosed(new BlockPos(i, k, i1), new BlockPos(j, l, j1))) { + renderShadowPart(matrixstack$entry, ivertexbuilder, Minecraft.getInstance().level, blockpos, d2, d0, d1, f, p_229096_3_); } @@ -51,11 +51,11 @@ public class ShadowRenderHelper { private static void renderShadowPart(MatrixStack.Entry p_229092_0_, IVertexBuilder p_229092_1_, IWorldReader p_229092_2_, BlockPos p_229092_3_, double p_229092_4_, double p_229092_6_, double p_229092_8_, float p_229092_10_, float p_229092_11_) { - BlockPos blockpos = p_229092_3_.down(); + BlockPos blockpos = p_229092_3_.below(); BlockState blockstate = p_229092_2_.getBlockState(blockpos); - if (blockstate.getRenderType() != BlockRenderType.INVISIBLE && p_229092_2_.getLight(p_229092_3_) > 3) { - if (blockstate.isFullCube(p_229092_2_, blockpos)) { - VoxelShape voxelshape = blockstate.getShape(p_229092_2_, p_229092_3_.down()); + if (blockstate.getRenderShape() != BlockRenderType.INVISIBLE && p_229092_2_.getMaxLocalRawBrightness(p_229092_3_) > 3) { + if (blockstate.isCollisionShapeFullBlock(p_229092_2_, blockpos)) { + VoxelShape voxelshape = blockstate.getShape(p_229092_2_, p_229092_3_.below()); if (!voxelshape.isEmpty()) { @SuppressWarnings("deprecation") float f = (float) (((double) p_229092_11_ - (p_229092_6_ - (double) p_229092_3_.getY()) / 2.0D) @@ -65,7 +65,7 @@ public class ShadowRenderHelper { f = 1.0F; } - AxisAlignedBB axisalignedbb = voxelshape.getBoundingBox(); + AxisAlignedBB axisalignedbb = voxelshape.bounds(); double d0 = (double) p_229092_3_.getX() + axisalignedbb.minX; double d1 = (double) p_229092_3_.getX() + axisalignedbb.maxX; double d2 = (double) p_229092_3_.getY() + axisalignedbb.minY; @@ -93,12 +93,12 @@ public class ShadowRenderHelper { private static void shadowVertex(MatrixStack.Entry p_229091_0_, IVertexBuilder p_229091_1_, float p_229091_2_, float p_229091_3_, float p_229091_4_, float p_229091_5_, float p_229091_6_, float p_229091_7_) { - p_229091_1_.vertex(p_229091_0_.getModel(), p_229091_3_, p_229091_4_, p_229091_5_) + p_229091_1_.vertex(p_229091_0_.pose(), p_229091_3_, p_229091_4_, p_229091_5_) .color(1.0F, 1.0F, 1.0F, p_229091_2_) - .texture(p_229091_6_, p_229091_7_) - .overlay(OverlayTexture.DEFAULT_UV) - .light(15728880) - .normal(p_229091_0_.getNormal(), 0.0F, 1.0F, 0.0F) + .uv(p_229091_6_, p_229091_7_) + .overlayCoords(OverlayTexture.NO_OVERLAY) + .uv2(15728880) + .normal(p_229091_0_.normal(), 0.0F, 1.0F, 0.0F) .endVertex(); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index acca05bf6..dd19089b4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -1,10 +1,10 @@ package com.simibubi.create.foundation.render; import com.jozufozu.flywheel.util.BufferBuilderReader; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.utility.MatrixStacker; import it.unimi.dsi.fastutil.longs.Long2IntMap; import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; @@ -44,13 +44,14 @@ public class SuperByteBuffer { // Vertex Overlay Color private boolean hasOverlay; - private int overlay = OverlayTexture.DEFAULT_UV;; + private int overlay = OverlayTexture.NO_OVERLAY;; // Vertex Lighting private boolean useWorldLight; - private boolean hybridLight; - private int packedLightCoords; private Matrix4f lightTransform; + private boolean hasCustomLight; + private int packedLightCoords; + private boolean hybridLight; // Vertex Normals private boolean fullNormalTransform; @@ -60,47 +61,48 @@ public class SuperByteBuffer { private final Vector4f pos = new Vector4f(); private final Vector3f normal = new Vector3f(); private final Vector4f lightPos = new Vector4f(); + private final MatrixTransformStack stacker; public SuperByteBuffer(BufferBuilder buf) { template = new BufferBuilderReader(buf); transforms = new MatrixStack(); + stacker = MatrixTransformStack.of(transforms); } public static float getUnInterpolatedU(TextureAtlasSprite sprite, float u) { - float f = sprite.getMaxU() - sprite.getMinU(); - return (u - sprite.getMinU()) / f * 16.0F; + float f = sprite.getU1() - sprite.getU0(); + return (u - sprite.getU0()) / f * 16.0F; } public static float getUnInterpolatedV(TextureAtlasSprite sprite, float v) { - float f = sprite.getMaxV() - sprite.getMinV(); - return (v - sprite.getMinV()) / f * 16.0F; + float f = sprite.getV1() - sprite.getV0(); + return (v - sprite.getV0()) / f * 16.0F; } public void renderInto(MatrixStack input, IVertexBuilder builder) { if (isEmpty()) return; - Matrix4f modelMat = input.peek() - .getModel() + Matrix4f modelMat = input.last() + .pose() .copy(); - Matrix4f localTransforms = transforms.peek() - .getModel(); + Matrix4f localTransforms = transforms.last() + .pose(); modelMat.multiply(localTransforms); Matrix3f normalMat; if (fullNormalTransform) { - normalMat = input.peek().getNormal().copy(); - Matrix3f localNormalTransforms = transforms.peek().getNormal(); - normalMat.multiply(localNormalTransforms); + normalMat = input.last().normal().copy(); + Matrix3f localNormalTransforms = transforms.last().normal(); + normalMat.mul(localNormalTransforms); } else { - normalMat = transforms.peek().getNormal().copy(); + normalMat = transforms.last().normal().copy(); } if (useWorldLight) { WORLD_LIGHT_CACHE.clear(); } - boolean hasDefaultLight = packedLightCoords != 0; float f = .5f; int vertexCount = template.getVertexCount(); for (int i = 0; i < vertexCount; i++) { @@ -117,16 +119,16 @@ public class SuperByteBuffer { normal.set(normalX, normalY, normalZ); normal.transform(normalMat); - float nx = normal.getX(); - float ny = normal.getY(); - float nz = normal.getZ(); + float nx = normal.x(); + float ny = normal.y(); + float nz = normal.z(); float staticDiffuse = LightUtil.diffuseLight(normalX, normalY, normalZ); float instanceDiffuse = LightUtil.diffuseLight(nx, ny, nz); pos.set(x, y, z, 1F); pos.transform(modelMat); - builder.vertex(pos.getX(), pos.getY(), pos.getZ()); + builder.vertex(pos.x(), pos.y(), pos.z()); if (shouldColor) { if (disableDiffuseMult) { @@ -161,11 +163,11 @@ public class SuperByteBuffer { if (spriteShiftFunc != null) { spriteShiftFunc.shift(builder, u, v); } else { - builder.texture(u, v); + builder.uv(u, v); } if (hasOverlay) { - builder.overlay(overlay); + builder.overlayCoords(overlay); } int light; @@ -176,20 +178,20 @@ public class SuperByteBuffer { lightPos.transform(lightTransform); } - light = getLight(Minecraft.getInstance().world, lightPos); - if (hasDefaultLight) { + light = getLight(Minecraft.getInstance().level, lightPos); + if (hasCustomLight) { light = maxLight(light, packedLightCoords); } - } else if (hasDefaultLight) { + } else if (hasCustomLight) { light = packedLightCoords; } else { light = template.getLight(i); } if (hybridLight) { - builder.light(maxLight(light, template.getLight(i))); + builder.uv2(maxLight(light, template.getLight(i))); } else { - builder.light(light); + builder.uv2(light); } builder.normal(nx, ny, nz); @@ -211,17 +213,18 @@ public class SuperByteBuffer { disableDiffuseMult = false; spriteShiftFunc = null; hasOverlay = false; - overlay = OverlayTexture.DEFAULT_UV; + overlay = OverlayTexture.NO_OVERLAY; useWorldLight = false; - hybridLight = false; - packedLightCoords = 0; lightTransform = null; + hasCustomLight = false; + packedLightCoords = 0; + hybridLight = false; fullNormalTransform = false; return this; } - public MatrixStacker matrixStacker() { - return MatrixStacker.of(transforms); + public MatrixTransformStack matrixStacker() { + return stacker; } public SuperByteBuffer translate(Vector3d vec) { @@ -238,27 +241,27 @@ public class SuperByteBuffer { } public SuperByteBuffer transform(MatrixStack stack) { - transforms.peek() - .getModel() - .multiply(stack.peek() - .getModel()); - transforms.peek() - .getNormal() - .multiply(stack.peek() - .getNormal()); + transforms.last() + .pose() + .multiply(stack.last() + .pose()); + transforms.last() + .normal() + .mul(stack.last() + .normal()); return this; } public SuperByteBuffer rotate(Direction axis, float radians) { if (radians == 0) return this; - transforms.multiply(axis.getUnitVector() - .getRadialQuaternion(radians)); + transforms.mulPose(axis.step() + .rotation(radians)); return this; } public SuperByteBuffer rotate(Quaternion q) { - transforms.multiply(q); + transforms.mulPose(q); return this; } @@ -312,10 +315,10 @@ public class SuperByteBuffer { public SuperByteBuffer shiftUV(SpriteShiftEntry entry) { this.spriteShiftFunc = (builder, u, v) -> { float targetU = entry.getTarget() - .getInterpolatedU((getUnInterpolatedU(entry.getOriginal(), u))); + .getU((getUnInterpolatedU(entry.getOriginal(), u))); float targetV = entry.getTarget() - .getInterpolatedV((getUnInterpolatedV(entry.getOriginal(), v))); - builder.texture(targetU, targetV); + .getV((getUnInterpolatedV(entry.getOriginal(), v))); + builder.uv(targetU, targetV); }; return this; } @@ -323,13 +326,13 @@ public class SuperByteBuffer { public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollV) { this.spriteShiftFunc = (builder, u, v) -> { float targetU = u - entry.getOriginal() - .getMinU() + entry.getTarget() - .getMinU(); + .getU0() + entry.getTarget() + .getU0(); float targetV = v - entry.getOriginal() - .getMinV() + entry.getTarget() - .getMinV() + .getV0() + entry.getTarget() + .getV0() + scrollV; - builder.texture(targetU, targetV); + builder.uv(targetU, targetV); }; return this; } @@ -337,10 +340,10 @@ public class SuperByteBuffer { public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) { this.spriteShiftFunc = (builder, u, v) -> { float targetU = entry.getTarget() - .getInterpolatedU((getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16); + .getU((getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16); float targetV = entry.getTarget() - .getInterpolatedV((getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16); - builder.texture(targetU, targetV); + .getV((getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16); + builder.uv(targetU, targetV); }; return this; } @@ -368,14 +371,14 @@ public class SuperByteBuffer { } public SuperByteBuffer light(int packedLightCoords) { + hasCustomLight = true; this.packedLightCoords = packedLightCoords; return this; } public SuperByteBuffer light(Matrix4f lightTransform, int packedLightCoords) { - useWorldLight = true; - this.lightTransform = lightTransform; - this.packedLightCoords = packedLightCoords; + light(lightTransform); + light(packedLightCoords); return this; } @@ -403,6 +406,10 @@ public class SuperByteBuffer { return this; } + public boolean isEmpty() { + return template.isEmpty(); + } + public static int transformColor(byte component, float scale) { return MathHelper.clamp((int) (Byte.toUnsignedInt(component) * scale), 0, 255); } @@ -412,20 +419,16 @@ public class SuperByteBuffer { } public static int maxLight(int packedLight1, int packedLight2) { - int blockLight1 = LightTexture.getBlockLightCoordinates(packedLight1); - int skyLight1 = LightTexture.getSkyLightCoordinates(packedLight1); - int blockLight2 = LightTexture.getBlockLightCoordinates(packedLight2); - int skyLight2 = LightTexture.getSkyLightCoordinates(packedLight2); + int blockLight1 = LightTexture.block(packedLight1); + int skyLight1 = LightTexture.sky(packedLight1); + int blockLight2 = LightTexture.block(packedLight2); + int skyLight2 = LightTexture.sky(packedLight2); return LightTexture.pack(Math.max(blockLight1, blockLight2), Math.max(skyLight1, skyLight2)); } private static int getLight(World world, Vector4f lightPos) { - BlockPos pos = new BlockPos(lightPos.getX(), lightPos.getY(), lightPos.getZ()); - return WORLD_LIGHT_CACHE.computeIfAbsent(pos.toLong(), $ -> WorldRenderer.getLightmapCoordinates(world, pos)); - } - - public boolean isEmpty() { - return template.isEmpty(); + BlockPos pos = new BlockPos(lightPos.x(), lightPos.y(), lightPos.z()); + return WORLD_LIGHT_CACHE.computeIfAbsent(pos.asLong(), $ -> WorldRenderer.getLightColor(world, pos)); } @FunctionalInterface diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java index d11742f51..6b7131c3f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java @@ -99,8 +99,8 @@ public class SuperByteBufferCache { private SuperByteBuffer standardBlockRender(BlockState renderedState) { BlockRendererDispatcher dispatcher = Minecraft.getInstance() - .getBlockRendererDispatcher(); - return standardModelRender(dispatcher.getModelForState(renderedState), renderedState); + .getBlockRenderer(); + return standardModelRender(dispatcher.getBlockModel(renderedState), renderedState); } private SuperByteBuffer standardModelRender(IBakedModel model, BlockState referenceState) { @@ -115,14 +115,14 @@ public class SuperByteBufferCache { public static BufferBuilder getBufferBuilder(IBakedModel model, BlockState referenceState, MatrixStack ms) { Minecraft mc = Minecraft.getInstance(); - BlockRendererDispatcher dispatcher = mc.getBlockRendererDispatcher(); - BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer(); + BlockRendererDispatcher dispatcher = mc.getBlockRenderer(); + BlockModelRenderer blockRenderer = dispatcher.getModelRenderer(); BufferBuilder builder = new BufferBuilder(512); builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - blockRenderer.renderModel(mc.world, model, referenceState, BlockPos.ZERO.up(255), ms, builder, true, - mc.world.rand, 42, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); - builder.finishDrawing(); + blockRenderer.renderModel(mc.level, model, referenceState, BlockPos.ZERO.above(255), ms, builder, true, + mc.level.random, 42, OverlayTexture.NO_OVERLAY, VirtualEmptyModelData.INSTANCE); + builder.end(); return builder; } diff --git a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index cf33b7f0e..f0d640691 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -4,11 +4,11 @@ import java.util.Iterator; import javax.annotation.Nullable; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -54,9 +54,9 @@ public class TileEntityRenderHelper { continue; } - BlockPos pos = tileEntity.getPos(); - ms.push(); - MatrixStacker.of(ms) + BlockPos pos = tileEntity.getBlockPos(); + ms.pushPose(); + MatrixTransformStack.of(ms) .translate(pos); try { @@ -64,12 +64,12 @@ public class TileEntityRenderHelper { if (lightTransform != null) { Vector4f lightVec = new Vector4f(pos.getX() + .5f, pos.getY() + .5f, pos.getZ() + .5f, 1); lightVec.transform(lightTransform); - lightPos = new BlockPos(lightVec.getX(), lightVec.getY(), lightVec.getZ()); + lightPos = new BlockPos(lightVec.x(), lightVec.y(), lightVec.z()); } else { lightPos = pos; } int worldLight = getCombinedLight(world, lightPos, renderWorld, pos); - renderer.render(tileEntity, pt, ms, buffer, worldLight, OverlayTexture.DEFAULT_UV); + renderer.render(tileEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY); } catch (Exception e) { iterator.remove(); @@ -83,16 +83,16 @@ public class TileEntityRenderHelper { Create.LOGGER.error(message); } - ms.pop(); + ms.popPose(); } } public static int getCombinedLight(World world, BlockPos worldPos, @Nullable PlacementSimulationWorld renderWorld, BlockPos renderWorldPos) { - int worldLight = WorldRenderer.getLightmapCoordinates(world, worldPos); + int worldLight = WorldRenderer.getLightColor(world, worldPos); if (renderWorld != null) { - int renderWorldLight = WorldRenderer.getLightmapCoordinates(renderWorld, renderWorldPos); + int renderWorldLight = WorldRenderer.getLightColor(renderWorld, renderWorldPos); return SuperByteBuffer.maxLight(worldLight, renderWorldLight); } diff --git a/src/main/java/com/simibubi/create/foundation/render/effects/ColorMatrices.java b/src/main/java/com/simibubi/create/foundation/render/effects/ColorMatrices.java deleted file mode 100644 index 07a683d16..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/effects/ColorMatrices.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.simibubi.create.foundation.render.effects; - -import com.simibubi.create.foundation.utility.AngleHelper; - -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.vector.Matrix4f; - -public class ColorMatrices { - - public static final float lumaR = 0.3086f; - public static final float lumaG = 0.6094f; - public static final float lumaB = 0.0820f; - - public static Matrix4f invert() { - Matrix4f invert = new Matrix4f(); - invert.a00 = -1.0F; - invert.a11 = -1.0F; - invert.a22 = -1.0F; - invert.a33 = -1.0F; - invert.a30 = 1; - invert.a31 = 1; - invert.a32 = 1; - - return invert; - } - - public static Matrix4f grayscale() { - Matrix4f mat = new Matrix4f(); - - mat.a00 = mat.a01 = mat.a02 = lumaR; - mat.a10 = mat.a11 = mat.a12 = lumaG; - mat.a20 = mat.a21 = mat.a22 = lumaB; - mat.a33 = 1; - - return mat; - } - - public static Matrix4f saturate(float s) { - Matrix4f mat = new Matrix4f(); - - mat.a00 = (1.0f - s) * lumaR + s; - mat.a01 = (1.0f - s) * lumaR; - mat.a02 = (1.0f - s) * lumaR; - mat.a10 = (1.0f - s) * lumaG; - mat.a11 = (1.0f - s) * lumaG + s; - mat.a12 = (1.0f - s) * lumaG; - mat.a20 = (1.0f - s) * lumaB; - mat.a21 = (1.0f - s) * lumaB; - mat.a22 = (1.0f - s) * lumaB + s; - - mat.a33 = 1; - - return mat; - } - - public static Matrix4f sepia(float amount) { - Matrix4f mat = new Matrix4f(); - - mat.a00 = (float) (0.393 + 0.607 * (1 - amount)); - mat.a10 = (float) (0.769 - 0.769 * (1 - amount)); - mat.a20 = (float) (0.189 - 0.189 * (1 - amount)); - mat.a01 = (float) (0.349 - 0.349 * (1 - amount)); - mat.a11 = (float) (0.686 + 0.314 * (1 - amount)); - mat.a21 = (float) (0.168 - 0.168 * (1 - amount)); - mat.a02 = (float) (0.272 - 0.272 * (1 - amount)); - mat.a12 = (float) (0.534 - 0.534 * (1 - amount)); - mat.a22 = (float) (0.131 + 0.869 * (1 - amount)); - - mat.a33 = 1; - - return mat; - } - - // https://stackoverflow.com/a/8510751 - public static Matrix4f hueShift(float rot) { - Matrix4f mat = new Matrix4f(); - - mat.loadIdentity(); - - float cosA = MathHelper.cos(AngleHelper.rad(rot)); - float sinA = MathHelper.sin(AngleHelper.rad(rot)); - mat.a00 = (float) (cosA + (1.0 - cosA) / 3.0); - mat.a01 = (float) (1. / 3. * (1.0 - cosA) - MathHelper.sqrt(1. / 3.) * sinA); - mat.a02 = (float) (1. / 3. * (1.0 - cosA) + MathHelper.sqrt(1. / 3.) * sinA); - mat.a10 = (float) (1. / 3. * (1.0 - cosA) + MathHelper.sqrt(1. / 3.) * sinA); - mat.a11 = (float) (cosA + 1. / 3. * (1.0 - cosA)); - mat.a12 = (float) (1. / 3. * (1.0 - cosA) - MathHelper.sqrt(1. / 3.) * sinA); - mat.a20 = (float) (1. / 3. * (1.0 - cosA) - MathHelper.sqrt(1. / 3.) * sinA); - mat.a21 = (float) (1. / 3. * (1.0 - cosA) + MathHelper.sqrt(1. / 3.) * sinA); - mat.a22 = (float) (cosA + 1. / 3. * (1.0 - cosA)); - - return mat; - } - - public static Matrix4f darken(float amount) { - Matrix4f mat = new Matrix4f(); - mat.loadIdentity(); - mat.multiply(1f - amount); - return mat; - } - - public static Matrix4f brightness(float amount) { - Matrix4f mat = new Matrix4f(); - mat.loadIdentity(); - mat.a03 = amount; - mat.a13 = amount; - mat.a23 = amount; - return mat; - } - - public static Matrix4f contrast(float amount) { - Matrix4f sub = new Matrix4f(); - sub.a00 = amount; - sub.a11 = amount; - sub.a22 = amount; - sub.a33 = 1; - sub.a30 = 0.5f - amount * 0.5f; - sub.a31 = 0.5f - amount * 0.5f; - sub.a32 = 0.5f - amount * 0.5f; - - return sub; - } - - public static Matrix4f identity() { - Matrix4f mat = new Matrix4f(); - mat.loadIdentity(); - return mat; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/effects/EffectsContext.java b/src/main/java/com/simibubi/create/foundation/render/effects/EffectsContext.java deleted file mode 100644 index 1967b49d5..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/effects/EffectsContext.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.simibubi.create.foundation.render.effects; - -import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.ShaderContext; -import com.jozufozu.flywheel.backend.gl.shader.ShaderType; -import com.jozufozu.flywheel.backend.loading.Shader; -import com.jozufozu.flywheel.core.shader.spec.ProgramSpec; -import com.simibubi.create.foundation.render.AllProgramSpecs; - -import net.minecraft.util.ResourceLocation; - -public class EffectsContext extends ShaderContext { - - public EffectsContext(Backend backend) { - super(backend); - } - - @Override - public void load() { - ProgramSpec programSpec = Backend.getInstance().getSpec(AllProgramSpecs.CHROMATIC); - - try { - programs.put(programSpec.name, new SphereFilterProgram(loadAndLink(programSpec, null))); - - Backend.log.debug("Loaded program {}", programSpec.name); - } catch (Exception e) { - Backend.log.error("Program '{}': {}", programSpec.name, e); - backend.sources.notifyError(); - } - } - - @Override - protected Shader getSource(ShaderType type, ResourceLocation name) { - Shader source = super.getSource(type, name); - source.processIncludes(); - return source; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/effects/EffectsHandler.java b/src/main/java/com/simibubi/create/foundation/render/effects/EffectsHandler.java deleted file mode 100644 index 41ce02740..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/effects/EffectsHandler.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.simibubi.create.foundation.render.effects; - -import java.util.ArrayList; - -import javax.annotation.Nullable; - -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL30; - -import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.core.FullscreenQuad; -import com.jozufozu.flywheel.util.RenderUtil; -import com.simibubi.create.foundation.render.AllProgramSpecs; -import com.simibubi.create.foundation.render.CreateContexts; -import com.simibubi.create.foundation.utility.AnimationTickHolder; - -import net.minecraft.client.MainWindow; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ActiveRenderInfo; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.shader.Framebuffer; -import net.minecraft.client.shader.FramebufferConstants; -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.math.vector.Vector3d; - -public class EffectsHandler { - - private static EffectsHandler instance; - - @Nullable - public static EffectsHandler getInstance() { - if (Backend.getInstance().available() && instance == null) { - instance = new EffectsHandler(Backend.getInstance()); - } - - if (!Backend.getInstance().available() && instance != null) { - instance.delete(); - instance = null; - } - - return instance; - } - - public static float getNearPlane() { - return 0.05f; - } - - public static float getFarPlane() { - return Minecraft.getInstance().gameRenderer.getFarPlaneDistance() * 4; - } - - private final Backend backend; - private final Framebuffer framebuffer; - private final ArrayList spheres; - - public EffectsHandler(Backend backend) { - this.backend = backend; - spheres = new ArrayList<>(); - - Framebuffer render = Minecraft.getInstance().getFramebuffer(); - framebuffer = new Framebuffer(render.framebufferWidth, render.framebufferHeight, false, Minecraft.IS_RUNNING_ON_MAC); - - } - - public void addSphere(FilterSphere sphere) { - this.spheres.add(sphere); - } - - public void render(Matrix4f view) { - if (spheres.size() == 0) { - return; - } - - GL20.glEnable(GL20.GL_DEPTH_TEST); - - GL20.glDepthRange(getNearPlane(), getFarPlane()); - - prepFramebufferSize(); - - Framebuffer mainBuffer = Minecraft.getInstance().getFramebuffer(); - - backend.compat.fbo.bindFramebuffer(FramebufferConstants.FRAME_BUFFER, framebuffer.framebufferObject); - GL11.glClear(GL30.GL_COLOR_BUFFER_BIT); - - SphereFilterProgram program = CreateContexts.EFFECTS.getProgram(AllProgramSpecs.CHROMATIC); - program.bind(); - - program.bindColorTexture(mainBuffer.getColorAttachment()); - program.bindDepthTexture(mainBuffer.getDepthAttachment()); - - GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; - ActiveRenderInfo activeRenderInfo = gameRenderer.getActiveRenderInfo(); - Matrix4f projection = gameRenderer.getBasicProjectionMatrix(activeRenderInfo, AnimationTickHolder.getPartialTicks(), true); - projection.a33 = 1; - projection.invert(); - program.bindInverseProjection(projection); - - Matrix4f inverseView = view.copy(); - inverseView.invert(); - program.bindInverseView(inverseView); - - Vector3d cameraPos = activeRenderInfo.getProjectedView(); - - program.setCameraPos(cameraPos.inverse()); - - for (FilterSphere sphere : spheres) { - sphere.x -= cameraPos.x; - sphere.y -= cameraPos.y; - sphere.z -= cameraPos.z; - } - - spheres.sort((o1, o2) -> { - double l1 = RenderUtil.length(o1.x, o1.y, o1.z); - double l2 = RenderUtil.length(o2.x, o2.y, o2.z); - return (int) Math.signum(l2 - l1); - }); - - program.uploadFilters(spheres); - - program.setFarPlane(getFarPlane()); - program.setNearPlane(getNearPlane()); - - FullscreenQuad.INSTANCE.get().draw(); - - program.bindColorTexture(0); - program.bindDepthTexture(0); - GL20.glActiveTexture(GL20.GL_TEXTURE0); - - program.unbind(); - spheres.clear(); - - backend.compat.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, framebuffer.framebufferObject); - backend.compat.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, mainBuffer.framebufferObject); - backend.compat.blit.blitFramebuffer(0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, 0, 0, mainBuffer.framebufferWidth, mainBuffer.framebufferHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); - backend.compat.fbo.bindFramebuffer(FramebufferConstants.FRAME_BUFFER, mainBuffer.framebufferObject); - } - - public void delete() { - framebuffer.deleteFramebuffer(); - } - - private void prepFramebufferSize() { - MainWindow window = Minecraft.getInstance().getWindow(); - if (framebuffer.framebufferWidth != window.getFramebufferWidth() - || framebuffer.framebufferHeight != window.getFramebufferHeight()) { - framebuffer.func_216491_a(window.getFramebufferWidth(), window.getFramebufferHeight(), - Minecraft.IS_RUNNING_ON_MAC); - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/effects/FilterSphere.java b/src/main/java/com/simibubi/create/foundation/render/effects/FilterSphere.java deleted file mode 100644 index 6c9546aef..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/effects/FilterSphere.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.simibubi.create.foundation.render.effects; - -import com.jozufozu.flywheel.backend.gl.buffer.MappedBuffer; -import com.jozufozu.flywheel.util.RenderUtil; - -import net.minecraft.util.math.vector.Matrix4f; - -public class FilterSphere { - public float x; - public float y; - public float z; - public float radius; - - public float feather; - public float fade; - public float density = 2; - public boolean blend = false; - - public boolean surface = true; - public boolean field = true; - public float strength = 1; - - public boolean rMask; - public boolean gMask; - public boolean bMask; - - public Matrix4f filter; - - public void write(MappedBuffer buf) { - buf.putFloatArray(new float[]{ - x, - y, - z, - radius, - - feather, - fade, - density, - blend ? 1 : 0, - - surface ? 1 : 0, - field ? 1 : 0, - Math.abs(strength), - strength < 0 ? 1 : 0, - - rMask ? 1 : 0, - gMask ? 1 : 0, - bMask ? 1 : 0, - 0, // padding - }); - - buf.putFloatArray(RenderUtil.writeMatrix(filter)); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/effects/SphereFilterProgram.java b/src/main/java/com/simibubi/create/foundation/render/effects/SphereFilterProgram.java deleted file mode 100644 index 3b69fa5db..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/effects/SphereFilterProgram.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.simibubi.create.foundation.render.effects; - -import java.util.ArrayList; - -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL31; - -import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer; -import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; -import com.jozufozu.flywheel.backend.gl.buffer.MappedBuffer; -import com.jozufozu.flywheel.backend.gl.shader.GlProgram; -import com.jozufozu.flywheel.backend.loading.Program; -import com.jozufozu.flywheel.core.shader.IMultiProgram; - -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.math.vector.Vector3d; - -public class SphereFilterProgram extends GlProgram implements IMultiProgram { - - protected static final int UBO_BINDING = 4; - - protected static final int SPHERE_FILTER_SIZE = 24 * 4; // - protected static final int MAX_FILTERS = 256; // arbitrary - - protected static final int EXTRA_INFO = 16; // array length: int + padding - protected static final int ALL_FILTERS_SIZE = MAX_FILTERS * SPHERE_FILTER_SIZE; - - protected static final int BUFFER_SIZE = EXTRA_INFO + ALL_FILTERS_SIZE; - - public final GlBuffer effectsUBO; - - protected final int uniformBlock; - - protected final int uDepth; - protected final int uColor; - - protected final int uInverseProjection; - protected final int uInverseView; - - protected final int uNearPlane; - protected final int uFarPlane; - - protected final int uCameraPos; - - public SphereFilterProgram(Program program) { - super(program); - - effectsUBO = new GlBuffer(GlBufferType.UNIFORM_BUFFER); - - uniformBlock = GL31.glGetUniformBlockIndex(program.program, "Filters"); - - GL31.glUniformBlockBinding(program.program, uniformBlock, UBO_BINDING); - - effectsUBO.bind(); - effectsUBO.alloc(BUFFER_SIZE); - GL31.glBindBufferBase(effectsUBO.getBufferTarget().glEnum, UBO_BINDING, effectsUBO.handle()); - effectsUBO.unbind(); - - uInverseProjection = getUniformLocation("uInverseProjection"); - uInverseView = getUniformLocation("uInverseView"); - uNearPlane = getUniformLocation("uNearPlane"); - uFarPlane = getUniformLocation("uFarPlane"); - uCameraPos = getUniformLocation("uCameraPos"); - - bind(); - uDepth = setSamplerBinding("uDepth", 8); - uColor = setSamplerBinding("uColor", 9); - unbind(); - } - - public void setNearPlane(float nearPlane) { - GL20.glUniform1f(uNearPlane, nearPlane); - } - - public void setFarPlane(float farPlane) { - GL20.glUniform1f(uFarPlane, farPlane); - } - - public void setCameraPos(Vector3d pos) { - GL20.glUniform3f(uCameraPos, (float) pos.x, (float) pos.y, (float) pos.z); - } - - public void uploadFilters(ArrayList filters) { - effectsUBO.bind(); - MappedBuffer buffer = effectsUBO.getBuffer(0, BUFFER_SIZE) - .putInt(filters.size()) - .position(16); - - filters.forEach(it -> it.write(buffer)); - - buffer.flush(); - - effectsUBO.unbind(); - } - - public void bindInverseProjection(Matrix4f mat) { - uploadMatrixUniform(uInverseProjection, mat); - } - - public void bindInverseView(Matrix4f mat) { - uploadMatrixUniform(uInverseView, mat); - } - - public void bindDepthTexture(int textureObject) { - GL20.glActiveTexture(GL20.GL_TEXTURE8); - GL20.glBindTexture(GL20.GL_TEXTURE_2D, textureObject); - } - - public void bindColorTexture(int textureObject) { - GL20.glActiveTexture(GL20.GL_TEXTURE9); - GL20.glBindTexture(GL20.GL_TEXTURE_2D, textureObject); - } - - @Override - public SphereFilterProgram get() { - return this; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/renderState/RenderTypes.java b/src/main/java/com/simibubi/create/foundation/renderState/RenderTypes.java index 4250dd03c..761271ddb 100644 --- a/src/main/java/com/simibubi/create/foundation/renderState/RenderTypes.java +++ b/src/main/java/com/simibubi/create/foundation/renderState/RenderTypes.java @@ -15,82 +15,82 @@ public class RenderTypes extends RenderState { public static RenderType getOutlineTranslucent(ResourceLocation texture, boolean cull) { RenderType.State rendertype$state = RenderType.State.builder() - .texture(new RenderState.TextureState(texture, false, false)) - .transparency(TRANSLUCENT_TRANSPARENCY) - .diffuseLighting(ENABLE_DIFFUSE_LIGHTING) - .alpha(ONE_TENTH_ALPHA) - .cull(cull ? ENABLE_CULLING : DISABLE_CULLING) - .lightmap(ENABLE_LIGHTMAP) - .overlay(ENABLE_OVERLAY_COLOR) - .build(true); - return RenderType.of(createLayerName("outline_translucent" + (cull ? "_cull" : "")), - DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, true, true, rendertype$state); + .setTextureState(new RenderState.TextureState(texture, false, false)) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setDiffuseLightingState(DIFFUSE_LIGHTING) + .setAlphaState(DEFAULT_ALPHA) + .setCullState(cull ? CULL : NO_CULL) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true); + return RenderType.create(createLayerName("outline_translucent" + (cull ? "_cull" : "")), + DefaultVertexFormats.NEW_ENTITY, GL11.GL_QUADS, 256, true, true, rendertype$state); } private static final RenderType OUTLINE_SOLID = - RenderType.of(createLayerName("outline_solid"), DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, true, + RenderType.create(createLayerName("outline_solid"), DefaultVertexFormats.NEW_ENTITY, GL11.GL_QUADS, 256, true, false, RenderType.State.builder() - .texture(new RenderState.TextureState(AllSpecialTextures.BLANK.getLocation(), false, false)) - .diffuseLighting(ENABLE_DIFFUSE_LIGHTING) - .lightmap(ENABLE_LIGHTMAP) - .overlay(ENABLE_OVERLAY_COLOR) - .build(true)); + .setTextureState(new RenderState.TextureState(AllSpecialTextures.BLANK.getLocation(), false, false)) + .setDiffuseLightingState(DIFFUSE_LIGHTING) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); public static RenderType getGlowingSolid(ResourceLocation texture) { RenderType.State rendertype$state = RenderType.State.builder() - .texture(new RenderState.TextureState(texture, false, false)) - .lightmap(ENABLE_LIGHTMAP) - .overlay(ENABLE_OVERLAY_COLOR) - .build(true); - return RenderType.of(createLayerName("glowing_solid"), DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, + .setTextureState(new RenderState.TextureState(texture, false, false)) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true); + return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormats.NEW_ENTITY, GL11.GL_QUADS, 256, true, false, rendertype$state); } public static RenderType getGlowingTranslucent(ResourceLocation texture) { RenderType.State rendertype$state = RenderType.State.builder() - .texture(new RenderState.TextureState(texture, false, false)) - .transparency(TRANSLUCENT_TRANSPARENCY) - .alpha(ONE_TENTH_ALPHA) - .cull(DISABLE_CULLING) - .lightmap(ENABLE_LIGHTMAP) - .overlay(ENABLE_OVERLAY_COLOR) - .build(true); - return RenderType.of(createLayerName("glowing_translucent"), DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, + .setTextureState(new RenderState.TextureState(texture, false, false)) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setAlphaState(DEFAULT_ALPHA) + .setCullState(NO_CULL) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true); + return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormats.NEW_ENTITY, GL11.GL_QUADS, 256, true, true, rendertype$state); } - private static final RenderType GLOWING_SOLID = getGlowingSolid(PlayerContainer.BLOCK_ATLAS_TEXTURE); - private static final RenderType GLOWING_TRANSLUCENT = getGlowingTranslucent(PlayerContainer.BLOCK_ATLAS_TEXTURE); + private static final RenderType GLOWING_SOLID = getGlowingSolid(PlayerContainer.BLOCK_ATLAS); + private static final RenderType GLOWING_TRANSLUCENT = getGlowingTranslucent(PlayerContainer.BLOCK_ATLAS); private static final RenderType ITEM_PARTIAL_SOLID = - RenderType.of(createLayerName("item_solid"), DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, true, + RenderType.create(createLayerName("item_solid"), DefaultVertexFormats.NEW_ENTITY, GL11.GL_QUADS, 256, true, false, RenderType.State.builder() - .texture(BLOCK_ATLAS_TEXTURE) - .transparency(NO_TRANSPARENCY) - .diffuseLighting(ENABLE_DIFFUSE_LIGHTING) - .lightmap(ENABLE_LIGHTMAP) - .overlay(ENABLE_OVERLAY_COLOR) - .build(true)); + .setTextureState(BLOCK_SHEET) + .setTransparencyState(NO_TRANSPARENCY) + .setDiffuseLightingState(DIFFUSE_LIGHTING) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); - private static final RenderType ITEM_PARTIAL_TRANSLUCENT = RenderType.of(createLayerName("item_translucent"), - DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, true, true, RenderType.State.builder() - .texture(BLOCK_ATLAS_TEXTURE) - .transparency(TRANSLUCENT_TRANSPARENCY) - .diffuseLighting(ENABLE_DIFFUSE_LIGHTING) - .alpha(ONE_TENTH_ALPHA) - .lightmap(ENABLE_LIGHTMAP) - .overlay(ENABLE_OVERLAY_COLOR) - .build(true)); + private static final RenderType ITEM_PARTIAL_TRANSLUCENT = RenderType.create(createLayerName("item_translucent"), + DefaultVertexFormats.NEW_ENTITY, GL11.GL_QUADS, 256, true, true, RenderType.State.builder() + .setTextureState(BLOCK_SHEET) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setDiffuseLightingState(DIFFUSE_LIGHTING) + .setAlphaState(DEFAULT_ALPHA) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); - private static final RenderType FLUID = RenderType.of(createLayerName("fluid"), - DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, true, true, RenderType.State.builder() - .texture(MIPMAP_BLOCK_ATLAS_TEXTURE) - .transparency(TRANSLUCENT_TRANSPARENCY) - .shadeModel(SMOOTH_SHADE_MODEL) - .alpha(ONE_TENTH_ALPHA) - .lightmap(ENABLE_LIGHTMAP) - .overlay(ENABLE_OVERLAY_COLOR) - .build(true)); + private static final RenderType FLUID = RenderType.create(createLayerName("fluid"), + DefaultVertexFormats.NEW_ENTITY, GL11.GL_QUADS, 256, true, true, RenderType.State.builder() + .setTextureState(BLOCK_SHEET_MIPPED) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setShadeModelState(SMOOTH_SHADE) + .setAlphaState(DEFAULT_ALPHA) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); private static String createLayerName(String name) { return Create.ID + ":" + name; diff --git a/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java b/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java index 286dc4423..7a9224afc 100644 --- a/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java @@ -47,15 +47,15 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { } public void draw() { - earlyBuffer.draw(); - defaultBuffer.draw(); - lateBuffer.draw(); + earlyBuffer.endBatch(); + defaultBuffer.endBatch(); + lateBuffer.endBatch(); } public void draw(RenderType type) { - earlyBuffer.draw(type); - defaultBuffer.draw(type); - lateBuffer.draw(type); + earlyBuffer.endBatch(type); + defaultBuffer.endBatch(type); + lateBuffer.endBatch(type); } private static class SuperRenderTypeBufferPhase extends IRenderTypeBuffer.Impl { @@ -65,28 +65,28 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { static final SortedMap createEntityBuilders() { return Util.make(new Object2ObjectLinkedOpenHashMap<>(), (map) -> { - map.put(Atlases.getEntitySolid(), blockBuilders.get(RenderType.getSolid())); + map.put(Atlases.solidBlockSheet(), blockBuilders.builder(RenderType.solid())); assign(map, RenderTypes.getOutlineSolid()); - map.put(Atlases.getEntityCutout(), blockBuilders.get(RenderType.getCutout())); - map.put(Atlases.getBannerPatterns(), blockBuilders.get(RenderType.getCutoutMipped())); - map.put(Atlases.getEntityTranslucentCull(), blockBuilders.get(RenderType.getTranslucent())); // FIXME new equivalent of getEntityTranslucent() ? - assign(map, Atlases.getShieldPatterns()); - assign(map, Atlases.getBeds()); - assign(map, Atlases.getShulkerBoxes()); - assign(map, Atlases.getSign()); - assign(map, Atlases.getChest()); - assign(map, RenderType.getTranslucentNoCrumbling()); - assign(map, RenderType.getGlint()); - assign(map, RenderType.getEntityGlint()); - assign(map, RenderType.getWaterMask()); - ModelBakery.BLOCK_DESTRUCTION_RENDER_LAYERS.forEach((p_228488_1_) -> { + map.put(Atlases.cutoutBlockSheet(), blockBuilders.builder(RenderType.cutout())); + map.put(Atlases.bannerSheet(), blockBuilders.builder(RenderType.cutoutMipped())); + map.put(Atlases.translucentCullBlockSheet(), blockBuilders.builder(RenderType.translucent())); // FIXME new equivalent of getEntityTranslucent() ? + assign(map, Atlases.shieldSheet()); + assign(map, Atlases.bedSheet()); + assign(map, Atlases.shulkerBoxSheet()); + assign(map, Atlases.signSheet()); + assign(map, Atlases.chestSheet()); + assign(map, RenderType.translucentNoCrumbling()); + assign(map, RenderType.glint()); + assign(map, RenderType.entityGlint()); + assign(map, RenderType.waterMask()); + ModelBakery.DESTROY_TYPES.forEach((p_228488_1_) -> { assign(map, p_228488_1_); }); }); } private static void assign(Object2ObjectLinkedOpenHashMap map, RenderType type) { - map.put(type, new BufferBuilder(type.getExpectedBufferSize())); + map.put(type, new BufferBuilder(type.bufferSize())); } protected SuperRenderTypeBufferPhase() { diff --git a/src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java b/src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java index 6055b26db..9f2dceeb1 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java +++ b/src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java @@ -15,13 +15,13 @@ public class ContinuousSound extends TickableSound { this.scape = scape; this.sharedPitch = sharedPitch; this.relativeVolume = relativeVolume; - this.repeat = true; - this.repeatDelay = 0; - this.global = false; + this.looping = true; + this.delay = 0; + this.relative = false; } public void remove() { - setDone(); + stop(); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java b/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java index 0c8d4c97e..61d460214 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java +++ b/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java @@ -29,10 +29,10 @@ public class RepeatingSound { if (AnimationTickHolder.getTicks() % repeatDelay != 0) return; - ClientWorld world = Minecraft.getInstance().world; + ClientWorld world = Minecraft.getInstance().level; Vector3d meanPos = scape.getMeanPos(); - world.playSound(meanPos.x, meanPos.y, meanPos.z, event, SoundCategory.AMBIENT, + world.playLocalSound(meanPos.x, meanPos.y, meanPos.z, event, SoundCategory.AMBIENT, scape.getVolume() * relativeVolume, sharedPitch, true); } diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java index 3b68a728b..cdd7c4794 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java @@ -52,7 +52,7 @@ class SoundScape { public void play() { continuous.forEach(Minecraft.getInstance() - .getSoundHandler()::play); + .getSoundManager()::play); } public void tick() { @@ -82,10 +82,10 @@ class SoundScape { } public float getVolume() { - Entity renderViewEntity = Minecraft.getInstance().renderViewEntity; + Entity renderViewEntity = Minecraft.getInstance().cameraEntity; float distanceMultiplier = 0; if (renderViewEntity != null) { - double distanceTo = renderViewEntity.getPositionVec() + double distanceTo = renderViewEntity.position() .distanceTo(getMeanPos()); distanceMultiplier = (float) MathHelper.lerp(distanceTo / SoundScapes.MAX_AMBIENT_SOURCE_DISTANCE, 2, 0); } diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java index e83bef0a9..d62449315 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java @@ -30,7 +30,9 @@ public class SoundScapes { KINETIC(SoundScapes::kinetic), COG(SoundScapes::cogwheel), - + CRUSHING(SoundScapes::crushing), + MILLING(SoundScapes::milling), + ; private BiFunction factory; @@ -46,13 +48,24 @@ public class SoundScapes { } private static SoundScape kinetic(float pitch, AmbienceGroup group) { - return new SoundScape(pitch, group).continuous(SoundEvents.ENTITY_MINECART_INSIDE, .25f, 1); + return new SoundScape(pitch, group).continuous(SoundEvents.MINECART_INSIDE, .25f, 1); } private static SoundScape cogwheel(float pitch, AmbienceGroup group) { return new SoundScape(pitch, group).continuous(AllSoundEvents.COGS.getMainEvent(), 1.5f, 1); } + private static SoundScape crushing(float pitch, AmbienceGroup group) { + return new SoundScape(pitch, group).repeating(AllSoundEvents.CRUSHING_1.getMainEvent(), 1.545f, .75f, 1) + .repeating(AllSoundEvents.CRUSHING_2.getMainEvent(), 0.425f, .75f, 2) + .repeating(AllSoundEvents.CRUSHING_3.getMainEvent(), 2f, 1.75f, 2); + } + + private static SoundScape milling(float pitch, AmbienceGroup group) { + return new SoundScape(pitch, group).repeating(AllSoundEvents.CRUSHING_1.getMainEvent(), 1.545f, .75f, 1) + .repeating(AllSoundEvents.CRUSHING_2.getMainEvent(), 0.425f, .75f, 2); + } + enum PitchGroup { VERY_LOW, LOW, NORMAL, HIGH, VERY_HIGH } @@ -114,14 +127,14 @@ public class SoundScapes { } protected static boolean outOfRange(BlockPos pos) { - return !getCameraPos().withinDistance(pos, MAX_AMBIENT_SOURCE_DISTANCE); + return !getCameraPos().closerThan(pos, MAX_AMBIENT_SOURCE_DISTANCE); } protected static BlockPos getCameraPos() { - Entity renderViewEntity = Minecraft.getInstance().renderViewEntity; + Entity renderViewEntity = Minecraft.getInstance().cameraEntity; if (renderViewEntity == null) return BlockPos.ZERO; - BlockPos playerLocation = renderViewEntity.getBlockPos(); + BlockPos playerLocation = renderViewEntity.blockPosition(); return playerLocation; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java index b25a42e2a..b4ec0bc2c 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java @@ -16,6 +16,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; @@ -58,7 +59,7 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka @Override public void tick() { - if (!initialized && hasWorld()) { + if (!initialized && hasLevel()) { initialize(); initialized = true; } @@ -77,7 +78,7 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka } @Override - public final CompoundNBT write(CompoundNBT compound) { + public final CompoundNBT save(CompoundNBT compound) { write(compound, false); return compound; } @@ -94,7 +95,7 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka } @Override - public final void fromTag(BlockState state, CompoundNBT tag) { + public final void load(BlockState state, CompoundNBT tag) { fromTag(state, tag, false); } @@ -110,7 +111,7 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka updateBehaviorList(); } - super.fromTag(state, compound); + super.load(state, compound); behaviourList.forEach(tb -> tb.read(compound, clientPacket)); } @@ -118,13 +119,13 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka * Hook only these in future subclasses of STE */ protected void write(CompoundNBT compound, boolean clientPacket) { - super.write(compound); + super.save(compound); behaviourList.forEach(tb -> tb.write(compound, clientPacket)); } @Override public void writeSafe(CompoundNBT compound, boolean clientPacket) { - super.write(compound); + super.save(compound); behaviourList.forEach(tb -> { if (tb.isSafeNBT()) tb.write(compound, clientPacket); @@ -140,9 +141,9 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka } @Override - public void remove() { + public void setRemoved() { forEachBehaviour(TileEntityBehaviour::remove); - super.remove(); + super.setRemoved(); } public void setLazyTickRate(int slowTickRate) { @@ -205,10 +206,13 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka @Override public boolean canPlayerUse(PlayerEntity player) { - if (world == null || world.getTileEntity(pos) != this) { + if (level == null || level.getBlockEntity(worldPosition) != this) { return false; } - return player.getDistanceSq(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D) <= 64.0D; + return player.distanceToSqr(worldPosition.getX() + 0.5D, worldPosition.getY() + 0.5D, worldPosition.getZ() + 0.5D) <= 64.0D; } + public World getWorld() { + return getLevel(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java b/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java index 2c8929358..c4f234d4f 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java @@ -28,46 +28,46 @@ public abstract class SyncedTileEntity extends TileEntity { @Override public CompoundNBT getUpdateTag() { - return write(new CompoundNBT()); + return save(new CompoundNBT()); } @Override public void handleUpdateTag(BlockState state, CompoundNBT tag) { - fromTag(state, tag); + load(state, tag); } public void sendData() { - if (world != null) - world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 2 | 4 | 16); + if (level != null) + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 2 | 4 | 16); } public void causeBlockUpdate() { - if (world != null) - world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 1); + if (level != null) + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 1); } @Override public SUpdateTileEntityPacket getUpdatePacket() { - return new SUpdateTileEntityPacket(getPos(), 1, writeToClient(new CompoundNBT())); + return new SUpdateTileEntityPacket(getBlockPos(), 1, writeToClient(new CompoundNBT())); } @Override public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { - readClientUpdate(getBlockState(), pkt.getNbtCompound()); + readClientUpdate(getBlockState(), pkt.getTag()); } // Special handling for client update packets public void readClientUpdate(BlockState state, CompoundNBT tag) { - fromTag(state, tag); + load(state, tag); } // Special handling for client update packets public CompoundNBT writeToClient(CompoundNBT tag) { - return write(tag); + return save(tag); } public void notifyUpdate() { - markDirty(); + setChanged(); sendData(); } @@ -76,7 +76,7 @@ public abstract class SyncedTileEntity extends TileEntity { } public Chunk containedChunk() { - SectionPos sectionPos = SectionPos.from(pos); - return world.getChunk(sectionPos.getSectionX(), sectionPos.getSectionZ()); + SectionPos sectionPos = SectionPos.of(worldPosition); + return level.getChunk(sectionPos.x(), sectionPos.z()); } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java index 4f0588e55..5cd951b31 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java @@ -77,20 +77,20 @@ public abstract class TileEntityBehaviour { } public BlockPos getPos() { - return tileEntity.getPos(); + return tileEntity.getBlockPos(); } public World getWorld() { - return tileEntity.getWorld(); + return tileEntity.getLevel(); } public static T get(IBlockReader reader, BlockPos pos, BehaviourType type) { - return get(reader.getTileEntity(pos), type); + return get(reader.getBlockEntity(pos), type); } public static void destroy(IBlockReader reader, BlockPos pos, BehaviourType type) { - T behaviour = get(reader.getTileEntity(pos), type); + T behaviour = get(reader.getBlockEntity(pos), type); if (behaviour != null) behaviour.destroy(); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java index a81df38bb..92f7300f2 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java @@ -40,7 +40,7 @@ public class ValueBox extends ChasingAABBOutline { super(bb); this.label = label; this.pos = pos; - this.blockState = Minecraft.getInstance().world.getBlockState(pos); + this.blockState = Minecraft.getInstance().level.getBlockState(pos); } public ValueBox transform(ValueBoxTransform transform) { @@ -82,12 +82,12 @@ public class ValueBox extends ChasingAABBOutline { if (hasTransform && !transform.shouldRender(blockState)) return; - ms.push(); + ms.pushPose(); ms.translate(pos.getX(), pos.getY(), pos.getZ()); if (hasTransform) transform.transform(blockState, ms); - transformNormals = ms.peek() - .getNormal() + transformNormals = ms.last() + .normal() .copy(); params.colored(isPassive ? passiveColor : highlightColor); super.render(ms, buffer, pt); @@ -95,12 +95,12 @@ public class ValueBox extends ChasingAABBOutline { float fontScale = hasTransform ? -transform.getFontScale() : -1 / 64f; ms.scale(fontScale, fontScale, fontScale); - ms.push(); + ms.pushPose(); renderContents(ms, buffer); - ms.pop(); + ms.popPose(); if (!isPassive) { - ms.push(); + ms.pushPose(); ms.translate(17.5, -.5, 7); ms.translate(labelOffset.x, labelOffset.y, labelOffset.z); @@ -109,15 +109,15 @@ public class ValueBox extends ChasingAABBOutline { ms.translate(0, 10, 0); renderHoveringText(ms, buffer, sublabel); } - if (!scrollTooltip.getUnformattedComponentText().isEmpty()) { + if (!scrollTooltip.getContents().isEmpty()) { ms.translate(0, 10, 0); renderHoveringText(ms, buffer, scrollTooltip, 0x998899, 0x111111); } - ms.pop(); + ms.popPose(); } - ms.pop(); + ms.popPose(); } public void renderContents(MatrixStack ms, IRenderTypeBuffer buffer) {} @@ -135,14 +135,14 @@ public class ValueBox extends ChasingAABBOutline { @Override public void renderContents(MatrixStack ms, IRenderTypeBuffer buffer) { super.renderContents(ms, buffer); - FontRenderer font = Minecraft.getInstance().fontRenderer; + FontRenderer font = Minecraft.getInstance().font; ITextComponent countString = new StringTextComponent(count == 0 ? "*" : count + ""); ms.translate(17.5f, -5f, 7f); boolean isFilter = stack.getItem() instanceof FilterItem; boolean isEmpty = stack.isEmpty(); float scale = 1.5f; - ms.translate(-font.getWidth(countString), 0, 0); + ms.translate(-font.width(countString), 0, 0); if (isFilter) ms.translate(3, 8, 7.25f); @@ -172,17 +172,17 @@ public class ValueBox extends ChasingAABBOutline { @Override public void renderContents(MatrixStack ms, IRenderTypeBuffer buffer) { super.renderContents(ms, buffer); - FontRenderer font = Minecraft.getInstance().fontRenderer; + FontRenderer font = Minecraft.getInstance().font; float scale = 4; ms.scale(scale, scale, 1); ms.translate(-4, -4, 5); - int stringWidth = font.getWidth(text); - float numberScale = (float) font.FONT_HEIGHT / stringWidth; + int stringWidth = font.width(text); + float numberScale = (float) font.lineHeight / stringWidth; boolean singleDigit = stringWidth < 10; if (singleDigit) numberScale = numberScale / 2; - float verticalMargin = (stringWidth - font.FONT_HEIGHT) / 2f; + float verticalMargin = (stringWidth - font.lineHeight) / 2f; ms.scale(numberScale, numberScale, numberScale); ms.translate(singleDigit ? stringWidth / 2 : 0, singleDigit ? -verticalMargin : verticalMargin, 0); @@ -220,16 +220,16 @@ public class ValueBox extends ChasingAABBOutline { protected void renderHoveringText(MatrixStack ms, IRenderTypeBuffer buffer, ITextComponent text, int color, int shadowColor) { - ms.push(); + ms.pushPose(); drawString(ms, buffer, text, 0, 0, color); ms.translate(0, 0, -.25); drawString(ms, buffer, text, 1, 1, shadowColor); - ms.pop(); + ms.popPose(); } private static void drawString(MatrixStack ms, IRenderTypeBuffer buffer, ITextComponent text, float x, float y, int color) { - Minecraft.getInstance().fontRenderer.draw(text, x, y, color, false, ms.peek() - .getModel(), buffer, false, 0, 15728880); + Minecraft.getInstance().font.drawInBatch(text, x, y, color, false, ms.last() + .pose(), buffer, false, 0, 15728880); } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxRenderer.java index fd37abb2a..bac64bc8a 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxRenderer.java @@ -21,13 +21,13 @@ public class ValueBoxRenderer { public static void renderItemIntoValueBox(ItemStack filter, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); - IBakedModel modelWithOverrides = itemRenderer.getItemModelWithOverrides(filter, Minecraft.getInstance().world, null); + IBakedModel modelWithOverrides = itemRenderer.getModel(filter, Minecraft.getInstance().level, null); boolean blockItem = modelWithOverrides.isGui3d(); float scale = (!blockItem ? .5f : 1f) - 1 / 64f; float zOffset = (!blockItem ? -.225f : 0) + customZOffset(filter.getItem()); ms.scale(scale, scale, scale); ms.translate(0, 0, zOffset); - itemRenderer.renderItem(filter, TransformType.FIXED, light, overlay, ms, buffer); + itemRenderer.renderStatic(filter, TransformType.FIXED, light, overlay, ms, buffer); } private static float customZOffset(Item item) { @@ -40,7 +40,7 @@ public class ValueBoxRenderer { return NUDGE; if (block instanceof FenceBlock) return NUDGE; - if (block.isIn(BlockTags.BUTTONS)) + if (block.is(BlockTags.BUTTONS)) return NUDGE; if (block == Blocks.END_ROD) return NUDGE; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java index 0d74f4e52..d701a8ae7 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java @@ -4,9 +4,9 @@ import java.util.function.Function; import org.apache.commons.lang3.tuple.Pair; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -46,10 +46,10 @@ public abstract class ValueBoxTransform { protected Vector3d rotateHorizontally(BlockState state, Vector3d vec) { float yRot = 0; - if (state.contains(BlockStateProperties.FACING)) - yRot = AngleHelper.horizontalAngle(state.get(BlockStateProperties.FACING)); - if (state.contains(BlockStateProperties.HORIZONTAL_FACING)) - yRot = AngleHelper.horizontalAngle(state.get(BlockStateProperties.HORIZONTAL_FACING)); + if (state.hasProperty(BlockStateProperties.FACING)) + yRot = AngleHelper.horizontalAngle(state.getValue(BlockStateProperties.FACING)); + if (state.hasProperty(BlockStateProperties.HORIZONTAL_FACING)) + yRot = AngleHelper.horizontalAngle(state.getValue(BlockStateProperties.HORIZONTAL_FACING)); return VecHelper.rotateCentered(vec, yRot, Axis.Y); } @@ -109,7 +109,7 @@ public abstract class ValueBoxTransform { protected void rotate(BlockState state, MatrixStack ms) { float yRot = AngleHelper.horizontalAngle(getSide()) + 180; float xRot = getSide() == Direction.UP ? 90 : getSide() == Direction.DOWN ? 270 : 0; - MatrixStacker.of(ms) + MatrixTransformStack.of(ms) .rotateY(yRot) .rotateX(xRot); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/BeltProcessingBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/BeltProcessingBehaviour.java index 8725bce5d..3d9af3d78 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/BeltProcessingBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/BeltProcessingBehaviour.java @@ -43,10 +43,10 @@ public class BeltProcessingBehaviour extends TileEntityBehaviour { } public static boolean isBlocked(IBlockReader world, BlockPos processingSpace) { - BlockState blockState = world.getBlockState(processingSpace.up()); + BlockState blockState = world.getBlockState(processingSpace.above()); if (AbstractFunnelBlock.isFunnel(blockState)) return false; - return !blockState.getCollisionShape(world, processingSpace.up()) + return !blockState.getCollisionShape(world, processingSpace.above()) .isEmpty(); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java index 823568969..a11f4f4a0 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java @@ -99,20 +99,20 @@ public class DirectBeltInputBehaviour extends TileEntityBehaviour { @Nullable public ItemStack tryExportingToBeltFunnel(ItemStack stack, @Nullable Direction side, boolean simulate) { - BlockPos funnelPos = tileEntity.getPos() - .up(); + BlockPos funnelPos = tileEntity.getBlockPos() + .above(); World world = getWorld(); BlockState funnelState = world.getBlockState(funnelPos); if (!(funnelState.getBlock() instanceof BeltFunnelBlock)) return null; - if (funnelState.get(BeltFunnelBlock.SHAPE) != Shape.PULLING) + if (funnelState.getValue(BeltFunnelBlock.SHAPE) != Shape.PULLING) return null; if (side != null && FunnelBlock.getFunnelFacing(funnelState) != side) return null; - TileEntity te = world.getTileEntity(funnelPos); + TileEntity te = world.getBlockEntity(funnelPos); if (!(te instanceof FunnelTileEntity)) return null; - if (funnelState.get(BeltFunnelBlock.POWERED)) + if (funnelState.getValue(BeltFunnelBlock.POWERED)) return stack; ItemStack insert = FunnelBlock.tryInsert(world, funnelPos, stack, simulate); if (insert.getCount() != stack.getCount() && !simulate) diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java index 56fcc5c91..9e43eca67 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java @@ -86,7 +86,7 @@ public class TransportedItemStackHandlerBehaviour extends TileEntityBehaviour { public TransportedItemStackHandlerBehaviour(SmartTileEntity te, ProcessingCallback processingCallback) { super(te); this.processingCallback = processingCallback; - positionGetter = t -> VecHelper.getCenterOf(te.getPos()); + positionGetter = t -> VecHelper.getCenterOf(te.getBlockPos()); } public TransportedItemStackHandlerBehaviour withStackPlacement(PositionGetter function) { diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java index 82ca086b9..47bb85727 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java @@ -35,9 +35,9 @@ public class EdgeInteractionHandler { BlockPos pos = event.getPos(); PlayerEntity player = event.getPlayer(); Hand hand = event.getHand(); - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); - if (player.isSneaking() || player.isSpectator()) + if (player.isShiftKeyDown() || player.isSpectator()) return; EdgeInteractionBehaviour behaviour = TileEntityBehaviour.get(world, pos, EdgeInteractionBehaviour.TYPE); if (behaviour == null) @@ -48,28 +48,28 @@ public class EdgeInteractionHandler { if (behaviour.requiredItem.orElse(heldItem.getItem()) != heldItem.getItem()) return; - Direction activatedDirection = getActivatedDirection(world, pos, ray.getFace(), ray.getHitVec(), behaviour); + Direction activatedDirection = getActivatedDirection(world, pos, ray.getDirection(), ray.getLocation(), behaviour); if (activatedDirection == null) return; if (event.getSide() != LogicalSide.CLIENT) - behaviour.connectionCallback.apply(world, pos, pos.offset(activatedDirection)); + behaviour.connectionCallback.apply(world, pos, pos.relative(activatedDirection)); event.setCanceled(true); event.setCancellationResult(ActionResultType.SUCCESS); - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, .1f); + world.playSound(null, pos, SoundEvents.ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, .1f); } public static List getConnectiveSides(World world, BlockPos pos, Direction face, EdgeInteractionBehaviour behaviour) { List sides = new ArrayList<>(6); - if (BlockHelper.hasBlockSolidSide(world.getBlockState(pos.offset(face)), world, pos.offset(face), face.getOpposite())) + if (BlockHelper.hasBlockSolidSide(world.getBlockState(pos.relative(face)), world, pos.relative(face), face.getOpposite())) return sides; for (Direction direction : Iterate.directions) { if (direction.getAxis() == face.getAxis()) continue; - BlockPos neighbourPos = pos.offset(direction); - if (BlockHelper.hasBlockSolidSide(world.getBlockState(neighbourPos.offset(face)), world, neighbourPos.offset(face), + BlockPos neighbourPos = pos.relative(direction); + if (BlockHelper.hasBlockSolidSide(world.getBlockState(neighbourPos.relative(face)), world, neighbourPos.relative(face), face.getOpposite())) continue; if (!behaviour.connectivityPredicate.test(world, pos, face, direction)) @@ -92,7 +92,7 @@ public class EdgeInteractionHandler { static AxisAlignedBB getBB(BlockPos pos, Direction direction) { AxisAlignedBB bb = new AxisAlignedBB(pos); - Vector3i vec = direction.getDirectionVec(); + Vector3i vec = direction.getNormal(); int x = vec.getX(); int y = vec.getY(); int z = vec.getZ(); @@ -102,9 +102,9 @@ public class EdgeInteractionHandler { double absZ = Math.abs(z) * margin; bb = bb.contract(absX, absY, absZ); - bb = bb.offset(absX / 2d, absY / 2d, absZ / 2d); - bb = bb.offset(x / 2d, y / 2d, z / 2d); - bb = bb.grow(1 / 256f); + bb = bb.move(absX / 2d, absY / 2d, absZ / 2d); + bb = bb.move(x / 2d, y / 2d, z / 2d); + bb = bb.inflate(1 / 256f); return bb; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java index 6cfcd227b..1c6d512ad 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java @@ -25,17 +25,17 @@ public class EdgeInteractionRenderer { public static void tick() { Minecraft mc = Minecraft.getInstance(); - RayTraceResult target = mc.objectMouseOver; + RayTraceResult target = mc.hitResult; if (target == null || !(target instanceof BlockRayTraceResult)) return; BlockRayTraceResult result = (BlockRayTraceResult) target; - ClientWorld world = mc.world; - BlockPos pos = result.getPos(); + ClientWorld world = mc.level; + BlockPos pos = result.getBlockPos(); PlayerEntity player = mc.player; - ItemStack heldItem = player.getHeldItemMainhand(); + ItemStack heldItem = player.getMainHandItem(); - if (player.isSneaking()) + if (player.isShiftKeyDown()) return; EdgeInteractionBehaviour behaviour = TileEntityBehaviour.get(world, pos, EdgeInteractionBehaviour.TYPE); if (behaviour == null) @@ -43,7 +43,7 @@ public class EdgeInteractionRenderer { if (behaviour.requiredItem.orElse(heldItem.getItem()) != heldItem.getItem()) return; - Direction face = result.getFace(); + Direction face = result.getDirection(); List connectiveSides = EdgeInteractionHandler.getConnectiveSides(world, pos, face, behaviour); if (connectiveSides.isEmpty()) return; @@ -52,7 +52,7 @@ public class EdgeInteractionRenderer { double bestDistance = Double.MAX_VALUE; Vector3d center = VecHelper.getCenterOf(pos); for (Direction direction : connectiveSides) { - double distance = Vector3d.of(direction.getDirectionVec()).subtract(target.getHitVec() + double distance = Vector3d.atLowerCornerOf(direction.getNormal()).subtract(target.getLocation() .subtract(center)) .length(); if (distance > bestDistance) @@ -62,9 +62,9 @@ public class EdgeInteractionRenderer { } AxisAlignedBB bb = EdgeInteractionHandler.getBB(pos, closestEdge); - boolean hit = bb.contains(target.getHitVec()); + boolean hit = bb.contains(target.getLocation()); - ValueBox box = new ValueBox(StringTextComponent.EMPTY, bb.offset(-pos.getX(), -pos.getY(), -pos.getZ()), pos); + ValueBox box = new ValueBox(StringTextComponent.EMPTY, bb.move(-pos.getX(), -pos.getY(), -pos.getZ()), pos); Vector3d textOffset = Vector3d.ZERO; boolean positive = closestEdge.getAxisDirection() == AxisDirection.POSITIVE; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java index 1768fd0cd..b7098e455 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java @@ -76,7 +76,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { @Override public void read(CompoundNBT nbt, boolean clientPacket) { - filter = ItemStack.read(nbt.getCompound("Filter")); + filter = ItemStack.of(nbt.getCompound("Filter")); count = nbt.getInt("FilterAmount"); if (nbt.contains("ForceScrollable")) { scrollableValue = count; @@ -89,7 +89,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { public void tick() { super.tick(); - if (!getWorld().isRemote) + if (!getWorld().isClientSide) return; if (ticksUntilScrollPacket == -1) return; @@ -155,7 +155,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { : (filter.getItem() instanceof FilterItem) ? 0 : Math.min(stack.getCount(), stack.getMaxStackSize()); forceClientState = true; - tileEntity.markDirty(); + tileEntity.setChanged(); tileEntity.sendData(); } @@ -164,7 +164,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { if (filter.getItem() instanceof FilterItem) { Vector3d pos = VecHelper.getCenterOf(getPos()); World world = getWorld(); - world.addEntity(new ItemEntity(world, pos.x, pos.y, pos.z, filter.copy())); + world.addFreshEntity(new ItemEntity(world, pos.x, pos.y, pos.z, filter.copy())); } super.destroy(); @@ -192,11 +192,11 @@ public class FilteringBehaviour extends TileEntityBehaviour { } public boolean test(ItemStack stack) { - return !isActive() || filter.isEmpty() || FilterItem.test(tileEntity.getWorld(), stack, filter); + return !isActive() || filter.isEmpty() || FilterItem.test(tileEntity.getLevel(), stack, filter); } public boolean test(FluidStack stack) { - return !isActive() || filter.isEmpty() || FilterItem.test(tileEntity.getWorld(), stack, filter); + return !isActive() || filter.isEmpty() || FilterItem.test(tileEntity.getLevel(), stack, filter); } @Override @@ -206,7 +206,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { public boolean testHit(Vector3d hit) { BlockState state = tileEntity.getBlockState(); - Vector3d localHit = hit.subtract(Vector3d.of(tileEntity.getPos())); + Vector3d localHit = hit.subtract(Vector3d.atLowerCornerOf(tileEntity.getBlockPos())); return slotPositioning.testHit(state, localHit); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringCountUpdatePacket.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringCountUpdatePacket.java index d6548d1e8..562ba13ab 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringCountUpdatePacket.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringCountUpdatePacket.java @@ -36,7 +36,7 @@ public class FilteringCountUpdatePacket extends TileEntityConfigurationPacket { CompoundNBT compound = new CompoundNBT(); compound.putInt("Side", entry.getKey() - .getIndex()); + .get3DDataValue()); entry.getValue() .write(compound, clientPacket); return compound; @@ -75,7 +75,7 @@ public class SidedFilteringBehaviour extends FilteringBehaviour { @Override public void read(CompoundNBT nbt, boolean clientPacket) { NBTHelper.iterateCompoundList(nbt.getList("Filters", NBT.TAG_COMPOUND), compound -> { - Direction face = Direction.byIndex(compound.getInt("Side")); + Direction face = Direction.from3DDataValue(compound.getInt("Side")); if (sidedFilters.containsKey(face)) sidedFilters.get(face) .read(compound, clientPacket); @@ -139,7 +139,7 @@ public class SidedFilteringBehaviour extends FilteringBehaviour { public boolean testHit(Direction direction, Vector3d hit) { ValueBoxTransform.Sided sidedPositioning = (Sided) slotPositioning; BlockState state = tileEntity.getBlockState(); - Vector3d localHit = hit.subtract(Vector3d.of(tileEntity.getPos())); + Vector3d localHit = hit.subtract(Vector3d.atLowerCornerOf(tileEntity.getBlockPos())); return sidedPositioning.fromSide(direction) .testHit(state, localHit); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java index 9841bbb8d..96be1251a 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -88,7 +88,7 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { @Override public void initialize() { super.initialize(); - if (getWorld().isRemote) + if (getWorld().isClientSide) return; foreach(ts -> { ts.fluidLevel.forceNextSync(); @@ -132,7 +132,7 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { protected void updateFluids() { fluidUpdateCallback.run(); tileEntity.sendData(); - tileEntity.markDirty(); + tileEntity.setChanged(); } @Override @@ -239,10 +239,10 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { } public void onFluidStackChanged() { - if (!tileEntity.hasWorld()) + if (!tileEntity.hasLevel()) return; fluidLevel.chase(tank.getFluidAmount() / (float) tank.getCapacity(), .25, Chaser.EXP); - if (!getWorld().isRemote) + if (!getWorld().isClientSide) sendDataLazily(); if (tileEntity.isVirtual() && !tank.getFluid() .isEmpty()) diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java index 80fcbf014..fa9ae5f95 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java @@ -100,7 +100,7 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { boolean shouldSimulate = simulateNext; simulateNext = false; - if (getWorld().isRemote) + if (getWorld().isClientSide) return ItemStack.EMPTY; IItemHandler inventory = targetCapability.orElse(null); if (inventory == null) @@ -147,7 +147,7 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { @Override public void onNeighborChanged(BlockPos neighborPos) { - BlockFace targetBlockFace = target.getTarget(getWorld(), tileEntity.getPos(), tileEntity.getBlockState()); + BlockFace targetBlockFace = target.getTarget(getWorld(), tileEntity.getBlockPos(), tileEntity.getBlockState()); if (targetBlockFace.getConnectedPos().equals(neighborPos)) onHandlerInvalidated(targetCapability); } @@ -182,16 +182,16 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { } public void findNewCapability() { - BlockFace targetBlockFace = target.getTarget(getWorld(), tileEntity.getPos(), tileEntity.getBlockState()) + BlockFace targetBlockFace = target.getTarget(getWorld(), tileEntity.getBlockPos(), tileEntity.getBlockState()) .getOpposite(); BlockPos pos = targetBlockFace.getPos(); World world = getWorld(); targetCapability = LazyOptional.empty(); - if (!world.isBlockPresent(pos)) + if (!world.isLoaded(pos)) return; - TileEntity invTE = world.getTileEntity(pos); + TileEntity invTE = world.getBlockEntity(pos); if (invTE == null) return; targetCapability = bypassSided ? invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) @@ -209,14 +209,14 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { public interface InterfaceProvider { public static InterfaceProvider towardBlockFacing() { - return (w, p, s) -> new BlockFace(p, s.contains(BlockStateProperties.FACING) ? s.get(BlockStateProperties.FACING) - : s.get(BlockStateProperties.HORIZONTAL_FACING)); + return (w, p, s) -> new BlockFace(p, s.hasProperty(BlockStateProperties.FACING) ? s.getValue(BlockStateProperties.FACING) + : s.getValue(BlockStateProperties.HORIZONTAL_FACING)); } public static InterfaceProvider oppositeOfBlockFacing() { return (w, p, s) -> new BlockFace(p, - (s.contains(BlockStateProperties.FACING) ? s.get(BlockStateProperties.FACING) - : s.get(BlockStateProperties.HORIZONTAL_FACING)).getOpposite()); + (s.hasProperty(BlockStateProperties.FACING) ? s.getValue(BlockStateProperties.FACING) + : s.getValue(BlockStateProperties.HORIZONTAL_FACING)).getOpposite()); } public BlockFace getTarget(World world, BlockPos pos, BlockState blockState); diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java index 75aa226e0..e10bc096e 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java @@ -102,7 +102,7 @@ public class LinkBehaviour extends TileEntityBehaviour implements IRedstoneLinka @Override public void initialize() { super.initialize(); - if (getWorld().isRemote) + if (getWorld().isClientSide) return; getHandler().addToNetwork(getWorld(), this); newPosition = true; @@ -116,7 +116,7 @@ public class LinkBehaviour extends TileEntityBehaviour implements IRedstoneLinka @Override public void remove() { super.remove(); - if (getWorld().isRemote) + if (getWorld().isClientSide) return; getHandler().removeFromNetwork(getWorld(), this); } @@ -130,23 +130,23 @@ public class LinkBehaviour extends TileEntityBehaviour implements IRedstoneLinka public void write(CompoundNBT nbt, boolean clientPacket) { super.write(nbt, clientPacket); nbt.put("FrequencyFirst", frequencyFirst.getStack() - .write(new CompoundNBT())); + .save(new CompoundNBT())); nbt.put("FrequencyLast", frequencyLast.getStack() - .write(new CompoundNBT())); - nbt.putLong("LastKnownPosition", tileEntity.getPos() - .toLong()); + .save(new CompoundNBT())); + nbt.putLong("LastKnownPosition", tileEntity.getBlockPos() + .asLong()); } @Override public void read(CompoundNBT nbt, boolean clientPacket) { - long positionInTag = tileEntity.getPos() - .toLong(); + long positionInTag = tileEntity.getBlockPos() + .asLong(); long positionKey = nbt.getLong("LastKnownPosition"); newPosition = positionInTag != positionKey; super.read(nbt, clientPacket); - frequencyFirst = Frequency.of(ItemStack.read(nbt.getCompound("FrequencyFirst"))); - frequencyLast = Frequency.of(ItemStack.read(nbt.getCompound("FrequencyLast"))); + frequencyFirst = Frequency.of(ItemStack.of(nbt.getCompound("FrequencyFirst"))); + frequencyLast = Frequency.of(ItemStack.of(nbt.getCompound("FrequencyLast"))); } public void setFrequency(boolean first, ItemStack stack) { @@ -154,7 +154,7 @@ public class LinkBehaviour extends TileEntityBehaviour implements IRedstoneLinka stack.setCount(1); ItemStack toCompare = first ? frequencyFirst.getStack() : frequencyLast.getStack(); boolean changed = - !ItemStack.areItemsEqual(stack, toCompare) || !ItemStack.areItemStackTagsEqual(stack, toCompare); + !ItemStack.isSame(stack, toCompare) || !ItemStack.tagMatches(stack, toCompare); if (changed) getHandler().removeFromNetwork(getWorld(), this); @@ -201,13 +201,13 @@ public class LinkBehaviour extends TileEntityBehaviour implements IRedstoneLinka public boolean testHit(Boolean first, Vector3d hit) { BlockState state = tileEntity.getBlockState(); - Vector3d localHit = hit.subtract(Vector3d.of(tileEntity.getPos())); + Vector3d localHit = hit.subtract(Vector3d.atLowerCornerOf(tileEntity.getBlockPos())); return (first ? firstSlot : secondSlot).testHit(state, localHit); } @Override public boolean isAlive() { - return !tileEntity.isRemoved() && getWorld().getTileEntity(getPos()) == tileEntity; + return !tileEntity.isRemoved() && getWorld().getBlockEntity(getPos()) == tileEntity; } @Override diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkHandler.java index 1c5e6319f..1c428e62d 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkHandler.java @@ -30,14 +30,14 @@ public class LinkHandler { PlayerEntity player = event.getPlayer(); Hand hand = event.getHand(); - if (player.isSneaking() || player.isSpectator()) + if (player.isShiftKeyDown() || player.isSpectator()) return; LinkBehaviour behaviour = TileEntityBehaviour.get(world, pos, LinkBehaviour.TYPE); if (behaviour == null) return; - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getItemInHand(hand); BlockRayTraceResult ray = RaycastHelper.rayTraceRange(world, player, 10); if (ray == null) return; @@ -47,12 +47,12 @@ public class LinkHandler { return; for (boolean first : Arrays.asList(false, true)) { - if (behaviour.testHit(first, ray.getHitVec())) { + if (behaviour.testHit(first, ray.getLocation())) { if (event.getSide() != LogicalSide.CLIENT) behaviour.setFrequency(first, heldItem); event.setCanceled(true); event.setCancellationResult(ActionResultType.SUCCESS); - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, .1f); + world.playSound(null, pos, SoundEvents.ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, .1f); } } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java index 8e7d31245..1c51f5861 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java @@ -27,13 +27,13 @@ public class LinkRenderer { public static void tick() { Minecraft mc = Minecraft.getInstance(); - RayTraceResult target = mc.objectMouseOver; + RayTraceResult target = mc.hitResult; if (target == null || !(target instanceof BlockRayTraceResult)) return; BlockRayTraceResult result = (BlockRayTraceResult) target; - ClientWorld world = mc.world; - BlockPos pos = result.getPos(); + ClientWorld world = mc.level; + BlockPos pos = result.getBlockPos(); LinkBehaviour behaviour = TileEntityBehaviour.get(world, pos, LinkBehaviour.TYPE); if (behaviour == null) @@ -43,9 +43,9 @@ public class LinkRenderer { ITextComponent freq2 = Lang.translate("logistics.secondFrequency"); for (boolean first : Iterate.trueAndFalse) { - AxisAlignedBB bb = new AxisAlignedBB(Vector3d.ZERO, Vector3d.ZERO).grow(.25f); - ITextComponent label = first ? freq2 : freq1; - boolean hit = behaviour.testHit(first, target.getHitVec()); + AxisAlignedBB bb = new AxisAlignedBB(Vector3d.ZERO, Vector3d.ZERO).inflate(.25f); + ITextComponent label = first ? freq1 : freq2; + boolean hit = behaviour.testHit(first, target.getLocation()); ValueBoxTransform transform = first ? behaviour.firstSlot : behaviour.secondSlot; ValueBox box = new ValueBox(label, bb, pos).withColors(0x601F18, 0xB73C2D) @@ -54,7 +54,7 @@ public class LinkRenderer { CreateClient.OUTLINER.showValueBox(Pair.of(Boolean.valueOf(first), pos), box.transform(transform)) .lineWidth(1 / 64f) .withFaceTexture(hit ? AllSpecialTextures.THIN_CHECKERED : null) - .highlightFace(result.getFace()); + .highlightFace(result.getDirection()); } } @@ -71,10 +71,10 @@ public class LinkRenderer { ValueBoxTransform transform = first ? behaviour.firstSlot : behaviour.secondSlot; ItemStack stack = first ? behaviour.frequencyFirst.getStack() : behaviour.frequencyLast.getStack(); - ms.push(); + ms.pushPose(); transform.transform(te.getBlockState(), ms); ValueBoxRenderer.renderItemIntoValueBox(stack, ms, buffer, light, overlay); - ms.pop(); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueBehaviour.java index d189a689d..090c32a21 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueBehaviour.java @@ -81,7 +81,7 @@ public class ScrollValueBehaviour extends TileEntityBehaviour { public void tick() { super.tick(); - if (!getWorld().isRemote) + if (!getWorld().isClientSide) return; if (ticksUntilScrollPacket == -1) return; @@ -154,7 +154,7 @@ public class ScrollValueBehaviour extends TileEntityBehaviour { this.value = value; forceClientState = true; callback.accept(value); - tileEntity.markDirty(); + tileEntity.setChanged(); tileEntity.sendData(); scrollableValue = value; } @@ -178,7 +178,7 @@ public class ScrollValueBehaviour extends TileEntityBehaviour { public boolean testHit(Vector3d hit) { BlockState state = tileEntity.getBlockState(); - Vector3d localHit = hit.subtract(Vector3d.of(tileEntity.getPos())); + Vector3d localHit = hit.subtract(Vector3d.atLowerCornerOf(tileEntity.getBlockPos())); return slotPositioning.testHit(state, localHit); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java index 1ae96c132..9ccd62138 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java @@ -30,32 +30,32 @@ public class ScrollValueHandler { @OnlyIn(Dist.CLIENT) public static boolean onScroll(double delta) { - RayTraceResult objectMouseOver = Minecraft.getInstance().objectMouseOver; + RayTraceResult objectMouseOver = Minecraft.getInstance().hitResult; if (!(objectMouseOver instanceof BlockRayTraceResult)) return false; BlockRayTraceResult result = (BlockRayTraceResult) objectMouseOver; Minecraft mc = Minecraft.getInstance(); - ClientWorld world = mc.world; - BlockPos blockPos = result.getPos(); + ClientWorld world = mc.level; + BlockPos blockPos = result.getBlockPos(); ScrollValueBehaviour scrolling = TileEntityBehaviour.get(world, blockPos, ScrollValueBehaviour.TYPE); if (scrolling == null) return false; if (!scrolling.isActive()) return false; - if (!mc.player.isAllowEdit()) + if (!mc.player.mayBuild()) return false; passiveScrollDirection = (float) -delta; wrenchCog.bump(3, -delta * 10); int prev = scrolling.scrollableValue; - if (scrolling.needsWrench && !AllItems.WRENCH.isIn(mc.player.getHeldItemMainhand())) + if (scrolling.needsWrench && !AllItems.WRENCH.isIn(mc.player.getMainHandItem())) return false; if (scrolling.slotPositioning instanceof Sided) - ((Sided) scrolling.slotPositioning).fromSide(result.getFace()); - if (!scrolling.testHit(objectMouseOver.getHitVec())) + ((Sided) scrolling.slotPositioning).fromSide(result.getDirection()); + if (!scrolling.testHit(objectMouseOver.getLocation())) return false; if (scrolling instanceof BulkScrollValueBehaviour && AllKeys.ctrlDown()) { diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java index ab5521204..f157c98fc 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java @@ -25,30 +25,30 @@ public class ScrollValueRenderer { public static void tick() { Minecraft mc = Minecraft.getInstance(); - RayTraceResult target = mc.objectMouseOver; + RayTraceResult target = mc.hitResult; if (target == null || !(target instanceof BlockRayTraceResult)) return; BlockRayTraceResult result = (BlockRayTraceResult) target; - ClientWorld world = mc.world; - BlockPos pos = result.getPos(); - Direction face = result.getFace(); + ClientWorld world = mc.level; + BlockPos pos = result.getBlockPos(); + Direction face = result.getDirection(); ScrollValueBehaviour behaviour = TileEntityBehaviour.get(world, pos, ScrollValueBehaviour.TYPE); if (behaviour == null) return; if (!behaviour.isActive()) return; - if (behaviour.needsWrench && !AllItems.WRENCH.isIn(mc.player.getHeldItemMainhand())) + if (behaviour.needsWrench && !AllItems.WRENCH.isIn(mc.player.getMainHandItem())) return; - boolean highlight = behaviour.testHit(target.getHitVec()); + boolean highlight = behaviour.testHit(target.getLocation()); if (behaviour instanceof BulkScrollValueBehaviour && AllKeys.ctrlDown()) { BulkScrollValueBehaviour bulkScrolling = (BulkScrollValueBehaviour) behaviour; for (SmartTileEntity smartTileEntity : bulkScrolling.getBulk()) { ScrollValueBehaviour other = smartTileEntity.getBehaviour(ScrollValueBehaviour.TYPE); if (other != null) - addBox(world, smartTileEntity.getPos(), face, other, highlight); + addBox(world, smartTileEntity.getBlockPos(), face, other, highlight); } } else addBox(world, pos, face, behaviour, highlight); @@ -56,9 +56,9 @@ public class ScrollValueRenderer { protected static void addBox(ClientWorld world, BlockPos pos, Direction face, ScrollValueBehaviour behaviour, boolean highlight) { - AxisAlignedBB bb = new AxisAlignedBB(Vector3d.ZERO, Vector3d.ZERO).grow(.5f) + AxisAlignedBB bb = new AxisAlignedBB(Vector3d.ZERO, Vector3d.ZERO).inflate(.5f) .contract(0, 0, -.5f) - .offset(0, 0, -.125f); + .move(0, 0, -.125f); ITextComponent label = behaviour.label; ValueBox box; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java index 2b47c21fb..c6366b8da 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java @@ -19,10 +19,10 @@ public abstract class ColoredOverlayTileEntityRenderer ext protected void renderSafe(T te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (Backend.getInstance().canUseInstancing(te.getWorld())) return; + if (Backend.getInstance().canUseInstancing(te.getLevel())) return; SuperByteBuffer render = render(getOverlayBuffer(te), getColor(te, partialTicks), light); - render.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + render.renderInto(ms, buffer.getBuffer(RenderType.solid())); } protected abstract int getColor(T te, float partialTicks); diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java index 6c02f67f9..d69e54731 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java @@ -26,7 +26,7 @@ public abstract class SafeTileEntityRenderer extends TileE int overlay); public boolean isInvalid(T te) { - return !te.hasWorld() || te.getBlockState() + return !te.hasLevel() || te.getBlockState() .getBlock() == Blocks.AIR; } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/AbstractBlockBreakQueue.java b/src/main/java/com/simibubi/create/foundation/utility/AbstractBlockBreakQueue.java index cc4989e8d..4bef24374 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/AbstractBlockBreakQueue.java +++ b/src/main/java/com/simibubi/create/foundation/utility/AbstractBlockBreakQueue.java @@ -28,7 +28,7 @@ public abstract class AbstractBlockBreakQueue { public void destroyBlocks(World world, @Nullable LivingEntity entity, BiConsumer drop) { PlayerEntity playerEntity = entity instanceof PlayerEntity ? ((PlayerEntity) entity) : null; ItemStack toDamage = - playerEntity != null && !playerEntity.isCreative() ? playerEntity.getHeldItemMainhand() : ItemStack.EMPTY; + playerEntity != null && !playerEntity.isCreative() ? playerEntity.getMainHandItem() : ItemStack.EMPTY; destroyBlocks(world, toDamage, playerEntity, drop); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java b/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java index 3f8723672..4ed984af0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java @@ -9,7 +9,7 @@ public class AngleHelper { * Legacy method. See {@link #horizontalAngleNew(Direction)} for new method. */ public static float horizontalAngle(Direction facing) { - float angle = facing.getHorizontalAngle(); + float angle = facing.toYRot(); if (facing.getAxis() == Axis.X) angle = -angle; return angle; @@ -22,7 +22,7 @@ public class AngleHelper { if (facing.getAxis().isVertical()) { return 0; } - float angle = facing.getHorizontalAngle(); + float angle = facing.toYRot(); if (facing.getAxis() == Axis.X) angle = -angle; return angle; diff --git a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java index efc5f90f8..2564c2cc6 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java @@ -19,7 +19,7 @@ public class AnimationTickHolder { public static void tick() { if (!Minecraft.getInstance() - .isGamePaused()) { + .isPaused()) { ticks = (ticks + 1) % 1_728_000; // wrap around every 24 hours so we maintain enough floating point precision } else { paused_ticks = (paused_ticks + 1) % 1_728_000; @@ -40,7 +40,7 @@ public class AnimationTickHolder { public static float getPartialTicks() { Minecraft mc = Minecraft.getInstance(); - return (mc.isGamePaused() ? mc.renderPartialTicksPaused : mc.getRenderPartialTicks()); + return (mc.isPaused() ? mc.pausePartialTick : mc.getFrameTime()); } public static int getTicks(IWorld world) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/BlockFace.java b/src/main/java/com/simibubi/create/foundation/utility/BlockFace.java index b26edb76c..a995e5fae 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/BlockFace.java +++ b/src/main/java/com/simibubi/create/foundation/utility/BlockFace.java @@ -34,7 +34,7 @@ public class BlockFace extends Pair { } public BlockPos getConnectedPos() { - return getPos().offset(getFace()); + return getPos().relative(getFace()); } public CompoundNBT serializeNBT() { diff --git a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java index 929a73904..b8f0102dc 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java @@ -60,10 +60,10 @@ public class BlockHelper { ClientWorld world = (ClientWorld) worldIn; VoxelShape voxelshape = state.getShape(world, pos); MutableInt amtBoxes = new MutableInt(0); - voxelshape.forEachBox((x1, y1, z1, x2, y2, z2) -> amtBoxes.increment()); + voxelshape.forAllBoxes((x1, y1, z1, x2, y2, z2) -> amtBoxes.increment()); double chance = 1d / amtBoxes.getValue(); - voxelshape.forEachBox((x1, y1, z1, x2, y2, z2) -> { + voxelshape.forAllBoxes((x1, y1, z1, x2, y2, z2) -> { double d1 = Math.min(1.0D, x2 - x1); double d2 = Math.min(1.0D, y2 - y1); double d3 = Math.min(1.0D, z2 - z1); @@ -74,7 +74,7 @@ public class BlockHelper { for (int l = 0; l < i; ++l) { for (int i1 = 0; i1 < j; ++i1) { for (int j1 = 0; j1 < k; ++j1) { - if (world.rand.nextDouble() > chance) + if (world.random.nextDouble() > chance) continue; double d4 = ((double) l + 0.5D) / (double) i; @@ -84,8 +84,8 @@ public class BlockHelper { double d8 = d5 * d2 + y1; double d9 = d6 * d3 + z1; manager - .addEffect((new DiggingParticle(world, (double) pos.getX() + d7, (double) pos.getY() + d8, - (double) pos.getZ() + d9, d4 - 0.5D, d5 - 0.5D, d6 - 0.5D, state)).setBlockPos(pos)); + .add((new DiggingParticle(world, (double) pos.getX() + d7, (double) pos.getY() + d8, + (double) pos.getZ() + d9, d4 - 0.5D, d5 - 0.5D, d6 - 0.5D, state)).init(pos)); } } } @@ -94,32 +94,32 @@ public class BlockHelper { } public static BlockState setZeroAge(BlockState blockState) { - if (blockState.contains(BlockStateProperties.AGE_0_1)) - return blockState.with(BlockStateProperties.AGE_0_1, 0); - if (blockState.contains(BlockStateProperties.AGE_0_2)) - return blockState.with(BlockStateProperties.AGE_0_2, 0); - if (blockState.contains(BlockStateProperties.AGE_0_3)) - return blockState.with(BlockStateProperties.AGE_0_3, 0); - if (blockState.contains(BlockStateProperties.AGE_0_5)) - return blockState.with(BlockStateProperties.AGE_0_5, 0); - if (blockState.contains(BlockStateProperties.AGE_0_7)) - return blockState.with(BlockStateProperties.AGE_0_7, 0); - if (blockState.contains(BlockStateProperties.AGE_0_15)) - return blockState.with(BlockStateProperties.AGE_0_15, 0); - if (blockState.contains(BlockStateProperties.AGE_0_25)) - return blockState.with(BlockStateProperties.AGE_0_25, 0); - if (blockState.contains(BlockStateProperties.HONEY_LEVEL)) - return blockState.with(BlockStateProperties.HONEY_LEVEL, 0); - if (blockState.contains(BlockStateProperties.HATCH_0_2)) - return blockState.with(BlockStateProperties.HATCH_0_2, 0); - if (blockState.contains(BlockStateProperties.STAGE_0_1)) - return blockState.with(BlockStateProperties.STAGE_0_1, 0); - if (blockState.contains(BlockStateProperties.LEVEL_0_3)) - return blockState.with(BlockStateProperties.LEVEL_0_3, 0); - if (blockState.contains(BlockStateProperties.LEVEL_0_8)) - return blockState.with(BlockStateProperties.LEVEL_0_8, 0); - if (blockState.contains(BlockStateProperties.EXTENDED)) - return blockState.with(BlockStateProperties.EXTENDED, false); + if (blockState.hasProperty(BlockStateProperties.AGE_1)) + return blockState.setValue(BlockStateProperties.AGE_1, 0); + if (blockState.hasProperty(BlockStateProperties.AGE_2)) + return blockState.setValue(BlockStateProperties.AGE_2, 0); + if (blockState.hasProperty(BlockStateProperties.AGE_3)) + return blockState.setValue(BlockStateProperties.AGE_3, 0); + if (blockState.hasProperty(BlockStateProperties.AGE_5)) + return blockState.setValue(BlockStateProperties.AGE_5, 0); + if (blockState.hasProperty(BlockStateProperties.AGE_7)) + return blockState.setValue(BlockStateProperties.AGE_7, 0); + if (blockState.hasProperty(BlockStateProperties.AGE_15)) + return blockState.setValue(BlockStateProperties.AGE_15, 0); + if (blockState.hasProperty(BlockStateProperties.AGE_25)) + return blockState.setValue(BlockStateProperties.AGE_25, 0); + if (blockState.hasProperty(BlockStateProperties.LEVEL_HONEY)) + return blockState.setValue(BlockStateProperties.LEVEL_HONEY, 0); + if (blockState.hasProperty(BlockStateProperties.HATCH)) + return blockState.setValue(BlockStateProperties.HATCH, 0); + if (blockState.hasProperty(BlockStateProperties.STAGE)) + return blockState.setValue(BlockStateProperties.STAGE, 0); + if (blockState.hasProperty(BlockStateProperties.LEVEL_CAULDRON)) + return blockState.setValue(BlockStateProperties.LEVEL_CAULDRON, 0); + if (blockState.hasProperty(BlockStateProperties.LEVEL_COMPOSTER)) + return blockState.setValue(BlockStateProperties.LEVEL_COMPOSTER, 0); + if (blockState.hasProperty(BlockStateProperties.EXTENDED)) + return blockState.setValue(BlockStateProperties.EXTENDED, false); return blockState; } @@ -127,41 +127,41 @@ public class BlockHelper { int amountFound = 0; Item required = getRequiredItem(block).getItem(); - boolean needsTwo = block.contains(BlockStateProperties.SLAB_TYPE) - && block.get(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE; + boolean needsTwo = block.hasProperty(BlockStateProperties.SLAB_TYPE) + && block.getValue(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE; if (needsTwo) amount *= 2; - if (block.contains(BlockStateProperties.EGGS_1_4)) - amount *= block.get(BlockStateProperties.EGGS_1_4); + if (block.hasProperty(BlockStateProperties.EGGS)) + amount *= block.getValue(BlockStateProperties.EGGS); - if (block.contains(BlockStateProperties.PICKLES_1_4)) - amount *= block.get(BlockStateProperties.PICKLES_1_4); + if (block.hasProperty(BlockStateProperties.PICKLES)) + amount *= block.getValue(BlockStateProperties.PICKLES); { // Try held Item first - int preferredSlot = player.inventory.currentItem; - ItemStack itemstack = player.inventory.getStackInSlot(preferredSlot); + int preferredSlot = player.inventory.selected; + ItemStack itemstack = player.inventory.getItem(preferredSlot); int count = itemstack.getCount(); if (itemstack.getItem() == required && count > 0) { int taken = Math.min(count, amount - amountFound); - player.inventory.setInventorySlotContents(preferredSlot, + player.inventory.setItem(preferredSlot, new ItemStack(itemstack.getItem(), count - taken)); amountFound += taken; } } // Search inventory - for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { + for (int i = 0; i < player.inventory.getContainerSize(); ++i) { if (amountFound == amount) break; - ItemStack itemstack = player.inventory.getStackInSlot(i); + ItemStack itemstack = player.inventory.getItem(i); int count = itemstack.getCount(); if (itemstack.getItem() == required && count > 0) { int taken = Math.min(count, amount - amountFound); - player.inventory.setInventorySlotContents(i, new ItemStack(itemstack.getItem(), count - taken)); + player.inventory.setItem(i, new ItemStack(itemstack.getItem(), count - taken)); amountFound += taken; } } @@ -169,7 +169,7 @@ public class BlockHelper { if (needsTwo) { // Give back 1 if uneven amount was removed if (amountFound % 2 != 0) - player.inventory.addItemStackToInventory(new ItemStack(required)); + player.inventory.add(new ItemStack(required)); amountFound /= 2; } @@ -186,7 +186,7 @@ public class BlockHelper { } public static void destroyBlock(World world, BlockPos pos, float effectChance) { - destroyBlock(world, pos, effectChance, stack -> Block.spawnAsEntity(world, pos, stack)); + destroyBlock(world, pos, effectChance, stack -> Block.popResource(world, pos, stack)); } public static void destroyBlock(World world, BlockPos pos, float effectChance, @@ -198,9 +198,9 @@ public class BlockHelper { float effectChance, Consumer droppedItemCallback) { FluidState fluidState = world.getFluidState(pos); BlockState state = world.getBlockState(pos); - if (world.rand.nextFloat() < effectChance) - world.playEvent(2001, pos, Block.getStateId(state)); - TileEntity tileentity = state.hasTileEntity() ? world.getTileEntity(pos) : null; + if (world.random.nextFloat() < effectChance) + world.levelEvent(2001, pos, Block.getId(state)); + TileEntity tileentity = state.hasTileEntity() ? world.getBlockEntity(pos) : null; if (player != null) { BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, pos, state, player); MinecraftForge.EVENT_BUS.post(event); @@ -209,25 +209,25 @@ public class BlockHelper { if (event.getExpToDrop() > 0 && world instanceof ServerWorld) state.getBlock() - .dropXpOnBlockBreak((ServerWorld) world, pos, event.getExpToDrop()); + .popExperience((ServerWorld) world, pos, event.getExpToDrop()); - usedTool.onBlockDestroyed(world, state, pos, player); - player.addStat(Stats.BLOCK_MINED.get(state.getBlock())); + usedTool.mineBlock(world, state, pos, player); + player.awardStat(Stats.BLOCK_MINED.get(state.getBlock())); } if (world instanceof ServerWorld && world.getGameRules() - .getBoolean(GameRules.DO_TILE_DROPS) && !world.restoringBlockSnapshots + .getBoolean(GameRules.RULE_DOBLOCKDROPS) && !world.restoringBlockSnapshots && (player == null || !player.isCreative())) { for (ItemStack itemStack : Block.getDrops(state, (ServerWorld) world, pos, tileentity, player, usedTool)) droppedItemCallback.accept(itemStack); - state.spawnAdditionalDrops((ServerWorld) world, pos, ItemStack.EMPTY); + state.spawnAfterBreak((ServerWorld) world, pos, ItemStack.EMPTY); } - world.setBlockState(pos, fluidState.getBlockState()); + world.setBlockAndUpdate(pos, fluidState.createLegacyBlock()); } public static boolean isSolidWall(IBlockReader reader, BlockPos fromPos, Direction toDirection) { - return hasBlockSolidSide(reader.getBlockState(fromPos.offset(toDirection)), reader, fromPos.offset(toDirection), + return hasBlockSolidSide(reader.getBlockState(fromPos.relative(toDirection)), reader, fromPos.relative(toDirection), toDirection.getOpposite()); } @@ -248,69 +248,69 @@ public class BlockHelper { chunk.getSections()[j >> 4] = chunksection; } BlockState old = chunksection.setBlockState(i, j & 15, k, state); - chunk.markDirty(); + chunk.markUnsaved(); world.markAndNotifyBlock(target, chunk, old, state, 82, 512); - world.setBlockState(target, state, 82); - world.neighborChanged(target, world.getBlockState(target.down()).getBlock(), target.down()); + world.setBlock(target, state, 82); + world.neighborChanged(target, world.getBlockState(target.below()).getBlock(), target.below()); } public static void placeSchematicBlock(World world, BlockState state, BlockPos target, ItemStack stack, @Nullable CompoundNBT data) { // Piston - if (state.contains(BlockStateProperties.EXTENDED)) - state = state.with(BlockStateProperties.EXTENDED, Boolean.FALSE); - if (state.contains(BlockStateProperties.WATERLOGGED)) - state = state.with(BlockStateProperties.WATERLOGGED, Boolean.FALSE); + if (state.hasProperty(BlockStateProperties.EXTENDED)) + state = state.setValue(BlockStateProperties.EXTENDED, Boolean.FALSE); + if (state.hasProperty(BlockStateProperties.WATERLOGGED)) + state = state.setValue(BlockStateProperties.WATERLOGGED, Boolean.FALSE); if (AllBlocks.BELT.has(state)) { - world.setBlockState(target, state, 2); + world.setBlock(target, state, 2); return; } else if (state.getBlock() == Blocks.COMPOSTER) - state = Blocks.COMPOSTER.getDefaultState(); + state = Blocks.COMPOSTER.defaultBlockState(); else if (state.getBlock() != Blocks.SEA_PICKLE && state.getBlock() instanceof IPlantable) state = ((IPlantable) state.getBlock()).getPlant(world, target); - if (world.getDimension() - .isUltrawarm() + if (world.dimensionType() + .ultraWarm() && state.getFluidState() - .getFluid() - .isIn(FluidTags.WATER)) { + .getType() + .is(FluidTags.WATER)) { int i = target.getX(); int j = target.getY(); int k = target.getZ(); - world.playSound(null, target, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, - 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + world.playSound(null, target, SoundEvents.FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, + 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); for (int l = 0; l < 8; ++l) { world.addParticle(ParticleTypes.LARGE_SMOKE, i + Math.random(), j + Math.random(), k + Math.random(), 0.0D, 0.0D, 0.0D); } - Block.spawnDrops(state, world, target); + Block.dropResources(state, world, target); return; } if (state.getBlock() instanceof AbstractRailBlock) { placeRailWithoutUpdate(world, state, target); } else { - world.setBlockState(target, state, 18); + world.setBlock(target, state, 18); } if (data != null) { - TileEntity tile = world.getTileEntity(target); + TileEntity tile = world.getBlockEntity(target); if (tile != null) { data.putInt("x", target.getX()); data.putInt("y", target.getY()); data.putInt("z", target.getZ()); if (tile instanceof KineticTileEntity) ((KineticTileEntity) tile).warnOfMovement(); - tile.fromTag(tile.getBlockState(), data); + tile.load(tile.getBlockState(), data); } } try { state.getBlock() - .onBlockPlacedBy(world, target, state, null, stack); + .setPlacedBy(world, target, state, null, stack); } catch (Exception e) { } } @@ -325,16 +325,16 @@ public class BlockHelper { public static boolean hasBlockSolidSide(BlockState p_220056_0_, IBlockReader p_220056_1_, BlockPos p_220056_2_, Direction p_220056_3_) { - return !p_220056_0_.isIn(BlockTags.LEAVES) - && Block.doesSideFillSquare(p_220056_0_.getCollisionShape(p_220056_1_, p_220056_2_), p_220056_3_); + return !p_220056_0_.is(BlockTags.LEAVES) + && Block.isFaceFull(p_220056_0_.getCollisionShape(p_220056_1_, p_220056_2_), p_220056_3_); } public static boolean extinguishFire(World world, @Nullable PlayerEntity p_175719_1_, BlockPos p_175719_2_, Direction p_175719_3_) { - p_175719_2_ = p_175719_2_.offset(p_175719_3_); + p_175719_2_ = p_175719_2_.relative(p_175719_3_); if (world.getBlockState(p_175719_2_) .getBlock() == Blocks.FIRE) { - world.playEvent(p_175719_1_, 1009, p_175719_2_, 0); + world.levelEvent(p_175719_1_, 1009, p_175719_2_, 0); world.removeBlock(p_175719_2_, false); return true; } else { diff --git a/src/main/java/com/simibubi/create/foundation/utility/ColorHandlers.java b/src/main/java/com/simibubi/create/foundation/utility/ColorHandlers.java index 75e429dd1..4022dba98 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ColorHandlers.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ColorHandlers.java @@ -10,7 +10,7 @@ import net.minecraft.world.biome.BiomeColors; public class ColorHandlers { public static IBlockColor getGrassyBlock() { - return (state, world, pos, layer) -> pos != null && world != null ? BiomeColors.getGrassColor(world, pos) + return (state, world, pos, layer) -> pos != null && world != null ? BiomeColors.getAverageGrassColor(world, pos) : GrassColors.get(0.5D, 1.0D); } @@ -20,7 +20,7 @@ public class ColorHandlers { public static IBlockColor getRedstonePower() { return (state, world, pos, layer) -> RedstoneWireBlock - .getWireColor(pos != null && world != null ? state.get(BlockStateProperties.POWER_0_15) : 0); + .getColorForPower(pos != null && world != null ? state.getValue(BlockStateProperties.POWER) : 0); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java b/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java index d02fb3156..30337a080 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java @@ -37,7 +37,7 @@ public class ColorHelper { public static int applyAlpha(int color, float alpha) { int prevAlphaChannel = (color >> 24) & 0xFF; if (prevAlphaChannel > 0) - alpha *= prevAlphaChannel / 256f; + alpha *= prevAlphaChannel / 255f; int alphaChannel = (int) (0xFF * MathHelper.clamp(alpha, 0, 1)); return (color & 0xFFFFFF) | alphaChannel << 24; } @@ -98,7 +98,7 @@ public class ColorHelper { int g = (color >> 8) & 0xFF; int b = color & 0xFF; - RenderSystem.color4f(r / 256f, g / 256f, b / 256f, 1); + RenderSystem.color4f(r / 255f, g / 255f, b / 255f, 1); } public static void glResetColor() { @@ -109,7 +109,15 @@ public class ColorHelper { int r = (color >> 16) & 0xFF; int g = (color >> 8) & 0xFF; int b = color & 0xFF; - return new Vector3d(r, g, b).scale(1 / 256d); + return new Vector3d(r, g, b).scale(1 / 255d); + } + + public static Vector3d[] toVectors(int[] colors) { + Vector3d[] vectors = new Vector3d[colors.length]; + for (int i = 0; i < colors.length; i++) { + vectors[i] = ColorHelper.getRGB(colors[i]); + } + return vectors; } public static int colorFromUUID(UUID uuid) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/Debug.java b/src/main/java/com/simibubi/create/foundation/utility/Debug.java index e6445ae11..f59840d5b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Debug.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Debug.java @@ -18,20 +18,20 @@ public class Debug { @Deprecated public static void debugChat(String message) { if (Minecraft.getInstance().player != null) - Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent(message), false); + Minecraft.getInstance().player.displayClientMessage(new StringTextComponent(message), false); } @Deprecated public static void debugChatAndShowStack(String message, int depth) { if (Minecraft.getInstance().player != null) - Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent(message).append("@") + Minecraft.getInstance().player.displayClientMessage(new StringTextComponent(message).append("@") .append(debugStack(depth)), false); } @Deprecated public static void debugMessage(String message) { if (Minecraft.getInstance().player != null) - Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent(message), true); + Minecraft.getInstance().player.displayClientMessage(new StringTextComponent(message), true); } @Deprecated @@ -50,17 +50,17 @@ public class Debug { StackTraceElement[] stackTraceElements = Thread.currentThread() .getStackTrace(); IFormattableTextComponent text = new StringTextComponent("[") - .append(new StringTextComponent(getLogicalSide()).formatted(TextFormatting.GOLD)) + .append(new StringTextComponent(getLogicalSide()).withStyle(TextFormatting.GOLD)) .append("] "); for (int i = 1; i < depth + 2 && i < stackTraceElements.length; i++) { StackTraceElement e = stackTraceElements[i]; if (e.getClassName() .equals(Debug.class.getName())) continue; - text.append(new StringTextComponent(e.getMethodName()).formatted(TextFormatting.YELLOW)) + text.append(new StringTextComponent(e.getMethodName()).withStyle(TextFormatting.YELLOW)) .append(", "); } - return text.append(new StringTextComponent(" ...").formatted(TextFormatting.GRAY)); + return text.append(new StringTextComponent(" ...").withStyle(TextFormatting.GRAY)); } @Deprecated diff --git a/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java b/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java index 88ce27061..14996e0ea 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java @@ -27,7 +27,7 @@ public class DirectionHelper { return dir; case Y: if (dir != UP && dir != DOWN) { - return dir.rotateY(); + return dir.getClockWise(); } return dir; diff --git a/src/main/java/com/simibubi/create/foundation/utility/EmptyNamedTag.java b/src/main/java/com/simibubi/create/foundation/utility/EmptyNamedTag.java index 6e33ff6d1..8e6814ad8 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/EmptyNamedTag.java +++ b/src/main/java/com/simibubi/create/foundation/utility/EmptyNamedTag.java @@ -24,7 +24,7 @@ public class EmptyNamedTag implements Tags.IOptionalNamedTag { } @Override - public ResourceLocation getId() { + public ResourceLocation getName() { return id; } @@ -34,7 +34,7 @@ public class EmptyNamedTag implements Tags.IOptionalNamedTag { } @Override - public List values() { + public List getValues() { return Collections.emptyList(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/FontHelper.java b/src/main/java/com/simibubi/create/foundation/utility/FontHelper.java index c81ffef70..ce5f20f32 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/FontHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/FontHelper.java @@ -31,7 +31,7 @@ public final class FontHelper { StringBuilder currentLine = new StringBuilder(); int width = 0; for (String word : words) { - int newWidth = font.getStringWidth(word); + int newWidth = font.width(word); if (width + newWidth > maxWidthPerLine) { if (width > 0) { String line = currentLine.toString(); @@ -55,13 +55,13 @@ public final class FontHelper { public static void drawSplitString(MatrixStack ms, FontRenderer font, String text, int x, int y, int width, int color) { List list = cutString(font, text, width); - Matrix4f matrix4f = ms.peek() - .getModel(); + Matrix4f matrix4f = ms.last() + .pose(); for (String s : list) { float f = (float) x; - if (font.getBidiFlag()) { - int i = font.getStringWidth(font.bidiReorder(s)); + if (font.isBidirectional()) { + int i = font.width(font.bidirectionalShaping(s)); f += (float) (width - i); } @@ -76,10 +76,10 @@ public final class FontHelper { return 0; } else { IRenderTypeBuffer.Impl irendertypebuffer$impl = IRenderTypeBuffer.immediate(Tessellator.getInstance() - .getBuffer()); - int i = font.draw(p_228078_1_, p_228078_2_, p_228078_3_, p_228078_4_, p_228078_6_, p_228078_5_, + .getBuilder()); + int i = font.drawInBatch(p_228078_1_, p_228078_2_, p_228078_3_, p_228078_4_, p_228078_6_, p_228078_5_, irendertypebuffer$impl, false, 0, 15728880); - irendertypebuffer$impl.draw(); + irendertypebuffer$impl.endBatch(); return i; } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/ISimpleReloadListener.java b/src/main/java/com/simibubi/create/foundation/utility/ISimpleReloadListener.java index 1b361b789..fb923c13a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ISimpleReloadListener.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ISimpleReloadListener.java @@ -13,7 +13,7 @@ public interface ISimpleReloadListener extends IFutureReloadListener { @Override default CompletableFuture reload(IFutureReloadListener.IStage stage, IResourceManager resourceManager, IProfiler prepareProfiler, IProfiler applyProfiler, Executor prepareExecutor, Executor applyExecutor) { - return stage.markCompleteAwaitingOthers(Unit.INSTANCE).thenRunAsync(() -> { + return stage.wait(Unit.INSTANCE).thenRunAsync(() -> { onReload(resourceManager, applyProfiler); }, applyExecutor); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java index 71b621cd2..138d2642c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java @@ -21,7 +21,7 @@ public class Iterate { private static Direction[] getHorizontals() { Direction[] directions = new Direction[4]; for (int i = 0; i < 4; i++) - directions[i] = Direction.byHorizontalIndex(i); + directions[i] = Direction.from2DDataValue(i); return directions; } @@ -38,10 +38,10 @@ public class Iterate { } public static List hereAndBelow(BlockPos pos) { - return Arrays.asList(pos, pos.down()); + return Arrays.asList(pos, pos.below()); } public static List hereBelowAndAbove(BlockPos pos) { - return Arrays.asList(pos, pos.down(), pos.up()); + return Arrays.asList(pos, pos.below(), pos.above()); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/Lang.java b/src/main/java/com/simibubi/create/foundation/utility/Lang.java index 62384d800..4572424b2 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Lang.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Lang.java @@ -21,7 +21,7 @@ public class Lang { } public static void sendStatus(PlayerEntity player, String key, Object... args) { - player.sendStatusMessage(createTranslationTextComponent(key, args), true); + player.displayClientMessage(createTranslationTextComponent(key, args), true); } public static List translatedOptions(String prefix, String... keys) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java deleted file mode 100644 index 11ff390c7..000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import com.mojang.blaze3d.matrix.MatrixStack; - -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Quaternion; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.util.math.vector.Vector3f; -import net.minecraft.util.math.vector.Vector3i; - -public class MatrixStacker { - - public static final Vector3d center = VecHelper.getCenterOf(BlockPos.ZERO); - static MatrixStacker instance; - - MatrixStack ms; - - public static MatrixStacker of(MatrixStack ms) { - if (instance == null) - instance = new MatrixStacker(); - instance.ms = ms; - return instance; - } - - public MatrixStacker restoreIdentity() { - MatrixStack.Entry entry = ms.peek(); - - entry.getModel() - .loadIdentity(); - entry.getNormal() - .loadIdentity(); - - return this; - } - - public MatrixStacker rotate(Direction axis, float radians) { - if (radians == 0) - return this; - ms.multiply(axis.getUnitVector() - .getRadialQuaternion(radians)); - return this; - } - - public MatrixStacker rotate(double angle, Axis axis) { - Vector3f vec = - axis == Axis.X ? Vector3f.POSITIVE_X : axis == Axis.Y ? Vector3f.POSITIVE_Y : Vector3f.POSITIVE_Z; - return multiply(vec, angle); - } - - public MatrixStacker rotateX(double angle) { - return multiply(Vector3f.POSITIVE_X, angle); - } - - public MatrixStacker rotateY(double angle) { - return multiply(Vector3f.POSITIVE_Y, angle); - } - - public MatrixStacker rotateZ(double angle) { - return multiply(Vector3f.POSITIVE_Z, angle); - } - - public MatrixStacker centre() { - return translate(center); - } - - public MatrixStacker unCentre() { - return translateBack(center); - } - - public MatrixStacker translate(Vector3i vec) { - ms.translate(vec.getX(), vec.getY(), vec.getZ()); - return this; - } - - public MatrixStacker translate(Vector3d vec) { - ms.translate(vec.x, vec.y, vec.z); - return this; - } - - public MatrixStacker translateBack(Vector3d vec) { - ms.translate(-vec.x, -vec.y, -vec.z); - return this; - } - - public MatrixStacker translate(double x, double y, double z) { - ms.translate(x, y, z); - return this; - } - - public MatrixStacker multiply(Quaternion quaternion) { - ms.multiply(quaternion); - return this; - } - - public MatrixStacker nudge(int id) { - long randomBits = (long) id * 31L * 493286711L; - randomBits = randomBits * randomBits * 4392167121L + randomBits * 98761L; - float xNudge = (((float) (randomBits >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; - float yNudge = (((float) (randomBits >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; - float zNudge = (((float) (randomBits >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; - ms.translate(xNudge, yNudge, zNudge); - return this; - } - - public MatrixStacker multiply(Vector3f axis, double angle) { - if (angle == 0) - return this; - ms.multiply(axis.getDegreesQuaternion((float) angle)); - return this; - } - - public MatrixStacker push() { - ms.push(); - return this; - } - - public MatrixStacker pop() { - ms.pop(); - return this; - } - - public MatrixStack unwrap() { - return ms; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java b/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java index abb7f39c5..34d32c713 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java @@ -58,17 +58,17 @@ public class NBTHelper { } public static List readItemList(ListNBT stacks) { - return readCompoundList(stacks, ItemStack::read); + return readCompoundList(stacks, ItemStack::of); } public static ListNBT writeAABB(AxisAlignedBB bb) { ListNBT bbtag = new ListNBT(); - bbtag.add(FloatNBT.of((float) bb.minX)); - bbtag.add(FloatNBT.of((float) bb.minY)); - bbtag.add(FloatNBT.of((float) bb.minZ)); - bbtag.add(FloatNBT.of((float) bb.maxX)); - bbtag.add(FloatNBT.of((float) bb.maxY)); - bbtag.add(FloatNBT.of((float) bb.maxZ)); + bbtag.add(FloatNBT.valueOf((float) bb.minX)); + bbtag.add(FloatNBT.valueOf((float) bb.minY)); + bbtag.add(FloatNBT.valueOf((float) bb.minZ)); + bbtag.add(FloatNBT.valueOf((float) bb.maxX)); + bbtag.add(FloatNBT.valueOf((float) bb.maxY)); + bbtag.add(FloatNBT.valueOf((float) bb.maxZ)); return bbtag; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java b/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java index cf919904a..8c1cc871a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java +++ b/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java @@ -54,14 +54,14 @@ public final class NBTProcessors { ListNBT pages = tag.getList("pages", Constants.NBT.TAG_STRING); for (INBT inbt : pages) { - if (textComponentHasClickEvent(inbt.getString())) + if (textComponentHasClickEvent(inbt.getAsString())) return null; } return data; }); addSurvivalProcessor(AllTileEntities.FUNNEL.get(), data -> { if (data.contains("Filter")) { - ItemStack filter = ItemStack.read(data.getCompound("Filter")); + ItemStack filter = ItemStack.of(data.getCompound("Filter")); if (filter.getItem() instanceof FilterItem) data.remove("Filter"); } @@ -90,7 +90,7 @@ public final class NBTProcessors { .apply(compound); if (tileEntity instanceof MobSpawnerTileEntity) return compound; - if (tileEntity.onlyOpsCanSetNbt()) + if (tileEntity.onlyOpCanSetNbt()) return null; return compound; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/Pointing.java b/src/main/java/com/simibubi/create/foundation/utility/Pointing.java index c9eac4486..c734ab4e5 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Pointing.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Pointing.java @@ -15,7 +15,7 @@ public enum Pointing implements IStringSerializable { } @Override - public String getString() { + public String getSerializedName() { return Lang.asId(name()); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/RaycastHelper.java b/src/main/java/com/simibubi/create/foundation/utility/RaycastHelper.java index 057c2b378..2b8b6af84 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/RaycastHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/RaycastHelper.java @@ -19,7 +19,7 @@ public class RaycastHelper { Vector3d origin = getTraceOrigin(playerIn); Vector3d target = getTraceTarget(playerIn, range, origin); RayTraceContext context = new RayTraceContext(origin, target, BlockMode.COLLIDER, FluidMode.NONE, playerIn); - return worldIn.rayTraceBlocks(context); + return worldIn.clip(context); } public static PredicateTraceResult rayTraceUntil(PlayerEntity playerIn, double range, @@ -30,8 +30,8 @@ public class RaycastHelper { } public static Vector3d getTraceTarget(PlayerEntity playerIn, double range, Vector3d origin) { - float f = playerIn.rotationPitch; - float f1 = playerIn.rotationYaw; + float f = playerIn.xRot; + float f1 = playerIn.yRot; float f2 = MathHelper.cos(-f1 * 0.017453292F - (float) Math.PI); float f3 = MathHelper.sin(-f1 * 0.017453292F - (float) Math.PI); float f4 = -MathHelper.cos(-f * 0.017453292F); @@ -67,7 +67,7 @@ public class RaycastHelper { BlockPos currentPos = new BlockPos(x, y, z); if (predicate.test(currentPos)) - return new PredicateTraceResult(currentPos, Direction.getFacingFromVector(dx - x, dy - y, dz - z)); + return new PredicateTraceResult(currentPos, Direction.getNearest(dx - x, dy - y, dz - z)); int remainingDistance = 200; diff --git a/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java b/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java index 45e7e224b..28038851a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java @@ -32,9 +32,9 @@ public class ServerSpeedProvider { @OnlyIn(Dist.CLIENT) public static void clientTick() { if (Minecraft.getInstance() - .isSingleplayer() + .hasSingleplayerServer() && Minecraft.getInstance() - .isGamePaused()) + .isPaused()) return; modifier.tick(); clientTimer++; diff --git a/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java b/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java index d1191082d..1fb499a09 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Predicate; @@ -13,6 +14,8 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import com.simibubi.create.AllTags; +import com.simibubi.create.compat.Mods; +import com.simibubi.create.compat.dynamictrees.DynamicTree; import net.minecraft.block.BambooBlock; import net.minecraft.block.Block; @@ -36,6 +39,18 @@ import net.minecraft.world.World; public class TreeCutter { public static final Tree NO_TREE = new Tree(Collections.emptyList(), Collections.emptyList()); + public static boolean canDynamicTreeCutFrom(Block startBlock) { + return Mods.DYNAMICTREES.runIfInstalled(() -> () -> DynamicTree.isDynamicBranch(startBlock)).orElse(false); + } + + @Nonnull + public static Optional findDynamicTree(Block startBlock, BlockPos pos) { + if (canDynamicTreeCutFrom(startBlock)) { + return Mods.DYNAMICTREES.runIfInstalled(() -> () -> new DynamicTree(pos)); + } + return Optional.empty(); + } + /** * Finds a tree at the given pos. Block at the position should be air * @@ -54,11 +69,11 @@ public class TreeCutter { List frontier = new LinkedList<>(); // Bamboo, Sugar Cane, Cactus - BlockState stateAbove = reader.getBlockState(pos.up()); + BlockState stateAbove = reader.getBlockState(pos.above()); if (isVerticalPlant(stateAbove)) { - logs.add(pos.up()); + logs.add(pos.above()); for (int i = 1; i < 256; i++) { - BlockPos current = pos.up(i); + BlockPos current = pos.above(i); if (!isVerticalPlant(reader.getBlockState(current))) break; logs.add(current); @@ -69,13 +84,13 @@ public class TreeCutter { // Chorus if (isChorus(stateAbove)) { - frontier.add(pos.up()); + frontier.add(pos.above()); while (!frontier.isEmpty()) { BlockPos current = frontier.remove(0); visited.add(current); logs.add(current); for (Direction direction : Iterate.directions) { - BlockPos offset = current.offset(direction); + BlockPos offset = current.relative(direction); if (visited.contains(offset)) continue; if (!isChorus(reader.getBlockState(offset))) @@ -92,7 +107,7 @@ public class TreeCutter { return NO_TREE; visited.add(pos); - BlockPos.getAllInBox(pos.add(-1, 0, -1), pos.add(1, 1, 1)) + BlockPos.betweenClosedStream(pos.offset(-1, 0, -1), pos.offset(1, 1, 1)) .forEach(p -> frontier.add(new BlockPos(p))); // Find all logs @@ -128,15 +143,15 @@ public class TreeCutter { if (isGenericLeaf) leaves.add(currentPos); - int distance = !isLeaf ? 0 : blockState.get(LeavesBlock.DISTANCE); + int distance = !isLeaf ? 0 : blockState.getValue(LeavesBlock.DISTANCE); for (Direction direction : Iterate.directions) { - BlockPos offset = currentPos.offset(direction); + BlockPos offset = currentPos.relative(direction); if (visited.contains(offset)) continue; BlockState state = reader.getBlockState(offset); BlockPos subtract = offset.subtract(pos); int horizontalDistance = Math.max(Math.abs(subtract.getX()), Math.abs(subtract.getZ())); - if (isLeaf(state) && state.get(LeavesBlock.DISTANCE) > distance + if (isLeaf(state) && state.getValue(LeavesBlock.DISTANCE) > distance || isNonDecayingLeaf(state) && horizontalDistance < 4) frontier.add(offset); } @@ -175,7 +190,7 @@ public class TreeCutter { Set visited = new HashSet<>(); List frontier = new LinkedList<>(); frontier.add(pos); - frontier.add(pos.up()); + frontier.add(pos.above()); int posY = pos.getY(); while (!frontier.isEmpty()) { @@ -185,7 +200,7 @@ public class TreeCutter { if (!isLog(reader.getBlockState(currentPos))) continue; - if (!lowerLayer && !pos.equals(currentPos.down()) && isLog(reader.getBlockState(currentPos.down()))) + if (!lowerLayer && !pos.equals(currentPos.below()) && isLog(reader.getBlockState(currentPos.below()))) return false; for (Direction direction : Iterate.directions) { @@ -193,7 +208,7 @@ public class TreeCutter { continue; if (direction == Direction.UP && !lowerLayer) continue; - BlockPos offset = currentPos.offset(direction); + BlockPos offset = currentPos.relative(direction); if (visited.contains(offset)) continue; frontier.add(offset); @@ -205,21 +220,21 @@ public class TreeCutter { } private static void addNeighbours(BlockPos pos, List frontier, Set visited) { - BlockPos.getAllInBox(pos.add(-1, -1, -1), pos.add(1, 1, 1)) + BlockPos.betweenClosedStream(pos.offset(-1, -1, -1), pos.offset(1, 1, 1)) .filter(((Predicate) visited::contains).negate()) .forEach(p -> frontier.add(new BlockPos(p))); } private static boolean isLog(BlockState state) { - return state.isIn(BlockTags.LOGS) || AllTags.AllBlockTags.SLIMY_LOGS.matches(state); + return state.is(BlockTags.LOGS) || AllTags.AllBlockTags.SLIMY_LOGS.matches(state); } private static boolean isNonDecayingLeaf(BlockState state) { - return state.isIn(BlockTags.WART_BLOCKS) || state.getBlock() == Blocks.SHROOMLIGHT; + return state.is(BlockTags.WART_BLOCKS) || state.getBlock() == Blocks.SHROOMLIGHT; } private static boolean isLeaf(BlockState state) { - return state.contains(LeavesBlock.DISTANCE); + return state.hasProperty(LeavesBlock.DISTANCE); } public static class Tree extends AbstractBlockBreakQueue { diff --git a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java index 7491d635c..7d273f44e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -12,6 +12,7 @@ import net.minecraft.nbt.DoubleNBT; import net.minecraft.nbt.ListNBT; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Mirror; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Quaternion; @@ -34,8 +35,7 @@ public class VecHelper { public static Vector3d rotateCentered(Vector3d vec, double deg, Axis axis) { Vector3d shift = getCenterOf(BlockPos.ZERO); - return VecHelper.rotate(vec.subtract(shift), deg, axis) - .add(shift); + return VecHelper.rotate(vec.subtract(shift), deg, axis).add(shift); } public static Vector3d rotate(Vector3d vec, double deg, Axis axis) { @@ -60,15 +60,51 @@ public class VecHelper { return vec; } + public static Vector3d mirrorCentered(Vector3d vec, Mirror mirror) { + Vector3d shift = getCenterOf(BlockPos.ZERO); + return VecHelper.mirror(vec.subtract(shift), mirror).add(shift); + } + + public static Vector3d mirror(Vector3d vec, Mirror mirror) { + if (mirror == null || mirror == Mirror.NONE) + return vec; + if (vec == Vector3d.ZERO) + return vec; + + double x = vec.x; + double y = vec.y; + double z = vec.z; + + if (mirror == Mirror.LEFT_RIGHT) + return new Vector3d(x, y, -z); + if (mirror == Mirror.FRONT_BACK) + return new Vector3d(-x, y, z); + return vec; + } + + public static Vector3d lookAt(Vector3d vec, Vector3d fwd) { + fwd = fwd.normalize(); + Vector3d up = new Vector3d(0,1,0); + double dot = fwd.dot(up); + if (Math.abs(dot) > 1 - 1.0E-3) + up = new Vector3d(0, 0, dot > 0 ? 1 : -1); + Vector3d right = fwd.cross(up).normalize(); + up = right.cross(fwd).normalize(); + double x = vec.x * right.x + vec.y * up.x + vec.z * fwd.x; + double y = vec.x * right.y + vec.y * up.y + vec.z * fwd.y; + double z = vec.x * right.z + vec.y * up.z + vec.z * fwd.z; + return new Vector3d(x, y, z); + } + public static boolean isVecPointingTowards(Vector3d vec, Direction direction) { - return Vector3d.of(direction.getDirectionVec()) - .dotProduct(vec.normalize()) > 0.125; // slight tolerance to activate perpendicular movement actors + return Vector3d.atLowerCornerOf(direction.getNormal()) + .dot(vec.normalize()) > 0.125; // slight tolerance to activate perpendicular movement actors } public static Vector3d getCenterOf(Vector3i pos) { - if (pos.equals(Vector3i.NULL_VECTOR)) + if (pos.equals(Vector3i.ZERO)) return CENTER_OF_ORIGIN; - return Vector3d.of(pos) + return Vector3d.atLowerCornerOf(pos) .add(.5f, .5f, .5f); } @@ -83,14 +119,14 @@ public class VecHelper { } public static Vector3d axisAlingedPlaneOf(Direction face) { - return axisAlingedPlaneOf(Vector3d.of(face.getDirectionVec())); + return axisAlingedPlaneOf(Vector3d.atLowerCornerOf(face.getNormal())); } public static ListNBT writeNBT(Vector3d vec) { ListNBT listnbt = new ListNBT(); - listnbt.add(DoubleNBT.of(vec.x)); - listnbt.add(DoubleNBT.of(vec.y)); - listnbt.add(DoubleNBT.of(vec.z)); + listnbt.add(DoubleNBT.valueOf(vec.x)); + listnbt.add(DoubleNBT.valueOf(vec.y)); + listnbt.add(DoubleNBT.valueOf(vec.z)); return listnbt; } @@ -105,11 +141,11 @@ public class VecHelper { } public static int getCoordinate(Vector3i pos, Axis axis) { - return axis.getCoordinate(pos.getX(), pos.getY(), pos.getZ()); + return axis.choose(pos.getX(), pos.getY(), pos.getZ()); } public static float getCoordinate(Vector3d vec, Axis axis) { - return (float) axis.getCoordinate(vec.x, vec.y, vec.z); + return (float) axis.choose(vec.x, vec.y, vec.z); } public static boolean onSameAxis(BlockPos pos1, BlockPos pos2, Axis axis) { @@ -140,7 +176,7 @@ public class VecHelper { public static Vector3d project(Vector3d vec, Vector3d ontoVec) { if (ontoVec.equals(Vector3d.ZERO)) return Vector3d.ZERO; - return ontoVec.scale(vec.dotProduct(ontoVec) / ontoVec.lengthSquared()); + return ontoVec.scale(vec.dot(ontoVec) / ontoVec.lengthSqr()); } @Nullable @@ -152,8 +188,8 @@ public class VecHelper { lineDirection = lineDirection.normalize(); Vector3d diff = origin.subtract(sphereCenter); - double lineDotDiff = lineDirection.dotProduct(diff); - double delta = lineDotDiff * lineDotDiff - (diff.lengthSquared() - radius * radius); + double lineDotDiff = lineDirection.dot(diff); + double delta = lineDotDiff * lineDotDiff - (diff.lengthSqr() - radius * radius); if (delta < 0) return null; double t = -lineDotDiff + MathHelper.sqrt(delta); @@ -166,52 +202,52 @@ public class VecHelper { * The (centered) location on the screen of the given 3d point in the world. * Result is (dist right of center screen, dist up from center screen, if < 0, then in front of view plane) */ - ActiveRenderInfo ari = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); - Vector3d camera_pos = ari.getProjectedView(); - Quaternion camera_rotation_conj = ari.getRotation() + ActiveRenderInfo ari = Minecraft.getInstance().gameRenderer.getMainCamera(); + Vector3d camera_pos = ari.getPosition(); + Quaternion camera_rotation_conj = ari.rotation() .copy(); - camera_rotation_conj.conjugate(); + camera_rotation_conj.conj(); Vector3f result3f = new Vector3f((float) (camera_pos.x - target.x), (float) (camera_pos.y - target.y), (float) (camera_pos.z - target.z)); - result3f.func_214905_a(camera_rotation_conj); + result3f.transform(camera_rotation_conj); // ----- compensate for view bobbing (if active) ----- // the following code adapted from GameRenderer::applyBobbing (to invert it) Minecraft mc = Minecraft.getInstance(); - if (mc.gameSettings.viewBobbing) { - Entity renderViewEntity = mc.getRenderViewEntity(); + if (mc.options.bobView) { + Entity renderViewEntity = mc.getCameraEntity(); if (renderViewEntity instanceof PlayerEntity) { PlayerEntity playerentity = (PlayerEntity) renderViewEntity; - float distwalked_modified = playerentity.distanceWalkedModified; + float distwalked_modified = playerentity.walkDist; - float f = distwalked_modified - playerentity.prevDistanceWalkedModified; + float f = distwalked_modified - playerentity.walkDistO; float f1 = -(distwalked_modified + f * partialTicks); - float f2 = MathHelper.lerp(partialTicks, playerentity.prevCameraYaw, playerentity.cameraYaw); - Quaternion q2 = new Quaternion(Vector3f.POSITIVE_X, + float f2 = MathHelper.lerp(partialTicks, playerentity.oBob, playerentity.bob); + Quaternion q2 = new Quaternion(Vector3f.XP, Math.abs(MathHelper.cos(f1 * (float) Math.PI - 0.2F) * f2) * 5.0F, true); - q2.conjugate(); - result3f.func_214905_a(q2); + q2.conj(); + result3f.transform(q2); Quaternion q1 = - new Quaternion(Vector3f.POSITIVE_Z, MathHelper.sin(f1 * (float) Math.PI) * f2 * 3.0F, true); - q1.conjugate(); - result3f.func_214905_a(q1); + new Quaternion(Vector3f.ZP, MathHelper.sin(f1 * (float) Math.PI) * f2 * 3.0F, true); + q1.conj(); + result3f.transform(q1); Vector3f bob_translation = new Vector3f((MathHelper.sin(f1 * (float) Math.PI) * f2 * 0.5F), (-Math.abs(MathHelper.cos(f1 * (float) Math.PI) * f2)), 0.0f); - bob_translation.setY(-bob_translation.getY()); // this is weird but hey, if it works + bob_translation.setY(-bob_translation.y()); // this is weird but hey, if it works result3f.add(bob_translation); } } // ----- adjust for fov ----- - float fov = (float) mc.gameRenderer.getFOVModifier(ari, partialTicks, true); + float fov = (float) mc.gameRenderer.getFov(ari, partialTicks, true); float half_height = (float) mc.getWindow() - .getScaledHeight() / 2; - float scale_factor = half_height / (result3f.getZ() * (float) Math.tan(Math.toRadians(fov / 2))); - return new Vector3d(-result3f.getX() * scale_factor, result3f.getY() * scale_factor, result3f.getZ()); + .getGuiScaledHeight() / 2; + float scale_factor = half_height / (result3f.z() * (float) Math.tan(Math.toRadians(fov / 2))); + return new Vector3d(-result3f.x() * scale_factor, result3f.y() * scale_factor, result3f.z()); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/VoxelShaper.java b/src/main/java/com/simibubi/create/foundation/utility/VoxelShaper.java index 31e9645ac..7b9b35e71 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VoxelShaper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VoxelShaper.java @@ -57,11 +57,11 @@ public class VoxelShaper { } public static Direction axisAsFace(Axis axis) { - return Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); + return Direction.get(AxisDirection.POSITIVE, axis); } protected static float horizontalAngleFromDirection(Direction direction) { - return (float) ((Math.max(direction.getHorizontalIndex(), 0) & 3) * 90); + return (float) ((Math.max(direction.get2DDataValue(), 0) & 3) * 90); } protected static VoxelShaper forDirectionsWithRotation(VoxelShape shape, Direction facing, @@ -79,7 +79,7 @@ public class VoxelShaper { return shape; return rotatedCopy(shape, usingValues.apply(from) - .inverse() + .reverse() .add(usingValues.apply(to))); } @@ -90,7 +90,7 @@ public class VoxelShaper { MutableObject result = new MutableObject<>(VoxelShapes.empty()); Vector3d center = new Vector3d(8, 8, 8); - shape.forEachBox((x1, y1, z1, x2, y2, z2) -> { + shape.forAllBoxes((x1, y1, z1, x2, y2, z2) -> { Vector3d v1 = new Vector3d(x1, y1, z1).scale(16) .subtract(center); Vector3d v2 = new Vector3d(x2, y2, z2).scale(16) @@ -106,7 +106,7 @@ public class VoxelShaper { v2 = VecHelper.rotate(v2, (float) rotation.z, Axis.Z) .add(center); - VoxelShape rotated = Block.makeCuboidShape(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z); + VoxelShape rotated = Block.box(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z); result.setValue(VoxelShapes.or(result.getValue(), rotated)); }); diff --git a/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java b/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java index ee9022165..d8dc4e987 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java +++ b/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.function.Supplier; +import java.util.function.Function; import javax.annotation.Nullable; @@ -14,9 +14,9 @@ public class WorldAttached { static List> allMaps = new ArrayList<>(); Map attached; - private Supplier factory; + private Function factory; - public WorldAttached(Supplier factory) { + public WorldAttached(Function factory) { this.factory = factory; attached = new HashMap<>(); allMaps.add(attached); @@ -31,7 +31,7 @@ public class WorldAttached { T t = attached.get(world); if (t != null) return t; - T entry = factory.get(); + T entry = factory.apply(world); put(world, entry); return entry; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/WorldHelper.java b/src/main/java/com/simibubi/create/foundation/utility/WorldHelper.java index 3cd375ea9..2f256a42b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/WorldHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/WorldHelper.java @@ -6,8 +6,8 @@ import net.minecraft.world.IWorld; public class WorldHelper { public static ResourceLocation getDimensionID(IWorld world) { - return world.getRegistryManager() - .get(Registry.DIMENSION_TYPE_KEY) - .getKey(world.getDimension()); + return world.registryAccess() + .registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY) + .getKey(world.dimensionType()); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java b/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java index 087929bb0..bd15f8dcc 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java +++ b/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java @@ -55,14 +55,14 @@ public class LerpedFloat { public boolean updateChaseSpeed(double speed) { float prevSpeed = this.chaseSpeed; this.chaseSpeed = (float) speed; - return !MathHelper.epsilonEquals(prevSpeed, speed); + return !MathHelper.equal(prevSpeed, speed); } public void tickChaser() { previousValue = value; if (chaseFunction == null) return; - if (MathHelper.epsilonEquals((double) value, chaseTarget)) { + if (MathHelper.equal((double) value, chaseTarget)) { value = chaseTarget; return; } @@ -83,7 +83,7 @@ public class LerpedFloat { } public boolean settled() { - return MathHelper.epsilonEquals((double) previousValue, value); + return MathHelper.equal((double) previousValue, value); } public float getChaseTarget() { diff --git a/src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java b/src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java index d56f8e35f..26ae9a246 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java +++ b/src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java @@ -11,6 +11,7 @@ public class PhysicalFloat { float previousSpeed; float speed; + float limit = Float.NaN; float mass; @@ -41,6 +42,11 @@ public class PhysicalFloat { return addForce(new Force.Zeroing((float) g)); } + public PhysicalFloat withLimit(float limit) { + this.limit = limit; + return this; + } + public void tick() { previousSpeed = speed; previousValue = value; @@ -53,6 +59,10 @@ public class PhysicalFloat { forces.removeIf(Force::finished); + if (Float.isFinite(limit)) { + speed = MathHelper.clamp(speed, -limit, limit); + } + value += speed; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java index b83e7f13d..01c6ddc6c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java @@ -23,7 +23,7 @@ public class GhostBlockParams { } public static GhostBlockParams of(Block block) { - return of(block.getDefaultState()); + return of(block.defaultBlockState()); } public GhostBlockParams at(BlockPos pos) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java index 6878acf40..96e2b4ab3 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java @@ -53,24 +53,24 @@ public abstract class GhostBlockRenderer { private static class DefaultGhostBlockRenderer extends GhostBlockRenderer { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { - ms.push(); + ms.pushPose(); BlockRendererDispatcher dispatcher = Minecraft.getInstance() - .getBlockRendererDispatcher(); + .getBlockRenderer(); - IBakedModel model = dispatcher.getModelForState(params.state); + IBakedModel model = dispatcher.getBlockModel(params.state); - RenderType layer = RenderTypeLookup.getEntityBlockLayer(params.state, false); + RenderType layer = RenderTypeLookup.getRenderType(params.state, false); IVertexBuilder vb = buffer.getEarlyBuffer(layer); BlockPos pos = params.pos; ms.translate(pos.getX(), pos.getY(), pos.getZ()); - dispatcher.getBlockModelRenderer() - .renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, + dispatcher.getModelRenderer() + .renderModel(ms.last(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.NO_OVERLAY, VirtualEmptyModelData.INSTANCE); - ms.pop(); + ms.popPose(); } } @@ -80,17 +80,17 @@ public abstract class GhostBlockRenderer { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { // prepare - ms.push(); + ms.pushPose(); // RenderSystem.pushMatrix(); Minecraft mc = Minecraft.getInstance(); - BlockRendererDispatcher dispatcher = mc.getBlockRendererDispatcher(); + BlockRendererDispatcher dispatcher = mc.getBlockRenderer(); - IBakedModel model = dispatcher.getModelForState(params.state); + IBakedModel model = dispatcher.getBlockModel(params.state); // RenderType layer = RenderTypeLookup.getEntityBlockLayer(params.state); - RenderType layer = RenderType.getTranslucent(); + RenderType layer = RenderType.translucent(); IVertexBuilder vb = buffer.getEarlyBuffer(layer); BlockPos pos = params.pos; @@ -101,14 +101,14 @@ public abstract class GhostBlockRenderer { ms.translate(-.5, -.5, -.5); // dispatcher.getBlockModelRenderer().renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); - renderModel(params, ms.peek(), vb, params.state, model, 1f, 1f, 1f, - WorldRenderer.getLightmapCoordinates(mc.world, pos), OverlayTexture.DEFAULT_UV, + renderModel(params, ms.last(), vb, params.state, model, 1f, 1f, 1f, + WorldRenderer.getLightColor(mc.level, pos), OverlayTexture.NO_OVERLAY, VirtualEmptyModelData.INSTANCE); // buffer.draw(); // clean // RenderSystem.popMatrix(); - ms.pop(); + ms.popPose(); } @@ -139,7 +139,7 @@ public abstract class GhostBlockRenderer { float f; float f1; float f2; - if (bakedquad.hasTintIndex()) { + if (bakedquad.isTinted()) { f = MathHelper.clamp(p_228803_2_, 0.0F, 1.0F); f1 = MathHelper.clamp(p_228803_3_, 0.0F, 1.0F); f2 = MathHelper.clamp(p_228803_4_, 0.0F, 1.0F); @@ -159,17 +159,17 @@ public abstract class GhostBlockRenderer { static void quad(float alpha, IVertexBuilder vb, MatrixStack.Entry p_227890_1_, BakedQuad p_227890_2_, float[] p_227890_3_, float p_227890_4_, float p_227890_5_, float p_227890_6_, int[] p_227890_7_, int p_227890_8_) { - int[] aint = p_227890_2_.getVertexData(); - Vector3i Vector3i = p_227890_2_.getFace() - .getDirectionVec(); + int[] aint = p_227890_2_.getVertices(); + Vector3i Vector3i = p_227890_2_.getDirection() + .getNormal(); Vector3f vector3f = new Vector3f((float) Vector3i.getX(), (float) Vector3i.getY(), (float) Vector3i.getZ()); - Matrix4f matrix4f = p_227890_1_.getModel(); - vector3f.transform(p_227890_1_.getNormal()); + Matrix4f matrix4f = p_227890_1_.pose(); + vector3f.transform(p_227890_1_.normal()); int vertexSize = DefaultVertexFormats.BLOCK.getIntegerSize(); int j = aint.length / vertexSize; try (MemoryStack memorystack = MemoryStack.stackPush()) { - ByteBuffer bytebuffer = memorystack.malloc(DefaultVertexFormats.BLOCK.getSize()); + ByteBuffer bytebuffer = memorystack.malloc(DefaultVertexFormats.BLOCK.getVertexSize()); IntBuffer intbuffer = bytebuffer.asIntBuffer(); for (int k = 0; k < j; ++k) { @@ -191,9 +191,9 @@ public abstract class GhostBlockRenderer { float f10 = bytebuffer.getFloat(20); Vector4f vector4f = new Vector4f(f, f1, f2, 1.0F); vector4f.transform(matrix4f); - vb.applyBakedNormals(vector3f, bytebuffer, p_227890_1_.getNormal()); - vb.vertex(vector4f.getX(), vector4f.getY(), vector4f.getZ(), r, g, b, alpha, f9, f10, p_227890_8_, - l, vector3f.getX(), vector3f.getY(), vector3f.getZ()); + vb.applyBakedNormals(vector3f, bytebuffer, p_227890_1_.normal()); + vb.vertex(vector4f.x(), vector4f.y(), vector4f.z(), r, g, b, alpha, f9, f10, p_227890_8_, + l, vector3f.x(), vector3f.y(), vector3f.z()); } } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java index 9839b890d..6d7998c7b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java @@ -27,10 +27,10 @@ public class AABBOutline extends Outline { } public void renderBB(MatrixStack ms, SuperRenderTypeBuffer buffer, AxisAlignedBB bb) { - Vector3d projectedView = Minecraft.getInstance().gameRenderer.getActiveRenderInfo() - .getProjectedView(); + Vector3d projectedView = Minecraft.getInstance().gameRenderer.getMainCamera() + .getPosition(); boolean noCull = bb.contains(projectedView); - bb = bb.grow(noCull ? -1 / 128d : 1 / 128d); + bb = bb.inflate(noCull ? -1 / 128d : 1 / 128d); noCull |= params.disableCull; Vector3d xyz = new Vector3d(bb.minX, bb.minY, bb.minZ); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java index 1f91f886f..d1ceb3b23 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java @@ -32,17 +32,17 @@ public class BlockClusterOutline extends Outline { @Override public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) { for (MergeEntry edge : cluster.visibleEdges) { - Vector3d start = Vector3d.of(edge.pos); - Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, edge.axis); - renderAACuboidLine(ms, buffer, start, Vector3d.of(edge.pos.offset(direction))); + Vector3d start = Vector3d.atLowerCornerOf(edge.pos); + Direction direction = Direction.get(AxisDirection.POSITIVE, edge.axis); + renderAACuboidLine(ms, buffer, start, Vector3d.atLowerCornerOf(edge.pos.relative(direction))); } for (MergeEntry face : cluster.visibleFaces.keySet()) { AxisDirection axisDirection = cluster.visibleFaces.get(face); - Direction direction = Direction.getFacingFromAxis(axisDirection, face.axis); + Direction direction = Direction.get(axisDirection, face.axis); BlockPos pos = face.pos; if (axisDirection == AxisDirection.POSITIVE) - pos = pos.offset(direction.getOpposite()); + pos = pos.relative(direction.getOpposite()); renderBlockFace(ms, buffer, pos, direction); } } @@ -57,7 +57,7 @@ public class BlockClusterOutline extends Outline { IVertexBuilder builder = buffer.getLateBuffer(translucentType); Vector3d center = VecHelper.getCenterOf(pos); - Vector3d offset = Vector3d.of(face.getDirectionVec()); + Vector3d offset = Vector3d.atLowerCornerOf(face.getNormal()); Vector3d plane = VecHelper.axisAlingedPlaneOf(offset); Axis axis = face.getAxis(); @@ -66,7 +66,7 @@ public class BlockClusterOutline extends Outline { .add(offset); int deg = face.getAxisDirection() - .getOffset() * 90; + .getStep() * 90; Vector3d a1 = plane.add(center); plane = VecHelper.rotate(plane, deg, axis); Vector3d a2 = plane.add(center); @@ -92,9 +92,9 @@ public class BlockClusterOutline extends Outline { // 6 FACES for (Axis axis : Axis.values()) { - Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); + Direction direction = Direction.get(AxisDirection.POSITIVE, axis); for (int offset : new int[] { 0, 1 }) { - MergeEntry entry = new MergeEntry(axis, pos.offset(direction, offset)); + MergeEntry entry = new MergeEntry(axis, pos.relative(direction, offset)); if (visibleFaces.remove(entry) == null) visibleFaces.put(entry, offset == 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); } @@ -111,13 +111,13 @@ public class BlockClusterOutline extends Outline { if (axis2 == axis3) continue; - Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis2); - Direction direction2 = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis3); + Direction direction = Direction.get(AxisDirection.POSITIVE, axis2); + Direction direction2 = Direction.get(AxisDirection.POSITIVE, axis3); for (int offset : new int[] { 0, 1 }) { - BlockPos entryPos = pos.offset(direction, offset); + BlockPos entryPos = pos.relative(direction, offset); for (int offset2 : new int[] { 0, 1 }) { - entryPos = entryPos.offset(direction2, offset2); + entryPos = entryPos.relative(direction2, offset2); MergeEntry entry = new MergeEntry(axis, entryPos); if (!visibleEdges.remove(entry)) visibleEdges.add(entry); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java index d70ef3189..c3d2204e2 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java @@ -13,8 +13,8 @@ public class ChasingAABBOutline extends AABBOutline { public ChasingAABBOutline(AxisAlignedBB bb) { super(bb); - prevBB = bb.grow(0); - targetBB = bb.grow(0); + prevBB = bb.inflate(0); + targetBB = bb.inflate(0); } public void target(AxisAlignedBB target) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java index e23c179fc..08cff21bb 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java @@ -4,6 +4,7 @@ import java.util.Optional; import javax.annotation.Nullable; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack.Entry; import com.mojang.blaze3d.vertex.IVertexBuilder; @@ -12,7 +13,6 @@ import com.simibubi.create.foundation.renderState.RenderTypes; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -36,15 +36,15 @@ public abstract class Outline { public void renderCuboidLine(MatrixStack ms, SuperRenderTypeBuffer buffer, Vector3d start, Vector3d end) { Vector3d diff = end.subtract(start); float hAngle = AngleHelper.deg(MathHelper.atan2(diff.x, diff.z)); - float hDistance = (float) diff.mul(1, 0, 1) + float hDistance = (float) diff.multiply(1, 0, 1) .length(); float vAngle = AngleHelper.deg(MathHelper.atan2(hDistance, diff.y)) - 90; - ms.push(); - MatrixStacker.of(ms) + ms.pushPose(); + MatrixTransformStack.of(ms) .translate(start) .rotateY(hAngle).rotateX(vAngle); renderAACuboidLine(ms, buffer, Vector3d.ZERO, new Vector3d(0, 0, diff.length())); - ms.pop(); + ms.popPose(); } public void renderAACuboidLine(MatrixStack ms, SuperRenderTypeBuffer buffer, Vector3d start, Vector3d end) { @@ -65,7 +65,7 @@ public abstract class Outline { Vector3d extension = diff.normalize() .scale(lineWidth / 2); Vector3d plane = VecHelper.axisAlingedPlaneOf(diff); - Direction face = Direction.getFacingFromVector(diff.x, diff.y, diff.z); + Direction face = Direction.getNearest(diff.x, diff.y, diff.z); Axis axis = face.getAxis(); start = start.subtract(extension); @@ -98,16 +98,16 @@ public abstract class Outline { putQuad(ms, builder, b4, b3, b2, b1, face); putQuad(ms, builder, a1, a2, a3, a4, face.getOpposite()); Vector3d vec = a1.subtract(a4); - face = Direction.getFacingFromVector(vec.x, vec.y, vec.z); + face = Direction.getNearest(vec.x, vec.y, vec.z); putQuad(ms, builder, a1, b1, b2, a2, face); vec = VecHelper.rotate(vec, -90, axis); - face = Direction.getFacingFromVector(vec.x, vec.y, vec.z); + face = Direction.getNearest(vec.x, vec.y, vec.z); putQuad(ms, builder, a2, b2, b3, a3, face); vec = VecHelper.rotate(vec, -90, axis); - face = Direction.getFacingFromVector(vec.x, vec.y, vec.z); + face = Direction.getNearest(vec.x, vec.y, vec.z); putQuad(ms, builder, a3, b3, b4, a4, face); vec = VecHelper.rotate(vec, -90, axis); - face = Direction.getFacingFromVector(vec.x, vec.y, vec.z); + face = Direction.getNearest(vec.x, vec.y, vec.z); putQuad(ms, builder, a4, b4, b1, a1, face); } @@ -128,27 +128,27 @@ public abstract class Outline { int i = 15 << 20 | 15 << 4; int j = i >> 16 & '\uffff'; int k = i & '\uffff'; - Entry peek = ms.peek(); + Entry peek = ms.last(); Vector3d rgb = params.rgb; if (transformNormals == null) - transformNormals = peek.getNormal(); + transformNormals = peek.normal(); int xOffset = 0; int yOffset = 0; int zOffset = 0; if (normal != null) { - xOffset = normal.getXOffset(); - yOffset = normal.getYOffset(); - zOffset = normal.getZOffset(); + xOffset = normal.getStepX(); + yOffset = normal.getStepY(); + zOffset = normal.getStepZ(); } - builder.vertex(peek.getModel(), (float) pos.x, (float) pos.y, (float) pos.z) + builder.vertex(peek.pose(), (float) pos.x, (float) pos.y, (float) pos.z) .color((float) rgb.x, (float) rgb.y, (float) rgb.z, params.alpha) - .texture(u, v) - .overlay(OverlayTexture.DEFAULT_UV) - .light(j, k) - .normal(peek.getNormal(), xOffset, yOffset, zOffset) + .uv(u, v) + .overlayCoords(OverlayTexture.NO_OVERLAY) + .uv2(j, k) + .normal(peek.normal(), xOffset, yOffset, zOffset) .endVertex(); transformNormals = null; diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java b/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java index 2b3403f0f..63ec2aace 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java @@ -65,7 +65,7 @@ public interface IPlacementHelper { PlacementOffset offset = getOffset(player, world, state, pos, ray); if (heldItem.getItem() instanceof BlockItem) { BlockItem blockItem = (BlockItem) heldItem.getItem(); - offset = offset.withGhostState(blockItem.getBlock().getDefaultState()); + offset = offset.withGhostState(blockItem.getBlock().defaultBlockState()); } return offset; } @@ -89,11 +89,11 @@ public interface IPlacementHelper { } static void renderArrow(Vector3d center, Vector3d target, Direction arrowPlane, double distanceFromCenter) { Vector3d direction = target.subtract(center).normalize(); - Vector3d facing = Vector3d.of(arrowPlane.getDirectionVec()); + Vector3d facing = Vector3d.atLowerCornerOf(arrowPlane.getNormal()); Vector3d start = center.add(direction); Vector3d offset = direction.scale(distanceFromCenter - 1); - Vector3d offsetA = direction.crossProduct(facing).normalize().scale(.25); - Vector3d offsetB = facing.crossProduct(direction).normalize().scale(.25); + Vector3d offsetA = direction.cross(facing).normalize().scale(.25); + Vector3d offsetB = facing.cross(direction).normalize().scale(.25); Vector3d endA = center.add(direction.scale(.75)).add(offsetA); Vector3d endB = center.add(direction.scale(.75)).add(offsetB); CreateClient.OUTLINER.showLine("placementArrowA" + center + target, start.add(offset), endA.add(offset)).lineWidth(1 / 16f); @@ -141,7 +141,7 @@ public interface IPlacementHelper { Vector3d centerToHit = hit.subtract(VecHelper.getCenterOf(pos)); return Arrays.stream(Iterate.directions) .filter(includeDirection) - .map(dir -> Pair.of(dir, Vector3d.of(dir.getDirectionVec()).distanceTo(centerToHit))) + .map(dir -> Pair.of(dir, Vector3d.atLowerCornerOf(dir.getNormal()).distanceTo(centerToHit))) .sorted(Comparator.comparingDouble(Pair::getSecond)) .map(Pair::getFirst) .collect(Collectors.toList()); diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java index 09f98b72f..1bb88d18d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java @@ -78,30 +78,30 @@ public class PlacementHelpers { @OnlyIn(Dist.CLIENT) private static void checkHelpers() { Minecraft mc = Minecraft.getInstance(); - ClientWorld world = mc.world; + ClientWorld world = mc.level; if (world == null) return; - if (!(mc.objectMouseOver instanceof BlockRayTraceResult)) + if (!(mc.hitResult instanceof BlockRayTraceResult)) return; - BlockRayTraceResult ray = (BlockRayTraceResult) mc.objectMouseOver; + BlockRayTraceResult ray = (BlockRayTraceResult) mc.hitResult; if (mc.player == null) return; - if (mc.player.isSneaking())//for now, disable all helpers when sneaking TODO add helpers that respect sneaking but still show position + if (mc.player.isShiftKeyDown())//for now, disable all helpers when sneaking TODO add helpers that respect sneaking but still show position return; for (Hand hand : Hand.values()) { - ItemStack heldItem = mc.player.getHeldItem(hand); + ItemStack heldItem = mc.player.getItemInHand(hand); List filteredForHeldItem = helpers.stream().filter(helper -> helper.matchesItem(heldItem)).collect(Collectors.toList()); if (filteredForHeldItem.isEmpty()) continue; - BlockPos pos = ray.getPos(); + BlockPos pos = ray.getBlockPos(); BlockState state = world.getBlockState(pos); List filteredForState = filteredForHeldItem.stream().filter(helper -> helper.matchesState(state)).collect(Collectors.toList()); @@ -155,8 +155,8 @@ public class PlacementHelpers { if (player != null && animationTick > 0) { MainWindow res = event.getWindow(); - float screenY = res.getScaledHeight() / 2f; - float screenX = res.getScaledWidth() / 2f; + float screenY = res.getGuiScaledHeight() / 2f; + float screenX = res.getGuiScaledWidth() / 2f; float progress = getCurrentAlpha(); drawDirectionIndicator(event.getMatrixStack(), event.getPartialTicks(), screenX, screenY, progress); @@ -178,12 +178,12 @@ public class PlacementHelpers { Vector3d target = new Vector3d(projTarget.x, projTarget.y, 0); if (projTarget.z > 0) { - target = target.inverse(); + target = target.reverse(); } Vector3d norm = target.normalize(); Vector3d ref = new Vector3d(0, 1, 0); - float targetAngle = AngleHelper.deg(Math.acos(norm.dotProduct(ref))); + float targetAngle = AngleHelper.deg(Math.acos(norm.dot(ref))); angle.withSpeed(0.25f); @@ -210,7 +210,7 @@ public class PlacementHelpers { } private static void fadedArrow(MatrixStack ms, float centerX, float centerY, float r, float g, float b, float a, float length, float snappedAngle) { - ms.push(); + ms.pushPose(); RenderSystem.disableTexture(); RenderSystem.enableBlend(); RenderSystem.disableAlphaTest(); @@ -218,16 +218,16 @@ public class PlacementHelpers { RenderSystem.shadeModel(GL11.GL_SMOOTH); ms.translate(centerX, centerY, 0); - ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(angle.get(0))); + ms.mulPose(Vector3f.ZP.rotationDegrees(angle.get(0))); //RenderSystem.rotatef(snappedAngle, 0, 0, 1); double scale = AllConfigs.CLIENT.indicatorScale.get(); RenderSystem.scaled(scale, scale, 1); Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuffer(); + BufferBuilder bufferbuilder = tessellator.getBuilder(); bufferbuilder.begin(GL11.GL_POLYGON, DefaultVertexFormats.POSITION_COLOR); - Matrix4f mat = ms.peek().getModel(); + Matrix4f mat = ms.last().pose(); bufferbuilder.vertex(mat, 0, - (10 + length), 0).color(r, g, b, a).endVertex(); @@ -239,16 +239,16 @@ public class PlacementHelpers { bufferbuilder.vertex(mat, 6, -6, 0).color(r, g, b, 0f).endVertex(); bufferbuilder.vertex(mat, 9, -3, 0).color(r, g, b, 0f).endVertex(); - tessellator.draw(); + tessellator.end(); RenderSystem.shadeModel(GL11.GL_FLAT); RenderSystem.disableBlend(); RenderSystem.enableAlphaTest(); RenderSystem.enableTexture(); - ms.pop(); + ms.popPose(); } private static void textured(MatrixStack ms, float centerX, float centerY, float alpha, float snappedAngle) { - ms.push(); + ms.pushPose(); RenderSystem.enableTexture(); AllGuiTextures.PLACEMENT_INDICATOR_SHEET.bind(); RenderSystem.enableBlend(); @@ -270,20 +270,20 @@ public class PlacementHelpers { float th = tex_size; Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder buffer = tessellator.getBuffer(); - buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEXTURE); + BufferBuilder buffer = tessellator.getBuilder(); + buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEX); - Matrix4f mat = ms.peek().getModel(); - buffer.vertex(mat, -1, -1, 0).color(1f, 1f, 1f, alpha).texture(tx, ty).endVertex(); - buffer.vertex(mat, -1, 1, 0).color(1f, 1f, 1f, alpha).texture(tx, ty + th).endVertex(); - buffer.vertex(mat, 1, 1, 0).color(1f, 1f, 1f, alpha).texture(tx + tw, ty + th).endVertex(); - buffer.vertex(mat, 1, -1, 0).color(1f, 1f, 1f, alpha).texture(tx + tw, ty).endVertex(); + Matrix4f mat = ms.last().pose(); + buffer.vertex(mat, -1, -1, 0).color(1f, 1f, 1f, alpha).uv(tx, ty).endVertex(); + buffer.vertex(mat, -1, 1, 0).color(1f, 1f, 1f, alpha).uv(tx, ty + th).endVertex(); + buffer.vertex(mat, 1, 1, 0).color(1f, 1f, 1f, alpha).uv(tx + tw, ty + th).endVertex(); + buffer.vertex(mat, 1, -1, 0).color(1f, 1f, 1f, alpha).uv(tx + tw, ty).endVertex(); - tessellator.draw(); + tessellator.end(); RenderSystem.shadeModel(GL11.GL_FLAT); RenderSystem.disableBlend(); - ms.pop(); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java index aebe09f8c..4ab7ef08f 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java @@ -108,23 +108,23 @@ public class PlacementOffset { if (!isReplaceable(world)) return ActionResultType.PASS; - if (world.isRemote) + if (world.isClientSide) return ActionResultType.SUCCESS; ItemUseContext context = new ItemUseContext(player, hand, ray); BlockPos newPos = new BlockPos(pos); - if (!world.isBlockModifiable(player, newPos)) + if (!world.mayInteract(player, newPos)) return ActionResultType.PASS; - BlockState state = stateTransform.apply(blockItem.getBlock().getDefaultState()); - if (state.contains(BlockStateProperties.WATERLOGGED)) { + BlockState state = stateTransform.apply(blockItem.getBlock().defaultBlockState()); + if (state.hasProperty(BlockStateProperties.WATERLOGGED)) { FluidState fluidState = world.getFluidState(newPos); - state = state.with(BlockStateProperties.WATERLOGGED, fluidState.getFluid() == Fluids.WATER); + state = state.setValue(BlockStateProperties.WATERLOGGED, fluidState.getType() == Fluids.WATER); } - BlockSnapshot snapshot = BlockSnapshot.create(world.getRegistryKey(), world, newPos); - world.setBlockState(newPos, state); + BlockSnapshot snapshot = BlockSnapshot.create(world.dimension(), world, newPos); + world.setBlockAndUpdate(newPos, state); BlockEvent.EntityPlaceEvent event = new BlockEvent.EntityPlaceEvent(snapshot, IPlacementHelper.ID, player); if (MinecraftForge.EVENT_BUS.post(event)) { @@ -136,13 +136,13 @@ public class PlacementOffset { SoundType soundtype = newState.getSoundType(world, newPos, player); world.playSound(null, newPos, soundtype.getPlaceSound(), SoundCategory.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - player.addStat(Stats.ITEM_USED.get(blockItem)); + player.awardStat(Stats.ITEM_USED.get(blockItem)); if (player instanceof ServerPlayerEntity) - CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayerEntity) player, newPos, context.getItem()); + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayerEntity) player, newPos, context.getItemInHand()); if (!player.isCreative()) - context.getItem().shrink(1); + context.getItemInHand().shrink(1); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java b/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java index f362531d3..8488daf3a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java @@ -41,12 +41,12 @@ public abstract class PoleHelper> implements IPlacementH } public int attachedPoles(World world, BlockPos pos, Direction direction) { - BlockPos checkPos = pos.offset(direction); + BlockPos checkPos = pos.relative(direction); BlockState state = world.getBlockState(checkPos); int count = 0; while (matchesAxis(state, direction.getAxis())) { count++; - checkPos = checkPos.offset(direction); + checkPos = checkPos.relative(direction); state = world.getBlockState(checkPos); } return count; @@ -59,7 +59,7 @@ public abstract class PoleHelper> implements IPlacementH @Override public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { - List directions = IPlacementHelper.orderedByDistance(pos, ray.getHitVec(), dir -> dir.getAxis() == axisFunction.apply(state)); + List directions = IPlacementHelper.orderedByDistance(pos, ray.getLocation(), dir -> dir.getAxis() == axisFunction.apply(state)); for (Direction dir : directions) { int range = AllConfigs.SERVER.curiosities.placementAssistRange.get(); if (player != null) { @@ -71,11 +71,11 @@ public abstract class PoleHelper> implements IPlacementH if (poles >= range) continue; - BlockPos newPos = pos.offset(dir, poles + 1); + BlockPos newPos = pos.relative(dir, poles + 1); BlockState newState = world.getBlockState(newPos); if (newState.getMaterial().isReplaceable()) - return PlacementOffset.success(newPos, bState -> bState.with(property, state.get(property))); + return PlacementOffset.success(newPos, bState -> bState.setValue(property, state.getValue(property))); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/recipe/IRecipeTypeInfo.java b/src/main/java/com/simibubi/create/foundation/utility/recipe/IRecipeTypeInfo.java new file mode 100644 index 000000000..bf347471f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/recipe/IRecipeTypeInfo.java @@ -0,0 +1,15 @@ +package com.simibubi.create.foundation.utility.recipe; + +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.util.ResourceLocation; + +public interface IRecipeTypeInfo { + + ResourceLocation getId(); + + > T getSerializer(); + + > T getType(); + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeConditions.java b/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeConditions.java index 901ca5dc6..95123ff19 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeConditions.java +++ b/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeConditions.java @@ -31,7 +31,7 @@ public class RecipeConditions { } public static Predicate> outputMatchesFilter(FilteringBehaviour filtering) { - return r -> filtering.test(r.getRecipeOutput()); + return r -> filtering.test(r.getResultItem()); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java index 60b82a4e5..18ce49c0c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java @@ -21,23 +21,23 @@ public class PlacementSimulationServerWorld extends WrappedServerWorld { } @Override - public boolean setBlockState(BlockPos pos, BlockState newState, int flags) { - blocksAdded.put(pos.toImmutable(), newState); + public boolean setBlock(BlockPos pos, BlockState newState, int flags) { + blocksAdded.put(pos.immutable(), newState); return true; } @Override - public boolean setBlockState(BlockPos pos, BlockState state) { - return setBlockState(pos, state, 0); + public boolean setBlockAndUpdate(BlockPos pos, BlockState state) { + return setBlock(pos, state, 0); } @Override - public boolean hasBlockState(BlockPos pos, Predicate condition) { + public boolean isStateAtPosition(BlockPos pos, Predicate condition) { return condition.test(getBlockState(pos)); } @Override - public boolean isBlockPresent(BlockPos pos) { + public boolean isLoaded(BlockPos pos) { return true; } @@ -50,7 +50,7 @@ public class PlacementSimulationServerWorld extends WrappedServerWorld { public BlockState getBlockState(BlockPos pos) { if (blocksAdded.containsKey(pos)) return blocksAdded.get(pos); - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java index e0f1c9806..57a1462b6 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java @@ -40,7 +40,7 @@ public class PlacementSimulationWorld extends WrappedWorld implements IFlywheelW } @Override - public WorldLightManager getLightingProvider() { + public WorldLightManager getLightEngine() { return lighter; } @@ -50,14 +50,14 @@ public class PlacementSimulationWorld extends WrappedWorld implements IFlywheelW BlockState state = entry.getValue(); int light = state.getLightValue(this, pos); if (light > 0) { - lighter.func_215573_a(pos, light); + lighter.onBlockEmissionIncrease(pos, light); } } } public void setTileEntities(Collection tileEntities) { tesAdded.clear(); - tileEntities.forEach(te -> tesAdded.put(te.getPos(), te)); + tileEntities.forEach(te -> tesAdded.put(te.getBlockPos(), te)); } public void clear() { @@ -65,10 +65,10 @@ public class PlacementSimulationWorld extends WrappedWorld implements IFlywheelW } @Override - public boolean setBlockState(BlockPos pos, BlockState newState, int flags) { + public boolean setBlock(BlockPos pos, BlockState newState, int flags) { blocksAdded.put(pos, newState); - SectionPos sectionPos = SectionPos.from(pos); + SectionPos sectionPos = SectionPos.of(pos); if (spannedSections.add(sectionPos)) { lighter.updateSectionStatus(sectionPos, false); } @@ -81,22 +81,22 @@ public class PlacementSimulationWorld extends WrappedWorld implements IFlywheelW } @Override - public boolean setBlockState(BlockPos pos, BlockState state) { - return setBlockState(pos, state, 0); + public boolean setBlockAndUpdate(BlockPos pos, BlockState state) { + return setBlock(pos, state, 0); } @Override - public TileEntity getTileEntity(BlockPos pos) { + public TileEntity getBlockEntity(BlockPos pos) { return tesAdded.get(pos); } @Override - public boolean hasBlockState(BlockPos pos, Predicate condition) { + public boolean isStateAtPosition(BlockPos pos, Predicate condition) { return condition.test(getBlockState(pos)); } @Override - public boolean isBlockPresent(BlockPos pos) { + public boolean isLoaded(BlockPos pos) { return true; } @@ -106,7 +106,7 @@ public class PlacementSimulationWorld extends WrappedWorld implements IFlywheelW } public BlockState getBlockState(int x, int y, int z) { - return getBlockState(scratch.setPos(x, y, z)); + return getBlockState(scratch.set(x, y, z)); } @Override @@ -114,6 +114,6 @@ public class PlacementSimulationWorld extends WrappedWorld implements IFlywheelW BlockState state = blocksAdded.get(pos); if (state != null) return state; - return Blocks.AIR.getDefaultState(); + return Blocks.AIR.defaultBlockState(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/RayTraceWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/RayTraceWorld.java index 3a15cc1e7..eb608d262 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/RayTraceWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/RayTraceWorld.java @@ -20,8 +20,8 @@ public class RayTraceWorld implements IBlockReader { } @Override - public TileEntity getTileEntity(BlockPos pos) { - return template.getTileEntity(pos); + public TileEntity getBlockEntity(BlockPos pos) { + return template.getBlockEntity(pos); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java index dbc75fcfd..7d68691b1 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java @@ -38,12 +38,12 @@ public class WrappedChunkProvider extends AbstractChunkProvider { @Nullable @Override - public IBlockReader getChunkForLight(int x, int z) { + public IBlockReader getChunkForLighting(int x, int z) { return getChunk(x, z); } @Override - public IBlockReader getWorld() { + public IBlockReader getLevel() { return world; } @@ -63,12 +63,12 @@ public class WrappedChunkProvider extends AbstractChunkProvider { } @Override - public String makeString() { + public String gatherStats() { return "WrappedChunkProvider"; } @Override - public WorldLightManager getLightManager() { - return world.getLightingProvider(); + public WorldLightManager getLightEngine() { + return world.getLightEngine(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedClientWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedClientWorld.java index f72f2b771..4e497fdc7 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedClientWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedClientWorld.java @@ -38,7 +38,7 @@ public class WrappedClientWorld extends ClientWorld { protected World world; private WrappedClientWorld(World world) { - super(mc.getConnection(), mc.world.getWorldInfo(), world.getRegistryKey(), world.getDimension(), mc.getConnection().viewDistance, world.getProfilerSupplier(), mc.worldRenderer, world.isDebugWorld(), world.getBiomeAccess().seed); + super(mc.getConnection(), mc.level.getLevelData(), world.dimension(), world.dimensionType(), mc.getConnection().serverChunkRadius, world.getProfilerSupplier(), mc.levelRenderer, world.isDebug(), world.getBiomeManager().biomeZoomSeed); this.world = world; } @@ -47,13 +47,13 @@ public class WrappedClientWorld extends ClientWorld { } @Override - public boolean isBlockLoaded(BlockPos pos) { - return world.isBlockLoaded(pos); + public boolean hasChunkAt(BlockPos pos) { + return world.hasChunkAt(pos); } @Override - public boolean isBlockPresent(BlockPos pos) { - return world.isBlockPresent(pos); + public boolean isLoaded(BlockPos pos) { + return world.isLoaded(pos); } @Override @@ -75,13 +75,13 @@ public class WrappedClientWorld extends ClientWorld { @Override - public int getLightLevel(LightType type, BlockPos pos) { - return world.getLightLevel(type, pos); + public int getBrightness(LightType type, BlockPos pos) { + return world.getBrightness(type, pos); } @Override - public int getLightValue(BlockPos pos) { - return world.getLightValue(pos); + public int getLightEmission(BlockPos pos) { + return world.getLightEmission(pos); } @Override @@ -91,13 +91,13 @@ public class WrappedClientWorld extends ClientWorld { @Nullable @Override - public T getClosestEntity(List p_217361_1_, EntityPredicate p_217361_2_, @Nullable LivingEntity p_217361_3_, double p_217361_4_, double p_217361_6_, double p_217361_8_) { - return world.getClosestEntity(p_217361_1_, p_217361_2_, p_217361_3_, p_217361_4_, p_217361_6_, p_217361_8_); + public T getNearestEntity(List p_217361_1_, EntityPredicate p_217361_2_, @Nullable LivingEntity p_217361_3_, double p_217361_4_, double p_217361_6_, double p_217361_8_) { + return world.getNearestEntity(p_217361_1_, p_217361_2_, p_217361_3_, p_217361_4_, p_217361_6_, p_217361_8_); } @Override - public int getColor(BlockPos p_225525_1_, ColorResolver p_225525_2_) { - return world.getColor(p_225525_1_, p_225525_2_); + public int getBlockTint(BlockPos p_225525_1_, ColorResolver p_225525_2_) { + return world.getBlockTint(p_225525_1_, p_225525_2_); } // FIXME: Emissive Lighting might not light stuff properly @@ -114,18 +114,18 @@ public class WrappedClientWorld extends ClientWorld { } @Override - public void addOptionalParticle(IParticleData p_195589_1_, double p_195589_2_, double p_195589_4_, double p_195589_6_, double p_195589_8_, double p_195589_10_, double p_195589_12_) { - world.addOptionalParticle(p_195589_1_, p_195589_2_, p_195589_4_, p_195589_6_, p_195589_8_, p_195589_10_, p_195589_12_); + public void addAlwaysVisibleParticle(IParticleData p_195589_1_, double p_195589_2_, double p_195589_4_, double p_195589_6_, double p_195589_8_, double p_195589_10_, double p_195589_12_) { + world.addAlwaysVisibleParticle(p_195589_1_, p_195589_2_, p_195589_4_, p_195589_6_, p_195589_8_, p_195589_10_, p_195589_12_); } @Override - public void addOptionalParticle(IParticleData p_217404_1_, boolean p_217404_2_, double p_217404_3_, double p_217404_5_, double p_217404_7_, double p_217404_9_, double p_217404_11_, double p_217404_13_) { - world.addOptionalParticle(p_217404_1_, p_217404_2_, p_217404_3_, p_217404_5_, p_217404_7_, p_217404_9_, p_217404_11_, p_217404_13_); + public void addAlwaysVisibleParticle(IParticleData p_217404_1_, boolean p_217404_2_, double p_217404_3_, double p_217404_5_, double p_217404_7_, double p_217404_9_, double p_217404_11_, double p_217404_13_) { + world.addAlwaysVisibleParticle(p_217404_1_, p_217404_2_, p_217404_3_, p_217404_5_, p_217404_7_, p_217404_9_, p_217404_11_, p_217404_13_); } @Override - public void playSound(double p_184134_1_, double p_184134_3_, double p_184134_5_, SoundEvent p_184134_7_, SoundCategory p_184134_8_, float p_184134_9_, float p_184134_10_, boolean p_184134_11_) { - world.playSound(p_184134_1_, p_184134_3_, p_184134_5_, p_184134_7_,p_184134_8_, p_184134_9_, p_184134_10_, p_184134_11_); + public void playLocalSound(double p_184134_1_, double p_184134_3_, double p_184134_5_, SoundEvent p_184134_7_, SoundCategory p_184134_8_, float p_184134_9_, float p_184134_10_, boolean p_184134_11_) { + world.playLocalSound(p_184134_1_, p_184134_3_, p_184134_5_, p_184134_7_,p_184134_8_, p_184134_9_, p_184134_10_, p_184134_11_); } @Override @@ -135,8 +135,8 @@ public class WrappedClientWorld extends ClientWorld { @Nullable @Override - public TileEntity getTileEntity(BlockPos p_175625_1_) { - return world.getTileEntity(p_175625_1_); + public TileEntity getBlockEntity(BlockPos p_175625_1_) { + return world.getBlockEntity(p_175625_1_); } public World getWrappedWorld() { return world; diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java index ec967e3d7..6161cbfc4 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java @@ -37,48 +37,48 @@ public class WrappedServerWorld extends ServerWorld { protected World world; public WrappedServerWorld(World world) { - // Replace null with world.getChunkProvider().chunkManager.field_219266_t ? We had null in 1.15 - super(world.getServer(), Util.getServerExecutor(), getLevelSaveFromWorld(world), (IServerWorldInfo) world.getWorldInfo(), world.getRegistryKey(), world.getDimension(), null, ((ServerChunkProvider) world.getChunkProvider()).getChunkGenerator(), world.isDebugWorld(), world.getBiomeAccess().seed, Collections.EMPTY_LIST, false); //, world.field_25143); + // Replace null with world.getChunkProvider().chunkManager.progressListener ? We had null in 1.15 + super(world.getServer(), Util.backgroundExecutor(), getLevelSaveFromWorld(world), (IServerWorldInfo) world.getLevelData(), world.dimension(), world.dimensionType(), null, ((ServerChunkProvider) world.getChunkSource()).getGenerator(), world.isDebug(), world.getBiomeManager().biomeZoomSeed, Collections.EMPTY_LIST, false); //, world.field_25143); this.world = world; } @Override - public float getCelestialAngleRadians(float p_72826_1_) { + public float getSunAngle(float p_72826_1_) { return 0; } - + @Override - public int getLight(BlockPos pos) { + public int getMaxLocalRawBrightness(BlockPos pos) { return 15; } @Override - public void notifyBlockUpdate(BlockPos pos, BlockState oldState, BlockState newState, int flags) { - world.notifyBlockUpdate(pos, oldState, newState, flags); + public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { + world.sendBlockUpdated(pos, oldState, newState, flags); } @Override - public ServerTickList getPendingBlockTicks() { - ITickList tl = world.getPendingBlockTicks(); + public ServerTickList getBlockTicks() { + ITickList tl = world.getBlockTicks(); if (tl instanceof ServerTickList) return (ServerTickList) tl; - return super.getPendingBlockTicks(); + return super.getBlockTicks(); } @Override - public ServerTickList getPendingFluidTicks() { - ITickList tl = world.getPendingFluidTicks(); + public ServerTickList getLiquidTicks() { + ITickList tl = world.getLiquidTicks(); if (tl instanceof ServerTickList) return (ServerTickList) tl; - return super.getPendingFluidTicks(); + return super.getLiquidTicks(); } @Override - public void playEvent(PlayerEntity player, int type, BlockPos pos, int data) { + public void levelEvent(PlayerEntity player, int type, BlockPos pos, int data) { } @Override - public List getPlayers() { + public List players() { return Collections.emptyList(); } @@ -88,12 +88,12 @@ public class WrappedServerWorld extends ServerWorld { } @Override - public void playMovingSound(PlayerEntity p_217384_1_, Entity p_217384_2_, SoundEvent p_217384_3_, + public void playSound(PlayerEntity p_217384_1_, Entity p_217384_2_, SoundEvent p_217384_3_, SoundCategory p_217384_4_, float p_217384_5_, float p_217384_6_) { } @Override - public Entity getEntityByID(int id) { + public Entity getEntity(int id) { return null; } @@ -103,22 +103,22 @@ public class WrappedServerWorld extends ServerWorld { } @Override - public boolean addEntity(Entity entityIn) { - entityIn.setWorld(world); - return world.addEntity(entityIn); + public boolean addFreshEntity(Entity entityIn) { + entityIn.setLevel(world); + return world.addFreshEntity(entityIn); } @Override - public void registerMapData(MapData mapDataIn) { + public void setMapData(MapData mapDataIn) { } @Override - public int getNextMapId() { + public int getFreeMapId() { return 0; } @Override - public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress) { + public void destroyBlockProgress(int breakerId, BlockPos pos, int progress) { } @Override @@ -127,16 +127,16 @@ public class WrappedServerWorld extends ServerWorld { } @Override - public ITagCollectionSupplier getTags() { - return world.getTags(); + public ITagCollectionSupplier getTagManager() { + return world.getTagManager(); } @Override - public Biome getGeneratorStoredBiome(int p_225604_1_, int p_225604_2_, int p_225604_3_) { - return world.getGeneratorStoredBiome(p_225604_1_, p_225604_2_, p_225604_3_); + public Biome getUncachedNoiseBiome(int p_225604_1_, int p_225604_2_, int p_225604_3_) { + return world.getUncachedNoiseBiome(p_225604_1_, p_225604_2_, p_225604_3_); } private static SaveFormat.LevelSave getLevelSaveFromWorld(World world) { - return ObfuscationReflectionHelper.getPrivateValue(MinecraftServer.class, world.getServer(), "field_71310_m"); + return ObfuscationReflectionHelper.getPrivateValue(MinecraftServer.class, world.getServer(), "field_71310_m"); // storageSource } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java index 634da56bd..46b8cdcf6 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java @@ -38,8 +38,8 @@ public class WrappedWorld extends World { protected AbstractChunkProvider provider; public WrappedWorld(World world, AbstractChunkProvider provider) { - super((ISpawnWorldInfo) world.getWorldInfo(), world.getRegistryKey(), world.getDimension(), world::getProfiler, - world.isRemote, world.isDebugWorld(), 0); + super((ISpawnWorldInfo) world.getLevelData(), world.dimension(), world.dimensionType(), world::getProfiler, + world.isClientSide, world.isDebug(), 0); this.world = world; this.provider = provider; } @@ -48,13 +48,13 @@ public class WrappedWorld extends World { this(world, null); } - public World getWorld() { + public World getLevel() { return world; } @Override - public WorldLightManager getLightingProvider() { - return world.getLightingProvider(); + public WorldLightManager getLightEngine() { + return world.getLightEngine(); } @Override @@ -63,50 +63,50 @@ public class WrappedWorld extends World { } @Override - public boolean hasBlockState(@Nullable BlockPos p_217375_1_, @Nullable Predicate p_217375_2_) { - return world.hasBlockState(p_217375_1_, p_217375_2_); + public boolean isStateAtPosition(@Nullable BlockPos p_217375_1_, @Nullable Predicate p_217375_2_) { + return world.isStateAtPosition(p_217375_1_, p_217375_2_); } @Override - public TileEntity getTileEntity(@Nullable BlockPos pos) { - return world.getTileEntity(pos); + public TileEntity getBlockEntity(@Nullable BlockPos pos) { + return world.getBlockEntity(pos); } @Override - public boolean setBlockState(@Nullable BlockPos pos, @Nullable BlockState newState, int flags) { - return world.setBlockState(pos, newState, flags); + public boolean setBlock(@Nullable BlockPos pos, @Nullable BlockState newState, int flags) { + return world.setBlock(pos, newState, flags); } @Override - public int getLight(BlockPos pos) { + public int getMaxLocalRawBrightness(BlockPos pos) { return 15; } @Override - public void notifyBlockUpdate(BlockPos pos, BlockState oldState, BlockState newState, int flags) { - world.notifyBlockUpdate(pos, oldState, newState, flags); + public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { + world.sendBlockUpdated(pos, oldState, newState, flags); } @Override - public ITickList getPendingBlockTicks() { - return world.getPendingBlockTicks(); + public ITickList getBlockTicks() { + return world.getBlockTicks(); } @Override - public ITickList getPendingFluidTicks() { - return world.getPendingFluidTicks(); + public ITickList getLiquidTicks() { + return world.getLiquidTicks(); } @Override - public AbstractChunkProvider getChunkProvider() { + public AbstractChunkProvider getChunkSource() { return provider; } @Override - public void playEvent(@Nullable PlayerEntity player, int type, BlockPos pos, int data) {} + public void levelEvent(@Nullable PlayerEntity player, int type, BlockPos pos, int data) {} @Override - public List getPlayers() { + public List players() { return Collections.emptyList(); } @@ -115,11 +115,11 @@ public class WrappedWorld extends World { SoundCategory category, float volume, float pitch) {} @Override - public void playMovingSound(@Nullable PlayerEntity p_217384_1_, Entity p_217384_2_, SoundEvent p_217384_3_, + public void playSound(@Nullable PlayerEntity p_217384_1_, Entity p_217384_2_, SoundEvent p_217384_3_, SoundCategory p_217384_4_, float p_217384_5_, float p_217384_6_) {} @Override - public Entity getEntityByID(int id) { + public Entity getEntity(int id) { return null; } @@ -129,23 +129,23 @@ public class WrappedWorld extends World { } @Override - public boolean addEntity(@Nullable Entity entityIn) { + public boolean addFreshEntity(@Nullable Entity entityIn) { if (entityIn == null) return false; - entityIn.setWorld(world); - return world.addEntity(entityIn); + entityIn.setLevel(world); + return world.addFreshEntity(entityIn); } @Override - public void registerMapData(MapData mapDataIn) {} + public void setMapData(MapData mapDataIn) {} @Override - public int getNextMapId() { - return world.getNextMapId(); + public int getFreeMapId() { + return world.getFreeMapId(); } @Override - public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress) {} + public void destroyBlockProgress(int breakerId, BlockPos pos, int progress) {} @Override public Scoreboard getScoreboard() { @@ -158,36 +158,36 @@ public class WrappedWorld extends World { } @Override - public ITagCollectionSupplier getTags() { - return world.getTags(); + public ITagCollectionSupplier getTagManager() { + return world.getTagManager(); } @Override - public Biome getGeneratorStoredBiome(int p_225604_1_, int p_225604_2_, int p_225604_3_) { - return world.getGeneratorStoredBiome(p_225604_1_, p_225604_2_, p_225604_3_); + public Biome getUncachedNoiseBiome(int p_225604_1_, int p_225604_2_, int p_225604_3_) { + return world.getUncachedNoiseBiome(p_225604_1_, p_225604_2_, p_225604_3_); } @Override - public DynamicRegistries getRegistryManager() { - return world.getRegistryManager(); + public DynamicRegistries registryAccess() { + return world.registryAccess(); } @Override - public float getBrightness(Direction p_230487_1_, boolean p_230487_2_) { - return world.getBrightness(p_230487_1_, p_230487_2_); + public float getShade(Direction p_230487_1_, boolean p_230487_2_) { + return world.getShade(p_230487_1_, p_230487_2_); } @Override - public void markChunkDirty(BlockPos p_175646_1_, TileEntity p_175646_2_) { + public void blockEntityChanged(BlockPos p_175646_1_, TileEntity p_175646_2_) { } @Override - public boolean isBlockLoaded(BlockPos p_175667_1_) { + public boolean hasChunkAt(BlockPos p_175667_1_) { return true; } @Override - public void updateComparatorOutputLevel(BlockPos p_175666_1_, Block p_175666_2_) { + public void updateNeighbourForOutputSignal(BlockPos p_175666_1_, Block p_175666_2_) { return; } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/EmptierChunk.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/EmptierChunk.java index 7543375f2..e5a963e2b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/EmptierChunk.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/EmptierChunk.java @@ -24,7 +24,7 @@ public class EmptierChunk extends Chunk { } public BlockState getBlockState(BlockPos p_180495_1_) { - return Blocks.VOID_AIR.getDefaultState(); + return Blocks.VOID_AIR.defaultBlockState(); } @Nullable @@ -33,15 +33,15 @@ public class EmptierChunk extends Chunk { } public FluidState getFluidState(BlockPos p_204610_1_) { - return Fluids.EMPTY.getDefaultState(); + return Fluids.EMPTY.defaultFluidState(); } @Nullable - public WorldLightManager getWorldLightManager() { + public WorldLightManager getLightEngine() { return null; } - public int getLightValue(BlockPos p_217298_1_) { + public int getLightEmission(BlockPos p_217298_1_) { return 0; } @@ -49,34 +49,34 @@ public class EmptierChunk extends Chunk { public void removeEntity(Entity p_76622_1_) { } - public void removeEntityAtIndex(Entity p_76608_1_, int p_76608_2_) { } + public void removeEntity(Entity p_76608_1_, int p_76608_2_) { } @Nullable - public TileEntity getTileEntity(BlockPos p_177424_1_, Chunk.CreateEntityType p_177424_2_) { + public TileEntity getBlockEntity(BlockPos p_177424_1_, Chunk.CreateEntityType p_177424_2_) { return null; } - public void addTileEntity(TileEntity p_150813_1_) { } + public void addBlockEntity(TileEntity p_150813_1_) { } - public void addTileEntity(BlockPos p_177426_1_, TileEntity p_177426_2_) { } + public void setBlockEntity(BlockPos p_177426_1_, TileEntity p_177426_2_) { } - public void removeTileEntity(BlockPos p_177425_1_) { } + public void removeBlockEntity(BlockPos p_177425_1_) { } - public void markDirty() { } + public void markUnsaved() { } - public void getEntitiesWithinAABBForEntity(@Nullable Entity p_177414_1_, AxisAlignedBB p_177414_2_, List p_177414_3_, Predicate p_177414_4_) { } + public void getEntities(@Nullable Entity p_177414_1_, AxisAlignedBB p_177414_2_, List p_177414_3_, Predicate p_177414_4_) { } - public void getEntitiesOfTypeWithinAABB(Class p_177430_1_, AxisAlignedBB p_177430_2_, List p_177430_3_, Predicate p_177430_4_) { } + public void getEntitiesOfClass(Class p_177430_1_, AxisAlignedBB p_177430_2_, List p_177430_3_, Predicate p_177430_4_) { } public boolean isEmpty() { return true; } - public boolean isEmptyBetween(int p_76606_1_, int p_76606_2_) { + public boolean isYSpaceEmpty(int p_76606_1_, int p_76606_2_) { return true; } - public ChunkHolder.LocationType getLocationType() { + public ChunkHolder.LocationType getFullStatus() { return ChunkHolder.LocationType.BORDER; } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java index c7bd8101d..6eaa14f87 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java @@ -55,7 +55,7 @@ public class WrappedChunk implements IChunk { } @Override - public Stream getLightSources() { + public Stream getLights() { return world.blocksAdded .entrySet() .stream() @@ -84,7 +84,7 @@ public class WrappedChunk implements IChunk { } @Override - public void addTileEntity(BlockPos p_177426_1_, TileEntity p_177426_2_) { + public void setBlockEntity(BlockPos p_177426_1_, TileEntity p_177426_2_) { } @@ -94,12 +94,12 @@ public class WrappedChunk implements IChunk { } @Override - public Set getTileEntitiesPos() { + public Set getBlockEntitiesPos() { return null; } @Override - public Collection> func_217311_f() { + public Collection> getHeightmaps() { return null; } @@ -109,12 +109,12 @@ public class WrappedChunk implements IChunk { } @Override - public Heightmap getHeightmap(Heightmap.Type p_217303_1_) { + public Heightmap getOrCreateHeightmapUnprimed(Heightmap.Type p_217303_1_) { return null; } @Override - public int getTopBlockY(Heightmap.Type p_201576_1_, int p_201576_2_, int p_201576_3_) { + public int getHeight(Heightmap.Type p_201576_1_, int p_201576_2_, int p_201576_3_) { return 0; } @@ -130,49 +130,49 @@ public class WrappedChunk implements IChunk { @Nullable @Override - public BiomeContainer getBiomeArray() { + public BiomeContainer getBiomes() { return null; } @Override - public void setModified(boolean p_177427_1_) { + public void setUnsaved(boolean p_177427_1_) { } @Override - public boolean isModified() { + public boolean isUnsaved() { return false; } @Override - public void removeTileEntity(BlockPos p_177425_1_) { + public void removeBlockEntity(BlockPos p_177425_1_) { } @Override - public ShortList[] getPackedPositions() { + public ShortList[] getPostProcessing() { return new ShortList[0]; } @Nullable @Override - public CompoundNBT getDeferredTileEntity(BlockPos p_201579_1_) { + public CompoundNBT getBlockEntityNbt(BlockPos p_201579_1_) { return null; } @Nullable @Override - public CompoundNBT func_223134_j(BlockPos p_223134_1_) { + public CompoundNBT getBlockEntityNbtForSaving(BlockPos p_223134_1_) { return null; } @Override - public ITickList getBlocksToBeTicked() { + public ITickList getBlockTicks() { return null; } @Override - public ITickList getFluidsToBeTicked() { + public ITickList getLiquidTicks() { return null; } @@ -192,18 +192,18 @@ public class WrappedChunk implements IChunk { } @Override - public boolean hasLight() { + public boolean isLightCorrect() { return needsLight; } @Override - public void setLight(boolean needsLight) { + public void setLightCorrect(boolean needsLight) { this.needsLight = needsLight; } @Nullable @Override - public TileEntity getTileEntity(BlockPos pos) { + public TileEntity getBlockEntity(BlockPos pos) { return null; } @@ -218,42 +218,42 @@ public class WrappedChunk implements IChunk { } @Override - public void addStructureReference(Structure arg0, long arg1) { + public void addReferenceForFeature(Structure arg0, long arg1) { } @Override - public Map, LongSet> getStructureReferences() { + public Map, LongSet> getAllReferences() { return null; } @Override - public LongSet getStructureReferences(Structure arg0) { + public LongSet getReferencesForFeature(Structure arg0) { return null; } @Override - public StructureStart getStructureStart(Structure arg0) { + public StructureStart getStartForFeature(Structure arg0) { return null; } @Override - public void setStructureReferences(Map, LongSet> arg0) { + public void setAllReferences(Map, LongSet> arg0) { } @Override - public void setStructureStart(Structure arg0, StructureStart arg1) { + public void setStartForFeature(Structure arg0, StructureStart arg1) { } @Override - public void setStructureStarts(Map, StructureStart> p_201612_1_) { + public void setAllStarts(Map, StructureStart> p_201612_1_) { } @Override - public Map, StructureStart> getStructureStarts() { + public Map, StructureStart> getAllStarts() { return null; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunkSection.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunkSection.java index e5e90594d..26282a22b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunkSection.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunkSection.java @@ -14,9 +14,9 @@ public class WrappedChunkSection extends ChunkSection { public WrappedChunkSection(WrappedChunk owner, int yBase) { super(yBase); this.owner = owner; - this.xStart = owner.pos.getXStart(); + this.xStart = owner.pos.getMinBlockX(); this.yStart = yBase; - this.zStart = owner.pos.getZStart(); + this.zStart = owner.pos.getMinBlockZ(); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/AllWorldFeatures.java b/src/main/java/com/simibubi/create/foundation/worldgen/AllWorldFeatures.java index 3eab6cd93..9113dd70a 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/AllWorldFeatures.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/AllWorldFeatures.java @@ -77,7 +77,7 @@ public class AllWorldFeatures { if (event.getCategory() == Category.NETHER) return; event.getGeneration() - .feature(GenerationStage.Decoration.UNDERGROUND_ORES, entry.getFeature()); + .addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, entry.getFeature()); }); } diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenDecorator.java b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenDecorator.java index b9c6509ad..86cfb3fe9 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenDecorator.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenDecorator.java @@ -18,7 +18,7 @@ public class ConfigDrivenDecorator extends SimplePlacement getPositions(Random r, ConfigDrivenOreFeatureConfig config, BlockPos pos) { + protected Stream place(Random r, ConfigDrivenOreFeatureConfig config, BlockPos pos) { float frequency = config.getFrequency(); int floored = MathHelper.floor(frequency); diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenFeatureEntry.java b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenFeatureEntry.java index e89ff388e..0d6eeb8ce 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenFeatureEntry.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenFeatureEntry.java @@ -49,11 +49,11 @@ public class ConfigDrivenFeatureEntry extends ConfigBase { private ConfiguredFeature createFeature() { ConfigDrivenOreFeatureConfig config = - new ConfigDrivenOreFeatureConfig(FillerBlockType.BASE_STONE_OVERWORLD, block.get() - .getDefaultState(), id); + new ConfigDrivenOreFeatureConfig(FillerBlockType.NATURAL_STONE, block.get() + .defaultBlockState(), id); - return ConfigDrivenOreFeature.INSTANCE.configure(config) - .decorate(ConfigDrivenDecorator.INSTANCE.configure(config)); + return ConfigDrivenOreFeature.INSTANCE.configured(config) + .decorated(ConfigDrivenDecorator.INSTANCE.configured(config)); } public void addToConfig(ForgeConfigSpec.Builder builder) { diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenOreFeature.java b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenOreFeature.java index 959452655..b93026dc8 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenOreFeature.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenOreFeature.java @@ -22,7 +22,7 @@ public class ConfigDrivenOreFeature extends Feature CODEC = RecordCodecBuilder.create((p_236568_0_) -> { - return p_236568_0_.group(RuleTest.field_25012.fieldOf("target") + return p_236568_0_.group(RuleTest.CODEC.fieldOf("target") .forGetter((p_236570_0_) -> { return p_236570_0_.target; }), BlockState.CODEC.fieldOf("state") diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/OxidizingBlock.java b/src/main/java/com/simibubi/create/foundation/worldgen/OxidizingBlock.java index 74345a8a3..d58fa40a6 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/OxidizingBlock.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/OxidizingBlock.java @@ -29,35 +29,35 @@ public class OxidizingBlock extends Block { public OxidizingBlock(Properties properties, float chance) { super(properties); this.chance = chance; - setDefaultState(getDefaultState().with(OXIDIZATION, 0)); + registerDefaultState(defaultBlockState().setValue(OXIDIZATION, 0)); } @Override - protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(OXIDIZATION)); + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(OXIDIZATION)); } @Override - public boolean ticksRandomly(BlockState state) { - return super.ticksRandomly(state) || state.get(OXIDIZATION) < 7; + public boolean isRandomlyTicking(BlockState state) { + return super.isRandomlyTicking(state) || state.getValue(OXIDIZATION) < 7; } @Override public void randomTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { if (worldIn.getRandom() .nextFloat() <= chance) { - int currentState = state.get(OXIDIZATION); + int currentState = state.getValue(OXIDIZATION); boolean canIncrease = false; LinkedList neighbors = new LinkedList<>(); for (Direction facing : Iterate.directions) { - BlockPos neighbourPos = pos.offset(facing); + BlockPos neighbourPos = pos.relative(facing); if (!worldIn.isAreaLoaded(neighbourPos, 0)) continue; - if (!worldIn.isBlockPresent(neighbourPos)) + if (!worldIn.isLoaded(neighbourPos)) continue; BlockState neighborState = worldIn.getBlockState(neighbourPos); - if (neighborState.contains(OXIDIZATION) && neighborState.get(OXIDIZATION) != 0) { - neighbors.add(neighborState.get(OXIDIZATION)); + if (neighborState.hasProperty(OXIDIZATION) && neighborState.getValue(OXIDIZATION) != 0) { + neighbors.add(neighborState.getValue(OXIDIZATION)); } if (BlockHelper.hasBlockSolidSide(neighborState, worldIn, neighbourPos, facing.getOpposite())) { continue; @@ -69,20 +69,20 @@ public class OxidizingBlock extends Block { .mapToInt(v -> v) .average(); if (average.orElse(7d) >= currentState) - worldIn.setBlockState(pos, state.with(OXIDIZATION, Math.min(currentState + 1, 7))); + worldIn.setBlockAndUpdate(pos, state.setValue(OXIDIZATION, Math.min(currentState + 1, 7))); } } } @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) { - if (state.get(OXIDIZATION) > 0 && player.getHeldItem(hand) + if (state.getValue(OXIDIZATION) > 0 && player.getItemInHand(hand) .getItem() instanceof SandPaperItem) { if (!player.isCreative()) - player.getHeldItem(hand) - .damageItem(1, player, p -> p.sendBreakAnimation(p.getActiveHand())); - world.setBlockState(pos, state.with(OXIDIZATION, 0)); + player.getItemInHand(hand) + .hurtAndBreak(1, player, p -> p.broadcastBreakEvent(p.getUsedItemHand())); + world.setBlockAndUpdate(pos, state.setValue(OXIDIZATION, 0)); return ActionResultType.SUCCESS; } return ActionResultType.PASS; diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 55f9eab8a..b3457e6a6 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,11 +1,11 @@ modLoader="javafml" -loaderVersion="[34,)" +loaderVersion="[36,)" issueTrackerURL="https://github.com/Creators-of-Create/Create/issues" license="MIT" [[mods]] modId="create" -version="${file.jarVersion}" +version="v0.3.2c for 1.16.5" displayName="Create" #updateJSONURL="" displayURL="https://www.curseforge.com/minecraft/mc-mods/create" @@ -13,26 +13,25 @@ logoFile="logo.png" #credits="" authors="simibubi" description=''' -Technology that empowers the player. -''' +Technology that empowers the player.''' [[dependencies.create]] modId="forge" mandatory=true - versionRange="[35.1.16,)" + versionRange="[36.2.0,)" ordering="NONE" side="BOTH" [[dependencies.create]] modId="minecraft" mandatory=true - versionRange="[1.16.4,1.17)" + versionRange="[1.16.5,1.17)" ordering="NONE" side="BOTH" [[dependencies.create]] modId="flywheel" mandatory=true - versionRange="[1.16,1.17)" + versionRange="[1.16-0.2,1.16-0.3)" ordering="AFTER" side="CLIENT" diff --git a/src/main/resources/assets/create/flywheel/programs/chromatic.json b/src/main/resources/assets/create/flywheel/programs/chromatic.json deleted file mode 100644 index f521eefa6..000000000 --- a/src/main/resources/assets/create/flywheel/programs/chromatic.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "vert": "create:area_effect.vert", - "frag": "create:area_effect.frag" -} diff --git a/src/main/resources/assets/create/flywheel/shaders/area_effect.frag b/src/main/resources/assets/create/flywheel/shaders/area_effect.frag deleted file mode 100644 index 6c34704ce..000000000 --- a/src/main/resources/assets/create/flywheel/shaders/area_effect.frag +++ /dev/null @@ -1,167 +0,0 @@ -#version 140 - -#flwinclude <"flywheel:core/color.glsl"> - -in vec2 ScreenCoord; -in vec3 WorldDir; - -out vec4 Color; - -// constants -uniform sampler2D uDepth; -uniform sampler2D uColor; -uniform float uNearPlane = 0.15; -uniform float uFarPlane = 1.; -uniform vec3 uCameraPos; - -struct SphereFilter { - vec4 sphere;// - vec4 d1;// - vec4 strength;// - vec4 channelMask;// - mat4 colorOp; -}; - - #define N 256 -layout (std140) uniform Filters { - int uCount; - SphereFilter uSpheres[N]; -}; - -float linearizeDepth(float d, float zNear, float zFar) { - float clipZ = 2.0 * d - 1.0; - return zNear * zFar / (zFar + zNear - clipZ * (zFar - zNear)); -} - -vec3 filterColor(mat4 colorOp, vec3 color) { - // preserve alpha while transforming color - vec4 i = vec4(color, 1.); - i *= colorOp; - return i.rgb; -} - -float getDepth() { - float depth = texture2D(uDepth, ScreenCoord).r; - - return linearizeDepth(depth, uNearPlane, uFarPlane); -} - -float surfaceFilterStrength(vec3 worldPos, vec4 sphere, float feather) { - float distance = distance(sphere.xyz, worldPos); - return 1 - smoothstep(sphere.w, sphere.w + feather, distance); -} - -vec2 raySphere(vec3 worldDir, vec3 position, float radius) { - float rayLengthSqr = dot(worldDir, worldDir); - float sphereDistSqr = dot(position, position); - - const vec3 M = vec3(2., 2., 4.); - vec3 f = M * vec3(dot(-position, worldDir), vec2(rayLengthSqr)); - - vec2 s = vec2(f.x, radius); - vec2 s2 = s * s; - float c = sphereDistSqr - s2.y; - float dc = f.z * c; - - float discriminant = s2.x - dc; - float hitDepth = (-f.x - sqrt(discriminant)) / f.y; - - return vec2(discriminant, hitDepth); -} - -// if i == 0 return s -// if i == 1 return 1 - s -float invert(float s, float i) { - return i - 2*i*s + s; -} - -float bubbleFilterStrength(vec3 worldDir, float depth, vec4 sphere, float feather, float density) { - vec3 position = sphere.xyz; - - vec2 hit = raySphere(worldDir, position, sphere.w + feather); - float hitDepth = hit.y; - - float strength = 0.; - - //float boo = step(0., discriminant) * step(0., hitDepth) * step(0., depth - hitDepth); - if (hit.x > 0 && hitDepth > 0 && hitDepth < depth) { - vec3 hitPos = worldDir * hitDepth; - - vec3 normal = normalize(hitPos - position); - float normalDot = dot(normal, normalize(worldDir)); - // blend into the effect based on the distance between the fragcoord and point on the sphere - // this avoinds having hard edges - strength += mix(0., normalDot * normalDot * density, clamp(depth - hitDepth, 0., feather + 1.)); - } - - return clamp(strength, 0., 1.);// * boo; -} - -float filterStrength(vec3 worldDir, float depth, inout SphereFilter f) { - vec4 sphere = f.sphere; - vec4 data = f.d1; - float feather = data.x; - - float strength; - // transition effect - float transitionRadius = sphere.w + feather; - strength = 1. - smoothstep(transitionRadius, transitionRadius + max(0.5, data.y), length(sphere.xyz)); - // bubble effect - strength = max(strength, bubbleFilterStrength(worldDir, depth, sphere, feather, data.z)); - - strength *= f.strength.y; - // surface effect - strength = max(strength, surfaceFilterStrength(worldDir * depth, sphere, feather) * f.strength.x); - - return strength * f.strength.z; -} - -vec3 applyFilters(vec3 worldDir, float depth, vec3 diffuse) { - vec3 worldPos = worldDir * depth; - - vec3 accum = vec3(diffuse); - - for (int i = 0; i < uCount; i++) { - SphereFilter s = uSpheres[i]; - - float strength = filterStrength(worldDir, depth, s); - - strength = invert(strength, s.strength.w); - - if (strength > 0) { - const float fcon = 0.; - - vec3 baseColor = mix(diffuse, accum, s.d1.w); - - vec3 filtered = filterColor(s.colorOp, baseColor); - - // vec3 baseHsv = rgb2hsv(baseColor); - // vec3 maskHsv = rgb2hsv(s.colorMask.rgb); - // float diff = dot(abs(baseHsv - maskHsv), vec3(1., 1.1, 0.1)); - // float colorMask = step(s.colorMask.w, diff); - float mixing = clamp(strength, 0., 1.); - - accum = mix(accum, filtered, mixing * s.channelMask.xyz); - //accum = vec3(colorMask); - } - } - - return accum; -} - -vec4 debugGrid(vec3 worldPos, vec4 diffuse) { - vec3 fractionalCoords = fract(worldPos - uCameraPos); - - vec3 isBonudary = step(15./16., fractionalCoords); - - return vec4(mix(diffuse.rgb, fractionalCoords, isBonudary), 1.); -} - -void main() { - float depth = getDepth(); - - vec4 diffuse = texture2D(uColor, ScreenCoord); - - Color = vec4(applyFilters(WorldDir, depth, diffuse.rgb), diffuse.a); - //Color = debugGrid(WorldDir * depth, Color); -} diff --git a/src/main/resources/assets/create/flywheel/shaders/area_effect.vert b/src/main/resources/assets/create/flywheel/shaders/area_effect.vert deleted file mode 100644 index 0a0d8443a..000000000 --- a/src/main/resources/assets/create/flywheel/shaders/area_effect.vert +++ /dev/null @@ -1,29 +0,0 @@ -#version 140 - -// scaling constants -// e - 0.99, this works well, no idea why -#define SXY 1.7282818 -// 1.90 -> highp close, mediump far -// 1.91 -> mediump close, highp far -#define SZ 1.905 - -in vec4 aVertex;// - -out vec2 ScreenCoord; -out vec3 WorldDir; - -uniform mat4 uInverseProjection; -uniform mat4 uInverseView; - -void main() { - gl_Position = vec4(aVertex.xy, 0., 1.); - ScreenCoord = aVertex.zw; - - vec4 clip = vec4(aVertex.xy, 0., 1.); - - clip *= uInverseProjection; - - vec3 cameraDir = clip.xyz / clip.w; - cameraDir = cameraDir * vec3(SXY, SXY, SZ); - WorldDir = (uInverseView * vec4(cameraDir, 1.)).xyz; -} diff --git a/src/main/resources/assets/create/lang/default/advancements.json b/src/main/resources/assets/create/lang/default/advancements.json index d56cccf97..1f35ae1b2 100644 --- a/src/main/resources/assets/create/lang/default/advancements.json +++ b/src/main/resources/assets/create/lang/default/advancements.json @@ -127,8 +127,8 @@ "advancement.create.flywheel.desc": "Successfully connect an engine to the Flywheel.", "advancement.create.overstress_flywheel": "High levels of Stress", "advancement.create.overstress_flywheel.desc": "Overstress a Furnace Engine.", - "advancement.create.clockwork_component": "Complex Curiosities", - "advancement.create.clockwork_component.desc": "Assemble a Clockwork Component.", + "advancement.create.precision_mechanism": "Complex Curiosities", + "advancement.create.precision_mechanism.desc": "Assemble a Precision Mechanism.", "advancement.create.mechanical_arm": "Busy Hands!", "advancement.create.mechanical_arm.desc": "Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch as it does all the work for you.", "advancement.create.musical_arm": "Play Me My Theme Tune!", diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index f22e5b8ef..1df9899de 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -4,13 +4,19 @@ "itemGroup.create.palettes": "Create Palettes", "death.attack.create.crush": "%1$s was processed by Crushing Wheels", - "death.attack.create.fan_fire": "%1$s was burned to death by hot air", - "death.attack.create.fan_lava": "%1$s was burned to death by lava fan", + "death.attack.create.crush.player": "%1$s was thrown into Crushing Wheels by %2$s", + "death.attack.create.fan_fire": "%1$s got smoked by an Encased Fan", + "death.attack.create.fan_fire.player": "%1$s was thrown into a smoker by %2$s", + "death.attack.create.fan_lava": "%1$s was incinerated by an Encased Fan", + "death.attack.create.fan_lava.player": "%1$s was thrown into a smelter by %2$s", "death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill", + "death.attack.create.mechanical_drill.player": "%1$s was thrown in front of a Drill by %2$s", "death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw", + "death.attack.create.mechanical_saw.player": "%1$s was thrown into a Saw by %2$s", "death.attack.create.potato_cannon": "%1$s was shot by %2$s's Potato Cannon", "death.attack.create.potato_cannon.item": "%1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s was blown up by tampered cuckoo clock", + "death.attack.create.cuckoo_clock_explosion.player": "%1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "a rogue Deployer", "create.block.cart_assembler.invalid": "Place your Cart Assembler on a rail block", @@ -56,7 +62,7 @@ "create.recipe.assembly.deploying_item": "Deploy %1$s", "create.recipe.assembly.cutting": "Cut with Saw", "create.recipe.assembly.repeat": "Repeat Sequence %1$s Times", - "create.recipe.assembly.junk": "Random junk", + "create.recipe.assembly.junk": "Random salvage", "create.recipe.processing.chance": "%1$s%% Chance", "create.recipe.heat_requirement.none": "No Heating Required", @@ -385,6 +391,12 @@ "create.item_attributes.added_by": "was added by %1$s", "create.item_attributes.added_by.inverted": "was not added by %1$s", + "create.item_attributes.shulker_level": "is shulker %1$s", + "create.item_attributes.shulker_level.inverted": "is shulker not %1$s", + "create.item_attributes.shulker_level.full": "full", + "create.item_attributes.shulker_level.empty": "empty", + "create.item_attributes.shulker_level.partial": "partially filled", + "create.item_attributes.has_enchant": "is enchanted with %1$s", "create.item_attributes.has_enchant.inverted": "is not enchanted with %1$s", "create.item_attributes.color": "is dyed %1$s", @@ -484,6 +496,10 @@ "create.tooltip.chute.fans_pull_up": "Fans pull from Above", "create.tooltip.chute.fans_pull_down": "Fans pull from Below", "create.tooltip.chute.contains": "Contains: %1$s x%2$s", + + "create.tooltip.brass_tunnel.contains": "Currently distributing:", + "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "Right-Click to retrieve", "create.linked_controller.bind_mode": "Bind mode active", "create.linked_controller.press_keybind": "Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", @@ -499,6 +515,10 @@ "create.crafting_blueprint.secondary_display_slot": "Secondary Display Slot", "create.crafting_blueprint.optional": "Optional", + "create.potato_cannon.ammo.attack_damage": "%1$s Attack Damage", + "create.potato_cannon.ammo.reload_ticks": "%1$s Reload Ticks", + "create.potato_cannon.ammo.knockback": "%1$s Knockback", + "create.hint.hose_pulley.title": "Bottomless Supply", "create.hint.hose_pulley": "The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "No Targets", diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index de63406a8..3c57d3fc5 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -154,6 +154,11 @@ "block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot", "block.create.creative_crate.tooltip.behaviour1": "Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + "item.create.creative_blaze_cake.tooltip": "CREATIVE CAKE", + "item.create.creative_blaze_cake.tooltip.summary": "A very special treat for _Blaze Burners_ that allows _controlling their heat level_. After eating this cake, Blaze Burners will _never run out of fuel_.", + "item.create.creative_blaze_cake.tooltip.condition1": "R-Click on Blaze Burner", + "item.create.creative_blaze_cake.tooltip.behaviour1": "_Locks_ the Blaze Burner's heat level. If used again, _cycles_ the Blaze Burner's heat level.", + "block.create.controller_rail.tooltip": "CONTROLLER RAIL", "block.create.controller_rail.tooltip.summary": "A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", "block.create.controller_rail.tooltip.condition1": "When Powered by Redstone", @@ -218,30 +223,11 @@ "item.create.minecart_coupling.tooltip.behaviour1": "_Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.", "block.create.peculiar_bell.tooltip": "PECULIAR BELL", - "block.create.peculiar_bell.tooltip.summary": "A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", + "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", - "block.create.cursed_bell.tooltip": "CURSED BELL", - "block.create.cursed_bell.tooltip.summary": "A spooky brass bell haunted by lost souls of the Nether.", - "block.create.cursed_bell.tooltip.condition1": "When Held or Rang", - "block.create.cursed_bell.tooltip.behaviour1": "Highlights nearby dark spots on which Hostile Mobs could spawn.", - - "create.gui.chromatic_projector.title": "Chromatic Projector", - "create.gui.chromatic_projector.filter.invert": "Invert", - "create.gui.chromatic_projector.filter.sepia": "Sepia", - "create.gui.chromatic_projector.filter.grayscale": "Grayscale", - "create.gui.chromatic_projector.filter.saturate": "Saturate", - "create.gui.chromatic_projector.filter.hue_shift": "Hue shift", - "create.gui.chromatic_projector.filter.darken": "Darken", - "create.gui.chromatic_projector.filter.contrast": "Contrast", - "create.gui.chromatic_projector.filter.end": "End", - "create.gui.chromatic_projector.filter": "Filter", - "create.gui.chromatic_projector.surface": "Surface", - "create.gui.chromatic_projector.field": "Field", - "create.gui.chromatic_projector.strength": "Strength", - "create.gui.chromatic_projector.radius": "Radius", - "create.gui.chromatic_projector.feather": "Feather", - "create.gui.chromatic_projector.density": "Density", - "create.gui.chromatic_projector.fade": "Fade", - "create.gui.chromatic_projector.blend": "Blend" + "block.create.haunted_bell.tooltip": "HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "A _Cursed Bell_ haunted by lost souls of the Nether.", + "block.create.haunted_bell.tooltip.condition1": "When Held or Rang", + "block.create.haunted_bell.tooltip.behaviour1": "Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn." } diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index c8e41ac46..a3d88329b 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -13,7 +13,7 @@ "block.create.andesite_bricks": "Ladrillos de andesita", "block.create.andesite_bricks_slab": "Losa de ladrillos de andesita", "block.create.andesite_bricks_stairs": "Escaleras de ladrillos de andesita", - "block.create.andesite_bricks_wall": "Pared de ladrillos de andesita", + "block.create.andesite_bricks_wall": "Muro de ladrillos de andesita", "block.create.andesite_casing": "Revestidor de andesita", "block.create.andesite_cobblestone": "Adoquín de andesita", "block.create.andesite_cobblestone_slab": "Losa de adoquín de andesita", @@ -52,23 +52,27 @@ "block.create.chiseled_weathered_limestone": "Piedra caliza erosionada cincelada", "block.create.chocolate": "Chocolate", "block.create.chute": "Ducto", - "block.create.clockwork_bearing": "Rodamiento de reloj", + "block.create.clockwork_bearing": "Rodamiento tipo reloj", "block.create.clutch": "Embrague", - "block.create.cogwheel": "Rueda dentada", + "block.create.cogwheel": "Engranaje pequeño", "block.create.content_observer": "Observador de contenidos", "block.create.controller_rail": "Raíl de control", + "block.create.copper_backtank": "Depósito trasero de cobre", "block.create.copper_block": "Bloque de cobre", "block.create.copper_casing": "Revestidor de caliza", - "block.create.copper_ore": "Mineral de cobre", + "block.create.copper_ore": "Mena de cobre", "block.create.copper_shingles": "Bloque de tejas de cobre", "block.create.copper_tiles": "Bloque de baldosas de cobre", "block.create.copper_valve_handle": "Asa de válvula de cobre", "block.create.creative_crate": "Caja creativa", "block.create.creative_fluid_tank": "Tanque de fluidos creativo", "block.create.creative_motor": "Motor creativo", + "block.create.crimson_window": "Ventana carmesí", + "block.create.crimson_window_pane": "Panel de ventana carmesí", "block.create.crushing_wheel": "Rueda trituradora", "block.create.crushing_wheel_controller": "Controlador de Rueda trituradora", - "block.create.cuckoo_clock": "Reloj Cucú", + "block.create.cuckoo_clock": "Reloj de cuco", + "block.create.cursed_bell": "Cursed Bell", "block.create.cyan_sail": "Vela cian", "block.create.cyan_seat": "Asiento cian", "block.create.cyan_valve_handle": "Asa de válvula cian", @@ -78,32 +82,32 @@ "block.create.dark_scoria_bricks": "Ladrillos de escoria oscura", "block.create.dark_scoria_bricks_slab": "Losa de ladrillos de escoria oscura", "block.create.dark_scoria_bricks_stairs": "Escaleras de ladrillos de escoria oscura", - "block.create.dark_scoria_bricks_wall": "Pared de ladrillos de escoria oscura", + "block.create.dark_scoria_bricks_wall": "Muro de ladrillos de escoria oscura", "block.create.dark_scoria_cobblestone": "Adoquines de escoria oscura", "block.create.dark_scoria_cobblestone_slab": "Losa de adoquines de escoria oscura", "block.create.dark_scoria_cobblestone_stairs": "Escaleras de adoquines de escoria oscura", - "block.create.dark_scoria_cobblestone_wall": "Pared de adoquines de escoria oscura", + "block.create.dark_scoria_cobblestone_wall": "Muro de adoquines de escoria oscura", "block.create.dark_scoria_pillar": "Pilar de escoria oscura", "block.create.deployer": "Desplegador", "block.create.depot": "Depósito", "block.create.diorite_bricks": "Ladrillos de diorita", "block.create.diorite_bricks_slab": "Losa de ladrillos de diorita", "block.create.diorite_bricks_stairs": "Escaleras de ladrillos de diorita", - "block.create.diorite_bricks_wall": "Pared de ladrillos de diorita", + "block.create.diorite_bricks_wall": "Muro de ladrillos de diorita", "block.create.diorite_cobblestone": "Adoquín de diorita", "block.create.diorite_cobblestone_slab": "Losa de adoquínes de diorita", "block.create.diorite_cobblestone_stairs": "Escaleras de adoquines de diorita", - "block.create.diorite_cobblestone_wall": "Pared de adoquines de diorita", + "block.create.diorite_cobblestone_wall": "Muro de adoquines de diorita", "block.create.diorite_pillar": "Pilar de diorita", "block.create.dolomite": "Dolomita", "block.create.dolomite_bricks": "Ladrillos de dolomita", "block.create.dolomite_bricks_slab": "Losa de ladrillos de dolomita", "block.create.dolomite_bricks_stairs": "Escaleras de ladrillos de dolomita", - "block.create.dolomite_bricks_wall": "Pared de ladrillos de dolomita", + "block.create.dolomite_bricks_wall": "Muro de ladrillos de dolomita", "block.create.dolomite_cobblestone": "Adoquín de dolomita", "block.create.dolomite_cobblestone_slab": "Losa de adoquín de dolomita", "block.create.dolomite_cobblestone_stairs": "Escaleras de adoquines de dolomita", - "block.create.dolomite_cobblestone_wall": "Pared de adoquines de dolomita", + "block.create.dolomite_cobblestone_wall": "Muro de adoquines de dolomita", "block.create.dolomite_pillar": "Pilar de dolomita", "block.create.encased_chain_drive": "Cadena de transmisión revestida", "block.create.encased_fan": "Ventilador revestido", @@ -111,39 +115,39 @@ "block.create.fancy_andesite_bricks": "Ladrillos de andesita elegantes", "block.create.fancy_andesite_bricks_slab": "Ladrillos de andesita elegantes", "block.create.fancy_andesite_bricks_stairs": "Escaleras de ladrillos de andesita elegantes", - "block.create.fancy_andesite_bricks_wall": "Pared de ladrillos de andesita elegantes", + "block.create.fancy_andesite_bricks_wall": "Muro de ladrillos de andesita elegantes", "block.create.fancy_dark_scoria_bricks": "Ladrillos de escoria oscura elegantes", "block.create.fancy_dark_scoria_bricks_slab": "Losa de ladrillos de escoria oscura elegantes", "block.create.fancy_dark_scoria_bricks_stairs": "Escalera de ladrillos de escoria oscura elegantes", - "block.create.fancy_dark_scoria_bricks_wall": "Pared de ladrillos de escoria oscura elegantes", + "block.create.fancy_dark_scoria_bricks_wall": "Muro de ladrillos de escoria oscura elegantes", "block.create.fancy_diorite_bricks": "Ladrillos de diorita elegantes", "block.create.fancy_diorite_bricks_slab": "Losa de ladrillos de diorita elegantes", "block.create.fancy_diorite_bricks_stairs": "Escaleras de ladrillos de diorita elegantes", - "block.create.fancy_diorite_bricks_wall": "Pared de ladrillos de diorita elegantes", + "block.create.fancy_diorite_bricks_wall": "Muro de ladrillos de diorita elegantes", "block.create.fancy_dolomite_bricks": "Ladrillos de dolomita elegantes", "block.create.fancy_dolomite_bricks_slab": "Losa de ladrillos de dolomita elegantes", "block.create.fancy_dolomite_bricks_stairs": "Escaleras de ladrillos de dolomita elegantes", - "block.create.fancy_dolomite_bricks_wall": "Pared de ladrillos de dolomita elegantes", + "block.create.fancy_dolomite_bricks_wall": "Muro de ladrillos de dolomita elegantes", "block.create.fancy_gabbro_bricks": "Ladrillos de gabro elegantes", "block.create.fancy_gabbro_bricks_slab": "Losa de ladrillos de gabro elegantes", "block.create.fancy_gabbro_bricks_stairs": "Escaleras de ladrillos de gabro elegantes", - "block.create.fancy_gabbro_bricks_wall": "Pared de ladrillos de gabro elegantes", + "block.create.fancy_gabbro_bricks_wall": "Muro de ladrillos de gabro elegantes", "block.create.fancy_granite_bricks": "Ladrillos de granito elegantes", "block.create.fancy_granite_bricks_slab": "Losa de ladrillos de granito elegantes", "block.create.fancy_granite_bricks_stairs": "Escaleras de ladrillos de granito elegantes", - "block.create.fancy_granite_bricks_wall": "Pared de ladrillos de granito elegantes", + "block.create.fancy_granite_bricks_wall": "Muro de ladrillos de granito elegantes", "block.create.fancy_limestone_bricks": "Ladrillos de piedra caliza elegantes", "block.create.fancy_limestone_bricks_slab": "Losa de ladrillos de piedra caliza elegantes", "block.create.fancy_limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza elegantes", - "block.create.fancy_limestone_bricks_wall": "Pared de ladrillos de piedra caliza elegantes", + "block.create.fancy_limestone_bricks_wall": "Muro de ladrillos de piedra caliza elegantes", "block.create.fancy_scoria_bricks": "Ladrillos de escoria elegantes", "block.create.fancy_scoria_bricks_slab": "Losa de ladrillos de escoria elegantes", "block.create.fancy_scoria_bricks_stairs": "Escaleras de ladrillos de escoria elegantes", - "block.create.fancy_scoria_bricks_wall": "Pared de ladrillos de escoria elegantes", + "block.create.fancy_scoria_bricks_wall": "Muro de ladrillos de escoria elegantes", "block.create.fancy_weathered_limestone_bricks": "Ladrillos de piedra de caliza erosionada elegantes", "block.create.fancy_weathered_limestone_bricks_slab": "Losa de ladrillos de caliza erosionada elegantes", "block.create.fancy_weathered_limestone_bricks_stairs": "Escaleras de ladrillos de caliza erosionada elegantes", - "block.create.fancy_weathered_limestone_bricks_wall": "Pared de ladrillos de caliza erosionada elegantes", + "block.create.fancy_weathered_limestone_bricks_wall": "Muro de ladrillos de caliza erosionada elegantes", "block.create.fluid_pipe": "Tubería de fluidos de cobre", "block.create.fluid_tank": "Depósito de fluidos", "block.create.fluid_valve": "Válvula de fluidos", @@ -155,13 +159,13 @@ "block.create.gabbro_bricks": "Ladrillos de gabro", "block.create.gabbro_bricks_slab": "Losa de ladrillos de gabro", "block.create.gabbro_bricks_stairs": "Escaleras de ladrillos de gabro", - "block.create.gabbro_bricks_wall": "Pared de ladrillos de gabro", + "block.create.gabbro_bricks_wall": "Muro de ladrillos de gabro", "block.create.gabbro_cobblestone": "Adoquín de gabro", "block.create.gabbro_cobblestone_slab": "Losa de adoquínes de gabro", "block.create.gabbro_cobblestone_stairs": "Escaleras de adoquínes de gabro", - "block.create.gabbro_cobblestone_wall": "Pared de adoquínes de gabro", + "block.create.gabbro_cobblestone_wall": "Muro de adoquínes de gabro", "block.create.gabbro_pillar": "Pilar de gabro", - "block.create.gantry_pinion": "Piñón de grúa", + "block.create.gantry_carriage": "Carro de grúa", "block.create.gantry_shaft": "Eje de grúa", "block.create.gearbox": "Caja de transmisión", "block.create.gearshift": "Caja de cambios", @@ -169,11 +173,11 @@ "block.create.granite_bricks": "Ladrillos de granito", "block.create.granite_bricks_slab": "Losa de ladrillos de granito", "block.create.granite_bricks_stairs": "Escaleras de ladrillos de granito", - "block.create.granite_bricks_wall": "Pared de ladrillos de granito", + "block.create.granite_bricks_wall": "Muro de ladrillos de granito", "block.create.granite_cobblestone": "Adoquín de granito", "block.create.granite_cobblestone_slab": "Losa de adoquínes de granito", "block.create.granite_cobblestone_stairs": "Escaleras de adoquínes de granito", - "block.create.granite_cobblestone_wall": "Pared de adoquínes de granito", + "block.create.granite_cobblestone_wall": "Muro de adoquínes de granito", "block.create.granite_pillar": "Pilar de granito", "block.create.gray_sail": "Vela gris", "block.create.gray_seat": "Asiento gris", @@ -186,10 +190,10 @@ "block.create.horizontal_framed_glass": "Cristal con marco horizontal", "block.create.horizontal_framed_glass_pane": "Panel de cristal con marco horizontal", "block.create.hose_pulley": "Polea de manguera", - "block.create.item_drain": "Drenador de elementos", + "block.create.item_drain": "Drenador de objetos", "block.create.jungle_window": "Ventana de jungla", "block.create.jungle_window_pane": "Panel de ventana de jungla", - "block.create.large_cogwheel": "Rueda dentada grande", + "block.create.large_cogwheel": "Engranaje grande", "block.create.layered_andesite": "Andesita estratificada", "block.create.layered_dark_scoria": "Escoria oscura estratificada", "block.create.layered_diorite": "Diorita estratificada", @@ -199,6 +203,7 @@ "block.create.layered_limestone": "Piedra caliza estratificada", "block.create.layered_scoria": "Escoria estratificada", "block.create.layered_weathered_limestone": "Caliza erosionada estratificada", + "block.create.lectern_controller": "Lectern Controller", "block.create.light_blue_sail": "Vela azul claro", "block.create.light_blue_seat": "Asiento azul claro", "block.create.light_blue_valve_handle": "Asa de válvula azul claro", @@ -213,11 +218,11 @@ "block.create.limestone_bricks": "Ladrillos de piedra caliza", "block.create.limestone_bricks_slab": "Losa de ladrillos de piedra caliza", "block.create.limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza", - "block.create.limestone_bricks_wall": "Pared de ladrillos de piedra caliza", + "block.create.limestone_bricks_wall": "Muro de ladrillos de piedra caliza", "block.create.limestone_cobblestone": "Adoquínes de piedra caliza", "block.create.limestone_cobblestone_slab": "Losa de adoquines de piedra caliza", "block.create.limestone_cobblestone_stairs": "Escaleras de adoquines de piedra caliza", - "block.create.limestone_cobblestone_wall": "Pared de adoquines de piedra caliza", + "block.create.limestone_cobblestone_wall": "Muro de adoquines de piedra caliza", "block.create.limestone_pillar": "Pilar de piedra caliza", "block.create.linear_chassis": "Chasis lineal", "block.create.lit_blaze_burner": "Quemador de Blaze encendido", @@ -226,7 +231,7 @@ "block.create.magenta_valve_handle": "Asa de válvula magenta", "block.create.mechanical_arm": "Brazo mecánico", "block.create.mechanical_bearing": "Rodamiento mecánico", - "block.create.mechanical_crafter": "Autoensamblador mecánico", + "block.create.mechanical_crafter": "Ensamblador mecánico", "block.create.mechanical_drill": "Taladro mecánico", "block.create.mechanical_harvester": "Cosechadora mecánica", "block.create.mechanical_mixer": "Mezcladora mecánica", @@ -248,7 +253,7 @@ "block.create.mossy_limestone": "Caliza musgosa", "block.create.mossy_scoria": "Escoria musgosa", "block.create.mossy_weathered_limestone": "Caliza erosionada musgosa", - "block.create.mysterious_cuckoo_clock": "Reloj cucú", + "block.create.mysterious_cuckoo_clock": "Reloj de cuco", "block.create.natural_scoria": "Escoria natural", "block.create.nixie_tube": "Tubo Nixie", "block.create.nozzle": "Boquilla", @@ -271,39 +276,40 @@ "block.create.paved_andesite": "Andesita pavimentada", "block.create.paved_andesite_slab": "Losa de andesita pavimentada", "block.create.paved_andesite_stairs": "Escaleras de andesita pavimentada", - "block.create.paved_andesite_wall": "Pared de andesita pavimentada", + "block.create.paved_andesite_wall": "Muro de andesita pavimentada", "block.create.paved_dark_scoria": "Escoria oscura pavimentada", "block.create.paved_dark_scoria_slab": "Losa de escoria oscura pavimentada", "block.create.paved_dark_scoria_stairs": "Escaleras de escoria oscura pavimentada", - "block.create.paved_dark_scoria_wall": "Pared de escoria oscura pavimentad", + "block.create.paved_dark_scoria_wall": "Muro de escoria oscura pavimentad", "block.create.paved_diorite": "Diorita pavimentada", "block.create.paved_diorite_slab": "Losa de diorita pavimentada", "block.create.paved_diorite_stairs": "Escaleras de diorita pavimentada", - "block.create.paved_diorite_wall": "Pared de diorita pavimentad", + "block.create.paved_diorite_wall": "Muro de diorita pavimentad", "block.create.paved_dolomite": "Dolomita pavimentada", "block.create.paved_dolomite_slab": "Losa de dolomita pavimentada", "block.create.paved_dolomite_stairs": "Escaleras de dolomita pavimentada", - "block.create.paved_dolomite_wall": "Pared de dolomita pavimentada", + "block.create.paved_dolomite_wall": "Muro de dolomita pavimentada", "block.create.paved_gabbro": "Gabro pavimentado", "block.create.paved_gabbro_slab": "Losa de gabro pavimentado", "block.create.paved_gabbro_stairs": "Escaleras de gabro pavimentado", - "block.create.paved_gabbro_wall": "Pared de gabro pavimentado", + "block.create.paved_gabbro_wall": "Muro de gabro pavimentado", "block.create.paved_granite": "Granito pavimentado", "block.create.paved_granite_slab": "Losa de granito pavimentado", "block.create.paved_granite_stairs": "Escaleras de granito pavimentado", - "block.create.paved_granite_wall": "Pared de granito pavimentado", + "block.create.paved_granite_wall": "Muro de granito pavimentado", "block.create.paved_limestone": "Piedra caliza pavimentada", "block.create.paved_limestone_slab": "Losa de piedra caliza pavimentada", "block.create.paved_limestone_stairs": "Escaleras de piedra caliza pavimentada", - "block.create.paved_limestone_wall": "Pared de piedra caliza pavimentada", + "block.create.paved_limestone_wall": "Muro de piedra caliza pavimentada", "block.create.paved_scoria": "Escoria pavimentada", "block.create.paved_scoria_slab": "Losa de escoria pavimentada", "block.create.paved_scoria_stairs": "Escaleras de escoria pavimentada", - "block.create.paved_scoria_wall": "Pared de escoria pavimentada", + "block.create.paved_scoria_wall": "Muro de escoria pavimentada", "block.create.paved_weathered_limestone": "Piedra caliza erosionada pavimentada", "block.create.paved_weathered_limestone_slab": "Losa de piedra caliza erosionada pavimentada", "block.create.paved_weathered_limestone_stairs": "Escaleras de piedra caliza erosionada pavimentada", - "block.create.paved_weathered_limestone_wall": "Pared de piedra caliza erosionada pavimentada", + "block.create.paved_weathered_limestone_wall": "Muro de piedra caliza erosionada pavimentada", + "block.create.peculiar_bell": "Peculiar Bell", "block.create.pink_sail": "Vela rosa", "block.create.pink_seat": "Asiento rosa", "block.create.pink_valve_handle": "Asa de válvula rosa", @@ -311,33 +317,33 @@ "block.create.polished_dark_scoria": "Escoria oscura pulida", "block.create.polished_dark_scoria_slab": "Losa de escoria oscura pulida", "block.create.polished_dark_scoria_stairs": "Escaleras de escoria oscura pulida", - "block.create.polished_dark_scoria_wall": "Pared de escoria oscura pulida", + "block.create.polished_dark_scoria_wall": "Muro de escoria oscura pulida", "block.create.polished_dolomite": "Dolomita pulida", "block.create.polished_dolomite_slab": "Losa de dolomita pulida", "block.create.polished_dolomite_stairs": "Escaleras de dolomita pulidas", - "block.create.polished_dolomite_wall": "Pared de dolomita pulida", + "block.create.polished_dolomite_wall": "Muro de dolomita pulida", "block.create.polished_gabbro": "Gabro pulido", "block.create.polished_gabbro_slab": "Losa de gabro pulido", "block.create.polished_gabbro_stairs": "Escaleras de gabro pulido", - "block.create.polished_gabbro_wall": "Pared de gabro pulido", + "block.create.polished_gabbro_wall": "Muro de gabro pulido", "block.create.polished_limestone": "Piedra caliza pulida", "block.create.polished_limestone_slab": "Losa de piedra caliza pulida", "block.create.polished_limestone_stairs": "Escaleras de piedra caliza pulidas", - "block.create.polished_limestone_wall": "Pared de piedra caliza pulida", + "block.create.polished_limestone_wall": "Muro de piedra caliza pulida", "block.create.polished_scoria": "Escoria pulida", "block.create.polished_scoria_slab": "Losa de escoria pulida", "block.create.polished_scoria_stairs": "Escaleras de losa pulida", - "block.create.polished_scoria_wall": "Pared de escoria pulida", + "block.create.polished_scoria_wall": "Muro de escoria pulida", "block.create.polished_weathered_limestone": "Piedra caliza erosionada pulida", "block.create.polished_weathered_limestone_slab": "Losa de piedra caliza erosionada pulida", "block.create.polished_weathered_limestone_stairs": "Escaleras de piedra caliza erosionada pulida", - "block.create.polished_weathered_limestone_wall": "Pared de piedra caliza erosionada pulida", + "block.create.polished_weathered_limestone_wall": "Muro de piedra caliza erosionada pulida", "block.create.portable_fluid_interface": "Interfaz de fluidos portátil", "block.create.portable_storage_interface": "Interfaz de almacenamiento portátil", "block.create.powered_latch": "Palanca motorizada", "block.create.powered_toggle_latch": "Palanca de cierre motorizada", "block.create.pulley_magnet": "Imán de la polea", - "block.create.pulse_repeater": "Repetidor de pulsos de Redstone", + "block.create.pulse_repeater": "Repetidor de pulsos de redstone", "block.create.purple_sail": "Vela morada", "block.create.purple_seat": "Asiento morado", "block.create.purple_valve_handle": "Asa de válvula morada", @@ -345,28 +351,28 @@ "block.create.red_sail": "Vela roja", "block.create.red_seat": "Asiento rojo", "block.create.red_valve_handle": "Asa de válvula roja", - "block.create.redstone_contact": "Contacto de Redstone", - "block.create.redstone_link": "Enlace de Redstone", - "block.create.refined_radiance_casing": "Revestidor de radiante", + "block.create.redstone_contact": "Contacto de redstone", + "block.create.redstone_link": "Enlace de redstone", + "block.create.refined_radiance_casing": "Revestidor radiante", "block.create.reinforced_rail": "Raíl reforzado", "block.create.rope": "Cuerda", "block.create.rope_pulley": "Polea de cuerda", - "block.create.rotation_speed_controller": "Controlador de velocidad de rotación", + "block.create.rotation_speed_controller": "Controlador de velocidad rotacional", "block.create.sail_frame": "Marco de vela", "block.create.schematic_table": "Tabla de esquemas", - "block.create.schematicannon": "Schematicannon", + "block.create.schematicannon": "Cañón de esquemas", "block.create.scoria": "Escoria", "block.create.scoria_bricks": "Ladrillos de escoria", "block.create.scoria_bricks_slab": "Losa de ladrillos de escoria", "block.create.scoria_bricks_stairs": "Escaleras de ladrillos de escoria", - "block.create.scoria_bricks_wall": "Pared de ladrillos de escoria", + "block.create.scoria_bricks_wall": "Muro de ladrillos de escoria", "block.create.scoria_cobblestone": "Adoquín de escoria", "block.create.scoria_cobblestone_slab": "Losa de adoquínes de escoria", "block.create.scoria_cobblestone_stairs": "Escaleras de adoquines de escoria", - "block.create.scoria_cobblestone_wall": "Pared de adoquines de escoria", + "block.create.scoria_cobblestone_wall": "Muro de adoquines de escoria", "block.create.scoria_pillar": "Pilar de escoria", "block.create.secondary_linear_chassis": "Chasis lineal secundario", - "block.create.sequenced_gearshift": "Palanca de cambios secuencial", + "block.create.sequenced_gearshift": "Caja de cambios secuencial", "block.create.shadow_steel_casing": "Revestidor sombrío", "block.create.shaft": "Eje", "block.create.smart_chute": "Ducto inteligente", @@ -375,6 +381,7 @@ "block.create.spout": "Surtidor", "block.create.spruce_window": "Ventana de abeto", "block.create.spruce_window_pane": "Panel de ventana de abeto", + "block.create.sticker": "Sticker", "block.create.sticky_mechanical_piston": "Pistón mecánico pegajoso", "block.create.stockpile_switch": "Interruptor de acopio", "block.create.stressometer": "Estresómetro", @@ -383,17 +390,20 @@ "block.create.turntable": "Plataforma giratoria mecánica", "block.create.vertical_framed_glass": "Vidrio esmaltado vertical", "block.create.vertical_framed_glass_pane": "Panel de vidrio esmaltado vertical", + "block.create.warped_window": "Ventana distorsionada", + "block.create.warped_window_pane": "Panel de ventana distorsionada", "block.create.water_wheel": "Rueda hidráulica mecánica", "block.create.weathered_limestone": "Piedra caliza erosionada", "block.create.weathered_limestone_bricks": "Ladrillos de piedra caliza erosionada", "block.create.weathered_limestone_bricks_slab": "Losa de piedra caliza erosionada", "block.create.weathered_limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza erosionada", - "block.create.weathered_limestone_bricks_wall": "Pared de ladrillos de piedra caliza erosionada", + "block.create.weathered_limestone_bricks_wall": "Muro de ladrillos de piedra caliza erosionada", "block.create.weathered_limestone_cobblestone": "Adoquín de piedra caliza erosionada", "block.create.weathered_limestone_cobblestone_slab": "Losa de adoquín de piedra caliza erosionada", "block.create.weathered_limestone_cobblestone_stairs": "Escaleras de adoquín de piedra caliza erosionada", - "block.create.weathered_limestone_cobblestone_wall": "Pared de adoquínes de piedra caliza erosionada", + "block.create.weathered_limestone_cobblestone_wall": "Muro de adoquínes de piedra caliza erosionada", "block.create.weathered_limestone_pillar": "Pilar de piedra caliza erosionada", + "block.create.weighted_ejector": "Eyector de peso", "block.create.white_sail": "Vela blanca", "block.create.white_seat": "Asiento blanco", "block.create.white_valve_handle": "Asa de válvula blanco", @@ -403,13 +413,15 @@ "block.create.yellow_seat": "Asiento amarillo", "block.create.yellow_valve_handle": "Asa de válvula amarillo", "block.create.zinc_block": "Bloque de zinc", - "block.create.zinc_ore": "Mineral de zinc", + "block.create.zinc_ore": "Mena de zinc", "entity.create.contraption": "Artilugio", + "entity.create.crafting_blueprint": "Plano de elaboración", "entity.create.gantry_contraption": "Artilugio de grúa", + "entity.create.potato_projectile": "Potato Projectile", "entity.create.seat": "Asiento", "entity.create.stationary_contraption": "Artilugio estacionario", - "entity.create.super_glue": "Super Pegamento", + "entity.create.super_glue": "Pegamento", "fluid.create.milk": "Leche", "fluid.create.potion": "Poción", @@ -418,22 +430,26 @@ "item.create.andesite_alloy": "Aleación de andesita", "item.create.attribute_filter": "Filtro de atributos", "item.create.bar_of_chocolate": "Barra de chocolate", - "item.create.belt_connector": "Correa", - "item.create.blaze_cake": "Pastel de Blaze", - "item.create.blaze_cake_base": "Base de Pastel de Blaze", + "item.create.belt_connector": "Correa mecánica", + "item.create.blaze_cake": "Pastel de blaze", + "item.create.blaze_cake_base": "Base de pastel de blaze", "item.create.brass_hand": "Mano de latón", "item.create.brass_ingot": "Lingote de latón", "item.create.brass_nugget": "Pepita de latón", "item.create.brass_sheet": "Lámina de latón", "item.create.builders_tea": "Té del Constructor", "item.create.chest_minecart_contraption": "Artilugio de vagoneta con cofre", - "item.create.chocolate_bucket": "Cubo de chocolate", + "item.create.chocolate_bucket": "Cubo con chocolate", + "item.create.chocolate_glazed_berries": "Bayas glaseadas con chocolate", "item.create.chromatic_compound": "Compuesto cromático", - "item.create.cinder_flour": "Harina de ceniza", + "item.create.cinder_flour": "Harina del Nether", + "item.create.clockwork_component": "Clockwork Component", + "item.create.copper_backtank": "Depósito trasero de cobre", "item.create.copper_ingot": "Lingote de cobre", "item.create.copper_nugget": "Pepita de cobre", "item.create.copper_sheet": "Lámina de cobre", - "item.create.crafter_slot_cover": "Tapa de ranura del Autoensamblador mecánico", + "item.create.crafter_slot_cover": "Tapa de ranura del ensamblador mecánico", + "item.create.crafting_blueprint": "Plano de elaboración", "item.create.crushed_aluminum_ore": "Mineral de aluminio molido", "item.create.crushed_brass": "Latón molido", "item.create.crushed_copper_ore": "Mineral de cobre molido", @@ -448,36 +464,39 @@ "item.create.crushed_tin_ore": "Mineral de estaño molido", "item.create.crushed_uranium_ore": "Mineral de uranio molido", "item.create.crushed_zinc_ore": "Mineral de zinc molido", - "item.create.deforester": "Deforestador", + "item.create.diving_boots": "Botas de buceo", + "item.create.diving_helmet": "Casco de buceo", "item.create.dough": "Masilla", "item.create.electron_tube": "Tubo de electrones", - "item.create.empty_blaze_burner": "Quemador de Blaze vacío", + "item.create.empty_blaze_burner": "Quemador de blaze vacío", "item.create.empty_schematic": "Esquema vacío", "item.create.extendo_grip": "Agarre extendido", "item.create.filter": "Filtro", "item.create.furnace_minecart_contraption": "Artilugio de vagoneta de horno", - "item.create.goggles": "Gafas del Ingeniero", + "item.create.goggles": "Gafas del constructor", "item.create.golden_sheet": "Lámina de oro", - "item.create.handheld_blockzapper": "Blockzapper", - "item.create.handheld_worldshaper": "Worldshaper", - "item.create.honey_bucket": "Cubo de miel", - "item.create.integrated_circuit": "Chip de circuito integrado", + "item.create.handheld_worldshaper": "Worldshaper Creativo", + "item.create.honey_bucket": "Cubo con miel", + "item.create.honeyed_apple": "Manzana con miel", + "item.create.incomplete_clockwork_component": "Incomplete Clockwork Component", "item.create.iron_sheet": "Lámina de hierro", - "item.create.lapis_sheet": "Lámina de lapislázuli", + "item.create.linked_controller": "Controlador enlazado", "item.create.minecart_contraption": "Artilugio de vagoneta", "item.create.minecart_coupling": "Acoplamiento de vagoneta", "item.create.polished_rose_quartz": "Cuarzo rosado pulido", - "item.create.powdered_obsidian": "Obsidiana en polvo", + "item.create.potato_cannon": "Potato Cannon", + "item.create.powdered_obsidian": "Polvo de obsidiana", "item.create.propeller": "Hélice", "item.create.red_sand_paper": "Papel de lija rojo", "item.create.refined_radiance": "Resplandor refinado", "item.create.rose_quartz": "Cuarzo rosado", "item.create.sand_paper": "Papel de lija", "item.create.schematic": "Esquema", - "item.create.schematic_and_quill": "Esquema y Pluma", + "item.create.schematic_and_quill": "Esquema y pluma", "item.create.shadow_steel": "Acero sombrío", - "item.create.super_glue": "Super Pegamento", - "item.create.tree_fertilizer": "Fertilizador de árboles", + "item.create.super_glue": "Pegamento", + "item.create.sweet_roll": "Pan dulce", + "item.create.tree_fertilizer": "Fertilizante para árboles", "item.create.vertical_gearbox": "Caja de transmisión vertical", "item.create.wand_of_symmetry": "Varita de simetría", "item.create.wheat_flour": "Harina de trigo", @@ -490,25 +509,25 @@ "_": "->------------------------] Advancements [------------------------<-", "advancement.create.root": "Bienvenido a Create", - "advancement.create.root.desc": "¡Es hora de empezar a construir increíbles Artilugios!", - "advancement.create.andesite_alloy": "Aliteraciones en abundancia", + "advancement.create.root.desc": "¡Es hora de empezar a construir increíbles artilugios!", + "advancement.create.andesite_alloy": "Aleaciones en abundancia", "advancement.create.andesite_alloy.desc": "Los materiales de Create tienen nombres extraños, la aleación de andesita es uno de ellos.", - "advancement.create.its_alive": "Está Vivo!", - "advancement.create.its_alive.desc": "Vea cómo gira su primer componente cinético.", + "advancement.create.its_alive": "¡Está vivo!", + "advancement.create.its_alive.desc": "Mira cómo gira tu primer componente cinético.", "advancement.create.shifting_gears": "Cambiando de marcha", - "advancement.create.shifting_gears.desc": "Conecta una rueda dentada grande a una pequeña, lo que te permitirá cambiar la velocidad de tu artilugio.", + "advancement.create.shifting_gears.desc": "Conecta un engranaje grande a uno pequeño, lo que te permitirá cambiar la velocidad de tu artilugio.", "advancement.create.overstressed": "Sobrecargado", "advancement.create.overstressed.desc": "Experimenta los límites del estrés.", "advancement.create.belt": "Paseo de algas", "advancement.create.belt.desc": "Conectar dos ejes con una correa.", - "advancement.create.tunnel": "Cúbrete!", - "advancement.create.tunnel.desc": "Embellece tu correa con un Túnel.", + "advancement.create.tunnel": "¡Cúbrete!", + "advancement.create.tunnel.desc": "Embellece tu correa con un túnel.", "advancement.create.splitter_tunnel": "Divide y vencerás", "advancement.create.splitter_tunnel.desc": "Crear un divisor con un grupo de túneles de latón.", "advancement.create.chute": "Caída en picado", "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical de la cinta.", "advancement.create.upward_chute": "Abducción aérea", - "advancement.create.upward_chute.desc": "Observe cómo un objeto lanzado vuela hacia un paracaídas impulsado por un ventilador.", + "advancement.create.upward_chute.desc": "Observe cómo un objeto lanzado vuela dentro de un ducto impulsado por un ventilador.", "advancement.create.belt_funnel": "Colgantes con forma de embudo", "advancement.create.belt_funnel.desc": "Coloca un embudo lateral encima de una cinta o depósito para crear un tipo especial.", "advancement.create.belt_funnel_kiss": "Los loros y las aletas", @@ -516,81 +535,81 @@ "advancement.create.fan": "Maestro mecánico del aire", "advancement.create.fan.desc": "Monta la corriente de aire proporcionada por un ventilador revestido.", "advancement.create.fan_lava": "Calentador geotérmico", - "advancement.create.fan_lava.desc": "Quedar atrapado en una corriente de aire que funde las cosas.", + "advancement.create.fan_lava.desc": "Queda atrapado en una corriente de aire que funde las cosas.", "advancement.create.fan_water": "Lavado de la ropa", - "advancement.create.fan_water.desc": "Quedar atrapado en una corriente de aire que lava las cosas.", + "advancement.create.fan_water.desc": "Queda atrapado en una corriente de aire que lava las cosas.", "advancement.create.fan_smoke": "Fuelle mecánico", - "advancement.create.fan_smoke.desc": "Quedar atrapado en una corriente de aire que humea los artículos.", + "advancement.create.fan_smoke.desc": "Queda atrapado en una corriente de aire que humea los objetos.", "advancement.create.wrench": "Configurar convenientemente", "advancement.create.wrench.desc": "Crea una llave inglesa para ayudarte a construir tus artilugios.", - "advancement.create.goggles": "Stress-O-Vision", - "advancement.create.goggles.desc": "Crea unas Gafas del Ingeniero para ayudarte a obtener más información cinética de los componentes.", - "advancement.create.speedometer": "Pero, ¿con qué rapidez exactamente??", - "advancement.create.speedometer.desc": "Coloca y alimenta un Velocímetro. Míralo a través de las gafas para leer su valor exacto.", + "advancement.create.goggles": "Estresóvisión", + "advancement.create.goggles.desc": "Crea unas gafas del constructor para ayudarte a obtener más información cinética de los componentes.", + "advancement.create.speedometer": "Pero, ¿con qué rapidez exactamente?", + "advancement.create.speedometer.desc": "Coloca y alimenta un velocímetro. Míralo a través de las gafas para leer su valor exacto.", "advancement.create.stressometer": "Pero, ¿cuán estresado exactamente??", - "advancement.create.stressometer.desc": "Coloca y alimenta un Estresómetro. Míralo a través de las gafas para leer su valor exacto.", - "advancement.create.aesthetics": "Boom, Estética!", - "advancement.create.aesthetics.desc": "Colocar los soportes en un eje, tubo y rueda dentada.", - "advancement.create.reinforced": "Boom, Reforzado!", - "advancement.create.reinforced.desc": "Utilizar bloques de revestimiento en un eje, un tubo y una cinta.", + "advancement.create.stressometer.desc": "Coloca y alimenta un estresómetro. Míralo a través de las gafas para leer su valor exacto.", + "advancement.create.aesthetics": "Boom, ¡Estética!", + "advancement.create.aesthetics.desc": "Coloca soportes en ejes, ductos y engranajes.", + "advancement.create.reinforced": "Boom, ¡Reforzado!", + "advancement.create.reinforced.desc": "Utiliza bloques de revestimiento en un eje, un ducto y una cinta.", "advancement.create.water_wheel": "Aprovechar la hidráulica", - "advancement.create.water_wheel.desc": "Coloca una Rueda hidráulica e intenta hacerla girar.", + "advancement.create.water_wheel.desc": "Coloca una rueda hidráulica e intenta hacerla girar.", "advancement.create.chocolate_wheel": "Potencia de buen gusto", - "advancement.create.chocolate_wheel.desc": "Hacer funcionar una rueda de agua con chocolate fundido.", - "advancement.create.lava_wheel": "Rueda de Magma", + "advancement.create.chocolate_wheel.desc": "Haz funcionar una rueda de agua con chocolate fundido.", + "advancement.create.lava_wheel": "Rueda de magma", "advancement.create.lava_wheel.desc": "Esto no debió haber funcionado.", "advancement.create.cuckoo": "¿Es el momento?", - "advancement.create.cuckoo.desc": "Presenciar cómo un Reloj de cucú anuncia la hora de acostarse.", + "advancement.create.cuckoo.desc": "Presencia cómo un reloj de cuco anuncia la hora de acostarse.", "advancement.create.millstone": "Triturador de bolsillo", - "advancement.create.millstone.desc": "Colocar y alimentar una Piedra de molino.", + "advancement.create.millstone.desc": "Coloca y alimenta una piedra de molino.", "advancement.create.windmill": "Una suave brisa", - "advancement.create.windmill.desc": "Montar un molino de viento.", + "advancement.create.windmill.desc": "Monta un molino de viento.", "advancement.create.maxed_windmill": "Una fuerte brisa", - "advancement.create.maxed_windmill.desc": "Montar un molino de viento de máxima intensidad.", + "advancement.create.maxed_windmill.desc": "Monta un molino de viento con máxima intensidad.", "advancement.create.andesite_casing": "La edad de la andesita", "advancement.create.andesite_casing.desc": "Utiliza un poco de aleación de andesita y madera para crear un revestimiento básico.", "advancement.create.mechanical_drill": "Interruptores fijos", - "advancement.create.mechanical_drill.desc": "Colocar y alimentar un taladro mecánico.", + "advancement.create.mechanical_drill.desc": "Coloca y alimenta un taladro mecánico.", "advancement.create.press": "¡La prensa se pone en marcha!", "advancement.create.press.desc": "Activa una prensa mecánica y utilízala para crear algunas láminas.", "advancement.create.polished_rose_quartz": "Diamantes rosas", "advancement.create.polished_rose_quartz.desc": "Utiliza un trozo de papel de lija para pulir el cuarzo rosa hasta que se vuelva transparente.", "advancement.create.electron_tube": "Beep Boop", - "advancement.create.electron_tube.desc": "Haz algunos Tubos de Electrones, útiles en la fabricación de maquinaria menos primitiva.", + "advancement.create.electron_tube.desc": "Haz algunos tubos de electrones, útiles en la fabricación de maquinaria menos primitiva.", "advancement.create.mechanical_saw": "Picado estacionario", - "advancement.create.mechanical_saw.desc": "Colocar y alimentar una sierra mecánica.", + "advancement.create.mechanical_saw.desc": "Coloca y alimenta una sierra mecánica.", "advancement.create.basin": "Funcionamiento de la cuenca", - "advancement.create.basin.desc": "Coloca una Cuenca e intenta arrojar objetos en ella.", + "advancement.create.basin.desc": "Coloca una cuenca e intenta arrojar objetos en ella.", "advancement.create.mixer": "Mezcla de colores", - "advancement.create.mixer.desc": "Coloque una batidora mecánica sobre el lavabo, enciéndala y empiece a mezclar algunos ingredientes.", + "advancement.create.mixer.desc": "Coloca una batidora mecánica sobre el lavabo, enciéndala y empiece a mezclar algunos ingredientes.", "advancement.create.blaze_burner": "Una chimenea viva", - "advancement.create.blaze_burner.desc": "Obtener un Quemador de Blaze.", + "advancement.create.blaze_burner.desc": "Obtiene un quemador de blaze.", "advancement.create.compact": "Compactación automática", - "advancement.create.compact.desc": "Utiliza una prensa y una palangana para compactar algunos elementos.", + "advancement.create.compact.desc": "Utiliza una prensa y una cuenca para compactar algunos objetos.", "advancement.create.brass": "Aleaciones reales", - "advancement.create.brass.desc": "Utiliza Cobre molido y Zinc molido para crear algo de latón.", + "advancement.create.brass.desc": "Utiliza cobre molido y zinc molido para crear algo de latón.", "advancement.create.brass_casing": "La Edad de Latón", "advancement.create.brass_casing.desc": "Utiliza el latón recién obtenido y algo de madera para crear un revestimiento más avanzado.", "advancement.create.copper_casing": "La Edad de Cobre", "advancement.create.copper_casing.desc": "Utiliza algunas láminas de cobre y madera para crear algunos revestimientos de cobre.", "advancement.create.spout": "Sploosh", - "advancement.create.spout.desc": "Observar el llenado de un elemento fluido usando una boquilla.", + "advancement.create.spout.desc": "Observa el llenado de un fluido usando una boquilla.", "advancement.create.spout_potion": "Cervecera global", "advancement.create.spout_potion.desc": "Mira cómo un pico llena una botella con líquido de poción.", "advancement.create.chocolate": "Un mundo de imaginación", - "advancement.create.chocolate.desc": "Obtener un cubo de chocolate fundido.", + "advancement.create.chocolate.desc": "Obtiene un cubo con chocolate fundido.", "advancement.create.item_drain": "Drenaje de la ropa", - "advancement.create.item_drain.desc": "Ver cómo se vacía un elemento fluido mediante una drenadora de elementos.", - "advancement.create.chained_item_drain": "Déjalo rodar!", - "advancement.create.chained_item_drain.desc": "Observa cómo un objeto rueda por varios drenadores de elementos encadenados.", + "advancement.create.item_drain.desc": "Ve cómo se vacía un fluido mediante un drenador de objetos.", + "advancement.create.chained_item_drain": "¡Déjalo rodar!", + "advancement.create.chained_item_drain.desc": "Observa cómo un objeto rueda por varios drenadores de objetos encadenados.", "advancement.create.glass_pipe": "Espía del flujo", - "advancement.create.glass_pipe.desc": "Observe cómo se propaga el fluido a través de una tubería de fluidos con ventanas. Las tuberías de fluido rectas se convierten en ventanas cuando se utiliza una llave en ellas.", + "advancement.create.glass_pipe.desc": "Observa cómo se propaga el fluido a través de un tubo de fluidos con ventanas. Los tubos de fluido rectos se convierten en ventanas cuando se utiliza una llave inglesa en ellas.", "advancement.create.pipe_collision": "No cruzar nunca los arroyos", "advancement.create.pipe_collision.desc": "Vea cómo se unen dos fluidos en su red de tuberías.", "advancement.create.pipe_spill": "¡Hay una fuga!", "advancement.create.pipe_spill.desc": "Observe cómo un extremo abierto de una tubería toma o deposita fluidos en el mundo.", "advancement.create.hose_pulley": "Vertidos industriales", - "advancement.create.hose_pulley.desc": "Bajar una polea de manguera y ver cómo se vacía o se llena un cuerpo de líquido.", + "advancement.create.hose_pulley.desc": "Baja una polea de manguera y ve cómo se vacía o se llena un cuerpo de líquido.", "advancement.create.infinite_water": "Drenando el océano", "advancement.create.infinite_water.desc": "Bombea de una masa de agua lo suficientemente grande como para ser considerada infinita.", "advancement.create.infinite_lava": "Drenaje del núcleo de los planetas", @@ -598,55 +617,51 @@ "advancement.create.infinite_chocolate": "Ahogándose en la imaginación", "advancement.create.infinite_chocolate.desc": "Bombea desde una masa de chocolate fundido lo suficientemente grande como para ser considerado infinito.", "advancement.create.crafter": "Montaje automatizado", - "advancement.create.crafter.desc": "Coloca y alimenta algunos autoensambladores.", + "advancement.create.crafter.desc": "Coloca y alimenta algunos ensambladores.", "advancement.create.clockwork_bearing": "Artilugio a la hora", - "advancement.create.clockwork_bearing.desc": "Ensamblar una estructura montada sobre un rodamiento de relojería.", + "advancement.create.clockwork_bearing.desc": "Ensamblar una estructura montada sobre un rodamiento tipo reloj.", "advancement.create.nixie_tube": "Signos de estilo", - "advancement.create.nixie_tube.desc": "Obtener y colocar un par de Tubos Nixie.", + "advancement.create.nixie_tube.desc": "Obtener y colocar un par de tubos nixie.", "advancement.create.deployer": "Picar, colocar y atacar", - "advancement.create.deployer.desc": "Coloca y potencia un Desplegador, el reflejo perfecto de ti mismo.", + "advancement.create.deployer.desc": "Coloca y potencia un desplegador, el reflejo perfecto de ti mismo.", "advancement.create.speed_controller": "Los ingenieros lo odian!", - "advancement.create.speed_controller.desc": "Coloque un regulador de velocidad de rotación, el dispositivo definitivo para cambiar de marcha.", + "advancement.create.speed_controller.desc": "Coloca un controlador de velocidad rotacional, el dispositivo definitivo para cambiar de marcha.", "advancement.create.flywheel": "El corazón de la fábrica", - "advancement.create.flywheel.desc": "Conectar con éxito un motor a la rueda de inercia.", + "advancement.create.flywheel.desc": "Conecta con éxito un motor a la rueda de inercia.", "advancement.create.overstress_flywheel": "Altos niveles de estrés", - "advancement.create.overstress_flywheel.desc": "Sobrecargar un Motor de Horno.", - "advancement.create.integrated_circuit": "Cálculos complejos", - "advancement.create.integrated_circuit.desc": "Ensamblar un chip de circuito integrado.", - "advancement.create.mechanical_arm": "Manos ocupadas!", + "advancement.create.overstress_flywheel.desc": "Sobrecarga un motor de horno.", + "advancement.create.clockwork_component": "Complex Curiosities", + "advancement.create.clockwork_component.desc": "Assemble a Clockwork Component.", + "advancement.create.mechanical_arm": "¡Manos ocupadas!", "advancement.create.mechanical_arm.desc": "Crea un brazo mecánico, selecciona las entradas y salidas, colócalo en el suelo y dale energía; luego observa cómo hace todo el trabajo por ti.", - "advancement.create.musical_arm": "Tócame la melodía!", + "advancement.create.musical_arm": "¡Tócame la melodía!", "advancement.create.musical_arm.desc": "Vea cómo un brazo mecánico maneja su Jukebox.", "advancement.create.arm_many_targets": "Organize-o-Tron", - "advancement.create.arm_many_targets.desc": "Programar un brazo mecánico con diez o más posiciones de salida.", + "advancement.create.arm_many_targets.desc": "Programa un brazo mecánico con diez o más posiciones de salida.", "advancement.create.arm_blaze_burner": "Combust-o-Tron", - "advancement.create.arm_blaze_burner.desc": "Instruya un brazo mecánico para alimentar su Quemador de Blaze.", + "advancement.create.arm_blaze_burner.desc": "Instruya un brazo mecánico para alimentar su quemador de blaze.", "advancement.create.fist_bump": "¡Pégale, hermano!", - "advancement.create.fist_bump.desc": "Hacer que dos Desplegadores se den un puñetazo.", + "advancement.create.fist_bump.desc": "Haz que dos desplegadores se den un puñetazo.", "advancement.create.crushing_wheel": "Un par de gigantes", - "advancement.create.crushing_wheel.desc": "Crea algunas Ruedas de trituración para descomponer más materiales de forma más eficaz.", + "advancement.create.crushing_wheel.desc": "Crea algunas ruedas de trituración para descomponer más materiales de forma más eficaz.", "advancement.create.blaze_cake": "Fiebre del azúcar", - "advancement.create.blaze_cake.desc": "Hornea en tu Quemador de Blaze un pastel especial.", - "advancement.create.chromatic_compound": "Minerales bipolares", - "advancement.create.chromatic_compound.desc": "Crea una Barra de Compuesto Cromático.", + "advancement.create.blaze_cake.desc": "Hornea en tu quemador de blaze un pastel especial.", + "advancement.create.chromatic_compound": "Mysterious Minerals", + "advancement.create.chromatic_compound.desc": "Crea una barra de compuesto cromático.", "advancement.create.shadow_steel": "Retorno del vacío", - "advancement.create.shadow_steel.desc": "Crea Acero Sombrío, una barra de metal de la nada.", + "advancement.create.shadow_steel.desc": "Crea acero sombrío, una barra de metal de la nada.", "advancement.create.refined_radiance": "Brillante e inspirador", - "advancement.create.refined_radiance.desc": "Crea un Resplandor refinado, una poderosa sustancia cromática.", + "advancement.create.refined_radiance.desc": "Crea un resplandor refinado, una poderosa sustancia cromática.", "advancement.create.chromatic_age": "La edad cromática", "advancement.create.chromatic_age.desc": "Crear bloques de revestimiento de la luz y la oscuridad.", - "advancement.create.zapper": "Construir con estilo", - "advancement.create.zapper.desc": "Construye un Blockzapper. Una pistola láser radiante que te ayuda a construir.", - "advancement.create.upgraded_zapper": "Radiante sobrecarga", - "advancement.create.upgraded_zapper.desc": "Crear y activar un Blockzapper totalmente mejorado.", "advancement.create.wand_of_symmetry": "Espejos radiantes", "advancement.create.wand_of_symmetry.desc": "Crear un bastón de simetría.", - "advancement.create.deforester": "Picado radiante", - "advancement.create.deforester.desc": "Crea un Deforestador y despídete del bosque local.", - "advancement.create.extendo_grip": "Boioioing!", - "advancement.create.extendo_grip.desc": "Hazte con un Agarre extentido.", + "advancement.create.extendo_grip": "¡Boioioing!", + "advancement.create.extendo_grip.desc": "Hazte con un agarre extentido.", + "advancement.create.potato_cannon": "Fwoomp!", + "advancement.create.potato_cannon.desc": "Defeat an enemy with your Potato Cannon.", "advancement.create.dual_extendo_grip": "La última edad del boing", - "advancement.create.dual_extendo_grip.desc": "Doble Empuñadura extendida para un alcance sobrehumano.", + "advancement.create.dual_extendo_grip.desc": "Doble empuñadura extendida para un alcance sobrehumano.", "advancement.create.eob": "Fin de la beta", "advancement.create.eob.desc": "Espere más contenido aquí en el futuro. <3", @@ -656,16 +671,26 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Paletas", - "death.attack.create.crush": "%1$s se procesó por las Ruedas de trituración", + "death.attack.create.crush": "%1$s se procesó en las ruedas de trituración", "death.attack.create.fan_fire": "%1$s murió quemado por el aire caliente", "death.attack.create.fan_lava": "%1$s murió quemado por un abanico de lava", "death.attack.create.mechanical_drill": "%1$s fue empalado por un taladro mecánico", "death.attack.create.mechanical_saw": "%1$s fue cortado por la mitad por una sierra mecánica", - "death.attack.create.cuckoo_clock_explosion": "%1$s fue volado por los aires por un reloj cucú manipulado", + "death.attack.create.potato_cannon": "%1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "%1$s was shot by %2$s using %3$s", + "death.attack.create.cuckoo_clock_explosion": "%1$s fue volado por los aires por un reloj de cuco manipulado", "create.block.deployer.damage_source_name": "un Desplegador rebelde", "create.block.cart_assembler.invalid": "Coloque su Ensamblador de vagonetas en un bloque de Raíles", + "create.menu.return": "Regresar al menú", + "create.menu.configure": "Configurar...", + "create.menu.ponder_index": "Ponder Index", + "create.menu.only_ingame": "Available in the Pause Menu", + "create.menu.project_page": "Página del proyecto", + "create.menu.report_bugs": "Informar de problemas", + "create.menu.support": "Apóyenos", + "create.recipe.crushing": "Trituración", "create.recipe.milling": "Fresado", "create.recipe.fan_washing": "Lavado a granel", @@ -676,6 +701,7 @@ "create.recipe.fan_blasting.fan": "Ventilador detrás de la lava", "create.recipe.pressing": "Prensando", "create.recipe.mixing": "Mezclando", + "create.recipe.deploying": "Desplegando", "create.recipe.automatic_shapeless": "Elaboración automatizada de productos sin forma", "create.recipe.automatic_brewing": "Elaboración de cerveza automatizada", "create.recipe.packing": "Compactando", @@ -685,11 +711,20 @@ "create.recipe.automatic_shaped": "Elaboración automatizada de productos con forma", "create.recipe.block_cutting": "Corte de bloques", "create.recipe.wood_cutting": "Corte de maderas", - "create.recipe.blockzapper_upgrade": "Blockzapper", "create.recipe.sandpaper_polishing": "Pulido con papel de lija", "create.recipe.mystery_conversion": "Conversión misteriosa", "create.recipe.spout_filling": "Llenar por el pico", - "create.recipe.draining": "Drenador de elementos", + "create.recipe.draining": "Drenador de objetos", + "create.recipe.sequenced_assembly": "Sequenced Assembly", + "create.recipe.assembly.next": "Next: %1$s", + "create.recipe.assembly.step": "Step %1$s:", + "create.recipe.assembly.progress": "Progress: %1$s/%2$s", + "create.recipe.assembly.pressing": "Process in Press", + "create.recipe.assembly.spout_filling_fluid": "Spout %1$s", + "create.recipe.assembly.deploying_item": "Deploy %1$s", + "create.recipe.assembly.cutting": "Cut with Saw", + "create.recipe.assembly.repeat": "Repeat Sequence %1$s Times", + "create.recipe.assembly.junk": "Random junk", "create.recipe.processing.chance": "%1$s%% Chance", "create.recipe.heat_requirement.none": "No es necesario calentar", "create.recipe.heat_requirement.heated": "Calentado", @@ -706,7 +741,7 @@ "create.generic.unit.seconds": "Segundos", "create.generic.unit.minutes": "Minutos", "create.generic.unit.rpm": "RPM", - "create.generic.unit.stress": "su", + "create.generic.unit.stress": "SU(unidades de estrés)", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "%1$smB", "create.generic.clockwise": "En el sentido de las agujas del reloj", @@ -723,11 +758,11 @@ "create.keyinfo.scrolldown": "Simular usar la rueda del ratón hacia abajo (en el mundo)", "create.gui.scrollInput.defaultTitle": "Seleccione una opción:", - "create.gui.scrollInput.scrollToModify": "Usa la rueda del ratón para Modificar", + "create.gui.scrollInput.scrollToModify": "Usa la rueda del ratón para modificar", "create.gui.scrollInput.scrollToAdjustAmount": "Usa la rueda del ratón para ajustar la cantidad", - "create.gui.scrollInput.scrollToSelect": "Usa la rueda del ratón para Seleccionar", - "create.gui.scrollInput.shiftScrollsFaster": "Shift para usar la rueda del ratón más rápido", - "create.gui.toolmenu.focusKey": "Mantenga [%1$s] para enfocar", + "create.gui.scrollInput.scrollToSelect": "Usa la rueda del ratón para seleccionar", + "create.gui.scrollInput.shiftScrollsFaster": "[Mayús izdo.] para usar la rueda del ratón más rápido", + "create.gui.toolmenu.focusKey": "Mantén [%1$s] para enfocar", "create.gui.toolmenu.cycle": "[RUEDA DEL RATÓN] para el ciclo", "create.gui.symmetryWand.mirrorType": "Espejado", "create.gui.symmetryWand.orientation": "Orientación", @@ -739,24 +774,20 @@ "create.orientation.orthogonal": "Ortogonal", "create.orientation.diagonal": "Diagonal", "create.orientation.horizontal": "Horizontal", + "create.orientation.alongZ": "A lo largo de Z", "create.orientation.alongX": "A lo largo de X", - - "create.gui.blockzapper.title": "Blockzapper", - "create.gui.blockzapper.replaceMode": "Modo de sustitución", - "create.gui.blockzapper.searchDiagonal": "Seguir las diagonales", - "create.gui.blockzapper.searchFuzzy": "Ignorar los bordes del material", - "create.gui.blockzapper.range": "Alcance del margen de maniobra", - "create.gui.blockzapper.needsUpgradedAmplifier": "Requiere un amplificador mejorado", - "create.gui.blockzapper.patternSection": "Patrón", - "create.gui.blockzapper.pattern.solid": "Sólido", - "create.gui.blockzapper.pattern.checkered": "Tablero de ajedrez", - "create.gui.blockzapper.pattern.inversecheckered": "Tablero de ajedrez invertido", - "create.gui.blockzapper.pattern.chance25": "25% Roll", - "create.gui.blockzapper.pattern.chance50": "50% Roll", - "create.gui.blockzapper.pattern.chance75": "75% Roll", - "create.gui.terrainzapper.title": "Worldshaper", - "create.gui.terrainzapper.placement": "Colocación", + "create.gui.terrainzapper.title": "Blockzapper", + "create.gui.terrainzapper.searchDiagonal": "Seguir diagonales", + "create.gui.terrainzapper.searchFuzzy": "Ignorar los bordes del material", + "create.gui.terrainzapper.patternSection": "Patrón", + "create.gui.terrainzapper.pattern.solid": "Sólido", + "create.gui.terrainzapper.pattern.checkered": "Tablero de ajedrez", + "create.gui.terrainzapper.pattern.inversecheckered": "Tablero de ajedrez invertido", + "create.gui.terrainzapper.pattern.chance25": "25% Roll", + "create.gui.terrainzapper.pattern.chance50": "50% Roll", + "create.gui.terrainzapper.pattern.chance75": "75% Roll", + "create.gui.terrainzapper.placement": "Ubicación", "create.gui.terrainzapper.placement.merged": "Fusionado", "create.gui.terrainzapper.placement.attached": "Adjuntado", "create.gui.terrainzapper.placement.inserted": "Insertado", @@ -764,35 +795,26 @@ "create.gui.terrainzapper.brush.cuboid": "Cuboide", "create.gui.terrainzapper.brush.sphere": "Esfera", "create.gui.terrainzapper.brush.cylinder": "Cilindro", + "create.gui.terrainzapper.brush.surface": "Superficie", + "create.gui.terrainzapper.brush.cluster": "Grupo", "create.gui.terrainzapper.tool": "Herramienta", "create.gui.terrainzapper.tool.fill": "Llenar", - "create.gui.terrainzapper.tool.place": "Sitio", - "create.gui.terrainzapper.tool.replace": "Sustituir", - "create.gui.terrainzapper.tool.clear": "Borrar", - "create.gui.terrainzapper.tool.overlay": "Superposición", + "create.gui.terrainzapper.tool.place": "Ubicar", + "create.gui.terrainzapper.tool.replace": "Reemplazar", + "create.gui.terrainzapper.tool.clear": "Eliminar", + "create.gui.terrainzapper.tool.overlay": "Superponer", "create.gui.terrainzapper.tool.flatten": "Aplanar", - "create.terrainzapper.shiftRightClickToSet": "Shift+Clic con el botón derecho para seleccionar una forma", - - "create.blockzapper.usingBlock": "Utilizando: %1$s", - "create.blockzapper.componentUpgrades": "Mejoras de componentes:", - "create.blockzapper.component.body": "Cuerpo", - "create.blockzapper.component.amplifier": "Amplificador", - "create.blockzapper.component.accelerator": "Acelerador", - "create.blockzapper.component.retriever": "Recuperador", - "create.blockzapper.component.scope": "Mira telescópica", - "create.blockzapper.componentTier.none": "Ninguno", - "create.blockzapper.componentTier.brass": "Latón", - "create.blockzapper.componentTier.chromatic": "Cromático", - "create.blockzapper.leftClickToSet": "Clic izquierdo en un bloque para establecer el material", - "create.blockzapper.empty": "Sin bloques!", + "create.terrainzapper.shiftRightClickToSet": "[Mayús izdo.] + clic derecho para seleccionar una forma", + "create.terrainzapper.usingBlock": "Usando: %1$s", + "create.terrainzapper.leftClickToSet": "Clic izquierdo a un bloque para establecer el material", "create.minecart_coupling.two_couplings_max": "Las vagonetas no pueden tener más de dos enganches cada una", "create.minecart_coupling.unloaded": "Algunas partes de su tren parecen estar en chunks no cargados", "create.minecart_coupling.no_loops": "Los acoplamientos no pueden formar un bucle", "create.minecart_coupling.removed": "Se han retirado todos los acoplamientos de la vagoneta", "create.minecart_coupling.too_far": "Las vagonetas están demasiado separadas", - + "create.contraptions.movement_mode": "Modo de movimiento", "create.contraptions.movement_mode.move_place": "Colocar siempre al detenerse", "create.contraptions.movement_mode.move_place_returned": "Colocar sólo en la posición inicial", @@ -811,8 +833,8 @@ "create.contraptions.clockwork.hour_first_24": "La manecilla del día primero", "create.logistics.filter": "Filtro", - "create.logistics.recipe_filter": "Filtro de recetas", - "create.logistics.fluid_filter": "Filtro de fluidos", + "create.logistics.recipe_filter": "Filtro para recetas", + "create.logistics.fluid_filter": "Filtro para fluidos", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", "create.logistics.filter.apply": "Filtro aplicado a %1$s.", @@ -823,12 +845,14 @@ "create.gui.goggles.kinetic_stats": "Estadísticas cinéticas:", "create.gui.goggles.at_current_speed": "con la velocidad actual", "create.gui.goggles.pole_length": "Longitud del poste:", + "create.gui.goggles.fluid_container": "Información sobre el contenedor de fluidos:", + "create.gui.goggles.fluid_container.capacity": "Capacidad: ", "create.gui.assembly.exception": "Este artilugio no se pudo montar:", "create.gui.assembly.exception.unmovableBlock": "Bloque inamovible (%4$s) en [%1$s,%2$s,%3$s]", "create.gui.assembly.exception.chunkNotLoaded": "El bloque en [%1$s,%2$s,%3$s] no estaba en un chunk cargado", "create.gui.assembly.exception.structureTooLarge": "Hay demasiados bloques incluídos en el artilugio.\nEl máximo configurado es: %1$s", "create.gui.assembly.exception.tooManyPistonPoles": "Hay demasiadas Pértigas de extensión conectadas a este Pistón.\nEl máximo configurado es: %1$s", - "create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el Pistón", + "create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el pistón", "create.gui.assembly.exception.not_enough_sails": "La estructura adjunta no incluye suficientes bloques tipo vela: %1$s\nSe requiere un mínimo de %2$s", "create.gui.gauge.info_header": "Información sobre el medidor:", "create.gui.speedometer.title": "Velocidad de rotación", @@ -837,7 +861,7 @@ "create.gui.stressometer.overstressed": "Sobrecargado", "create.gui.stressometer.no_rotation": "Sin rotación", "create.gui.contraptions.not_fast_enough": "Parece que este %1$s no está girando con _suficiente_ velocidad_.", - "create.gui.contraptions.network_overstressed": "Parece que este artilugio está _sobrecargado_. Añade más fuentes o _desacelera_ los componentes con un _impacto_ de alto estrés.", + "create.gui.contraptions.network_overstressed": "Parece que este artilugio está _sobrecargado_. Añade más fuentes o _desacelera_ los componentes con un _impacto de estrés alto_.", "create.gui.adjustable_crate.title": "Caja ajustable", "create.gui.adjustable_crate.storageSpace": "Espacio de almacenamiento", "create.gui.stockpile_switch.title": "Interruptor de acopio", @@ -857,7 +881,7 @@ "create.gui.sequenced_gearshift.instruction.delay.duration": "Duración", "create.gui.sequenced_gearshift.instruction.end.descriptive": "Fin", "create.gui.sequenced_gearshift.instruction.end": "Fin", - "create.gui.sequenced_gearshift.instruction.await.descriptive": "En espera de un Pulso de Redstone", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "En espera de un pulso de redstone", "create.gui.sequenced_gearshift.instruction.await": "En espera", "create.gui.sequenced_gearshift.speed": "Velocidad, Dirección", "create.gui.sequenced_gearshift.speed.forward": "Velocidad de entrada, hacia adelante", @@ -868,7 +892,7 @@ "create.schematicAndQuill.dimensions": "Tamaño del esquema: %1$sx%2$sx%3$s", "create.schematicAndQuill.firstPos": "Primera posición fijada.", "create.schematicAndQuill.secondPos": "Segunda posición fijada.", - "create.schematicAndQuill.noTarget": "Mantenga [Ctrl] para seleccionar los bloques del aire.", + "create.schematicAndQuill.noTarget": "Mantén [Ctrl] para seleccionar los bloques del aire.", "create.schematicAndQuill.abort": "Selección eliminada.", "create.schematicAndQuill.title": "Nombre del esquema:", "create.schematicAndQuill.convert": "Guardar y desplegar inmediatamente", @@ -884,7 +908,7 @@ "create.schematic.rotation.cw270": "En el sentido de las agujas del reloj 270", "create.schematic.mirror": "Espejado", "create.schematic.mirror.none": "Ninguno", - "create.schematic.mirror.frontBack": "Delante-detrás", + "create.schematic.mirror.frontBack": "Delante-Detrás", "create.schematic.mirror.leftRight": "Izquierda-Derecha", "create.schematic.tool.deploy": "Despliegue", "create.schematic.tool.move": "Mover XZ", @@ -893,27 +917,27 @@ "create.schematic.tool.print": "Imprimir", "create.schematic.tool.flip": "Voltear", "create.schematic.tool.deploy.description.0": "Mueve la estructura a un lugar.", - "create.schematic.tool.deploy.description.1": "Haga clic con el botón derecho del ratón en el suelo para colocar.", - "create.schematic.tool.deploy.description.2": "Mantenga [Ctrl] para seleccionar a una distancia fija.", - "create.schematic.tool.deploy.description.3": "[Ctrl]-Rueda del ratón para cambiar la distancia.", + "create.schematic.tool.deploy.description.1": "Haz clic con el botón derecho del ratón en el suelo para colocarla.", + "create.schematic.tool.deploy.description.2": "Mantén [Ctrl] para seleccionar a una distancia fija.", + "create.schematic.tool.deploy.description.3": "[Ctrl] + [RUEDA DEL RATÓN] para cambiar la distancia.", "create.schematic.tool.move.description.0": "Desplaza el esquema horizontalmente.", - "create.schematic.tool.move.description.1": "Apunta al Esquema y [CTRL]-Rueda del ratón para ponerlo.", + "create.schematic.tool.move.description.1": "Apunta al esquema y [Ctrl] + [RUEDA DEL RATÓN] para ponerlo.", "create.schematic.tool.move.description.2": "", "create.schematic.tool.move.description.3": "", "create.schematic.tool.movey.description.0": "Desplaza el esquema verticalmente..", - "create.schematic.tool.movey.description.1": "[CTRL]-Rueda del ratón para moverlo hacia arriba/abajo.", + "create.schematic.tool.movey.description.1": "[Ctrl] + [RUEDA DEL RATÓN] para moverlo hacia arriba/abajo.", "create.schematic.tool.movey.description.2": "", "create.schematic.tool.movey.description.3": "", "create.schematic.tool.rotate.description.0": "Gira el esquema alrededor de su centro.", - "create.schematic.tool.rotate.description.1": "[CTRL]-Rueda del ratón para girar 90 grados.", + "create.schematic.tool.rotate.description.1": "[Ctrl] + [RUEDA DEL RATÓN] para girar 90 grados.", "create.schematic.tool.rotate.description.2": "", "create.schematic.tool.rotate.description.3": "", "create.schematic.tool.print.description.0": "Sitúa instantáneamente la estructura en el mundo.", "create.schematic.tool.print.description.1": "[Clic derecho] para confirmar la colocación en el lugar actual.", "create.schematic.tool.print.description.2": "Esta herramienta es sólo para el Modo Creativo.", "create.schematic.tool.print.description.3": "", - "create.schematic.tool.flip.description.0": "Voltea el Esquema a lo largo de la cara que seleccione.", - "create.schematic.tool.flip.description.1": "Apunta al esquema y [CTRL]-Rueda del ratón para voltearlo.", + "create.schematic.tool.flip.description.0": "Voltea el esquema a lo largo de la cara que seleccione.", + "create.schematic.tool.flip.description.1": "Apunta al esquema y [Ctrl] + [RUEDA DEL RATÓN] para voltearlo.", "create.schematic.tool.flip.description.2": "", "create.schematic.tool.flip.description.3": "", @@ -927,8 +951,8 @@ "create.gui.schematicTable.availableSchematics": "Esquemas disponibles", "create.gui.schematicTable.noSchematics": "No hay esquemas guardados", "create.gui.schematicTable.uploading": "Subiendo...", - "create.gui.schematicTable.finished": "Subida finalizada!", - "create.gui.schematicannon.title": "Schematicannon", + "create.gui.schematicTable.finished": "¡Subida finalizada!", + "create.gui.schematicannon.title": "Cañón de esquemas", "create.gui.schematicannon.listPrinter": "Lista de control de la impresora", "create.gui.schematicannon.gunpowderLevel": "Pólvora %1$s%%", "create.gui.schematicannon.shotsRemaining": "Disparos restantes: %1$s", @@ -946,16 +970,16 @@ "create.gui.schematicannon.slot.listPrinter": "Coloque los libros aquí para imprimir una lista de comprobación para su esquema", "create.gui.schematicannon.slot.schematic": "Añada su esquema aquí. Asegúrese de que se despliega en un lugar específico.", "create.gui.schematicannon.option.skipMissing.description": "Si el cañón no encuentra un bloque necesario para su colocación, continuará en la siguiente ubicación.", - "create.gui.schematicannon.option.skipTileEntities.description": "El cañón evitará reemplazar los bloques que contienen datos, como los Cofres.", + "create.gui.schematicannon.option.skipTileEntities.description": "El cañón evitará reemplazar los bloques que contienen datos, como los cofres.", "create.gui.schematicannon.option.dontReplaceSolid.description": "El cañón nunca sustituirá ningún bloque sólido en su zona de trabajo, sólo los no sólidos y el aire.", "create.gui.schematicannon.option.replaceWithSolid.description": "El cañón sólo reemplazará los bloques sólidos en su área de trabajo si el esquema contiene un bloque sólido en la ubicación.", "create.gui.schematicannon.option.replaceWithAny.description": "El cañón reemplazará los bloques sólidos en su área de trabajo si el esquema contiene algún bloque en la ubicación.", - "create.gui.schematicannon.option.replaceWithEmpty.description": "El cañón eliminará todos los bloques de su zona de trabajo, incluidos los sustituidos por Aire.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "El cañón eliminará todos los bloques de su zona de trabajo, incluidos los sustituidos por aire.", "create.schematicannon.status.idle": "Inactivo", "create.schematicannon.status.ready": "Listo", "create.schematicannon.status.running": "Funcionando", - "create.schematicannon.status.finished": "Finished", + "create.schematicannon.status.finished": "Finalizado", "create.schematicannon.status.paused": "Pausado", "create.schematicannon.status.stopped": "Detenido", "create.schematicannon.status.noGunpowder": "Sin pólvora", @@ -974,9 +998,9 @@ "create.materialChecklist.blocksNotLoaded": "* Descargo de Responsabilidad *\n\nLa lista de materiales puede ser inexacta debido a que no se han cargado los chunks pertinentes.", "create.gui.filter.deny_list": "Lista de denegados", - "create.gui.filter.deny_list.description": "Los elementos pasan si NO coinciden con ninguno de los anteriores. Una lista de denegación vacía acepta todo.", + "create.gui.filter.deny_list.description": "Los objetos pasan si NO coinciden con ninguno de los anteriores. Una lista de denegación vacía acepta todo.", "create.gui.filter.allow_list": "Lista de permitidos", - "create.gui.filter.allow_list.description": "Los elementos pasan si coinciden con alguno de los anteriores. Una lista de permitidos vacía rechaza todo.", + "create.gui.filter.allow_list.description": "Los objetos pasan si coinciden con alguno de los anteriores. Una lista de permitidos vacía rechaza todo.", "create.gui.filter.respect_data": "Respetar datos", "create.gui.filter.respect_data.description": "Los objetos sólo coinciden si su durabilidad, encantos y otros atributos también coinciden.", "create.gui.filter.ignore_data": "Ignorar datos", @@ -1016,6 +1040,10 @@ "create.item_attributes.added_by.inverted": "no fue añadida por %1$s", "create.item_attributes.has_enchant": "está encantado con %1$s", "create.item_attributes.has_enchant.inverted": "no está encantado con %1$s", + "create.item_attributes.color": "Está teñido %1$s", + "create.item_attributes.color.inverted": "No está teñido %1$s", + "create.item_attributes.max_enchanted": "está encantado en el nivel máximo", + "create.item_attributes.max_enchanted.inverted": "no está encantado en el nivel máximo", "create.item_attributes.has_fluid": "contiene %1$s", "create.item_attributes.has_fluid.inverted": "no contiene %1$s", "create.item_attributes.has_name": "tiene el nombre personalizado %1$s", @@ -1044,16 +1072,16 @@ "create.gui.attribute_filter.add_attribute": "Añadir atributo a la lista", "create.gui.attribute_filter.add_inverted_attribute": "Añadir atributo invertido a la Lista", "create.gui.attribute_filter.allow_list_disjunctive": "Lista de permitidos (Cualquiera)", - "create.gui.attribute_filter.allow_list_disjunctive.description": "Los elementos pasan si tienen alguno de los atributos seleccionados", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Los objetos pasan si tienen alguno de los atributos seleccionados", "create.gui.attribute_filter.allow_list_conjunctive": "Lista de permitidos (Todos)", - "create.gui.attribute_filter.allow_list_conjunctive.description": "Los elementos pasan sólo si tienen TODOS los atributos seleccionados", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Los objetos pasan sólo si tienen TODOS los atributos seleccionados", "create.gui.attribute_filter.deny_list": "Lista de denegados", - "create.gui.attribute_filter.deny_list.description": "Los elementos pasan si NO tienen ninguno de los atributos seleccionados", + "create.gui.attribute_filter.deny_list.description": "Los objetos pasan si NO tienen ninguno de los atributos seleccionados", "create.gui.attribute_filter.add_reference_item": "Añadir elemento de referencia", - "create.tooltip.holdKey": "Mantener [%1$s]", - "create.tooltip.holdKeyOrKey": "Mantener [%1$s] o [%2$s]", - "create.tooltip.keyShift": "Shift", + "create.tooltip.holdForDescription": "Mantén [%1$s] para mas información", + "create.tooltip.holdForControls": "Mantén [%1$s] para ver los controles", + "create.tooltip.keyShift": "Mayús izdo.", "create.tooltip.keyCtrl": "Ctrl", "create.tooltip.speedRequirement": "Requisitos de velocidad: %1$s", "create.tooltip.speedRequirement.none": "Ninguno", @@ -1068,20 +1096,25 @@ "create.tooltip.capacityProvided.low": "Pequeña", "create.tooltip.capacityProvided.medium": "Media", "create.tooltip.capacityProvided.high": "Grande", - "create.tooltip.capacityProvided.asGenerator": "(Como generador)", - "create.tooltip.generationSpeed": "Genera en %1$s %2$s", + "create.tooltip.generationSpeed": "Generada en %1$s %2$s", "create.tooltip.analogStrength": "Fuerza analógica: %1$s/15", - "create.mechanical_arm.extract_from": "Extraer elementos de %1$s", - "create.mechanical_arm.deposit_to": "Depositar elementos en %1$s", + "create.mechanical_arm.extract_from": "Extraer objetos de %1$s", + "create.mechanical_arm.deposit_to": "Depositar objetos en %1$s", "create.mechanical_arm.summary": "El brazo mecánico tiene %1$s entrada(s) y %2$s salida(s)", "create.mechanical_arm.points_outside_range": "%1$s punto(s) de interacción seleccionado(s) eliminado(s) debido a las limitaciones de rango", + "create.weighted_ejector.target_set": "Objetivo seleccionado", + "create.weighted_ejector.target_not_valid": "Expulsión al bloque adyacente (el objetivo no era válido)", + "create.weighted_ejector.no_target": "Expulsión al bloque adyacente (no se ha seleccionado ningún objetivo)", + "create.weighted_ejector.targeting": "Expulsión a [%1$s,%2$s,%3$s]", + "create.weighted_ejector.stack_size": "Tamaño de la pila expulsada", + "create.logistics.when_multiple_outputs_available": "Cuando hay múltiples salidas disponibles", "create.mechanical_arm.selection_mode.round_robin": "Round Robin", "create.mechanical_arm.selection_mode.forced_round_robin": "Round Robin forzado", - "create.mechanical_arm.selection_mode.prefer_first": "Preferir el primer objetivo", + "create.mechanical_arm.selection_mode.prefer_first": "Preferir el primero", "create.tunnel.selection_mode.split": "División", "create.tunnel.selection_mode.forced_split": "División forzada", @@ -1092,8 +1125,8 @@ "create.tunnel.selection_mode.synchronize": "Sincronizar entradas", "create.tooltip.chute.header": "Información del ducto", - "create.tooltip.chute.items_move_down": "Los elementos se mueven hacia abajo", - "create.tooltip.chute.items_move_up": "Los elementos se mueven hacia arriba", + "create.tooltip.chute.items_move_down": "Los objetos se mueven hacia abajo", + "create.tooltip.chute.items_move_up": "Los objetos se mueven hacia arriba", "create.tooltip.chute.no_fans_attached": "No hay ventiladores adjuntos", "create.tooltip.chute.fans_push_up": "Los ventiladores empujan desde abajo", "create.tooltip.chute.fans_push_down": "Los ventiladores empujan desde arriba", @@ -1101,19 +1134,29 @@ "create.tooltip.chute.fans_pull_down": "Los ventiladores tiran desde abajo", "create.tooltip.chute.contains": "Contiene: %1$s x%2$s", - "create.hint.hose_pulley.title": "Suministro sin fondo", - "create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita", - "create.hint.mechanical_arm_no_targets.title": "No hay objetivos", - "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona correas, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_.", - "create.hint.horizontal_funnel.title": "Embudos horizontales", - "create.hint.horizontal_funnel": "No puede transferir entre inventarios _directamente_. Intenta pasar una _correa_ o un _depósito_ por debajo de tu embudo para extraer artículos de los inventarios", - "create.hint.upward_funnel.title": "Embudos hacia arriba", - "create.hint.upward_funnel": "sólo pueden transferir objetos insertados por _brazos_, y _ductos_ impulsados por ventilador, o elementos _lanzados_ hacia ellos. Intenta construir algunos _ductos_ si quieres mover tus objetos _verticalmente_", - "create.hint.empty_bearing.title": "Rodamiento de reloj", - "create.hint.empty_bearing": "_Haz clic con el botón derecho del ratón_ en el rodamiento con la _mano vacía_ para _adherir_ la estructura que acabas de construir delante de él", - "create.hint.full_deployer.title": "Desbordamiento de elementos del desplegador", - "create.hint.full_deployer": "Parece que este _Desplegador_ contiene _elementos_ en exceso que necesitan ser _extraídos._ Usa un _tolva,_embudo_ u otro medio para liberarlo de su desbordamiento.", + "create.linked_controller.bind_mode": "Modo de enlace activo", + "create.linked_controller.press_keybind": "Presiona %1$s, %2$s, %3$s, %4$s, %5$s o %6$s, para vincular esta frecuencia a la tecla correspondiente", + "create.linked_controller.key_bound": "Frecuencia ligada a %1$s", + "create.linked_controller.frequency_slot_1": "Enlace de teclas: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "Enlace de teclas: %1$s, Freq. #2", + "create.crafting_blueprint.crafting_slot": "Ranura para ingredientes", + "create.crafting_blueprint.filter_items_viable": "Los objetos del filtro avanzado son viables", + "create.crafting_blueprint.display_slot": "Ranura de pantalla", + "create.crafting_blueprint.inferred": "A partir de la receta", + "create.crafting_blueprint.manually_assigned": "Asignado manualmente", + "create.crafting_blueprint.secondary_display_slot": "Ranura de pantalla secundaria", + "create.crafting_blueprint.optional": "Opcional", + + "create.hint.hose_pulley.title": "Suministro ilimitado", + "create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita.", + "create.hint.mechanical_arm_no_targets.title": "Sin objetivos", + "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún objetivo. Selecciona _correas_, _depósitos_, _embudos_ y otros bloques haciendo clic derecho sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu mano..", + "create.hint.empty_bearing.title": "Actualización del rodamiento", + "create.hint.empty_bearing": "Haz clic derecho sobre el rodamiento con la _mano vacía_ para _adjuntar_ la estructura que acabas de construir delante de él.", + "create.hint.full_deployer.title": "Exceso de objetos en el desplegador", + "create.hint.full_deployer": "Parece que este _desplegador_ contiene _exceso_ de objetos que necesitan ser _extraídos._ Usa una _tolva_, _embudo_ u otro medio para liberarlo de su excedente.", + "create.gui.config.overlay1": "Hola :)", "create.gui.config.overlay2": "Esta es una muestra de la superposición", "create.gui.config.overlay3": "Haga clic o arrastre con el ratón", @@ -1127,20 +1170,50 @@ "create.command.killTPSCommand.status.slowed_by.0": "[Crear]: El tick del servidor está actualmente ralentizado en %s ms :o", "create.command.killTPSCommand.status.slowed_by.1": "[Crear]: El tick del servidor está ralentizado en %s ms ahora >:)", "create.command.killTPSCommand.status.slowed_by.2": "[Create]: El tick del servidor ha vuelto a su velocidad normal :D", - "create.command.killTPSCommand.status.usage.0": "[Create]: usar /killtps stop para que el servidor vuelva a la velocidad normal", - "create.command.killTPSCommand.status.usage.1": "[Create]: usar /killtps start para ralentizar artificialmente el tick del servidor", + "create.command.killTPSCommand.status.usage.0": "[Create]: usa /killtps stop para que el servidor vuelva a la velocidad normal", + "create.command.killTPSCommand.status.usage.1": "[Create]: usa /killtps start para ralentizar artificialmente el tick del servidor", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", - "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", - "create.subtitle.slime_added": "Slime aplastado", - "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", - "create.subtitle.mechanical_press_item_break": "Clanks de metal", - "create.subtitle.blockzapper_place": "Los bloques se colocan en su sitio", - "create.subtitle.blockzapper_confirm": "Ding afirmativo", - "create.subtitle.blockzapper_deny": "Boop declinante", - "create.subtitle.block_funnel_eat": "CHOMPS del embudo", - "create.subtitle.blaze_munch": "Blaze mastica felizmente", + "create.contraption.minecart_contraption_too_big": "Este artilugio de vagoneta parece demasiado grande para recogerlo", + "create.contraption.minecart_contraption_illegal_pickup": "Una fuerza mística está atando este artilugio de vagoneta al mundo", + + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.contraption_disassemble": "", + "create.subtitle.peculiar_bell_use": "", + "create.subtitle.mixing": "", + "create.subtitle.mechanical_press_activation_belt": "", + "create.subtitle.fwoomp": "", + "create.subtitle.worldshaper_place": "", + "create.subtitle.depot_slide": "", + "create.subtitle.saw_activate_stone": "", + "create.subtitle.blaze_munch": "", + "create.subtitle.funnel_flap": "", + "create.subtitle.schematicannon_finish": "", + "create.subtitle.scroll_value": "", + "create.subtitle.crafter_craft": "", + "create.subtitle.controller_put": "", + "create.subtitle.cranking": "", + "create.subtitle.wrench_remove": "", + "create.subtitle.cogs": "", + "create.subtitle.slime_added": "", + "create.subtitle.wrench_rotate": "", + "create.subtitle.potato_hit": "", + "create.subtitle.saw_activate_wood": "", + "create.subtitle.deployer_polish": "", + "create.subtitle.deny": "", + "create.subtitle.controller_click": "", + "create.subtitle.schematicannon_launch_block": "", + "create.subtitle.copper_armor_equip": "", + "create.subtitle.cursed_bell_use": "", + "create.subtitle.cursed_bell_convert": "", + "create.subtitle.controller_take": "Lectern empties", + "create.subtitle.mechanical_press_activation": "", + "create.subtitle.contraption_assemble": "", + "create.subtitle.crafter_click": "", + "create.subtitle.depot_plop": "", + "create.subtitle.confirm": "", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1151,654 +1224,1035 @@ "item.create.example_item.tooltip.behaviour1": "Entonces este elemento hace esto. (los comportamientos se muestran en el turno)", "item.create.example_item.tooltip.condition2": "Y cuando esto", "item.create.example_item.tooltip.behaviour2": "Puedes añadir tantos comportamientos como quieras", - "item.create.example_item.tooltip.control1": "Cuando se pulsa Ctrl", + "item.create.example_item.tooltip.control1": "Cuando se pulsa [Ctrl]", "item.create.example_item.tooltip.action1": "Se muestran estos controles", - "block.create.andesite_encased_shaft.tooltip": "EJE REVESTIDO DE ANDESITA", - "block.create.andesite_encased_shaft.tooltip.summary": "Elemento _sólo para el modo creativo_. Reviste los _ejes_ en el mundo usando _revestimiento de andesita_. Los bloques de revestimiento _no se consumirán_.", - - "block.create.brass_encased_shaft.tooltip": "EJE REVESTIDO DE LATÓN", - "block.create.brass_encased_shaft.tooltip.summary": "Elemento _sólo para el modo creativo_. Reviste los _ejes_ en el mundo usando _revestimiento de latón_. Los bloques de revestimiento _no se consumirán_.", - "block.create.wooden_bracket.tooltip": "SOPORTE DE MADERA PARA EJES", - "block.create.wooden_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un refuerzo acogedor y de madera.", + "block.create.wooden_bracket.tooltip.summary": "Decora tus _ejes_, _engranajes_ y _ductos_ con un acogedor refuerzo de madera.", "block.create.metal_bracket.tooltip": "SOPORTE DE METAL PARA EJES", - "block.create.metal_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un poco de refuerzo industrial robusto.", - - "block.create.andesite_casing.tooltip": "REVESTIDOR DE ANDESITA", - "block.create.andesite_casing.tooltip.summary": "Máquina de revestimiento simple con una variedad de usos. Seguro para la decoración. Puede utilizarse para _revestir ejes_ y _cintas._", - - "block.create.andesite_funnel.tooltip": "EMBUDO DE ANDESITA", - "block.create.andesite_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_.", - "block.create.andesite_funnel.tooltip.condition1": "Comportamiento general", - "block.create.andesite_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo", - "block.create.andesite_funnel.tooltip.condition2": "Cuando se montan en cintas, depósitos y similares", - "block.create.andesite_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave.", - "block.create.andesite_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", - "block.create.andesite_funnel.tooltip.behaviour3": "Transferirá los artículos hacia abajo, como una tolva sin búfer.", - - "block.create.andesite_tunnel.tooltip": "TÚNEL DE ANDESITA", - "block.create.andesite_tunnel.tooltip.summary": "¡Una cubierta protectora para sus _cintas_!. El _Túnel de Andesita_ puede separar un elemento de una pila cuando se coloca otra cinta o depósito al lado de la cinta principal.", - "block.create.andesite_tunnel.tooltip.control1": "Click derecho con la Llave Inglesa en el lateral", - "block.create.andesite_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", - - "block.create.brass_funnel.tooltip": "EMBUDO DE LATÓN", - "block.create.brass_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_. Viene con un práctico _filtro_.", - "block.create.brass_funnel.tooltip.condition1": "Comportamiento General", - "block.create.brass_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo.", - "block.create.brass_funnel.tooltip.condition2": "Cuando se montan en cintas, depósitos y similares", - "block.create.brass_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave Inglesa.", - "block.create.brass_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", - "block.create.brass_funnel.tooltip.behaviour3": "Transfiere los artículos hacia abajo, como una tolva sin búfer.", - - "block.create.brass_tunnel.tooltip": "TÚNEL DE LATÓN", - "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _cintas_. Los _Túneles de latón_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", - "block.create.brass_tunnel.tooltip.condition1": "Cuando se colocan uno al lado del otro", - "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de latón se conectan entre sí y permiten redirigir el contenido de una cinta a otra.", - "block.create.brass_tunnel.tooltip.condition2": "Filtrado", - "block.create.brass_tunnel.tooltip.behaviour2": "Los _Túneles de latón_ vienen con filtros tanto para la _Entrada_ como para la _Salida_. Si un _Elemento_ no está permitido desde la salida filtrada de un _Túnel_ será transferido a la salida de un _Túnel_ conectado.", - "block.create.brass_tunnel.tooltip.condition3": "Dividiendo", - "block.create.brass_tunnel.tooltip.behaviour3": "Los _Túneles de latón_ pueden ser configurados para cambiar el método en el que los _Elementos_ son ordenados en los _Túneles_ conectados.", - "block.create.brass_tunnel.tooltip.control1": "Cuando haces click derecho con una Llave Inglesa", - "block.create.brass_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", - "block.create.brass_tunnel.tooltip.control2": "Usa la rueda del ratón con la Llave Inglesa en la parte superior", - "block.create.brass_tunnel.tooltip.action2": "Cambiar el método de división de los _Túneles_ conectados.", - - "block.create.copper_casing.tooltip": "REVESTIDOR DE COBRE", - "block.create.copper_casing.tooltip.summary": "Robusta máquina de revestimientos con una gran variedad de usos. Seguro para la decoración.", - "block.create.copper_casing.tooltip.condition1": "Cuando se utiliza en una tubería de fluidos", - "block.create.copper_casing.tooltip.behaviour1": "_Reviste_ la _Tubería de fluidos_ con _Revestimiento de cobre_. Las tuberías de fluidos revestidas _bloquean sus conexiones_ en su lugar, dejando de reaccionar a los cambios en las tuberías vecinas.", - - "block.create.encased_fluid_pipe.tooltip": "TUBO DE FLUIDOS REFORZADO", - "block.create.encased_fluid_pipe.tooltip.summary": "Un tubo de fluidos reforzado con más cobre.", - - "block.create.copper_valve_handle.tooltip": "ASA DE VÁLVULA DE COBRE", - "block.create.copper_valve_handle.tooltip.summary": "Una precisa _fuente_ de _fuerza de rotación_ que requiere la interacción de los jugadores. ¡Ten cuidado de no agotarte!", - "block.create.copper_valve_handle.tooltip.condition1": "Cuando se utiliza", - "block.create.copper_valve_handle.tooltip.behaviour1": "Proporciona _Fuerza de rotación_ a un artilugio acoplado. _Shift_ para _invertir_ la rotación.", + "block.create.metal_bracket.tooltip.summary": "Decora tus _ejes_, _engranajes_ y _ductos_ con un poco de refuerzo industrial robusto.", "block.create.seat.tooltip": "ASIENTO", - "block.create.seat.tooltip.summary": "¡Siéntate y disfruta del viaje! Anclará a un jugador en un _contrafuerte_ en movimiento. También es ideal para los muebles estáticos. Viene en una variedad de colores.", - "block.create.seat.tooltip.condition1": "Click derecho en el asiento", - "block.create.seat.tooltip.behaviour1": "Sienta al jugador en el _Asiento_. Pulsa shift izquierdo para dejar el _Asiento_.", - - "block.create.chute.tooltip": "DUCTO", - "block.create.chute.tooltip.summary": "_Recoge_ y _Transporta_ elementos en vertical o en diagonal. Puede tanto coger como colocar objetos en _contenedores de objetos_. También puede interactuar con los ductos desde el lateral utilizando _tolvas_ o _embudos montados_.", - "block.create.chute.tooltip.condition1": "Cuando se alimenta con un ventilador", - "block.create.chute.tooltip.behaviour1": "Los ductos accionados por ventilador pueden transportar _elementos_ hacia arriba, y aspirar _elementos_ de los _depósitos_ y de las _cintas_.", - - "block.create.depot.tooltip": "DEPÓSITO", - "block.create.depot.tooltip.summary": "Un lugar práctico para colocar sus _elementos_. Proporciona un punto de interacción para varias máquinas", - "block.create.depot.tooltip.condition1": "Click derecho en el depósito", - "block.create.depot.tooltip.behaviour1": "Coloca o toma un _Elemento_ del _Depósito_. Los _Bloques_ y los _Artilugios_ que interactúan con una _cinta_ también funcionan en un _Depósito_.", + "block.create.seat.tooltip.summary": "¡Siéntate y disfruta del viaje! Anclará a un jugador en un artilugio en movimiento. También es ideal para muebles estáticos. Viene en una variedad de colores.", + "block.create.seat.tooltip.condition1": "Cuando se hace clic derecho en el asiento", + "block.create.seat.tooltip.behaviour1": "Sienta al jugador en el _asiento_. Pulsa [Mayús izdo.] para dejar el asiento.", "item.create.blaze_cake.tooltip": "PASTEL DE BLAZE", - "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para sus esforzados _Quemadores de blaze_. Los pone en marcha!.", - - "item.create.empty_blaze_burner.tooltip": "QUEMADOR DE BLAZE VACÍO", - "item.create.empty_blaze_burner.tooltip.summary": "Un pequeño hogar de hierro para tus amigos fogosos. Estoy seguro de que podrías darles un buen uso.", - "item.create.empty_blaze_burner.tooltip.condition1": "Cuando se utiliza en un Blaze o en un generador de Blaze", - "item.create.empty_blaze_burner.tooltip.behaviour1": "_Captura_ un Blaze en el elemento", - - "block.create.fluid_pipe.tooltip": "TUBERÍA DE FLUIDOS DE COBRE", - "block.create.fluid_pipe.tooltip.summary": "Se utiliza para mover _fluidos_. Necesita una _bomba mecánica_ para que el _fluido_ se mueva.", - "block.create.fluid_pipe.tooltip.condition1": "Transferencia de fluidos", - "block.create.fluid_pipe.tooltip.behaviour1": "Puede conectarse a _contenedores de fluidos_ como _depósitos_ o _cuencas_. Los extremos expuestos de los _tubos_ también pueden drenar o colocar bloques de fluido. ¡Cuidado con las fugas!", - "block.create.fluid_pipe.tooltip.control1": "Cuando haces clic derecho con una Llave Inglesa", - "block.create.fluid_pipe.tooltip.action1": "Coloca una ventana en la tubería si está disponible", - - "block.create.hose_pulley.tooltip": "POLEA DE MANGUERA", - "block.create.hose_pulley.tooltip.summary": "Se utiliza para _colocar_ o _drenar_ grandes _cuerpos fluidos_ en el mundo", - "block.create.hose_pulley.tooltip.condition1": "Cuando se alimenta por cinética", - "block.create.hose_pulley.tooltip.behaviour1": "_Sube_ o _baja_ la manguera, la ubicación de la manguera determina hasta qué _altura de extracción_ o _llenado_ actuará.", - "block.create.hose_pulley.tooltip.condition2": "Cuando los fluidos se extraen de la polea", - "block.create.hose_pulley.tooltip.behaviour2": "Comienza a _tomar bloques de fluidos_ del cuerpo al que se bajó el extremo de la manguera. Los cuerpos muy _grandes_ de fluidos se _considerarán infinitos_.", - "block.create.hose_pulley.tooltip.condition3": "Cuando los fluidos son empujados a la polea", - "block.create.hose_pulley.tooltip.behaviour3": "Comienza a _llenar de fluido_ el mundo hasta la _altura_ de los extremos de la _manguera_", - - "block.create.fluid_tank.tooltip": "TANQUE DE FLUIDOS", - "block.create.fluid_tank.tooltip.summary": "Almacena todos tus _líquidos_ favoritos. Escala en anchura y altura.", - "block.create.fluid_tank.tooltip.condition1": "Cuando se hace click derecho con la Llave Inglesa", - "block.create.fluid_tank.tooltip.behaviour1": "Cambia la ventana opcional", - - "block.create.creative_fluid_tank.tooltip": "TANQUE DE FLUIDOS CREATIVO", - "block.create.creative_fluid_tank.tooltip.summary": "Este _Tanque de Fluidos_ permite la replicación infinita de cualquier Fluido. Escala en anchura y altura.", - "block.create.creative_fluid_tank.tooltip.condition1": "Cuando hay fluido en el tanque", - "block.create.creative_fluid_tank.tooltip.behaviour1": "Todo lo que se _extraiga_ de este tanque proporcionará un _suministro ilimitado_ del fluido especificado. Los fluidos _insertados_ en este tanque serán _evitados._", - "block.create.creative_fluid_tank.tooltip.condition2": "Cuando se hace clic derecho con una Llave Inglesa", - "block.create.creative_fluid_tank.tooltip.behaviour2": "Cambia la ventana opcional", - - "block.create.fluid_valve.tooltip": "VALVULA DE FLUIDOS", - "block.create.fluid_valve.tooltip.summary": "Detiene el flujo de un fluido por una tubería", - "block.create.fluid_valve.tooltip.condition1": "Flujo controlable", - "block.create.fluid_valve.tooltip.behaviour1": "La _fuerza de rotación_ aplicada obligará a la _válvula_ a cerrarse, cesando el flujo de _fluidos_. Invierta la dirección de la _fuerza de rotación_ para volver a abrir la válvula", - - "block.create.mechanical_pump.tooltip": "BOMBA MECÁNICA", - "block.create.mechanical_pump.tooltip.summary": "Toma la _fuerza de rotación_ y la utiliza para mover el _fluido_ a lo largo de un _tubo_. Tiene un rango máximo de efecto en ambas direcciones. (16 bloques por defecto)", - "block.create.mechanical_pump.tooltip.condition1": "Flujo de fluido", - "block.create.mechanical_pump.tooltip.behaviour1": "La _fuerza de rotación_ aplicada crea una presión que obliga al _fluido_ a pasar por la red de _tuberías_. Invierte la dirección de la _fuerza de rotación_ para cambiar la dirección en la que fluye el _fluido_", - "block.create.mechanical_pump.tooltip.control1": "Pulsando con el botón derecho del ratón con la Llave Inglesa", - "block.create.mechanical_pump.tooltip.action1": "Invierte la dirección de la _bomba_, cambiando la dirección por defecto del flujo", - - "block.create.smart_fluid_pipe.tooltip": "TUBERÍA DE FLUIDOS INTELIGENTE", - "block.create.smart_fluid_pipe.tooltip.summary": "Una _tubería de fluidos_ con un filtro. Puede especificar qué _fluidos_ pasan por ella", - "block.create.smart_fluid_pipe.tooltip.condition1": "Cuando se introducen fluidos en ella", - "block.create.smart_fluid_pipe.tooltip.behaviour1": "Las tuberías inteligentes que reciban fluidos que no coincidan con su filtro bloquearán el flujo", - "block.create.smart_fluid_pipe.tooltip.condition2": "Cuando es adyacente a un contenedor de fluido", - "block.create.smart_fluid_pipe.tooltip.behaviour2": "Las tuberías inteligentes que _inicien_ un _flujo_ desde cualquier contenedor sólo extraerán fluidos que _coincidan_ con su _filtro._", - - "block.create.spout.tooltip": "SURTIDOR", - "block.create.spout.tooltip.summary": "Un inyector para rellenar tus elementos de _fluidos._", - "block.create.spout.tooltip.condition1": "Transferencia de fluidos", - "block.create.spout.tooltip.behaviour1": "Cuando se coloca un _contenedor de fluidos_ como un _cubo_ o una _botella_ debajo, el caño intentará rellenarlo con su propio _fluido_ almacenado", - "block.create.spout.tooltip.condition2": "Automatización de fluidos", - "block.create.spout.tooltip.behaviour2": "El caño colocado encima de una _cinta_ o _depósito_ reaccionará automáticamente con un contenedor de fluidos_ que pase por debajo", - - "block.create.item_drain.tooltip": "DRENADOR DE ELEMENTOS", - "block.create.item_drain.tooltip.summary": "Un depósito rallado para vaciar tus _artículos fluidos._", - "block.create.item_drain.tooltip.condition1": "Transferencia de fluidos", - "block.create.item_drain.tooltip.behaviour1": "Cuando un _contenedor de fluidos_, como un _cubo_ o una _botella_, se inserta desde el lateral, el desagüe intentará vaciarlo en su propio _contenedor de fluidos_. El artículo será entonces expulsado por el lado opuesto", - - "block.create.mechanical_arm.tooltip": "BRAZO MECÁNICO", - "block.create.mechanical_arm.tooltip.summary": "Artilugio avanzado para reubicar _elementos_", - "block.create.mechanical_arm.tooltip.condition1": "Transferencia de elementos", - "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Cintas_, _Depósitos_, _Embudos_ y _Autoensambladores_", - "block.create.mechanical_arm.tooltip.control1": "Mientras está en la mano", - "block.create.mechanical_arm.tooltip.action1": "Haz clic con el botón derecho en un _objeto accesible del inventario_ para establecerlo como _fuente_ para el _brazo mecánico_. Haz clic con el botón derecho del ratón dos veces para establecerlo como _destino_", - "block.create.mechanical_arm.tooltip.control2": "Usa la rueda del ratón con la Llave Inglesa", - "block.create.mechanical_arm.tooltip.action2": "Establece el comportamiento de orden de los _items_ emitidos por el _brazo mecánico_", + "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para sus esforzados _quemadores de blaze_. ¡Los pone en marcha!.", "item.create.wand_of_symmetry.tooltip": "VARITA DE SIMETRÍA", - "item.create.wand_of_symmetry.tooltip.summary": "Refleja perfectamente la colocación de bloques en los planos configurados", + "item.create.wand_of_symmetry.tooltip.summary": "Refleja perfectamente la colocación de bloques en los planos configurados.", "item.create.wand_of_symmetry.tooltip.condition1": "Mientras está en el inventario rápido", - "item.create.wand_of_symmetry.tooltip.behaviour1": "Permanece activo", - "item.create.wand_of_symmetry.tooltip.control1": "Click derecho en el suelo", - "item.create.wand_of_symmetry.tooltip.action1": "_Crea_ o _Mueve_ el Espejo", - "item.create.wand_of_symmetry.tooltip.control2": "Click derecho en el aire", - "item.create.wand_of_symmetry.tooltip.action2": "_Quita_ el Espejo activo", - "item.create.wand_of_symmetry.tooltip.control3": "Click derecho mientras se agacha", - "item.create.wand_of_symmetry.tooltip.action3": "Abre la _Interfaz de Configuración_", - - "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "Novedoso artefacto para colocar o intercambiar bloques a distancia", - "item.create.handheld_blockzapper.tooltip.control1": "Click izquierdo en un bloque", - "item.create.handheld_blockzapper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo", - "item.create.handheld_blockzapper.tooltip.control2": "Click derecho en un bloque", - "item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ o _Reemplaza_ el bloque objetivo", - "item.create.handheld_blockzapper.tooltip.control3": "Click derecho mientras se agacha", - "item.create.handheld_blockzapper.tooltip.action3": "Abre la _Interfaz de Configuración_", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Permanece activo.", + "item.create.wand_of_symmetry.tooltip.control1": "Cuando se hace clic derecho en el suelo", + "item.create.wand_of_symmetry.tooltip.action1": "_Crea_ o _mueve_ el espejo.", + "item.create.wand_of_symmetry.tooltip.control2": "Cuando se hace clic derecho en el aire", + "item.create.wand_of_symmetry.tooltip.action2": "_Quita_ el espejo activo.", + "item.create.wand_of_symmetry.tooltip.control3": "[Mayús izdo.] + clic derecho", + "item.create.wand_of_symmetry.tooltip.action3": "Abre la interfaz de configuración.", "item.create.handheld_worldshaper.tooltip": "WORLDSHAPER", - "item.create.handheld_worldshaper.tooltip.summary": "Práctica herramienta para crear _paisajes_ y _características del terreno_", - "item.create.handheld_worldshaper.tooltip.control1": "Click izquierdo en un bloque", - "item.create.handheld_worldshaper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo", - "item.create.handheld_worldshaper.tooltip.control2": "Click derecho en un bloque", + "item.create.handheld_worldshaper.tooltip.summary": "Práctica herramienta para crear _paisajes_ y _características del terreno_.", + "item.create.handheld_worldshaper.tooltip.control1": "Cuando se hace clic izquierdo en un bloque", + "item.create.handheld_worldshaper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo.", + "item.create.handheld_worldshaper.tooltip.control2": "Cuando se hace clic derecho en un bloque", "item.create.handheld_worldshaper.tooltip.action2": "Aplica el _pincel_ y la _herramienta_ actualmente seleccionadas en el lugar deseado.", - "item.create.handheld_worldshaper.tooltip.control3": "Click derecho mientras se agacha", - "item.create.handheld_worldshaper.tooltip.action3": "Abre la _Interfaz de Configuración_", + "item.create.handheld_worldshaper.tooltip.control3": "[Mayús izdo.] + clic derecho", + "item.create.handheld_worldshaper.tooltip.action3": "Abre la interfaz de configuración.", "item.create.tree_fertilizer.tooltip": "FERTILIZANTE PARA ÁRBOLES", - "item.create.tree_fertilizer.tooltip.summary": "Una potente combinación de minerales adecuada para acelerar el crecimiento de los tipos de árboles más comunes", + "item.create.tree_fertilizer.tooltip.summary": "Una potente combinación de minerales adecuada para acelerar el crecimiento de los tipos de árboles más comunes.", "item.create.tree_fertilizer.tooltip.condition1": "Cuando se utiliza en un árbol joven", - "item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles _independientemente_ de sus condiciones de _espacio_", - - "item.create.deforester.tooltip": "DEFORESTADOR", - "item.create.deforester.tooltip.summary": "Un hacha _radiante_ capaz de talar árboles en una fracción de segundo", - + "item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles _independientemente_ de sus condiciones de _espacio_.", + "item.create.extendo_grip.tooltip": "AGARRE EXTENDIDO", - "item.create.extendo_grip.tooltip.summary": "¡Boioioing! Aumenta enormemente la _distancia de alcance_ del portador", + "item.create.extendo_grip.tooltip.summary": "¡Boioioing! Aumenta enormemente la _distancia de alcance_ del portador. Can be powered with Air Pressure from a _Copper_ _Backtank_", "item.create.extendo_grip.tooltip.condition1": "Cuando está fuera de la mano", - "item.create.extendo_grip.tooltip.behaviour1": "Aumenta la _distancia de alcance_ de los objetos usados en la _mano principal_", + "item.create.extendo_grip.tooltip.behaviour1": "Aumenta la _distancia de alcance_ de los objetos usados en la _mano principal_.", + "item.create.extendo_grip.tooltip.condition2": "While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "_Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTRO", - "item.create.filter.tooltip.summary": "Controla las salidas_ y _entradas_ de los dispositivos logísticos con más _precisión_, comparándolas con un _conjunto de elementos_ o varios _filtros anidados_", - "item.create.filter.tooltip.condition1": "Cuando está en la ranura del filtro", - "item.create.filter.tooltip.behaviour1": "Controla_ el flujo del elemento según su _configuración_", + "item.create.filter.tooltip.summary": "Controla las _salidas_ y _entradas_ de los _dispositivos logísticos_ con más precisión, comparándolas con un _conjunto de objetos_ o varios _filtros anidados_.", + "item.create.filter.tooltip.condition1": "Cuando está en la ranura de filtros", + "item.create.filter.tooltip.behaviour1": "Controla el flujo de objetos según su _configuración_.", "item.create.filter.tooltip.condition2": "Cuando se hace clic derecho", - "item.create.filter.tooltip.behaviour2": "Abre la interfaz de _configuración_", + "item.create.filter.tooltip.behaviour2": "Abre la interfaz de configuración.", "item.create.attribute_filter.tooltip": "FILTRO DE ATRIBUTOS", - "item.create.attribute_filter.tooltip.summary": "Controla las salidas_ y las _entradas_ de los dispositivos logísticos con más _precisión_, comparándolas con un _conjunto de _atributos_ y _categorías_ de artículos", - "item.create.attribute_filter.tooltip.condition1": "Cuando está en la ranura del filtro", - "item.create.attribute_filter.tooltip.behaviour1": "Controla el flujo del elemento según su _configuración_", + "item.create.attribute_filter.tooltip.summary": "Controla las _salidas_ y las _entradas_ de los _dispositivos logísticos_ con más precisión, comparándolas con un _conjunto de atributos_ y _categorías_ de objetos.", + "item.create.attribute_filter.tooltip.condition1": "Cuando está en la ranura de filtros", + "item.create.attribute_filter.tooltip.behaviour1": "Controla el flujo de objetos según su _configuración_.", "item.create.attribute_filter.tooltip.condition2": "Cuando se hace clic derecho", - "item.create.attribute_filter.tooltip.behaviour2": "Abre la interfaz de _configuración_", + "item.create.attribute_filter.tooltip.behaviour2": "Abre la interfaz de configuración.", "item.create.empty_schematic.tooltip": "ESQUEMA VACÍO", - "item.create.empty_schematic.tooltip.summary": "Se utiliza como ingrediente de las recetas y para escribir en la _tabla de esquemas_", - + "item.create.empty_schematic.tooltip.summary": "Se utiliza como 'ingrediente' de las recetas y para escribir en la _tabla de esquemas_.", + "item.create.schematic.tooltip": "ESQUEMA", - "item.create.schematic.tooltip.summary": "Contiene una estructura para ser posicionada y colocada en el mundo. Posiciona el holograma como se desee y utiliza un _Esquematicannon_ para construirlo", - "item.create.schematic.tooltip.condition1": "Cuando se mantiene", - "item.create.schematic.tooltip.behaviour1": "Se puede posicionar utilizando las herramientas en pantalla", - "item.create.schematic.tooltip.control1": "Click derecho mientras se agacha", - "item.create.schematic.tooltip.action1": "Abre una _Interfaz_ para introducir las _Coordenadas_ exactas", + "item.create.schematic.tooltip.summary": "Contiene una estructura para ser posicionada y colocada en el mundo. Posiciona el holograma como desees y utiliza un _cañón de esquemas_ para construirla.", + "item.create.schematic.tooltip.condition1": "Cuando se sostiene en la mano", + "item.create.schematic.tooltip.behaviour1": "Se puede posicionar utilizando las herramientas en pantalla.", + "item.create.schematic.tooltip.control1": "[Mayús izdo.] + clic derecho", + "item.create.schematic.tooltip.action1": "Abre una _interfaz_ para introducir las _coordenadas_ exactas.", "item.create.schematic_and_quill.tooltip": "ESQUEMA Y PLUMA", - "item.create.schematic_and_quill.tooltip.summary": "Se utiliza para guardar una estructura de tu mundo en un archivo .nbt", + "item.create.schematic_and_quill.tooltip.summary": "Se utiliza para guardar una estructura de tu mundo en un archivo .nbt.", "item.create.schematic_and_quill.tooltip.condition1": "Paso 1", - "item.create.schematic_and_quill.tooltip.behaviour1": "Selecciona dos puntos de esquina usando click derecho", + "item.create.schematic_and_quill.tooltip.behaviour1": "Selecciona dos puntos de esquina usando clic derecho.", "item.create.schematic_and_quill.tooltip.condition2": "Paso 2", - "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Rueda del ratón_ en las caras para ajustar el tamaño. Click derecho de nuevo para guardar", - "item.create.schematic_and_quill.tooltip.control1": "Click derecho", - "item.create.schematic_and_quill.tooltip.action1": "Seleccionar un punto de esquina / confirmar guardar", - "item.create.schematic_and_quill.tooltip.control2": "Al mantener Ctrl", - "item.create.schematic_and_quill.tooltip.action2": "Seleccionar puntos en _medio del aire_. Rueda del ratón para ajustar la distancia", - "item.create.schematic_and_quill.tooltip.control3": "Click derecho mientras se agacha", - "item.create.schematic_and_quill.tooltip.action3": "Reinicia_ y elimina la selección", - - "block.create.schematicannon.tooltip": "ESQUEMATICAÑÓN", - "block.create.schematicannon.tooltip.summary": "Dispara bloques para recrear un _Esquema_ desplegado en el Mundo. Utiliza elementos de los inventarios adyacentes y _Pólvora_ como combustible.", - "block.create.schematicannon.tooltip.control1": "Cuando se hace clic derecho", - "block.create.schematicannon.tooltip.action1": "Abre la _Interfaz_ de configuración", + "item.create.schematic_and_quill.tooltip.behaviour2": "[Ctrl] + [RUEDA DEL RATÓN] en las caras para ajustar el tamaño. Clic derecho de nuevo para guardar.", + "item.create.schematic_and_quill.tooltip.control1": "Cuando se hace clic derecho", + "item.create.schematic_and_quill.tooltip.action1": "Selecciona un punto de esquina / confirmar guardar.", + "item.create.schematic_and_quill.tooltip.control2": "Cuando mantiene [Ctrl]", + "item.create.schematic_and_quill.tooltip.action2": "Selecciona puntos en _medio del aire_. Rueda del ratón para ajustar la distancia.", + "item.create.schematic_and_quill.tooltip.control3": "[Mayús izdo.] + clic derecho", + "item.create.schematic_and_quill.tooltip.action3": "_Reinicia_ y elimina la selección.", + "block.create.schematicannon.tooltip": "CAÑÓN DE ESQUEMAS", + "block.create.schematicannon.tooltip.summary": "Dispara bloques para recrear un _esquema_ desplegado en el mundo. Utiliza objetos de los inventarios adyacentes y _pólvora_ como combustible.", + "block.create.schematicannon.tooltip.condition1": "Cuando se hace clic derecho", + "block.create.schematicannon.tooltip.behaviour1": "Abre la interfaz.", + "block.create.schematic_table.tooltip": "TABLA DE ESQUEMAS", - "block.create.schematic_table.tooltip.summary": "Escribe los esquemas guardados en un _esquema vacío_", + "block.create.schematic_table.tooltip.summary": "Escribe los esquemas guardados en un _esquema vacío_.", "block.create.schematic_table.tooltip.condition1": "Cuando se da un esquema vacío", - "block.create.schematic_table.tooltip.behaviour1": "Carga un archivo elegido de la carpeta de esquemas", + "block.create.schematic_table.tooltip.behaviour1": "Carga un archivo elegido de la carpeta de esquemas.", - "block.create.shaft.tooltip": "EJE", - "block.create.shaft.tooltip.summary": "_Retransmite la rotación_ en línea recta", - - "block.create.cogwheel.tooltip": "RUEDA DENTADA", - "block.create.cogwheel.tooltip.summary": "_Retransmite la rotación_ en línea recta, y a las _ruedas dentadas_ adyacentes", - - "block.create.large_cogwheel.tooltip": "RUEDA DENTADA GRANDE", - "block.create.large_cogwheel.tooltip.summary": "Una versión más grande de la _Rueda dentada_, que permite _cambiar_ la _Velocidad de Rotación_ cuando se conecta a su contraparte más pequeña", - - "block.create.encased_shaft.tooltip": "EJE REVESTIDO", - "block.create.encased_shaft.tooltip.summary": "_Retransmite la rotación_ en línea recta. Adecuado para propagar la Rotación a través de Muros", - - "block.create.gearbox.tooltip": "CAJA DE TRANSMISIÓN", - "block.create.gearbox.tooltip.summary": "_Retransmite la rotación_ en _cuatro direcciones_. Invierte las conexiones rectas", - - "block.create.gearshift.tooltip": "CAJA DE CAMBIOS", - "block.create.gearshift.tooltip.summary": "Un control para alternar la dirección de rotación de los ejes conectados", - "block.create.gearshift.tooltip.condition1": "Cuando se alimenta", - "block.create.gearshift.tooltip.behaviour1": "_Invierte_ la rotación de salida", - - "block.create.clutch.tooltip": "Embrague", - "block.create.clutch.tooltip.summary": "Un control para conectar/desconectar la rotación de los ejes conectados", - "block.create.clutch.tooltip.condition1": "Cuando se acciona", - "block.create.clutch.tooltip.behaviour1": "_Detiene_ el transporte de la rotación al otro lado", - - "block.create.encased_chain_drive.tooltip": "CADENA DE TRANSMISIÓN REVESTIDA", - "block.create.encased_chain_drive.tooltip.summary": "_Retransmite la rotación_ en línea recta y a las cadenas de transmisión adyacentes. Las cadenas de transmisión se conectan en un grupo cuando se colocan junto a otra en cualquier cara sin eje. Su orientación no tiene que coincidir", - "block.create.encased_chain_drive.tooltip.condition1": "Cuando se conecta", - "block.create.encased_chain_drive.tooltip.behaviour1": "Los bloques conectados transmitirán la _velocidad de rotación_ y la dirección de este componente", - - "block.create.adjustable_chain_gearshift.tooltip": "CADENA DE TRANSMISIÓN AJUSTABLE", - "block.create.adjustable_chain_gearshift.tooltip.summary": "_Retransmite el giro_ en línea recta y a las _cadenas adyacentes_. El Redstone analógo proporcionada a este bloque controlará qué tamaño de rueda motriz se acopla a las cadenas de transmisión adyacentes", - "block.create.adjustable_chain_gearshift.tooltip.condition1": "Control de Redstone", - "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Sin señal_, los accionamientos de cadena adyacentes transmitirán la _misma velocidad._ Con una señal de _fuerza completa_, los accionamientos de cadena adyacentes transmitirán exactamente _el doble de su velocidad._ Cualquier cosa entre medias dará resultados entre 1-2x su velocidad", - - "item.create.belt_connector.tooltip": "CORREA", - "item.create.belt_connector.tooltip.summary": "Conecta dos o más _ejes_ con una _Correa_. Los ejes conectados tendrán exactamente la misma velocidad y dirección de rotación. La correa puede actuar como _Transportador_ para _Estados_ y _Entidades_", - "item.create.belt_connector.tooltip.control1": "Click derecho en el eje", - "item.create.belt_connector.tooltip.action1": "Selecciona el eje como una polea de la correa. Los dos ejes seleccionados tienen que estar _alineados_ ya sea _Verticalmente_, _Horizontalmente_ o _Diagonalmente_ hacia la dirección de la correa", - "item.create.belt_connector.tooltip.control2": "Click derecho mientras te agachas", - "item.create.belt_connector.tooltip.action2": "_Reinicia_ la primera posición seleccionada para la correa", - - "item.create.goggles.tooltip": "GAFAS DEL INGENIERO", - "item.create.goggles.tooltip.summary": "Un par de gafas para aumentar tu visión con útil información _cinética_", + "item.create.goggles.tooltip": "GAFAS DEL CONSTRUCTOR", + "item.create.goggles.tooltip.summary": "Un par de gafas para aumentar tu visión con útil información _cinética_.", "item.create.goggles.tooltip.condition1": "Cuando se llevan puestas", - "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores de color_ correspondientes al _Nivel de velocidad_ de un componente cinético colocado, así como el _Impacto de estrés_ y la _Capacidad_ de los componentes individuales.", - "item.create.goggles.tooltip.condition2": "Al mirar el medidor", - "item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre _Velocidad_ o _Estrés_ de la red a la que está conectado el medidor", + "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores de color_ correspondientes al _nivel de velocidad_ de un componente cinético colocado, así como el _impacto de estrés_ y la _carga_ de los componentes individuales.", + "item.create.goggles.tooltip.condition2": "Al mirar un medidor", + "item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre _velocidad_ o _estrés_ de la red a la que está conectado el medidor.", + "item.create.goggles.tooltip.condition3": "Al mirar un contenedor de fluidos", + "item.create.goggles.tooltip.behaviour3": "Muestra información detallada sobre la _carga_ del bloque y los _líquidos_ almacenados en su interior.", "item.create.wrench.tooltip": "LLAVE INGLESA", - "item.create.wrench.tooltip.summary": "Una herramienta útil para trabajar en artilugios cinéticos. Se puede utilizar para _Rotar_, _Desmantelar_ y para _Configurar_ componentes", - "item.create.wrench.tooltip.control1": "Click con el botón derecho en un bloque cinético", - "item.create.wrench.tooltip.action1": "_Rota los componentes_ hacia o desde la cara con la que ha interactuado", - "item.create.wrench.tooltip.control2": "Click derecho mientras te agachas", - "item.create.wrench.tooltip.action2": "Desmonta los componentes cinéticos_ y los devuelve a _tu inventario_", - - "block.create.creative_motor.tooltip": "MOTOR CREATIVO", - "block.create.creative_motor.tooltip.summary": "Una fuente configurable de _Fuerza Rotativa_", - - "block.create.water_wheel.tooltip": "RUEDA HIDRÁULICA MECÁNICA", - "block.create.water_wheel.tooltip.summary": "Proporciona _Fuerza de rotación_ tomada de las _Corrientes de agua_ adyacentes", - - "block.create.encased_fan.tooltip": "VENTILADOR REVESTIDO", - "block.create.encased_fan.tooltip.summary": "Convierte la _fuerza de rotación_ en _corrientes de aire_ y viceversa. Tiene una gran variedad de usos", - "block.create.encased_fan.tooltip.condition1": "Cuando es alimentado por Redstone", - "block.create.encased_fan.tooltip.behaviour1": "Proporciona _fuerza de rotación_ a partir de cualquier _fuente de calor_ inmediatamente inferior. El ventilador debe estar orientado hacia abajo", - "block.create.encased_fan.tooltip.condition2": "Cuando es impulsado por la cinética", - "block.create.encased_fan.tooltip.behaviour2": "_Empuja_ o _Tira_ de Entidades, dependiendo de la velocidad de Rotación entrante", - "block.create.encased_fan.tooltip.condition3": "Al soplar a través de bloques especiales", - "block.create.encased_fan.tooltip.behaviour3": "Se emiten partículas de _Líquidos_ y _Fuego_ en el flujo de aire. Esto puede utilizarse para _procesar objetos_", + "item.create.wrench.tooltip.summary": "Una herramienta útil para trabajar en artilugios cinéticos. Se puede utilizar para _rotar_, _desmantelar_ y para _configurar_ componentes.", + "item.create.wrench.tooltip.control1": "Cuando se hace clic derecho en un bloque cinético", + "item.create.wrench.tooltip.action1": "Rota los componentes hacia o desde la cara con la que ha interactuado.", + "item.create.wrench.tooltip.control2": "[Mayús izdo.] + clic derecho", + "item.create.wrench.tooltip.action2": "Desmonta los _componentes cinéticos_ y los devuelve a tu inventario_.", "block.create.nozzle.tooltip": "BOQUILLA", - "block.create.nozzle.tooltip.summary": "Se acopla a la parte delantera de un _ventilador revestido_ para distribuir su efecto sobre las entidades en _todas las direcciones_", - - "block.create.hand_crank.tooltip": "MANIVELA", - "block.create.hand_crank.tooltip.summary": "Una sencilla _fuente_ de _fuerza de rotación_ que requiere la interacción de los jugadores. Ten cuidado de no agotarte!", - "block.create.hand_crank.tooltip.condition1": "Cuando se usa", - "block.create.hand_crank.tooltip.behaviour1": "Proporciona _fuerza de rotación_ a un artilugio acoplado. _Se puede revertir_ la rotación", + "block.create.nozzle.tooltip.summary": "Se acopla a la parte delantera de un _ventilador revestido_ para distribuir su efecto sobre las entidades en _todas las direcciones_.", "block.create.cuckoo_clock.tooltip": "RELOJ DE CUCO", - "block.create.cuckoo_clock.tooltip.summary": "Fina artesanía para _decorar_ un espacio y _contar el tiempo_", + "block.create.cuckoo_clock.tooltip.summary": "Fina artesanía para decorar un espacio y contar el tiempo.", "block.create.cuckoo_clock.tooltip.condition1": "Cuando es alimentado por cinética", - "block.create.cuckoo_clock.tooltip.behaviour1": "Muestra la _hora actual_ y toca una melodía dos veces al día. Se activa_ una vez al _mediodía_ y al anochecer, en cuanto _los jugadores pueden dormir_", + "block.create.cuckoo_clock.tooltip.behaviour1": "Muestra la _hora actual_ y toca una melodía dos veces al día. Se activa una vez al mediodía y al anochecer, _en cuanto los jugadores pueden dormir_.", "block.create.turntable.tooltip": "PLATAFORMA GIRATORIA", - "block.create.turntable.tooltip.summary": "Convierte la _fuerza de rotación_ en un refinado mareo", - - "block.create.millstone.tooltip": "PIEDRA DEL MOLINO", - "block.create.millstone.tooltip.summary": "Un componente cinético adecuado para _moler_ materiales insertados. Puede ser alimentado por una rueda dentada adyacente o conectándose al eje de la parte inferior. Los resultados tienen que ser extraídos del componente", - "block.create.millstone.tooltip.condition1": "Cuando es impulsado por la cinética", - "block.create.millstone.tooltip.behaviour1": "Comienza a aplicar _recetas de fresado_ a cualquier elemento insertado desde el lateral o la parte superior del bloque", - "block.create.millstone.tooltip.condition2": "Cuando se hace clic derecho", - "block.create.millstone.tooltip.behaviour2": "Recoge las salidas manualmente", - - "block.create.crushing_wheel.tooltip": "RUEDA DE TRITURACIÓN", - "block.create.crushing_wheel.tooltip.summary": "Grandes ruedas giratorias que _rompen_ cualquier cosa", - "block.create.crushing_wheel.tooltip.condition1": "Cuando se une a otra rueda trituradora", - "block.create.crushing_wheel.tooltip.behaviour1": "Forma una máquina trituradora para procesar una variedad de cosas. Los dientes de las ruedas tienen que conectarse y moverse con la _misma velocidad_ en _direcciones opuestas_", - - "block.create.mechanical_press.tooltip": "PRENSA MECÁNICA", - "block.create.mechanical_press.tooltip.summary": "Un pistón de fuerza para comprimir los objetos que tiene debajo. Requiere una _fuerza de rotación_ constante", - "block.create.mechanical_press.tooltip.condition1": "Cuando es impulsado por Redstone", - "block.create.mechanical_press.tooltip.behaviour1": "Comienza a _comprimir_ los objetos que caen debajo", - "block.create.mechanical_press.tooltip.condition2": "Cuando está por encima de una cinta", - "block.create.mechanical_press.tooltip.behaviour2": "Comprime _automáticamente_ los elementos de derivación en la cinta", - "block.create.mechanical_press.tooltip.condition3": "Cuando está por encima de la Cuenca", - "block.create.mechanical_press.tooltip.behaviour3": "Comienza a _compactar artículos_ en la cuenca siempre que estén presentes todos los ingredientes necesarios", - - "block.create.basin.tooltip": "CUENCA", - "block.create.basin.tooltip.summary": "Un práctico _contenedor de elementos_ utilizado en el procesamiento con la _Mezcladora mecánica_ y la _Prensa mecánica_. Soporta _Comparadores de Redstone_. Viene con un práctico filtro que especifica qué elementos deben crearse en esta cuenca", - "block.create.basin.tooltip.condition1": "Salida automática", - "block.create.basin.tooltip.behaviour1": "Cuando los _inventarios abiertos_ como cintas, otras cuencas, depósitos, desagües de fluidos y otros están _bajo un lado_ de una cuenca, recibirán automáticamente cualquier _salida de artículos/fluidos_ creada en la cuenca. Esto es útil para la automatización", - - "block.create.blaze_burner.tooltip": "QUEMADOR DE BLAZE", - "block.create.blaze_burner.tooltip.summary": "Un bloque donde se aloja un blaze domado para calentar una cuenca", - "block.create.blaze_burner.tooltip.condition1": "Cuando se coloca debajo de una cuenca", - "block.create.blaze_burner.tooltip.behaviour1": "Proporciona _calor_ a las recetas de la cuenca", - "block.create.blaze_burner.tooltip.condition2": "Cuando se utiliza el combustible en el Quemador de Blaze", - "block.create.blaze_burner.tooltip.behaviour2": "Aumenta el tiempo de combustión restante en el tiempo de combustión del horno del elemento utilizado. Consume el objeto. Utiliza _Torta de Blaze_ para altas temperaturas", - - "block.create.reinforced_rail.tooltip": "RAÍL REFORZADO", - "block.create.reinforced_rail.tooltip.summary": "Raíl estabilizado con madera, _no necesita soportes_", - - "block.create.mechanical_mixer.tooltip": "MEZCLADOR MECÁNICO", - "block.create.mechanical_mixer.tooltip.summary": "Un batidor cinético que proporciona recetas de elaboración automatizada de múltiples ingredientes. Requiere una _fuerza de rotación_ constante y una _cuenca_ colocada debajo (con un espacio intermedio)", - "block.create.mechanical_mixer.tooltip.condition1": "Cuando está por encima de la Cuenca", - "block.create.mechanical_mixer.tooltip.behaviour1": "Comienza a mezclar los elementos en la cuenca siempre que estén presentes todos los ingredientes necesarios. Para evitar recetas no deseadas, utilice la ranura del filtro de la cuenca o reduzca la fuerza de rotación hasta que se hayan añadido todos los ingredientes deseados", - - "block.create.mechanical_crafter.tooltip": "AUTOENSAMBLADOR MECÁNICO", - "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus cintas_ para crear un _flujo_ que salga de la cuadrícula en uno de los Autoensambladores", - "block.create.mechanical_crafter.tooltip.condition1": "Cuando es impulsado por la cinética", - "block.create.mechanical_crafter.tooltip.behaviour1": "_Empieza el proceso de creación_ en cuanto _todos los crafters_ de la parrilla hayan recibido un objeto_", - "block.create.mechanical_crafter.tooltip.condition2": "Con pulso de Redstone", - "block.create.mechanical_crafter.tooltip.behaviour2": "_Fuerza_ el inicio del proceso de _creación_ con todos los _artículos_ dados actualmente en la parrilla", - "block.create.mechanical_crafter.tooltip.control1": "Cuando se arranca por delante", - "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un autoensamblador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza las cintas en un flujo_ que mueva todos los objetos hacia un autoensamblador final. El autoensamblador final debe _apuntar hacia fuera_ de la rejilla", - "block.create.mechanical_crafter.tooltip.control2": "Cuando se arranca hacia atrás", - "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los autoensambladores adyacentes. Usa esto para _combinar ranuras_ en la cuadrícula de trabajo y _guardar el la entrada de trabajo_", - - "block.create.furnace_engine.tooltip": "MOTOR DEL HORNO", - "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _fuerza de rotación/torque_ que requiere un _horno en funcionamiento_ para funcionar", - "block.create.furnace_engine.tooltip.condition1": "Cuando se conecta a un horno encendido", - "block.create.furnace_engine.tooltip.behaviour1": "_Empieza a alimentar_ un _Horno_ colocado delante de él (a 1m de distancia). Utiliza un Alto Horno para obtener mayores velocidades", - - "block.create.flywheel.tooltip": "RUEDA DE INERCIA", - "block.create.flywheel.tooltip.summary": "Una gran rueda metálica para _conducir y estabilizar_ la fuerza generada por un _motor conectado_. Las ruedas de inercia se conectan a los motores si están a _1m de distancia_ y en un _ángulo de 90º_ entre ellos", - "block.create.flywheel.tooltip.condition1": "Cuando está unida a un motor en marcha", - "block.create.flywheel.tooltip.behaviour1": "Proporciona _fuerza de rotación_ a un artilugio conectado en función de la fuerza y la velocidad del generador", - - "block.create.portable_storage_interface.tooltip": "INTERFAZ DE ALMACENAMIENTO PORTÁTIL", - "block.create.portable_storage_interface.tooltip.summary": "Un punto de intercambio portátil para _mover elementos_ hacia y desde una _estructura_ movida por un pistón, rodamiento, vagoneta o polea. Para cumplirse dos interfaces tienen que _enfrentarse_ y estar separadas _1-2 bloques_", - "block.create.portable_storage_interface.tooltip.condition1": "Mientras se mueve", - "block.create.portable_storage_interface.tooltip.behaviour1": "Interactúa con las _interfaces de almacenamiento portátil_ estacionarias para transferir elementos hacia o desde el artilugio. Los componentes que se inserten o extraigan de la _interfaz estacionaria_ interactuarán con los inventarios del artilugio _directamente._ La estructura se detendrá brevemente mientras se intercambian los elementos.", - "block.create.portable_storage_interface.tooltip.condition2": "Cuando es alimentado por Redstone", - "block.create.portable_storage_interface.tooltip.behaviour2": "Desactiva_ cualquier conexión activa inmediatamente", - - "block.create.portable_fluid_interface.tooltip": "INTERFAZ DE FLUIDO PORTÁTIL", - "block.create.portable_fluid_interface.tooltip.summary": "Punto de intercambio portátil para _mover fluidos_ hacia y desde una _estructura_ movida por un pistón, rodamiento, vagoneta o polea. Para cumplirse dos interfaces tienen que _enfrentarse_ y estar separadas _1-2 bloques_", - "block.create.portable_fluid_interface.tooltip.condition1": "Mientras se mueve", - "block.create.portable_fluid_interface.tooltip.behaviour1": "Interactúa con las _interfaces de almacenamiento portátiles_ estacionarias para transferir fluidos hacia o desde el artilugio. Las tuberías que se inserten en la _interfaz estacionaria_ o se extraigan de ella interactuarán con los depósitos del artilugio _directamente._ La estructura se paralizará brevemente mientras se intercambian fluidos.", - "block.create.portable_fluid_interface.tooltip.condition2": "Cuando se alimenta con Redstone", - "block.create.portable_fluid_interface.tooltip.behaviour2": "_Desconecta_ cualquier conexión activa inmediatamente", - - "block.create.rotation_speed_controller.tooltip": "CONTROLADOR DE VELOCIDAD DE ROTACIÓN", - "block.create.rotation_speed_controller.tooltip.summary": "Un _relé_ configurable_ capaz de acelerar o ralentizar el componente de destino a cualquier velocidad deseada", - "block.create.rotation_speed_controller.tooltip.condition1": "Cuando se adjunta a una rueda dentada grande", - "block.create.rotation_speed_controller.tooltip.behaviour1": "Transmite la fuerza de rotación entrante a la rueda, intentando _igualar_ la _velocidad_ a la que está configurada. La _rueda mecánica_ tiene que estar _adherida en la parte superior_ del controlador", - - "block.create.mechanical_piston.tooltip": "PISTÓN MECÁNICO", - "block.create.mechanical_piston.tooltip.summary": "Una versión más avanzada del _Pistón_. Utiliza la _Fuerza de rotación_ para mover con precisión las estructuras que tiene delante. las pértigas de extensión del pistón_ en la parte trasera definen el _alcance_ de este dispositivo. Sin las extensiones, el pistón no se moverá. Utiliza _Chasis_ o _Bloques de Slime_ para mover más de una línea de bloques", - "block.create.mechanical_piston.tooltip.condition1": "Cuando es impulsado por la cinética", - "block.create.mechanical_piston.tooltip.behaviour1": "Comienza a mover la estructura adjunta. La velocidad y la dirección se correlacionan con la velocidad de rotación entrante", - - "block.create.piston_extension_pole.tooltip": "PÉRTIGA DE EXTENSIÓN", - "block.create.piston_extension_pole.tooltip.summary": "Amplía la gama de _Pistones mecánicos_", - "block.create.piston_extension_pole.tooltip.condition1": "Cuando se acopla a un pistón mecánico", - "block.create.piston_extension_pole.tooltip.behaviour1": "Extiende el alcance de un pistón en 1 bloque", - - "block.create.mechanical_bearing.tooltip": "RODAMIENTO MECÁNICO", - "block.create.mechanical_bearing.tooltip.summary": "Se utiliza para girar _estructuras más grandes_ con fuerza de rotación", - "block.create.mechanical_bearing.tooltip.condition1": "Cuando es impulsado por la cinética", - "block.create.mechanical_bearing.tooltip.behaviour1": "Inicia la rotación de los bloques adjuntos. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque", - - "block.create.windmill_bearing.tooltip": "RODAMIENTO DEL MOLINO DE VIENTO", - "block.create.windmill_bearing.tooltip.summary": "Se utiliza para aprovechar la _fuerza de rotación_ del viento. Coloca tu propio diseño y mira cómo gira!", - "block.create.windmill_bearing.tooltip.condition1": "Al hacer clic con el botón derecho", - "block.create.windmill_bearing.tooltip.behaviour1": "Comienza a proporcionar _Fuerza de rotación_ generada por la rotación de su estructura adjunta. La estructura tiene que incluir bloques de vela o lana adecuados. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque.", - - "block.create.sail_frame.tooltip": "MARCO DE VELA", - "block.create.sail_frame.tooltip.summary": "Un útil bloque de construcción y fuente de energía cinética cuando forma parte de una estructura montada sobre un _Rodamiento de molino_", - - "block.create.white_sail.tooltip": "VELA BLANCA", - "block.create.white_sail.tooltip.summary": "Un útil bloque de construcción y fuente de energía cinética cuando forma parte de una estructura montada en un _Rodamiento de molino_. Viene en una variedad de colores", - "block.create.white_sail.tooltip.condition1": "Cuando se hace clic con el botón derecho del ratón con tinte", - "block.create.white_sail.tooltip.behaviour1": "Cambia el color de la vela", - - "block.create.clockwork_bearing.tooltip": "RODAMIENTO DE RELOJ", - "block.create.clockwork_bearing.tooltip.summary": "Una versión avanzada del _rodamiento mecánico_ para hacer girar hasta dos _manecillas de reloj_ según la _hora actual_ en el _juego_", - "block.create.clockwork_bearing.tooltip.condition1": "Cuando es impulsado por la cinética", - "block.create.clockwork_bearing.tooltip.behaviour1": "Comienza a girar la estructura adjunta hacia la _hora actual_. Si existe una segunda estructura independiente delante de la primera, servirá de _manecilla de las horas_", - - "block.create.sequenced_gearshift.tooltip": "CAMBIO DE MARCHAS SECUENCIADO", - "block.create.sequenced_gearshift.tooltip.summary": "Un _componente de utilidad programable_, que puede cambiar su _rendimiento rotacional_ según hasta _5 instrucciones consecutivas._ Utilízalo para alimentar Rodamientos Mecánicos, Pistones o Poleas con más control sobre la sincronización y la velocidad. Puede ser menos preciso a velocidades más altas", - "block.create.sequenced_gearshift.tooltip.condition1": "Cuando es impulsado por Redstone", - "block.create.sequenced_gearshift.tooltip.behaviour1": "_Ejecuta_ las instrucciones programadas en función de la velocidad de entrada", - "block.create.sequenced_gearshift.tooltip.condition2": "Cuando se hace clic derecho", - "block.create.sequenced_gearshift.tooltip.behaviour2": "Abre la _interfaz de configuración._", - - "block.create.cart_assembler.tooltip": "ENSAMBLADOR DE VAGONETAS", - "block.create.cart_assembler.tooltip.summary": "Cuando se coloca en un _Raíl_, puede _ensamblar_ y _desensamblar_ estructuras móviles en las vagonetas que pasan. Consulta [Ctrl] para conocer el comportamiento específico del tipo de raíl", - "block.create.cart_assembler.tooltip.condition1": "Artilugio de vagoneta simple", - "block.create.cart_assembler.tooltip.behaviour1": "Con un _miembro único_, las estructuras se anclarán y girarán en _una sola vagoneta_. Utilice una _Llave Inglesa_ para especificar el _comportamiento de rotación_ deseado", - "block.create.cart_assembler.tooltip.condition2": "Artilugio de vagonetas", - "block.create.cart_assembler.tooltip.behaviour2": "Dos ensambladores de vagonetas _conectadas por_ una _estructura_, una vez que ambos contengan una vagoneta, las conectará con un artilugio montado _entre los dos_. La estructura se comportará de forma similar a un _acoplador de vagonetas_", - "block.create.cart_assembler.tooltip.control1": "Cuando se coloca sobre un Rail", - "block.create.cart_assembler.tooltip.action1": "_Se monta_ en las vagonetas que pasan _cuando está alimentado_, _se desmonta_ en caso contrario", - "block.create.cart_assembler.tooltip.control2": "Cuando se coloca sobre un raíl energizado", - "block.create.cart_assembler.tooltip.action2": "Monta y _acelera_ las vagonetas _cuando está alimentado_, desmonta y _sostiene_ en caso contrario", - "block.create.cart_assembler.tooltip.control3": "Cuando se coloca sobre el raíl detector", - "block.create.cart_assembler.tooltip.action3": "_Monta vagonetas sin montar_, _desmonta vagonetas montadas_", - "block.create.cart_assembler.tooltip.control4": "Cuando se coloca sobre el raíl activador", - "block.create.cart_assembler.tooltip.action4": "Desmonta_ vagonetas cuando se activa", - - "block.create.rope_pulley.tooltip": "POLEA DE CUERDA", - "block.create.rope_pulley.tooltip.summary": "Mueve verticalmente los _bloques_ y _estructuras_ adjuntos. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque", - "block.create.rope_pulley.tooltip.condition1": "Cuando es impulsado por la cinética", - "block.create.rope_pulley.tooltip.behaviour1": "Comienza a mover la estructura adjunta. La velocidad y la dirección se correlacionan con la velocidad de rotación entrante", - - "block.create.linear_chassis.tooltip": "CHASIS LINEAL", - "block.create.linear_chassis.tooltip.summary": "Bloque base configurable que conecta estructuras para el movimiento", - "block.create.linear_chassis.tooltip.condition1": "Cuando se mueve", - "block.create.linear_chassis.tooltip.behaviour1": "_Mueve_ todos los _Chasis adjuntos_ con la misma orientación, y una columna de Bloques dentro de su rango. Los bloques sólo serán arrastrados si la cara del chasis es _Pegajosa_ (Ver [Ctrl])", - "block.create.linear_chassis.tooltip.condition2": "Con Llave Inglesa", - "block.create.linear_chassis.tooltip.behaviour2": "Configura el _rango_ para este bloque de chasis. Mantenga pulsada la tecla CTRL para modificar también el rango de todos los bloques de chasis adjuntos", - "block.create.linear_chassis.tooltip.control1": "Cuando se hace clic derecho con slime", - "block.create.linear_chassis.tooltip.action1": "Hace que la cara sobre la que se ha hecho clic sea _pegajosa_. Cuando se mueva, el chasis _tirará_ de los bloques adjuntos, independientemente de la dirección del movimiento", - - "block.create.secondary_linear_chassis.tooltip": "CHASIS LINEAL SECUNDARIO", - "block.create.secondary_linear_chassis.tooltip.summary": "Un segundo tipo de _Chasis lineal_ que no se conecta al otro", - - "block.create.radial_chassis.tooltip": "CHASIS RADIAL", - "block.create.radial_chassis.tooltip.summary": "Bloque base configurable que conecta estructuras para el movimiento", - "block.create.radial_chassis.tooltip.condition1": "Cuando se mueve", - "block.create.radial_chassis.tooltip.behaviour1": "_Mueve_ todos los _Chasis_ adjuntos en una columna, y un cilindro de bloques a su alrededor. Los bloques que lo rodean sólo se mueven cuando están dentro del rango y están adheridos a un lado pegajoso (Ver [Ctrl]).", - "block.create.radial_chassis.tooltip.condition2": "Con Llave Inglesa", - "block.create.radial_chassis.tooltip.behaviour2": "Configura el _rango_ para este bloque de chasis. Mantenga pulsada la tecla CTRL para modificar también el rango de todos los bloques de chasis adjuntos", - "block.create.radial_chassis.tooltip.control1": "Cuando se hace clic derecho con slime", - "block.create.radial_chassis.tooltip.action1": "Hace que la cara sobre la que se ha hecho clic sea _pegajosa_. Cuando el chasis se mueve, todos los bloques designados unidos a la cara pegajosa se mueven con él", - - "block.create.mechanical_drill.tooltip": "TALADRO MECÁNICO", - "block.create.mechanical_drill.tooltip.summary": "Un dispositivo mecánico adecuado para _romper bloques_. Se puede mover con _pistones mecánicos_, _rodamientos_ u otros controladores", - "block.create.mechanical_drill.tooltip.condition1": "Cuando se mueve con cinética", - "block.create.mechanical_drill.tooltip.behaviour1": "Actúa como un rompebloques _estacionario_. También _hace daño a las entidades_ en su área efectiva", - "block.create.mechanical_drill.tooltip.condition2": "Mientras se mueve", - "block.create.mechanical_drill.tooltip.behaviour2": "Rompe los bloques con los que colisiona el taladro", - - "block.create.mechanical_harvester.tooltip": "COSECHADORA MECÁNICA", - "block.create.mechanical_harvester.tooltip.summary": "Una cosechadora mecánica adecuada para la automatización de cultivos a mediana escala. Se puede mover con _Pistones mecánicos_, _Rodamientos_ u otros controladores", - "block.create.mechanical_harvester.tooltip.condition1": "Mientras se mueve", - "block.create.mechanical_harvester.tooltip.behaviour1": "_Corta_ todos los _cultivos maduros_ con los que la cuchilla colisiona y los restablece a su estado de crecimiento inicial", - - "block.create.mechanical_plough.tooltip": "ARADO MECÁNICO", - "block.create.mechanical_plough.tooltip.summary": "Un arado mecánico tiene varios usos. Se puede mover con _Pistones mecánicos_, _Rodamientos_ u otros mandos", - "block.create.mechanical_plough.tooltip.condition1": "Mientras se mueve", - "block.create.mechanical_plough.tooltip.behaviour1": "_Rompe bloques_ con los que _no se puede colisionar_, como antorchas, raíles o capas de nieve. _Aplica_ su _movimiento_ a las _entidades_ sin dañarlas. _Labra bloques de tierra_ como si se usara una azada en ellos", - - "block.create.mechanical_saw.tooltip": "SIERRA MECÁNICA", - "block.create.mechanical_saw.tooltip.summary": "Adecuada para _cortar árboles_ de forma eficaz y para _cortar bloques_ en sus homólogos carpinteros. Se puede mover mediante _pistones mecánicos_ o _rodamientos_", - "block.create.mechanical_saw.tooltip.condition1": "Cuando está orientado hacia arriba", - "block.create.mechanical_saw.tooltip.behaviour1": "Aplica las recetas _Serrar_ y _Estallar_ a los objetos que se dejan caer o se introducen en ella. Cuando hay varias salidas posibles, las recorre a menos que se asigne un _filtro_", - "block.create.mechanical_saw.tooltip.condition2": "Cuando se orienta horizontalmente", - "block.create.mechanical_saw.tooltip.behaviour2": "Rompe los troncos_ que tiene delante. Si el tronco soportaba un árbol por sí mismo, el _árbol se derrumbará_ lejos de la sierra", - "block.create.mechanical_saw.tooltip.condition3": "Mientras se mueve", - "block.create.mechanical_saw.tooltip.behaviour3": "_Corta_ todos los _Árboles_ con los que colisiona la sierra", + "block.create.turntable.tooltip.summary": "Convierte la _fuerza rotacional_ en un refinado mareo.", "block.create.stockpile_switch.tooltip": "INTERRUPTOR DE ACOPIO", - "block.create.stockpile_switch.tooltip.summary": "Activa una señal de Redstone en función de la cantidad de _Artículos almacenados_ en el Contenedor adjunto. Viene con un práctico filtro. A diferencia de un _Comparador,_ el _Interruptor de acopio_ permite la configuración de _Umbrales,_ a partir de los cuales se invierten las señales", - "block.create.stockpile_switch.tooltip.condition1": "Cuando haces click derecho", - "block.create.stockpile_switch.tooltip.behaviour1": "Abre la _Interfaz de Configuración_", + "block.create.stockpile_switch.tooltip.summary": "Activa una señal de redstone en función de la cantidad de _objetos almacenados_ en el _contenedor_ adjunto. Viene con un práctico filtro. A diferencia de un _comparador, el _interruptor de acopio_ permite la configuración de _umbrales_, a partir de los cuales se invierten las señales.", + "block.create.stockpile_switch.tooltip.condition1": "Cuando se hace clic derecho", + "block.create.stockpile_switch.tooltip.behaviour1": "Abre la interfaz de configuración.", "block.create.content_observer.tooltip": "OBSERVADOR DE CONTENIDO", - "block.create.content_observer.tooltip.summary": "_Detecta artículos_ dentro de _contenedores_ y _transportadores_ que coinciden con un _filtro_ configurado. Mientras el _inventario_, la _cinta_ o la _canaleta_ observados contengan_ un artículo que coincida, este componente emitirá una _señal de Redstone_. Cuando un _túnel observado transfiere_ un artículo coincidente, este componente emitirá un _Pulso de Redstone_", - - "block.create.redstone_link.tooltip": "ENLACE DE REDSTONE", - "block.create.redstone_link.tooltip.summary": "Puntos finales para conexiones _Inalámbricas Redstone_. Se pueden asignar _frecuencias_ utilizando cualquier elemento. El alcance de la señal es limitado, aunque razonablemente lejano", - "block.create.redstone_link.tooltip.condition1": "Cuando se alimenta", - "block.create.redstone_link.tooltip.behaviour1": "Recibir enlaces de la misma _Frecuencia_ producirá una señal de Redstone", - "block.create.redstone_link.tooltip.control1": "Cuando se hace Clic derecho con un ítem", - "block.create.redstone_link.tooltip.action1": "Establece la _Frecuencia_ a ese elemento. Se pueden utilizar un total de _dos elementos diferentes_ en combinación para definir una Frecuencia", - "block.create.redstone_link.tooltip.control2": "Cuando se hace clic derecho mientras se agacha", - "block.create.redstone_link.tooltip.action2": "Cambia entre el modo _Receptor_ y _Transmisor_", - - "block.create.nixie_tube.tooltip": "TUBO NIXIE", - "block.create.nixie_tube.tooltip.summary": "Un elegante _visualizador_ de _números y texto_ potenciados por Redstone", - "block.create.nixie_tube.tooltip.condition1": "Cuando se alimenta", - "block.create.nixie_tube.tooltip.behaviour1": "Muestra el valor actual de la _Fuerza de la señal Redstone_", - "block.create.nixie_tube.tooltip.condition2": "Con etiqueta de nombre", - "block.create.nixie_tube.tooltip.behaviour2": "Mostrar el _contenido_ de su _etiqueta de nombre_ con varios tubos nixie _ordenados_ en una _línea_", - - "block.create.redstone_contact.tooltip": "CONTACTO DE REDSTONE", - "block.create.redstone_contact.tooltip.summary": "Solo emite energía de Redstone por parejas. Se puede mover con _Pistones mecánicos_, _Rodamientos_ u otros controladores", - "block.create.redstone_contact.tooltip.condition1": "Cuando se enfrenta a otro Contacto", - "block.create.redstone_contact.tooltip.behaviour1": "Proporciona una _señal de Redstone_", - "block.create.redstone_contact.tooltip.condition2": "Mientras se mueve", - "block.create.redstone_contact.tooltip.behaviour2": "Activa todos los contactos estacionarios que pasa", + "block.create.content_observer.tooltip.summary": "_Detecta objetos_ dentro de _contenedores_ y _transportadores_ que coincidan con un _filtro_ configurado. Mientras el _inventario_, la _cinta_ o la _canaleta_ observados _contengan_ un objeto que coincida, este componente emitirá una _señal de redstone_. Cuando un embudo observado _transfiere_ un objeto coincidente, este componente emitirá un _pulso de redstone_.", "block.create.adjustable_crate.tooltip": "CAJA AJUSTABLE", - "block.create.adjustable_crate.tooltip.summary": "Este _Contenedor de Artículos_ permite el control manual de su capacidad. Puede contener hasta _16 pilas_ de cualquier objeto. Soporta _Comparadores de Redstone_", - "block.create.adjustable_crate.tooltip.control1": "Cuando haces click derecho", - "block.create.adjustable_crate.tooltip.action1": "Abre la _Interfaz_", + "block.create.adjustable_crate.tooltip.summary": "Este _contenedor de objetos_ permite el control manual de su capacidad. Puede contener hasta _16 pilas_ de cualquier objeto. Soporta _comparadores de redstone_.", + "block.create.adjustable_crate.tooltip.condition1": "Cuando se hace clic derecho", + "block.create.adjustable_crate.tooltip.behaviour1": "Abre la interfaz.", "block.create.creative_crate.tooltip": "CAJA CREATIVA", - "block.create.creative_crate.tooltip.summary": "Este _Contenedor de Almacenamiento_ permite la replicación infinita de cualquier elemento. Colócalo junto a un _Schematicannon_ para eliminar cualquier requisito de material", - "block.create.creative_crate.tooltip.condition1": "Cuando el artículo está en la ranura del filtro", - "block.create.creative_crate.tooltip.behaviour1": "Todo lo que se _extraiga_ de este contenedor proporcionará un _suministro ilimitado_ del elemento especificado. Los elementos _insertados_ en esta caja serán _evitados._", - - "block.create.deployer.tooltip": "DESPLEGADOR", - "block.create.deployer.tooltip.summary": "_Lanza_, _Usa_ y _Activa_. Esta máquina intentará _imitar_ a un _jugador_ en la medida de lo posible. Puede _tomar_ y _depositar objetos_ en su propio _inventario_. Los objetos guardados deben ser _insertados_ y _extraídos_ del bloque directamente", - "block.create.deployer.tooltip.condition1": "Cuando se alimenta de cinética", - "block.create.deployer.tooltip.behaviour1": "Extiende su brazo y se _activa_ en el espacio del bloque _2m por delante_ de sí mismo", - "block.create.deployer.tooltip.condition2": "Click derecho con la Llave Inglesa", - "block.create.deployer.tooltip.behaviour2": "Activa el modo puñetazo. En el _modo puñetazo_, el Desplegador intentará usar su objeto para _romper bloques_ o _herir entidades_", - "block.create.deployer.tooltip.condition3": "Cuando se asigna el filtro", - "block.create.deployer.tooltip.behaviour3": "El desplegador no se activará a menos que el elemento retenido _coincida_ con el _filtro._ Los elementos que no coincidan no podrán ser insertados; los elementos retenidos que coincidan con el filtro no podrán ser extraídos.", - - "block.create.brass_casing.tooltip": "REVESTIDOR DE LATÓN", - "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _cintas._", - - "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSOS DE REDSTONE", - "block.create.pulse_repeater.tooltip.summary": "Un circuito sencillo para cortar las señales de Redstone que pasan a una longitud de _1 tick_", - - "block.create.adjustable_repeater.tooltip": "REPETIDOR AJUSTABLE", - "block.create.adjustable_repeater.tooltip.summary": "Un avanzado _repetidor de Redstone_ con un _retraso configurable_ de hasta 30 minutos", - - "block.create.adjustable_pulse_repeater.tooltip": "REPETIDOR DE PULSO AJUSTABLE", - "block.create.adjustable_pulse_repeater.tooltip.summary": "Un _repetidor de pulsos_ con un _retardo configurable_ de hasta 30 minutos", - - "block.create.analog_lever.tooltip": "PALANCA ANALÓGICA", - "block.create.analog_lever.tooltip.summary": "Una palanca con un control más _preciso_ sobre su fuerza de _señal_ emitida", - - "block.create.powered_toggle_latch.tooltip": "PALANCA MECANIZADA", - "block.create.powered_toggle_latch.tooltip.summary": "Una palanca que puede ser accionada por un _Pulso de Redstone_", - - "block.create.powered_latch.tooltip": "PALANCA DE CIERRE MECANIZADA", - "block.create.powered_latch.tooltip.summary": "Una palanca que puede ser controlada por _señales de Redstone_. Una señal en la _trasera la habilita_, una señal desde el _lado la reinicia_", + "block.create.creative_crate.tooltip.summary": "Este _contenedor de objetos_ permite la replicación infinita de cualquier elemento. Colócalo junto a un _cañón de esquemas_ para eliminar cualquier requisito de material.", + "block.create.creative_crate.tooltip.condition1": "Cuando el elemento está en la ranura para filtros", + "block.create.creative_crate.tooltip.behaviour1": "Todo lo que se _extraiga_ de este contenedor proporcionará un suministro _ilimitado_ del elemento especificado. Los objetos _insertados_ en esta caja serán _evitados_.", "block.create.controller_rail.tooltip": "RAÍL DE CONTROL", - "block.create.controller_rail.tooltip.summary": "Un _raíl energizado unidireccional_ capaz de _controlar con precisión_ la _velocidad de movimiento_ de una vagoneta", - "block.create.controller_rail.tooltip.condition1": "Cuando es impulsado por Redstone", - "block.create.controller_rail.tooltip.behaviour1": "_Acelera_ o _Desacelera_ pasando _vagonetas_ correspondientes a la _fuerza de la señal_. Propaga la energía de Redstone a los Raíles de control adyacentes. Al alimentar dos Raíles de control con diferentes intensidades, los carriles entre ellos interpolarán su señal", - - "block.create.speedometer.tooltip": "VELOCÍMETRO", - "block.create.speedometer.tooltip.summary": "Mide y muestra la _velocidad de rotación_ de los componentes cinéticos acoplados. Es compatible con _comparadores de Redstone_", - "block.create.speedometer.tooltip.condition1": "Cuando es impulsado por la cinética", - "block.create.speedometer.tooltip.behaviour1": "Indica un color correspondiente al nivel de velocidad. El _Verde_ indica Lento, el _Azul_ Moderado y el _Púrpura_ Rápido. Algunos componentes mecánicos requieren un nivel de velocidad suficiente para funcionar correctamente", - - "block.create.stressometer.tooltip": "ESTRESÓMETRO", - "block.create.stressometer.tooltip.summary": "Mide y muestra el _estrés global_ de la red cinética adjunta. Es compatible con _comparadores de Redstone_", - "block.create.stressometer.tooltip.condition1": "Cuando se alimenta con cinética", - "block.create.stressometer.tooltip.behaviour1": "Indica un color correspondiente al nivel de estrés. Las redes demasiado estresadas dejarán de moverse. El estrés puede aliviarse añadiendo más _fuentes de rotación_ a la red", + "block.create.controller_rail.tooltip.summary": "Un raíl energizado _unidireccional_ capaz de _controlar con precisión_ la _velocidad de movimiento_ de una vagoneta.", + "block.create.controller_rail.tooltip.condition1": "Cuando es alimentado con redstone", + "block.create.controller_rail.tooltip.behaviour1": "_Acelera_ o _desacelera_ pasando _vagonetas_ correspondientes a la _fuerza de la señal_. Propaga la energía de redstone a los raíles de control adyacentes. Al alimentar dos raíles de control con diferentes intensidades, los carriles entre ellos interpolarán su señal.", "item.create.sand_paper.tooltip": "PAPEL DE LIJA", - "item.create.sand_paper.tooltip.summary": "Un papel rugoso que se puede utilizar para _pulir materiales_. Se puede aplicar automáticamente con el Desplegador", + "item.create.sand_paper.tooltip.summary": "Un papel rugoso que se puede utilizar para _pulir materiales_. Se puede aplicar automáticamente con el _desplegador_.", "item.create.sand_paper.tooltip.condition1": "Cuando se usa", - "item.create.sand_paper.tooltip.behaviour1": "Aplica el pulido a los objetos sostenidos en la _mano libre_ o tirados en el _suelo_ cuando se _miran_", - - "item.create.super_glue.tooltip": "SÚPER PEGAMENTO", - "item.create.super_glue.tooltip.summary": "Pega un bloque a otro y serán inseparables para siempre", - "item.create.super_glue.tooltip.condition1": "Cuando se usa", - "item.create.super_glue.tooltip.behaviour1": "Hace que la cara _clicada_ de un bloque sea _pegajosa_. Los bloques unidos a caras pegajosas serán _arrastrados_ cuando se muevan por _pistones mecánicos_, _rodamientos_ y otros controladores", - "item.create.super_glue.tooltip.condition2": "Cuando se sostiene en la mano", - "item.create.super_glue.tooltip.behaviour2": "_Adjunta automáticamente_ los bloques colocados desde la mano principal al _lado_ contra el que fueron _colocados._", + "item.create.sand_paper.tooltip.behaviour1": "Aplica un pulido a los objetos sostenidos en la _mano libre_ o tirados en el _suelo_ cuando se _miran_.", "item.create.builders_tea.tooltip": "TÉ DEL CONSTRUCTOR", - "item.create.builders_tea.tooltip.summary": "La bebida perfecta para empezar el día- _Motivante_ y _Saturante._", + "item.create.builders_tea.tooltip.summary": "La bebida perfecta para empezar el día. Motivante y saturante.", "item.create.refined_radiance.tooltip": "RESPLANDOR REFINADO", - "item.create.refined_radiance.tooltip.summary": "Material cromático forjado a partir de _luz absorbida_", + "item.create.refined_radiance.tooltip.summary": "Un material cromático forjado a partir de la _luz absorbida_.", + "item.create.refined_radiance.tooltip.condition1": "Trabajo en progreso", + "item.create.refined_radiance.tooltip.behaviour1": "Los usos para este material estarán disponibles en un próximo lanzamiento.", "item.create.shadow_steel.tooltip": "ACERO SOMBRÍO", - "item.create.shadow_steel.tooltip.summary": "Un material cromático forjado _en el vacío_", + "item.create.shadow_steel.tooltip.summary": "Un material cromático forjado en el _vacío_.", + "item.create.shadow_steel.tooltip.condition1": "Work In Progress", + "item.create.shadow_steel.tooltip.behaviour1": "Usages for this material will be available in a future release.", + + "item.create.linked_controller.tooltip": "CONTROLADOR ENLAZADO", + "item.create.linked_controller.tooltip.summary": "Permite el control manual de las frecuencias de _enlaces de redstone_ asignadas a sus seis botones..", + "item.create.linked_controller.tooltip.condition1": "Al hacer clic derecho", + "item.create.linked_controller.tooltip.behaviour1": "Activa el _controlador_. Los _controles de movimiento_ se adquieren mientras está activo.", + "item.create.linked_controller.tooltip.condition2": "Al usar [Mayús izdo.] + clic derecho", + "item.create.linked_controller.tooltip.behaviour2": "Abre la interfaz de configuración manual.", + "item.create.linked_controller.tooltip.condition3": "Al usar clic derecho en un receptor de enlaces de redstone", + "item.create.linked_controller.tooltip.behaviour3": "Activa el _modo de vinculación_, pulsa uno de los _seis controles_ para vincularlo a la _frecuencia de los enlaces_.", + + "item.create.diving_helmet.tooltip": "CASCO DE BUCEO", + "item.create.diving_helmet.tooltip.summary": "Junto con un _depósito trasero de cobre_, permite que el usuario pueda respirar bajo el agua durante un tiempo prolongado.", + "item.create.diving_helmet.tooltip.condition1": "Cuando se lleva puesto", + "item.create.diving_helmet.tooltip.behaviour1": "Proporciona el efecto de _respiración acuática_, drenando lentamente la presión de aire del _depósito trasero_.", + "item.create.copper_backtank.tooltip.condition2": "When placed, Powered by Kinetics", + "item.create.copper_backtank.tooltip.behaviour2": "_Collects_ _Pressurized_ _Air_ at a rate depending on the Rotational Speed.", + + "item.create.copper_backtank.tooltip": "DEPÓSITO TRASERO DE COBRE", + "item.create.copper_backtank.tooltip.summary": "Un tanque portátil para transportar _aire presurizado_.", + "item.create.copper_backtank.tooltip.condition1": "Cuando se lleva puesto", + "item.create.copper_backtank.tooltip.behaviour1": "Proporciona _aire presurizado_ a los equipos que lo requieran.", + "item.create.copper_backtank.tooltip.condition2": "Cuando se coloca y es alimentado por cinética", + "item.create.copper_backtank.tooltip.behaviour2": "Recoge _aire presurizado_ a un ritmo que depende de la velocidad rotacional.", + + "item.create.diving_boots.tooltip": "BOTAS DE BUCEO", + "item.create.diving_boots.tooltip.summary": "Un par de _botas_ pesadas, que permiten atravesar mejor el suelo del océano.", + "item.create.diving_boots.tooltip.condition1": "Cuando se llevan puestas", + "item.create.diving_boots.tooltip.behaviour1": "El portador se hunde rápido y no puede nadar. Concede la capacidad de caminar y saltar bajo el agua. Al portador no le afectarán las _correas mecánicas.", + + "item.create.crafting_blueprint.tooltip": "PLANO DE ELABORACIÓN", + "item.create.crafting_blueprint.tooltip.summary": "Colocado en una pared, puede utilizarse para especificar la disposición de los ingredientes para facilitar la elaboración manual. Cada ranura representa una receta", + "item.create.crafting_blueprint.condition1": "Al hacer clic derecho en una ranura vacía", + "item.create.crafting_blueprint.behaviour1": "Abre un menú que permite configurar una receta y los objetos a mostrar.", + "item.create.crafting_blueprint.condition2": "Al hacer clic derecho en una ranura configurada", + "item.create.crafting_blueprint.behaviour2": "Aplica la receta configurada con los ingredientes que se encuentran en tu inventario. Se puede utilizar para fabricar hasta una pila de objetos.", "item.create.minecart_coupling.tooltip": "ENSAMBLADOR DE VAGONETAS", - "item.create.minecart_coupling.tooltip.summary": "_Encadena_ todas tus _Vagonetas_ o _Artilugios de vagoneta_ para formar un majestuoso Tren", - "item.create.minecart_coupling.tooltip.condition1": "Cuando se utiliza en Vagonetas", - "item.create.minecart_coupling.tooltip.behaviour1": "_Acopla_ dos Vagonetas, intentando mantenerlas a una _distancia constante_ mientras se mueven", + "item.create.minecart_coupling.tooltip.summary": "_Encadena_ todas tus _vagonetas_ o _artilugios de vagoneta_ para formar un majestuoso _tren_.", + "item.create.minecart_coupling.tooltip.condition1": "Cuando se utiliza en vagonetas", + "item.create.minecart_coupling.tooltip.behaviour1": "_Acopla_ dos vagonetas, intentando mantenerlas a una _distancia constante_ mientras se mueven.", + + "block.create.peculiar_bell.tooltip": "PECULIAR BELL", + "block.create.peculiar_bell.tooltip.summary": "A decorative brass bell. Placing it above a _Soul Fire_ or _Soul Campfire_ may cause a spooky transformation to occur...", - "item.create.crafter_slot_cover.tooltip": "TAPA DE RANURA DEL AUTOENSAMBLADOR", - "item.create.crafter_slot_cover.tooltip.summary": "Se utiliza para marcar a un _Autoensamblador_ una ranura vacía en una receta. Los autoensambladores no tienen que formar necesariamente una cuadrícula completa. Esto es útil cuando hay recetas en las que los _ingredientes están en diagonal_ entre sí", + "block.create.cursed_bell.tooltip": "CURSED BELL", + "block.create.cursed_bell.tooltip.summary": "A spooky brass bell haunted by lost souls of the Nether.", + "block.create.cursed_bell.tooltip.condition1": "When Held or Rang", + "block.create.cursed_bell.tooltip.behaviour1": "Highlights nearby dark spots on which Hostile Mobs could spawn.", - "create.tooltip.wip": "WIP", - "create.tooltip.workInProgress": "¡Trabajo en curso!", - "create.tooltip.randomWipDescription0": "Por favor, mantenga este artículo fuera del alcance de los niños", - "create.tooltip.randomWipDescription1": "Un bebé panda muere cada vez que usas este objeto. Cada vez. Cada vez", - "create.tooltip.randomWipDescription2": "Úsalo bajo tu propio riesgo", - "create.tooltip.randomWipDescription3": "Este no es el objeto que buscas, *mueve los dedos* por favor, dispérsate", - "create.tooltip.randomWipDescription4": "Este objeto se autodestruirá en 10 segundos. 10, 9, 8...", - "create.tooltip.randomWipDescription5": "Créeme, es inútil", - "create.tooltip.randomWipDescription6": "Al utilizar este elemento, aceptas nuestra exención de responsabilidad y estás de acuerdo con sus términos", - "create.tooltip.randomWipDescription7": "Este quizás no es para ti. ¿Qué tal ese?", - "create.tooltip.randomWipDescription8": "Úsalo y arrepiéntete de tu decisión inmediatamente", + + "_": "->------------------------] Ponder Content [------------------------<-", + + "create.ponder.hold_to_ponder": "Mantén [%1$s] para considerar", + "create.ponder.subject": "Tema de esta escena", + "create.ponder.pondering": "Considerando sobre...", + "create.ponder.identify_mode": "Identificando modo activo.\nDespausea con [%1$s]", + "create.ponder.associated": "Entradas asociadas", + "create.ponder.close": "Cerrar", + "create.ponder.identify": "Identificar", + "create.ponder.next": "Escena siguiente", + "create.ponder.previous": "Escena previa", + "create.ponder.replay": "Repetición", + "create.ponder.think_back": "Volver atrás", + "create.ponder.slow_text": "Lectura cómoda", + "create.ponder.exit": "Exit", + "create.ponder.welcome": "Welcome to Ponder", + "create.ponder.categories": "Available Categories in Create", + "create.ponder.index_description": "Click one of the icons to learn about its associated Items and Blocks", + "create.ponder.index_title": "Ponder Index", + "create.ponder.shared.movement_anchors": "Con la ayuda de un chasis o pegamento, se pueden mover estructuras más grandes.", + "create.ponder.shared.rpm32": "32 RPM", + "create.ponder.shared.sneak_and": "Mayús izdo. +", + "create.ponder.shared.storage_on_contraption": "Los inventarios unidos al artilugio recogerán sus producciones automáticamente", + "create.ponder.shared.behaviour_modify_wrench": "Este comportamiento puede modificarse mediante una llave inglesa", + "create.ponder.shared.rpm8": "8 RPM", + "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm16_source": "Fuente: 16 RPM", + "create.ponder.shared.rpm16": "16 RPM", + "create.ponder.tag.kinetic_sources": "Fuentes cinéticas", + "create.ponder.tag.kinetic_sources.description": "Componentes que generan fuerza rotacional", + "create.ponder.tag.contraption_actor": "Actores del artilugio", + "create.ponder.tag.contraption_actor.description": "Componentes que exponen un comportamiento especial cuando están unidos a un artilugio en movimiento", + "create.ponder.tag.arm_targets": "Objetivos para los brazos mecánicos", + "create.ponder.tag.arm_targets.description": "Componentes que pueden seleccionarse como entradas o salidas del brazo mecánico", + "create.ponder.tag.logistics": "Transporte de objetos", + "create.ponder.tag.logistics.description": "Componentes que ayudan a desplazar los objetos", + "create.ponder.tag.movement_anchor": "Anclas de movimiento", + "create.ponder.tag.movement_anchor.description": "Componentes que permiten crear artilugios en movimiento, animando una estructura anexa de diversas maneras", + "create.ponder.tag.creative": "Modo creativo", + "create.ponder.tag.creative.description": "Componentes que no suelen estar disponibles para el Modo Supervivencia", + "create.ponder.tag.kinetic_relays": "Transmisores cinéticos", + "create.ponder.tag.kinetic_relays.description": "Componentes que ayudan a transmitir la fuerza rotacional en otro lugar", + "create.ponder.tag.windmill_sails": "Velas para los rodamientos de los molinos de viento", + "create.ponder.tag.windmill_sails.description": "Bloques que cuentan para la fuerza de un artefacto de molino de viento cuando se ensamblan. Cada uno de ellos tiene la misma eficacia al hacerlo.", + "create.ponder.tag.contraption_assembly": "Utilidades para adjuntar bloques", + "create.ponder.tag.contraption_assembly.description": "Herramientas y componentes utilizados para montar estructuras con movimiento, como un artilugio animado", + "create.ponder.tag.decoration": "Estética", + "create.ponder.tag.decoration.description": "Componentes utilizados principalmente con fines decorativos", + "create.ponder.tag.kinetic_appliances": "Dispositivos cinéticos", + "create.ponder.tag.kinetic_appliances.description": "Componentes que utilizan la fuerza rotacional", + "create.ponder.tag.redstone": "Componentes lógicos", + "create.ponder.tag.redstone.description": "Componentes que ayudan a la ingeniería de redstone", + "create.ponder.tag.fluids": "Manipuladores de fluidos", + "create.ponder.tag.fluids.description": "Componentes que ayudan a transportar y utilizar fluidos", + + "create.ponder.adjustable_pulse_repeater.header": "Controlar señales mediante repetidores de pulsos ajustables", + "create.ponder.adjustable_pulse_repeater.text_1": "Los repetidores de pulsos ajustables emiten un pulso corto con un retardo", + "create.ponder.adjustable_pulse_repeater.text_2": "Con la rueda del ratón se puede configurar el tiempo de carga", + "create.ponder.adjustable_pulse_repeater.text_3": "Los retrasos configurados pueden ser de hasta 30 minutos", + + "create.ponder.adjustable_repeater.header": "Controlar señales mediante repetidores ajustables", + "create.ponder.adjustable_repeater.text_1": "Los repetidores ajustables se comportan de forma similar a los repetidores normales", + "create.ponder.adjustable_repeater.text_2": "Se cargan durante un tiempo determinado...", + "create.ponder.adjustable_repeater.text_3": "...y se enfrían durante el mismo tiempo", + "create.ponder.adjustable_repeater.text_4": "Con la rueda del ratón se puede configurar el tiempo de carga", + "create.ponder.adjustable_repeater.text_5": "Los retrasos configurados pueden variar hasta 30 minutos", + + "create.ponder.analog_lever.header": "Controlar señales mediante la palanca analógica", + "create.ponder.analog_lever.text_1": "Las palancas analógicas son una fuente compacta y precisa de energía de redstone", + "create.ponder.analog_lever.text_2": "Haz clic derecho para aumentar su potencia analógica", + "create.ponder.analog_lever.text_3": "Usa [Mayús izdo.] + clic derecho para volver a disminuir su potencia", + + "create.ponder.andesite_tunnel.header": "Usar túneles de andesita", + "create.ponder.andesite_tunnel.text_1": "Los túneles de andesita se pueden utilizar para tapar las correas", + "create.ponder.andesite_tunnel.text_2": "Siempre que un túnel de andesita tenga conexiones a los lados...", + "create.ponder.andesite_tunnel.text_3": "...dividirá exactamente un elemento de cualquier pila que pase", + "create.ponder.andesite_tunnel.text_4": "El resto continuará su camino", + + "create.ponder.basin.header": "Procesar objetos en la cuenca", + "create.ponder.basin.text_1": "Una cuenca puede contener objetos y fluidos para su procesamiento", + "create.ponder.basin.text_2": "Después de un paso de procesamamiento, las cuencas intentan descargar por debajo a un lado de ellas", + "create.ponder.basin.text_3": "Cuando un ingrediente válido está presente, la cuenca mostrará un conducto de salida", + "create.ponder.basin.text_4": "Aquí se pueden aplicar varias opciones", + "create.ponder.basin.text_5": "Las salidas serán capturadas por el inventario que está por debajo", + "create.ponder.basin.text_6": "Sin conducto de salida, la cuenca retendrá los objetos creados en su procesamiento", + "create.ponder.basin.text_7": "Esto puede ser útil si las salidas deben ser reutilizadas como ingredientes", + "create.ponder.basin.text_8": "Las salidas deseadas tendrán que ser extraídas de la cuenca", + "create.ponder.basin.text_9": "Podría ser necesario un filtro para evitar sacar los objetos no procesados", + + "create.ponder.bearing_modes.header": "Modos de movimiento del rodamiento mecánico", + "create.ponder.bearing_modes.text_1": "Cuando se detenga, el rodamiento mecánico colocará la estructura en el ángulo más cercano alineado con la cuadrícula", + "create.ponder.bearing_modes.text_2": "Se puede configurar para que nunca vuelva a los bloques sólidos, o sólo cerca del ángulo en el que comenzó", + + "create.ponder.belt_casing.header": "Correas revestidas", + "create.ponder.belt_casing.text_1": "Se puede utilizar revestidor de latón o andesita para decorar las correas", + "create.ponder.belt_casing.text_2": "Se puede utilizar una llave inglesa para quitar el revestimiento", + + "create.ponder.belt_connector.header": "El uso de las correas mecánicas", + "create.ponder.belt_connector.text_1": "Al hacer clic derecho en dos ejes con una correa mecánica se conectarán entre sí", + "create.ponder.belt_connector.text_2": "Las selecciones accidentales pueden ser canceladas con [Mayús izdo.] + clic derecho", + "create.ponder.belt_connector.text_3": "Se pueden añadir ejes adicionales en toda la correa", + "create.ponder.belt_connector.text_4": "Los ejes conectados a través de correas girarán con velocidad y dirección idénticas", + "create.ponder.belt_connector.text_5": "Los ejes añadidos se pueden quitar con la llave inglesa", + "create.ponder.belt_connector.text_6": "Las correas mecánicas se pueden teñir con fines estéticos", + + "create.ponder.belt_directions.header": "Orientaciones válidas para las correas mecánicas", + "create.ponder.belt_directions.text_1": "Las correas mecánicas no pueden conectarse en direcciones arbitrarias", + "create.ponder.belt_directions.text_2": "1. Pueden conectarse horizontalmente", + "create.ponder.belt_directions.text_3": "2. Pueden conectarse en diagonal", + "create.ponder.belt_directions.text_4": "3. Pueden conectarse verticalmente", + "create.ponder.belt_directions.text_5": "4. Y pueden conectar ejes verticales horizontalmente", + "create.ponder.belt_directions.text_6": "Estas son todas las direcciones posibles. Pueden abarcar cualquier longitud entre 2 y 20 bloques", + + "create.ponder.belt_transport.header": "El uso de las correas mecánicas para la logística", + "create.ponder.belt_transport.text_1": "Las correas mecánicas transportan objetos y otras entidades", + "create.ponder.belt_transport.text_2": "Haz clic derecho con la mano vacía para sacar objetos de una 'cinta'", + + "create.ponder.blaze_burner.header": "Alimentar quemadores de blaze", + "create.ponder.blaze_burner.text_1": "Los quemadores de blaze pueden proporcionar calor a los objetos procesados en una cuenca", + "create.ponder.blaze_burner.text_2": "Para ello, el blaze tiene que ser alimentado con objetos inflamables", + "create.ponder.blaze_burner.text_3": "Con un pastel de blaze, el quemador puede alcanzar un mayor nivel de calor", + "create.ponder.blaze_burner.text_4": "El proceso de alimentación puede automatizarse utilizando desplegadores o brazos mecánicos", + + "create.ponder.brass_funnel.header": "El embudo de latón", + "create.ponder.brass_funnel.text_1": "Los embudos de andesita sólo pueden extraer objetos individuales", + "create.ponder.brass_funnel.text_2": "Los embudos de latón pueden extraer hasta una pila completa", + "create.ponder.brass_funnel.text_3": "Usar la rueda de desplazamiento del ratón en la ranura para filtros permite un control preciso del tamaño de la pila extraída.", + "create.ponder.brass_funnel.text_4": "El uso de objetos en la ranura de filtrado restringirá el embudo para transferir sólo las pilas que coincidan.", + + "create.ponder.brass_tunnel.header": "Usar túneles de latón", + "create.ponder.brass_tunnel.text_1": "Los túneles de latón pueden utilizarse para tapar las correas", + "create.ponder.brass_tunnel.text_2": "Tienen ranuras de filtro en cada lado abierto", + "create.ponder.brass_tunnel.text_3": "Los filtros en las conexiones de entrada simplemente bloquean los objetos que no coincidan", + "create.ponder.brass_tunnel.text_4": "Los filtros en las conexiones de salida pueden utilizarse para ordenar los objetos por tipo", + "create.ponder.brass_tunnel.text_5": "Siempre que un objeto de paso tenga múltiples salidas válidas, el modo de distribución decidirá cómo manejarlo", + "create.ponder.brass_tunnel.text_6": "Los túneles de latón en bandas paralelas formarán un grupo", + "create.ponder.brass_tunnel.text_7": "Los objetos entrantes se distribuirán ahora por todas las salidas conectadas", + "create.ponder.brass_tunnel.text_8": "Para ello, los objetos también pueden insertarse en el bloque del túnel directamente", + + "create.ponder.brass_tunnel_modes.header": "Modos de distribución del túnel de latón", + "create.ponder.brass_tunnel_modes.text_1": "Mediante una llave inglesa se puede configurar el comportamiento de distribución de los túneles de latón", + "create.ponder.brass_tunnel_modes.text_10": "'Sincronizar entradas' es una configuración única de los túneles de latón", + "create.ponder.brass_tunnel_modes.text_11": "Las entradas sólo pueden pasar si cada túnel del grupo tiene una en espera", + "create.ponder.brass_tunnel_modes.text_12": "Esto asegura que todas las correas afectadas suministren objetos al mismo tiempo", + "create.ponder.brass_tunnel_modes.text_2": "El modo División intentará distribuir la pila uniformemente entre las salidas disponibles", + "create.ponder.brass_tunnel_modes.text_3": "Si una salida no puede tomar más objetos, se saltará", + "create.ponder.brass_tunnel_modes.text_4": "El modo División forzada nunca saltará las salidas, y en su lugar esperará hasta que estén libres", + "create.ponder.brass_tunnel_modes.text_5": "El modo Round Robin mantiene las pilas enteras, y recorre las salidas de forma iterativa", + "create.ponder.brass_tunnel_modes.text_6": "Una vez más, si una salida no puede aceptar más objetos, se saltará", + "create.ponder.brass_tunnel_modes.text_7": "El modo Round Robin forzado nunca omite salidas", + "create.ponder.brass_tunnel_modes.text_8": "El modo Preferir el más cercano prioriza las salidas más cercanas a la ubicación de entrada de los objetos", + "create.ponder.brass_tunnel_modes.text_9": "El modo Aleatorizar distribuirá pilas enteras a salidas elegidas al azar", + + "create.ponder.cart_assembler.header": "Mover estructuras usando ensambladores de vagonetas", + "create.ponder.cart_assembler.text_1": "Los ensambladores de vagonetas montan estructuras adjuntas a las vagonetas que pasan", + "create.ponder.cart_assembler.text_2": "Sin una señal de redstone, desmonta los artilugios de vagoneta que pasan de nuevo en bloques", + "create.ponder.cart_assembler.text_3": "El uso de una llave inglesa en una vagoneta te permitirá llevar el artilugio a otro lugar", + + "create.ponder.cart_assembler_dual.header": "Ensamblajes de artilugios de vagoneta", + "create.ponder.cart_assembler_dual.text_1": "Siempre que dos ensambladores de vagoneta compartan una estructura adjunta...", + "create.ponder.cart_assembler_dual.text_2": "...al alimentar a cualquiera de ellos se creará un artilugio de vagoneta", + "create.ponder.cart_assembler_dual.text_3": "Las vagonetas se comportarán como las conectadas a través del acoplamiento de vagoneta", + + "create.ponder.cart_assembler_modes.header": "Configurar la orientación de los artilugios de vagonetas", + "create.ponder.cart_assembler_modes.text_1": "Los artilugios de vagonetas girarán para orientarse hacia el movimiento de sus vagonetas", + "create.ponder.cart_assembler_modes.text_2": "This Arrow indicates which side of the Structure will be considered the front", + "create.ponder.cart_assembler_modes.text_3": "If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "Otros tipos de vagonetas y raíles", + "create.ponder.cart_assembler_rails.text_1": "Los ensambladores de vagonetas en raíles normales no afectarán el movimiento de las vagonetas que pasen", + "create.ponder.cart_assembler_rails.text_2": "Cuando se encuentre en un raíl motorizado o en un raíl de control, las vagonetas se mantendrán en su sitio hasta que sea motorizado", + "create.ponder.cart_assembler_rails.text_3": "Se pueden utilizar otros tipos de vagonetas como anclaje", + "create.ponder.cart_assembler_rails.text_4": "Los artilugios de vagonetas de horno se mantendrán alimentados a sí mismos, sacando combustible de cualquier inventario adjunto", + + "create.ponder.chain_drive.header": "Transmitir fuerza rotacional con las cadenas de transmisión", + "create.ponder.chain_drive.text_1": "Las cadenas de transmisión transmiten la rotación entre sí en fila", + "create.ponder.chain_drive.text_2": "Todos los ejes conectados así girarán en la misma dirección", + "create.ponder.chain_drive.text_3": "Cualquier parte de la fila puede girar 90 grados usando una llave inglesa", + + "create.ponder.chain_gearshift.header": "Controlar la velocidad de rotación con la cadena de transmisión ajustable", + "create.ponder.chain_gearshift.text_1": "Las cadenas de transmisión ajustables sin alimentación se comportan exactamente como las cadenas de transmisión", + "create.ponder.chain_gearshift.text_2": "Cuando están alimentadas, la velocidad transmitida a las demás cadenas de transmisión de la fila se duplica", + "create.ponder.chain_gearshift.text_3": "Siempre que la cadena de transmisión alimentada no esté en el origen, su velocidad se reducirá a la mitad", + "create.ponder.chain_gearshift.text_4": "En ambos casos, las cadenas de transmisión de la fila siempre funcionan a 2 veces la velocidad de la cadena de transmisión alimentada", + "create.ponder.chain_gearshift.text_5": "Utilizando señales analógicas, la relación puede ajustarse con mayor precisión, entre 1 y 2", + "create.ponder.chain_gearshift.text_6": "12 RPM", + + "create.ponder.chute.header": "Transportar objetos hacia abajo a través de ductos", + "create.ponder.chute.text_1": "Los ductos pueden transportar objetos verticalmente desde y hacia los inventarios", + "create.ponder.chute.text_2": "Usando la llave inglesa, se puede crear una ventana", + "create.ponder.chute.text_3": "Colocar ductos apuntando a las caras laterales de otro lo hará en diagonal", + + "create.ponder.chute_upward.header": "Transportar objetos hacia arriba mediante ductos", + "create.ponder.chute_upward.text_1": "Usando ventiladores revestidos en la parte superior o inferior, un ducto puede transportar objetos hacia arriba", + "create.ponder.chute_upward.text_2": "Al inspeccionar los ductos con las gafas del constructor, se revela información sobre la dirección del movimiento", + "create.ponder.chute_upward.text_3": "En el extremo 'bloqueado', los objetos tendrán que ser insertados/tomados de los lados", + + "create.ponder.clockwork_bearing.header": "Animar estructuras con rodamientos tipo reloj", + "create.ponder.clockwork_bearing.text_1": "Los rodamientos tipo reloj se fijan a los bloques que tienen delante", + "create.ponder.clockwork_bearing.text_2": "Al recibir fuerza rotacional, la estructura girará según la hora del día", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "Haz clic derecho en el rodamiento para iniciar o detener la animación de la estructura", + "create.ponder.clockwork_bearing.text_6": "Delante de la manecilla de las horas se puede añadir una segunda estructura", + "create.ponder.clockwork_bearing.text_7": "Asegúrese de que las dos estructuras no están unidas entre sí con pegamento o algo similar", + "create.ponder.clockwork_bearing.text_8": "La segunda estructura ahora girará como el minutero", + + "create.ponder.clutch.header": "Controlar la fuerza rotacional mediante un embrague", + "create.ponder.clutch.text_1": "Los embragues transmitirán la rotación en línea recta", + "create.ponder.clutch.text_2": "Cuando se alimentan con redstone, rompen la conexión", + + "create.ponder.cog_speedup.header": "Cambiar de marchas con engranajes", + "create.ponder.cog_speedup.text_1": "Los engranajes grandes y pequeños pueden conectarse en diagonal", + "create.ponder.cog_speedup.text_2": "Al cambiar de engranajes grandes a pequeños, la velocidad rotacional se duplicará", + "create.ponder.cog_speedup.text_3": "Inversamente, la velocidad rotacional se reducirá a la mitad", + + "create.ponder.cogwheel.header": "Transmitir fuerza rotacional mediante engranajes", + "create.ponder.cogwheel.text_1": "Los engranajes transmitirán la rotación a otros engranajes adyacentes", + "create.ponder.cogwheel.text_2": "Los ejes adyacentes conectados así, girarán en direcciones opuestas", + + "create.ponder.creative_fluid_tank.header": "Tanque de fluídos creativo", + "create.ponder.creative_fluid_tank.text_1": "Creative Fluid Tanks can be used to provide a bottomless supply of fluid", + "create.ponder.creative_fluid_tank.text_2": "Right-Click with a fluid containing item to configure it", + "create.ponder.creative_fluid_tank.text_3": "Pipe Networks can now endlessly draw the assigned fluid from the tank", + "create.ponder.creative_fluid_tank.text_4": "Any Fluids pushed back into a Creative Fluid Tank will be voided", + + "create.ponder.creative_motor.header": "Generar fuerza rotacional con motores creativos", + "create.ponder.creative_motor.text_1": "Los motores creativos son una fuente compacta y configurable de fuerza rotacional", + "create.ponder.creative_motor.text_2": "Usar la rueda de desplazamiento del ratón en su parte trasera cambia las RPM de la salida rotacional", + + "create.ponder.crushing_wheels.header": "Procesar objetos con las ruedas trituradoras", + "create.ponder.crushing_wheels.text_1": "Un par de ruedas trituradoras pueden moler objetos de forma muy eficaz", + "create.ponder.crushing_wheels.text_2": "Su fuerza rotacional tiene que hacerlas girar una contra otra", + "create.ponder.crushing_wheels.text_3": "Los objetos lanzados o insertados en la parte superior serán procesados", + "create.ponder.crushing_wheels.text_4": "Los objetos también pueden ser insertados y recogidos a través de medios automatizados", + + "create.ponder.deployer.header": "Usar el desplegador", + "create.ponder.deployer.text_1": "Dada la fuerza rotacional, un desplegador puede imitar las interacciones de los jugadores", + "create.ponder.deployer.text_10": "Haz clic derecho en el frente para darle un objeto a utilizar", + "create.ponder.deployer.text_11": "Los objetos también pueden ser insertados automáticamente", + "create.ponder.deployer.text_12": "Los desplegadores llevan una ranura de filtro", + "create.ponder.deployer.text_13": "Cuando se establece un filtro, sólo se activa mientras se mantiene un elemento coincidente", + "create.ponder.deployer.text_14": "Ahora sólo se pueden insertar los objetos que coincidan con el filtro...", + "create.ponder.deployer.text_15": "...y sólo se extraerán los objetos que no coincidan", + "create.ponder.deployer.text_2": "Siempre interactuará con la posición 2 bloques delante de sí mismo", + "create.ponder.deployer.text_3": "Los bloques situados directamente delante no lo obstruirán", + "create.ponder.deployer.text_4": "Los desplegadores pueden:", + "create.ponder.deployer.text_5": "Colocar bloques,", + "create.ponder.deployer.text_6": "Usar objetos,", + "create.ponder.deployer.text_7": "Activar bloques,", + "create.ponder.deployer.text_8": "Cosechar bloques", + "create.ponder.deployer.text_9": "Y atacar criaturas", + + "create.ponder.deployer_contraption.header": "Usar desplegadores en artilugios", + "create.ponder.deployer_contraption.text_1": "Siempre que los desplegadores se muevan como parte de un artilugio animado...", + "create.ponder.deployer_contraption.text_2": "Se activan en cada ubicación visitada, utilizando objetos de los inventarios de cualquier parte del artilugio", + "create.ponder.deployer_contraption.text_3": "La ranura para filtros se puede utilizar para especificar qué objetos tirar", + + "create.ponder.deployer_modes.header": "Modos del desplegador", + "create.ponder.deployer_modes.text_1": "Por defecto, un desplegador imita la interacción del clic derecho del ratón", + "create.ponder.deployer_modes.text_2": "Usando una llave inglesa, se puede configurar para imitar un clic izquierdo en su lugar", + + "create.ponder.deployer_processing.header": "Procesar objetos mediante desplegadores", + "create.ponder.deployer_processing.text_1": "Con un objeto de sujeción ajustado, los desplegadores pueden procesar los objetos proporcionados por debajo de ellos", + "create.ponder.deployer_processing.text_2": "Los objetos de entrada pueden soltarse o colocarse en un depósito bajo el desplegador", + "create.ponder.deployer_processing.text_3": "Cuando los objetos se proporcionan en una 'cinta'...", + "create.ponder.deployer_processing.text_4": "El desplegador los retendrá y procesará automáticamente", + + "create.ponder.deployer_redstone.header": "Controlar desplegadores con redstone", + "create.ponder.deployer_redstone.text_1": "Al controlar los desplegadores con redstone, éstos no se activarán", + "create.ponder.deployer_redstone.text_2": "Antes de detenerse, el desplegador terminará cualquier ciclo iniciado", + "create.ponder.deployer_redstone.text_3": "Por lo tanto, un pulso negativo puede ser utilizado para desencadenar exactamente un ciclo de activación", + + "create.ponder.depot.header": "Usar depósitos", + "create.ponder.depot.text_1": "Los depósitos pueden servir como objetos 'fijos' de la correa", + "create.ponder.depot.text_2": "Haz clic derecho para colocar o eliminar manualmente objetos del mismo", + "create.ponder.depot.text_3": "Al igual que las correas mecánicas, pueden proporcionar objetos para su procesamiento", + "create.ponder.depot.text_4": "...así como proporcionar objetos a los brazos mecánicos", + + "create.ponder.empty_blaze_burner.header": "Usar quemadores de blaze vacíos", + "create.ponder.empty_blaze_burner.text_1": "Haz clic derecho en un blaze con el quemador vacío para capturarlo", + "create.ponder.empty_blaze_burner.text_2": "Alternativamente, los blaze pueden ser recogidos de sus spawners directamente", + "create.ponder.empty_blaze_burner.text_3": "Ahora tienes una fuente de calor ideal para varias máquinas", + "create.ponder.empty_blaze_burner.text_4": "Por motivos estéticos, los quemadores de blaze vacíos también se pueden encender con pedernal y acero", + "create.ponder.empty_blaze_burner.text_6": "Sin embargo, no son adecuados para la calefacción industrial", + + "create.ponder.encased_fluid_pipe.header": "Revestir tuberías de fluídos", + "create.ponder.encased_fluid_pipe.text_1": "Copper Casing can be used to decorate Fluid Pipes", + "create.ponder.encased_fluid_pipe.text_2": "Aside from being conceiled, Encased Pipes are locked into their connectivity state", + "create.ponder.encased_fluid_pipe.text_3": "It will no longer react to any neighbouring blocks being added or removed", + + "create.ponder.fan_direction.header": "El flujo de aire de los ventiladores revestidos", + "create.ponder.fan_direction.text_1": "Los ventiladores revestidos utilizan la fuerza rotacional para crear una corriente de aire", + "create.ponder.fan_direction.text_2": "La fuerza y la dirección del flujo dependen de la fuerza rotacional suministrada", + + "create.ponder.fan_processing.header": "Procesar objetos mediante ventiladores revestidos", + "create.ponder.fan_processing.text_1": "Al pasar por lava, el flujo de aire se calienta", + "create.ponder.fan_processing.text_2": "Los objetos capturados en la zona serán fundidos", + "create.ponder.fan_processing.text_3": "Los artículos de comida arrojados aquí serán incinerados", + "create.ponder.fan_processing.text_4": "En su lugar, se debería utilizar una instalación de ahumado, usando fuego", + "create.ponder.fan_processing.text_5": "Los flujos de aire que pasan por el agua crean una instalación de lavado", + "create.ponder.fan_processing.text_6": "Se puede hacer un nuevo e interesante procesamiento con él", + "create.ponder.fan_processing.text_7": "La velocidad del ventilador NO afecta a la velocidad de procesamiento, sólo a su rango", + "create.ponder.fan_processing.text_8": "El procesamiento del ventilador también puede aplicarse a los objetos de los depósitos y las correas", + + "create.ponder.fan_source.header": "Generar fuerza rotacional mediante ventiladores revestidos", + "create.ponder.fan_source.text_1": "Los ventiladores orientados hacia una fuente de calor pueden proporcionar fuerza rotacional", + "create.ponder.fan_source.text_2": "Cuando se les da una señal de redstone, los ventiladores comenzarán a proporcionar fuerza", + + "create.ponder.fluid_pipe_flow.header": "Transportar fluidos mediante tuberías de cobre", + "create.ponder.fluid_pipe_flow.text_1": "Fluid Pipes can connect two or more fluid sources and targets", + "create.ponder.fluid_pipe_flow.text_2": "Using a wrench, a straight pipe segment can be given a window", + "create.ponder.fluid_pipe_flow.text_3": "Windowed pipes will not connect to any other adjacent pipe segments", + "create.ponder.fluid_pipe_flow.text_4": "Powered by Mechanical Pumps, the Pipes can transport Fluids", + "create.ponder.fluid_pipe_flow.text_5": "No fluid is being extracted at first", + "create.ponder.fluid_pipe_flow.text_6": "Once the flow connects them, the endpoints gradually transfer their contents", + "create.ponder.fluid_pipe_flow.text_7": "Thus, the Pipe blocks themselves never 'physically' contain any fluid", + + "create.ponder.fluid_pipe_interaction.header": "Drenaje y llenado de contenedores de fluidos", + "create.ponder.fluid_pipe_interaction.text_1": "Endpoints of a pipe network can interact with a variety of blocks", + "create.ponder.fluid_pipe_interaction.text_2": "Any block with fluid storage capabilities can be filled or drained", + "create.ponder.fluid_pipe_interaction.text_3": "Source blocks right in front of an open end can be picked up...", + "create.ponder.fluid_pipe_interaction.text_4": "...while spilling into empty spaces can create fluid sources", + "create.ponder.fluid_pipe_interaction.text_5": "Pipes can also extract fluids from a handful of other blocks directly", + + "create.ponder.fluid_tank_sizes.header": "Dimensiones de un depósito de fluidos", + "create.ponder.fluid_tank_sizes.text_1": "Fluid Tanks can be combined to increase the total capacity", + "create.ponder.fluid_tank_sizes.text_2": "Their base square can be up to 3 blocks wide...", + "create.ponder.fluid_tank_sizes.text_3": "...and grow in height by more than 30 additional layers", + "create.ponder.fluid_tank_sizes.text_4": "Using a Wrench, a tanks' window can be toggled", + + "create.ponder.fluid_tank_storage.header": "Almacenar fluidos en depósitos de fluidos", + "create.ponder.fluid_tank_storage.text_1": "Fluid Tanks can be used to store large amounts of fluid", + "create.ponder.fluid_tank_storage.text_2": "Pipe networks can push and pull fluids from any side", + "create.ponder.fluid_tank_storage.text_3": "The contained fluid can be measured by a Comparator", + "create.ponder.fluid_tank_storage.text_4": "However, in Survival Mode Fluids cannot be added or taken manually", + "create.ponder.fluid_tank_storage.text_5": "You can use Basins, Item Drains and Spouts to drain or fill fluid containing items", + + "create.ponder.flywheel.header": "Generar fuerza rotacional con la rueda de inercia", + "create.ponder.flywheel.text_1": "Las ruedas de inercia son necesarias para generar fuerza rotacional con el motor de horno", + "create.ponder.flywheel.text_2": "La fuerza rotacional proporcionada tiene una capacidad de estrés muy grande", + "create.ponder.flywheel.text_3": "El uso de un alto horno duplicará la eficiencia del motor", + + "create.ponder.funnel_compat.header": "Compatibilidades con el embudo", + "create.ponder.funnel_compat.text_1": "Los embudos deberían interactuar bien con un puñado de otros componentes", + "create.ponder.funnel_compat.text_2": "Sierras verticales", + "create.ponder.funnel_compat.text_3": "Depósitos", + "create.ponder.funnel_compat.text_4": "Drenadores de objetos", + + "create.ponder.funnel_direction.header": "Dirección de la transferencia", + "create.ponder.funnel_direction.text_1": "Colocado normalmente, extrae objetos del inventario", + "create.ponder.funnel_direction.text_2": "Colocado mientras pulsa [Mayús izdo.], pone objetos en el inventario", + "create.ponder.funnel_direction.text_3": "Usando una llave inglesa, el embudo puede ser volteado después de su colocación", + "create.ponder.funnel_direction.text_4": "Se aplicarán las mismas reglas para la mayoría de las orientaciones", + "create.ponder.funnel_direction.text_5": "Los embudos en las correas extraerán/insertarán dependiendo de su dirección de movimiento", + + "create.ponder.funnel_intro.header": "Usar embudos", + "create.ponder.funnel_intro.text_1": "Los embudos son ideales para transferir objetos desde y hacia los inventarios", + + "create.ponder.funnel_redstone.header": "Embudos alimentados con redstone", + "create.ponder.funnel_redstone.text_1": "La energía de redstone impedirá la actuación de cualquier embudo", + + "create.ponder.funnel_transfer.header": "Transferencia directa", + "create.ponder.funnel_transfer.text_1": "Los embudos no pueden transferir nunca entre inventarios cerrados directamente", + "create.ponder.funnel_transfer.text_2": "Los ductos o los ductos inteligentes podrían ser más adecuados para estos fines", + "create.ponder.funnel_transfer.text_3": "Lo mismo se aplica para el movimiento horizontal. Una correa mecánica debería ayudar aquí", + + "create.ponder.furnace_engine.header": "Generar fuerza rotacional con el motor de horno", + "create.ponder.furnace_engine.text_1": "Los motores de horno generan fuerza rotacional mientras su horno adjunto está funcionando", + "create.ponder.furnace_engine.text_2": "La fuerza rotacional proporcionada tiene una capacidad de estrés muy grande", + "create.ponder.furnace_engine.text_3": "El uso de un alto horno duplicará la eficiencia del motor", + + "create.ponder.gantry_carriage.header": "Usar carros de grúa", + "create.ponder.gantry_carriage.text_1": "Los carros de grúa pueden montarse y deslizarse a lo largo de un eje de grúa", + "create.ponder.gantry_carriage.text_2": "Las instalaciones de grúa pueden mover bloques adjuntos", + + "create.ponder.gantry_cascaded.header": "Grúas en cascada", + "create.ponder.gantry_cascaded.text_1": "Los ejes de grúas se unen a un carro de grúa sin necesidad de pegamento", + "create.ponder.gantry_cascaded.text_2": "Lo mismo se aplica a los carros de grúa en los ejes de grúas desplazados", + "create.ponder.gantry_cascaded.text_3": "Así, un sistema de grúas puede estar en cascada para cubrir múltiples ejes de movimiento", + + "create.ponder.gantry_direction.header": "Dirección del movimiento de la grúa", + "create.ponder.gantry_direction.text_1": "Los ejes de grúa pueden tener orientaciones opuestas", + "create.ponder.gantry_direction.text_2": "La dirección de movimiento de los carros de grúa depende de la orientación de sus ejes", + "create.ponder.gantry_direction.text_3": "...así como de su sentido de rotación", + "create.ponder.gantry_direction.text_4": "Se aplican las mismas reglas para la rotación propagada", + + "create.ponder.gantry_redstone.header": "Propagación de la potencia de la grúa", + "create.ponder.gantry_redstone.text_1": "Los ejes de grúa alimentados con redstone dejan de mover sus carros", + "create.ponder.gantry_redstone.text_2": "En su lugar, su fuerza rotacional se transmite al eje de salida de los carros", + + "create.ponder.gantry_shaft.header": "Usar ejes de grúa", + "create.ponder.gantry_shaft.text_1": "Los ejes de grúa forman la base de una instalación de grúas. Los carros adjuntos se moverán a lo largo de ellos", + "create.ponder.gantry_shaft.text_2": "Las instalaciones de grúas pueden mover los bloques adjuntos", + + "create.ponder.gearbox.header": "Transmitir fuerza rotacional mediante cajas de transmisión", + "create.ponder.gearbox.text_1": "Saltar entre ejes de rotación puede volverse voluminoso rápidamente", + "create.ponder.gearbox.text_2": "Una caja de transmisión es el equivalente más compacto de esta configuración", + "create.ponder.gearbox.text_3": "Los ejes giran en las direcciones reflejadas...", + "create.ponder.gearbox.text_4": "...esto quiere decir que las conexiones rectas se invierten", + + "create.ponder.gearshift.header": "Controlar la dirección rotacional mediante una caja de cambios", + "create.ponder.gearshift.text_1": "La caja de cambios transmitirá la rotación en línea recta", + "create.ponder.gearshift.text_2": "Cuando es alimentada con redstone, invierte la transmisión", + + "create.ponder.hand_crank.header": "Generar fuerza rotacional mediante manivelas", + "create.ponder.hand_crank.text_1": "Las manivelas pueden ser utilizadas para aplicar fuerza rotacional manualmente", + "create.ponder.hand_crank.text_2": "Mantén pulsado clic derecho para girar en sentido antihorario", + "create.ponder.hand_crank.text_3": "Su velocidad de transmisión es relativamente alta", + "create.ponder.hand_crank.text_4": "[Mayús izdo.] + clic derecho pulsado para girar en sentido horario", + + "create.ponder.hose_pulley.header": "Llenado y vaciado de fuentes mediante poleas de manguera", + "create.ponder.hose_pulley.text_1": "Hose Pulleys can be used to fill or drain large bodies of Fluid", + "create.ponder.hose_pulley.text_2": "With the Kinetic Input, the height of the pulleys' hose can be controlled", + "create.ponder.hose_pulley.text_3": "The Pulley retracts while the input rotation is inverted", + "create.ponder.hose_pulley.text_4": "On the opposite side, pipes can be connected", + "create.ponder.hose_pulley.text_5": "Attached pipe networks can either provide fluid to the hose...", + "create.ponder.hose_pulley.text_6": "...or pull from it, draining the pool instead", + "create.ponder.hose_pulley.text_7": "Fill and Drain speed of the pulley depends entirely on the fluid networks' throughput", + + "create.ponder.hose_pulley_infinite.header": "Llenado y drenaje pasivo de grandes masas de fluido", + "create.ponder.hose_pulley_infinite.text_1": "When deploying the Hose Pulley into a large enough ocean...", + "create.ponder.hose_pulley_infinite.text_2": "It will provide/dispose fluids without affecting the source", + "create.ponder.hose_pulley_infinite.text_3": "Pipe networks can limitlessly take fluids from/to such pulleys", + + "create.ponder.hose_pulley_level.header": "Nivel de llenado y vaciado de las poleas de las mangueras", + "create.ponder.hose_pulley_level.text_1": "While fully retracted, the Hose Pulley cannot operate", + "create.ponder.hose_pulley_level.text_2": "Draining runs from top to bottom", + "create.ponder.hose_pulley_level.text_3": "The surface level will end up just below where the hose ends", + "create.ponder.hose_pulley_level.text_4": "Filling runs from bottom to top", + "create.ponder.hose_pulley_level.text_5": "The filled pool will not grow beyond the layer above the hose end", + + "create.ponder.item_drain.header": "Vaciar contenedores de fluidos mediante drenajes de objetos", + "create.ponder.item_drain.text_1": "Item Drains can extract fluids from items", + "create.ponder.item_drain.text_2": "Right-click it to pour fluids from your held item into it", + "create.ponder.item_drain.text_3": "When items are inserted from the side...", + "create.ponder.item_drain.text_4": "...they roll across, emptying out their contained fluid", + "create.ponder.item_drain.text_5": "Pipe Networks can now pull the fluid from the drains' internal buffer", + + "create.ponder.large_cogwheel.header": "Transmitir fuerza rotacional mediante engranajes grandes", + "create.ponder.large_cogwheel.text_1": "Los engranajes grandes pueden conectarse entre sí en ángulo recto", + "create.ponder.large_cogwheel.text_2": "Ayudarán a transmitir la velocidad transportada a otros ejes de rotación.", + + "create.ponder.linear_chassis_attachment.header": "Fijar bloques mediante el chasis lineal", + "create.ponder.linear_chassis_attachment.text_1": "Las caras abiertas de un chasis lineal pueden hacerse pegajosas", + "create.ponder.linear_chassis_attachment.text_2": "Haz clic de nuevo para que se pegue el lado opuesto", + "create.ponder.linear_chassis_attachment.text_3": "[Mayús izdo.] + clic derecho con la mano vacía para eliminar el pegamento", + "create.ponder.linear_chassis_attachment.text_4": "Las caras pegadas del chasis lineal fijarán una línea de bloques delante de él", + "create.ponder.linear_chassis_attachment.text_5": "Utilizando una llave inglesa, se puede especificar un rango preciso", + "create.ponder.linear_chassis_attachment.text_6": "Manteniendo pulsada la tecla [Ctrl] y usando la rueda central del ratón, se ajusta el rango de todos los bloques de chasis adjuntos", + "create.ponder.linear_chassis_attachment.text_7": "Para fijar los bloques a cualquier otro lado es necesario utilizar pegamento", + "create.ponder.linear_chassis_attachment.text_8": "Utilizando esta mecánica, las estructuras de cualquier forma pueden moverse como un artilugio", + + "create.ponder.linear_chassis_group.header": "Mover chasis lineales en grupos", + "create.ponder.linear_chassis_group.text_1": "Los chasis lineales se conectan a los bloques de chasis idénticos que se encuentren a su lado", + "create.ponder.linear_chassis_group.text_2": "Cuando uno es movido por un artilugio, los otros son arrastrados con él", + "create.ponder.linear_chassis_group.text_3": "Los chasis de otro tipo u orientados en otra dirección no se fijan", + + "create.ponder.mechanical_arm.header": "Configurar los brazos mecánicos", + "create.ponder.mechanical_arm.text_1": "A los brazos mecánicos hay que asignarles sus entradas y salidas antes de colocarlos", + "create.ponder.mechanical_arm.text_2": "Clic derecho en los inventarios mientras mantiene el brazo mecánico para asignarlos como objetivos", + "create.ponder.mechanical_arm.text_3": "Clic derecho denuevo para alternar entre la entrada (azul) y la salida (naranja)", + "create.ponder.mechanical_arm.text_4": "Clic izquierdo en los componentes para eliminar su selección", + "create.ponder.mechanical_arm.text_5": "Una vez colocado, el brazo mecánico apuntará a los bloques seleccionados previamente", + "create.ponder.mechanical_arm.text_6": "Pueden tener cualquier cantidad de entradas y salidas dentro de su rango", + "create.ponder.mechanical_arm.text_7": "Sin embargo, no se puede interactuar directamente con todos los tipos de inventario", + "create.ponder.mechanical_arm.text_8": "Los embudos y depósitos pueden ayudar a salvar esa distancia", + + "create.ponder.mechanical_arm_filtering.header": "Filtrar salidas del brazo mecánico", + "create.ponder.mechanical_arm_filtering.text_1": "Entradas", + "create.ponder.mechanical_arm_filtering.text_2": "Salidas", + "create.ponder.mechanical_arm_filtering.text_3": "A veces es conveniente restringir los objetivos del brazo mecánico haciendo coincidir un filtro", + "create.ponder.mechanical_arm_filtering.text_4": "Por sí mismos no ofrecen ninguna opción de filtrado", + "create.ponder.mechanical_arm_filtering.text_5": "Sin embargo, los embudos de latón como objetivos comunican su propio filtro al brazo", + "create.ponder.mechanical_arm_filtering.text_6": "El brazo mecánico es lo suficientemente inteligente como para no recoger objetos que no podría distribuir", + + "create.ponder.mechanical_arm_modes.header": "Modos de distribución del brazo mecánico", + "create.ponder.mechanical_arm_modes.text_1": "Entradas", + "create.ponder.mechanical_arm_modes.text_2": "Salidas", + "create.ponder.mechanical_arm_modes.text_3": "Siempre que un brazo tenga que elegir entre varias salidas válidas...", + "create.ponder.mechanical_arm_modes.text_4": "...funcionará según su configuración", + "create.ponder.mechanical_arm_modes.text_5": "Usando la rueda del ratón con una llave inglesa te permitirá configurarlo", + "create.ponder.mechanical_arm_modes.text_6": "El modo Round Robin simplemente hace un ciclo a través de todas las salidas que están disponibles", + "create.ponder.mechanical_arm_modes.text_7": "Si una salida no puede admitir más objetos, se omitirá", + "create.ponder.mechanical_arm_modes.text_8": "El modo Round Robin forzado nunca omitirá las salidas, sino que esperará a que estén libres", + "create.ponder.mechanical_arm_modes.text_9": "Preferir el primero da prioridad a las salidas seleccionadas anteriormente al configurar este brazo", + + "create.ponder.mechanical_arm_redstone.header": "Controlar brazos mecánicos con redstone", + "create.ponder.mechanical_arm_redstone.text_1": "Cuando se alimentan con redstone, los brazos mecánicos no se activan", + "create.ponder.mechanical_arm_redstone.text_2": "Antes de detenerse, terminará los ciclos iniciados", + "create.ponder.mechanical_arm_redstone.text_3": "Así, un pulso negativo puede utilizarse para activar exactamente un ciclo de activación", + + "create.ponder.mechanical_bearing.header": "Mover estructuras mediante el rodamiento mecánico", + "create.ponder.mechanical_bearing.text_1": "Los rodamientos mecánicos se fijan al bloque que tienen delante", + "create.ponder.mechanical_bearing.text_2": "Al recibir fuerza rotacional, la ensamblará en un artilugio giratorio", + + "create.ponder.mechanical_crafter.header": "Configurar ensambladores mecánicos", + "create.ponder.mechanical_crafter.text_1": "Se puede utilizar una serie de ensambladores mecánicos para automatizar cualquier receta de elaboración.", + "create.ponder.mechanical_crafter.text_2": "Usando una llave inglesa, puedes establecer los caminos de los ensambladores ", + "create.ponder.mechanical_crafter.text_3": "Para que la configuración sea válida, todos los caminos tienen que converger en una salida, en cualquiera de los lados", + "create.ponder.mechanical_crafter.text_4": "Los puertos de salida de objetos se colocarán en un inventario a la salida", + "create.ponder.mechanical_crafter.text_5": "Los ensambladores mecánicos requieren fuerza rotacional para funcionar", + "create.ponder.mechanical_crafter.text_6": "Haga clic derecho en la parte delantera para insertar objetos manualmente", + "create.ponder.mechanical_crafter.text_7": "Una vez que cada ranura de una ruta contenga un objeto, comenzará el proceso de elaboración", + "create.ponder.mechanical_crafter.text_8": "Para las recetas que no ocupen totalmente la instalación del ensamblador, se puede forzar el arranque utilizando un pulso de redstone", + + "create.ponder.mechanical_crafter_connect.header": "Conectar inventarios a los ensambladores mecánicos", + "create.ponder.mechanical_crafter_connect.text_1": "Los objetos pueden ser insertados a los ensambladores mecánicos automáticamente", + "create.ponder.mechanical_crafter_connect.text_2": "Utilizando la llave inglesa a sus espaldas, las entradas pueden combinarse", + "create.ponder.mechanical_crafter_connect.text_3": "Ahora se puede acceder a todos los ensambladores mecánicos conectados por la misma ubicación de entrada", + + "create.ponder.mechanical_crafter_covers.header": "Cubrir las ranuras de los ensambladores mecánicos", + "create.ponder.mechanical_crafter_covers.text_1": "Algunas recetas requerirán ensambladores mecánicos adicionales para salvar las brechas en el camino", + "create.ponder.mechanical_crafter_covers.text_2": "Utilizando las tapas de ranuras del ensamblador mecánico, pueden actuar como una ranura vacía a su disposición", + "create.ponder.mechanical_crafter_covers.text_3": "Las entradas compartidas creadas con la llave inglesa en la parte posterior también pueden llegar a través de los ensambladores revestidos", + + "create.ponder.mechanical_drill.header": "Romper bloques con el taladro mecánico", + "create.ponder.mechanical_drill.text_1": "Cuando se le aplica fuerza rotacional, el taladro mecánico rompe los bloques que tiene delante.", + "create.ponder.mechanical_drill.text_2": "Su velocidad de trabajo depende de la fuerza rotacional suministrada", + + "create.ponder.mechanical_drill_contraption.header": "Usar taladros mecánicos en artilugios", + "create.ponder.mechanical_drill_contraption.text_1": "Siempre que los taladros mecánicos se muevan como parte de un artilugio animado...", + "create.ponder.mechanical_drill_contraption.text_2": "...romperán los bloques por los que artilugio los hace pasar", + + "create.ponder.mechanical_harvester.header": "Utilizar cosechadoras mecánicas en artilugios", + "create.ponder.mechanical_harvester.text_1": "Siempre que las cosechadoras mecánicas se muevan como parte de un artilugio animado...", + "create.ponder.mechanical_harvester.text_2": "...recogerán y repondrán los cultivos maduros en su camino", + + "create.ponder.mechanical_mixer.header": "Procesar objetos con la mezcladora mecánica", + "create.ponder.mechanical_mixer.text_1": "Con una mezcladora mecánica y una cuenca, se pueden automatizar algunas recetas", + "create.ponder.mechanical_mixer.text_2": "Las recetas disponibles incluyen cualquier receta de elaboración amorfa, además de un par de recetas adicionales", + "create.ponder.mechanical_mixer.text_3": "Algunas de esas recetas pueden requerir el calor de un quemador de blaze", + "create.ponder.mechanical_mixer.text_4": "La ranura para filtros se puede utilizar en caso de que dos recetas sean conflictivas.", + + "create.ponder.mechanical_piston.header": "Mover estructuras mediante pistones mecánicos", + "create.ponder.mechanical_piston.text_1": "Los pistones mecánicos pueden mover los bloques que tienen delante", + "create.ponder.mechanical_piston.text_2": "La velocidad y la dirección del movimiento dependen de la fuerza rotacional suministrada", + "create.ponder.mechanical_piston.text_3": "Los pistones mecánicos pegajosos pueden tirar de los bloques unidos hacia atrás", + + "create.ponder.mechanical_piston_modes.header": "Modos de movimiento del pistón mecánico", + "create.ponder.mechanical_piston_modes.text_1": "Cuando los pistones mecánicos dejan de moverse, la estructura movida vuelve a los bloques", + "create.ponder.mechanical_piston_modes.text_2": "Puede configurarse para que no vuelva nunca a los bloques sólidos, o sólo en la ubicación en la que comenzó", + + "create.ponder.mechanical_plough.header": "Utilizar arados mecánicos en los artilugios", + "create.ponder.mechanical_plough.text_1": "Cuando los arados mecánicos se mueven como parte de un artilugio animado...", + "create.ponder.mechanical_plough.text_2": "...romperán los bloques sin un hitbox de colisión sólido", + "create.ponder.mechanical_plough.text_3": "Además, pueden crear tierras de cultivo", + "create.ponder.mechanical_plough.text_4": "...también pueden lanzar entidades sin dañarlas", + + "create.ponder.mechanical_press.header": "Procesar objetos con la prensa mecánica", + "create.ponder.mechanical_press.text_1": "La prensa mecánica puede procesar los objetos proporcionados por debajo de ella", + "create.ponder.mechanical_press.text_2": "Los objetos de entrada pueden soltarse o colocarse en un depósito bajo la prensa", + "create.ponder.mechanical_press.text_3": "Cuando los objetos se proporcionan en una 'cinta'...", + "create.ponder.mechanical_press.text_4": "...la prensa mecánica los retendrá y procesará automáticamente", + + "create.ponder.mechanical_press_compacting.header": "Compactar objetos con la prensa mecánica", + "create.ponder.mechanical_press_compacting.text_1": "Al presionar los objetos que se encuentran en una cuenca, éstos se compactan.", + "create.ponder.mechanical_press_compacting.text_2": "La compactación incluye cualquier receta de elaboración de 2x2 o 3x3 rellena, además de un par extra", + "create.ponder.mechanical_press_compacting.text_3": "Algunas de esas recetas pueden requerir el calor de un quemador de blaze", + "create.ponder.mechanical_press_compacting.text_4": "La ranura para filtros se puede utilizar en caso de que dos recetas sean conflictivas.", + + "create.ponder.mechanical_pump_flow.header": "Transportar fluidos mediante bombas mecánicas", + "create.ponder.mechanical_pump_flow.text_1": "Mechanical Pumps govern the flow of their attached pipe networks", + "create.ponder.mechanical_pump_flow.text_2": "When powered, their arrow indicates the direction of flow", + "create.ponder.mechanical_pump_flow.text_3": "The network behind is now pulling fluids...", + "create.ponder.mechanical_pump_flow.text_4": "...while the network in front is transferring it outward", + "create.ponder.mechanical_pump_flow.text_5": "Reversing the input rotation reverses the direction of flow", + "create.ponder.mechanical_pump_flow.text_6": "Use a Wrench to reverse the orientation of pumps manually", + + "create.ponder.mechanical_pump_speed.header": "Rendimiento de las bombas mecánicas", + "create.ponder.mechanical_pump_speed.text_1": "Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away", + "create.ponder.mechanical_pump_speed.text_2": "Speeding up the input rotation changes the speed of flow propagation...", + "create.ponder.mechanical_pump_speed.text_3": "...aswell as how quickly fluids are transferred", + "create.ponder.mechanical_pump_speed.text_4": "Pumps can combine their throughputs within shared pipe networks", + "create.ponder.mechanical_pump_speed.text_5": "Alternating their orientation can help align their flow directions", + + "create.ponder.mechanical_saw_breaker.header": "Cortar árboles con la sierra mecánica", + "create.ponder.mechanical_saw_breaker.text_1": "Cuando se le da una fuerza rotacional, la sierra mecánica cortará los árboles que estén directamente frente a ella", + "create.ponder.mechanical_saw_breaker.text_2": "Para poder cortar el árbol por completo, la sierra tiene que romper el último bloque que lo une al suelo", + + "create.ponder.mechanical_saw_contraption.header": "Utilizar sierras mecánicas en artilugios", + "create.ponder.mechanical_saw_contraption.text_1": "Cuando las sierras mecánicas se mueven como parte de un artilugio animado...", + "create.ponder.mechanical_saw_contraption.text_2": "...cortarán cualquier árbol con el que el artilugio se tope", + + "create.ponder.mechanical_saw_processing.header": "Procesar objetos en la sierra mecánica", + "create.ponder.mechanical_saw_processing.text_1": "Las sierras mecánicas orientadas hacia arriba pueden procesar una variedad de objetos", + "create.ponder.mechanical_saw_processing.text_2": "El objeto procesado siempre se mueve en contra de la fuerza rotacional de la sierra", + "create.ponder.mechanical_saw_processing.text_3": "Las sierras mecánicas pueden trabajar en línea con las correas mecánicas", + "create.ponder.mechanical_saw_processing.text_4": "Cuando un ingrediente tiene varios resultados posibles, la ranura para filtros puede especificarlo", + "create.ponder.mechanical_saw_processing.text_5": "Sin filtro, al contrario, la sierra mecánica pasaría por todos los resultados", + + "create.ponder.millstone.header": "Procesar objetos en la piedra de molino", + "create.ponder.millstone.text_1": "Las piedras de molino procesan los objetos mediante la molienda", + "create.ponder.millstone.text_2": "Se pueden accionar lateralmente mediante engranajes...", + "create.ponder.millstone.text_3": "... y tirar o insertar objetos en la parte superior", + "create.ponder.millstone.text_4": "Después de un tiempo, el resultado se puede obtener usando el clic derecho del ratón", + "create.ponder.millstone.text_5": "Las salidas también pueden extraerse mediante la automatización", + + "create.ponder.nixie_tube.header": "Usar los tubos Nixie", + "create.ponder.nixie_tube.text_1": "Cuando son alimentados con redstone, los tubos nixie mostrarán la fuerza de las señales de redstone", + "create.ponder.nixie_tube.text_2": "Con las etiquetas editadas en un yunque, pueden mostar un texto personalizado", + + "create.ponder.piston_pole.header": "Pértigas de extensión de pistones", + "create.ponder.piston_pole.text_1": "Sin las pértigas de extensión unidas, un pistón mecánico no puede moverse", + "create.ponder.piston_pole.text_2": "La longitud de la pértiga añadida en su parte posterior determina el rango de alcance", + + "create.ponder.portable_fluid_interface.header": "Interfaz de fluidos portátil", + "create.ponder.portable_fluid_interface.text_1": "Fluid Tanks on moving contraptions cannot be accessed by any pipes", + "create.ponder.portable_fluid_interface.text_2": "This component can interact with fluid tanks without the need to stop the contraption", + "create.ponder.portable_fluid_interface.text_3": "Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_fluid_interface.text_4": "Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_fluid_interface.text_5": "While engaged, the stationary interface will represent ALL Tanks on the contraption", + "create.ponder.portable_fluid_interface.text_6": "Fluid can now be inserted...", + "create.ponder.portable_fluid_interface.text_7": "...or extracted from the contraption", + "create.ponder.portable_fluid_interface.text_8": "After no contents have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.header": "Interfaz de almacenamiento portátil", + "create.ponder.portable_storage_interface.text_1": "Los jugadores no pueden acceder a los inventarios de los artilugios en movimiento.", + "create.ponder.portable_storage_interface.text_2": "Este componente puede interactuar con el almacenamiento sin necesidad de detener el artilugio.", + "create.ponder.portable_storage_interface.text_3": "Coloca una segunda unidad con un espacio de 1 o 2 bloques entre ellas", + "create.ponder.portable_storage_interface.text_4": "Cada vez que pasen por delante del otro, entablarán una conexión", + "create.ponder.portable_storage_interface.text_5": "Mientras esté conectada, la interfaz fija representará TODOS los inventarios del artilugio", + "create.ponder.portable_storage_interface.text_6": "Ahora pueden insertarse objetos...", + "create.ponder.portable_storage_interface.text_7": "...o extraerse", + "create.ponder.portable_storage_interface.text_8": "Cuando no se hayan intercambiado objetos durante un tiempo, el artilugio seguirá su camino", + + "create.ponder.portable_storage_interface_redstone.header": "Interfaz de almacenamiento portátil controlada por redstone", + "create.ponder.portable_storage_interface_redstone.text_1": "La energía de redstone impedirá que las interfaces de almacenamiento portátil se conecten", + + "create.ponder.powered_latch.header": "Controlar señales mediante la palanca motorizada", + "create.ponder.powered_latch.text_1": "Las palancas motorizadas son palancas controlables por redstone", + "create.ponder.powered_latch.text_2": "Las señales en la parte trasera la encienden", + "create.ponder.powered_latch.text_3": "Las señales sobre un lateral la vuelven a apagar", + "create.ponder.powered_latch.text_4": "Las palancas motorizadas también se pueden accionar manualmente", + + "create.ponder.powered_toggle_latch.header": "Controlar señales mediante la palanca de cierre motorizada", + "create.ponder.powered_toggle_latch.text_1": "Las palancas de cierre motorizadas son palancas controlables por redstone", + "create.ponder.powered_toggle_latch.text_2": "Las señales en la parte trasera cambiarán su estado...", + "create.ponder.powered_toggle_latch.text_3": "...encender y apagar", + "create.ponder.powered_toggle_latch.text_4": "Las palancas de cierre motorizadas también se pueden accionar manualmente", + + "create.ponder.pulse_repeater.header": "Controlar señales mediante repetidores de pulsos", + "create.ponder.pulse_repeater.text_1": "Los repetidores de pulsos acortan cualquier señal de redstone a un solo pulso", + + "create.ponder.radial_chassis.header": "Fijar bloques mediante chasis radiales", + "create.ponder.radial_chassis.text_1": "Los chasis radiales se conectan a bloques de chasis idénticos en una fila", + "create.ponder.radial_chassis.text_2": "Cuando uno es movido por un artilugio, los otros son arrastrados con él", + "create.ponder.radial_chassis.text_3": "Las caras laterales de un chasis radial pueden hacerse adhesivas", + "create.ponder.radial_chassis.text_4": "Haga clic de nuevo para que todos los demás lados sean pegajosos", + "create.ponder.radial_chassis.text_5": "[Mayús izdo.] + clic derecho con la mano vacía para eliminar el pegamento", + "create.ponder.radial_chassis.text_6": "Cada vez que un bloque está junto a una cara pegajosa...", + "create.ponder.radial_chassis.text_7": "...adjuntará todos los bloques alcanzables dentro de un radio en esa capa", + "create.ponder.radial_chassis.text_8": "Con una llave inglesa y usando la rueda de desplazamiento del ratón se puede especificar un radio preciso", + "create.ponder.radial_chassis.text_9": "Los bloques no alcanzables por ninguna cara adhesiva no se fijarán", + + "create.ponder.redstone_contact.header": "Contactos de redstone", + "create.ponder.redstone_contact.text_1": "Los contactos de redstone enfrentados emitirán una señal de redstone", + "create.ponder.redstone_contact.text_2": "Esto sigue siendo válido cuando uno de ellos forma parte de un artilugio en movimiento", + + "create.ponder.redstone_link.header": "Usar los enlaces de redstone", + "create.ponder.redstone_link.text_1": "Los enlaces de redstone pueden transmitir señales redstone de forma inalámbrica", + "create.ponder.redstone_link.text_2": "[Mayús izdo.] + clic derecho para cambiar el modo de recepción", + "create.ponder.redstone_link.text_3": "Un simple clic derecho con una llave inglesa puede hacer lo mismo", + "create.ponder.redstone_link.text_4": "Los receptores emiten la potencia de redstone de los transmisores en 128 bloques", + "create.ponder.redstone_link.text_5": "Colocando objetos en las dos ranuras puede especificar una frecuencia", + "create.ponder.redstone_link.text_6": "Sólo se comunicarán los enlaces con frecuencias coincidentes", + + "create.ponder.rope_pulley.header": "Mover estructuras con poleas de cuerda", + "create.ponder.rope_pulley.text_1": "Las poleas de cuerda pueden mover los bloques verticalmente cuando se les aplica una fuerza rotacional", + "create.ponder.rope_pulley.text_2": "La dirección y la velocidad del movimiento dependen de la fuerza rotacional suministrada", + + "create.ponder.rope_pulley_attachment.header": "Mover poleas como parte de un artilugio", + "create.ponder.rope_pulley_attachment.text_1": "Siempre que las poleas de cuerda sean movidas por un artilugio...", + "create.ponder.rope_pulley_attachment.text_2": "...su estructura adjunta será arrastrada con ella", + "create.ponder.rope_pulley_attachment.text_3": "Tenga en cuenta que las poleas de cuerda sólo se mueven cuando están paradas", + + "create.ponder.rope_pulley_modes.header": "Modos de movimiento de la polea de cuerda", + "create.ponder.rope_pulley_modes.text_1": "Cuando las poleas de cuerda dejan de moverse, la estructura movida vuelve a los bloques", + "create.ponder.rope_pulley_modes.text_2": "Puede configurarse para que no vuelva nunca a los bloques sólidos, o sólo en la ubicación en la que comenzó", + + "create.ponder.rotation_speed_controller.header": "Usar el controlador de velocidad rotacional", + "create.ponder.rotation_speed_controller.text_1": "Los controladores de velocidad rotacional transmiten la rotación de su eje a un engranaje grande situado encima.", + "create.ponder.rotation_speed_controller.text_2": "Utilizando la rueda de desplazamiento del ratón, puede configurarse la velocidad rotacional", + + "create.ponder.sail.header": "Montar molinos de viento usando velas", + "create.ponder.sail.text_1": "Las velas son bloques muy útiles para crear molinos de viento", + "create.ponder.sail.text_2": "Se fijarán a los bloques y entre sí sin necesidad de pegamento o bloques de chasis", + "create.ponder.sail.text_3": "Clic derecho con un tinte para pintarlas", + "create.ponder.sail.text_4": "Clic derecho con una tijera para volver a convertirlas en marcos", + + "create.ponder.sail_frame.header": "Montar molinos de viento con marcos de vela", + "create.ponder.sail_frame.text_1": "Los marcos de vela son prácticos bloques para crear molinos de viento", + "create.ponder.sail_frame.text_2": "Se fijarán a los bloques y entre sí sin necesidad de pegamento o bloques de chasis", + + "create.ponder.sequenced_gearshift.header": "Controlar la velocidad de rotación mediante la caja de cambios secuenciales", + "create.ponder.sequenced_gearshift.text_1": "La caja de cambios secuencial retransmite la rotación siguiendo una lista cronometrada de instrucciones", + "create.ponder.sequenced_gearshift.text_2": "Haga clic con el botón derecho para abrir la interfaz de configuración", + "create.ponder.sequenced_gearshift.text_3": "Al recibir una señal de redstone, comenzará a ejecutar su secuencia configurada", + "create.ponder.sequenced_gearshift.text_4": "Una vez terminado, espera la siguiente señal de redstone y vuelve a empezar", + "create.ponder.sequenced_gearshift.text_5": "Se puede utilizar un comparador de redstone para leer el progreso actual", + + "create.ponder.shaft.header": "Transmitir fuerza rotacional mediante ejes", + "create.ponder.shaft.text_1": "Los ejes transmiten la rotación en línea recta.", + + "create.ponder.shaft_casing.header": "Ejes revestidos", + "create.ponder.shaft_casing.text_1": "Puedes utilizar el revestidor de latón o de andesita para decorar tus ejes", + + "create.ponder.smart_chute.header": "Filtrar objetos mediante ductos inteligentes", + "create.ponder.smart_chute.text_1": "Los ductos inteligentes son ductos verticales con control adicional", + "create.ponder.smart_chute.text_2": "Los objetos en la ranura para filtros especifican lo que pueden extraer y transferir exactamente", + "create.ponder.smart_chute.text_3": "Usa la rueda del ratón para especificar el tamaño de la pila extraída", + "create.ponder.smart_chute.text_4": "La energía de redstone impedirá que funcionen.", + + "create.ponder.smart_pipe.header": "Controlar el flujo de fluidos mediante tuberías inteligentes", + "create.ponder.smart_pipe.text_1": "Smart pipes can help control flows by fluid type", + "create.ponder.smart_pipe.text_2": "When placed directly at the source, they can specify the type of fluid to extract", + "create.ponder.smart_pipe.text_3": "Simply Right-Click their filter slot with any item containing the desired fluid", + "create.ponder.smart_pipe.text_4": "When placed further down a pipe network, smart pipes will only let matching fluids continue", + + "create.ponder.speedometer.header": "Controlar la información cinética mediante el velocímetro", + "create.ponder.speedometer.text_1": "El velocímetro muestra la velocidad actual de los componentes conectados", + "create.ponder.speedometer.text_2": "Cuando se usan las gafas del constructor, el jugador puede obtener información más detallada del medidor", + "create.ponder.speedometer.text_3": "Los comparadores pueden emitir señales analógicas de redstone en relación con las mediciones del velocímetro", + + "create.ponder.spout_filling.header": "Llenar objetos con un surtidor", + "create.ponder.spout_filling.text_1": "The Spout can fill fluid holding items provided beneath it", + "create.ponder.spout_filling.text_2": "The content of a Spout cannot be accessed manually", + "create.ponder.spout_filling.text_3": "Instead, Pipes can be used to supply it with fluids", + "create.ponder.spout_filling.text_4": "The Input items can be placed on a Depot under the Spout", + "create.ponder.spout_filling.text_5": "When items are provided on a belt...", + "create.ponder.spout_filling.text_6": "The Spout will hold and process them automatically", + + "create.ponder.stabilized_bearings.header": "Estabilizar artilugios", + "create.ponder.stabilized_bearings.text_1": "Siempre que los rodamientos mecánicos formen parte de una estructura móvil...", + "create.ponder.stabilized_bearings.text_2": "...intentarán mantenerse derechos", + "create.ponder.stabilized_bearings.text_3": "Una vez más, el rodamiento se unirá al bloque de enfrente", + "create.ponder.stabilized_bearings.text_4": "Como resultado, todo el sub-artilugio se mantendrá en posición vertical", + + "create.ponder.sticker.header": "Fijar bloques con stickers", + "create.ponder.sticker.text_1": "Los stickers son ideales para la fijación de bloques controlados por redstone", + "create.ponder.sticker.text_2": "Al recibir una señal, cambiarán su estado", + "create.ponder.sticker.text_3": "Si ahora se mueve en un artilugio, el bloque se moverá con él", + "create.ponder.sticker.text_4": "Si se vuelve a activar, el bloque dejará de estar fijado", + + "create.ponder.stressometer.header": "Supervisar la información cinética con el estresómetro", + "create.ponder.stressometer.text_1": "El estresómetro muestra la capacidad de estrés actual de la red cinética conectada", + "create.ponder.stressometer.text_2": "Cuando se usan las gafas del constructor, el jugador puede obtener información más detallada del medidor", + "create.ponder.stressometer.text_3": "Los comparadores pueden emitir señales analógicas de redstone en relación con las mediciones del estresómetro", + + "create.ponder.super_glue.header": "Fijar bloques con pegamento", + "create.ponder.super_glue.text_1": "Se puede utilizar pegamento entre dos bloques cualquiera", + "create.ponder.super_glue.text_2": "Los bloques fijados se moverán juntos cuando se ensamblen en un artilugio", + "create.ponder.super_glue.text_3": "Cada vez que el pegamento es sostenido en la mano...", + "create.ponder.super_glue.text_4": "...los bloques añadidos se pegarán a la cara en la que fueron colocados automáticamente", + "create.ponder.super_glue.text_5": "El pegamento se puede quitar con un clic izquierdo", + + "create.ponder.valve_handle.header": "Generar fuerza rotacional mediante asas de válvula", + "create.ponder.valve_handle.text_1": "Los jugadores pueden utilizar las asas de válvulas para aplicar fuerza rotacional manualmente", + "create.ponder.valve_handle.text_2": "Mantén pulsado el clic derecho para rotar en sentido contrario a las agujas del reloj", + "create.ponder.valve_handle.text_3": "Su velocidad de transmisión es lenta y precisa", + "create.ponder.valve_handle.text_4": "[Mayús izdo.] + clic derecho para rotar en el sentido de las agujas del reloj", + "create.ponder.valve_handle.text_5": "Las asas de las válvulas pueden teñirse con fines estéticos", + + "create.ponder.valve_pipe.header": "Controlar el flujo de fluidos mediante válvulas", + "create.ponder.valve_pipe.text_1": "Valve pipes help control fluids propagating through pipe networks", + "create.ponder.valve_pipe.text_2": "Their shaft input controls whether fluid is currently allowed through", + "create.ponder.valve_pipe.text_3": "Given Rotational Force in the opening direction, the valve will open up", + "create.ponder.valve_pipe.text_4": "It can be closed again by reversing the input rotation", + + "create.ponder.water_wheel.header": "Generar fuerza rotacional mediante ruedas hidráulicas", + "create.ponder.water_wheel.text_1": "Las ruedas hidráulicas extraen la fuerza de las corrientes de agua adyacentes", + "create.ponder.water_wheel.text_2": "Cuantas más caras se alimenten, más rápido girará", + "create.ponder.water_wheel.text_3": "Las paletas de las ruedas deben estar orientadas en contra del flujo", + "create.ponder.water_wheel.text_4": "Orientadas hacia el lado contrario, no serán tan eficaces", + + "create.ponder.weighted_ejector.header": "Usar eyectores de peso", + "create.ponder.weighted_ejector.text_1": "[Mayús izdo.] + clic derecho sosteniendo un eyector de peso para seleccionar la ubicación de destino", + "create.ponder.weighted_ejector.text_2": "El eyector colocado lanzará ahora los objetos al lugar marcado", + "create.ponder.weighted_ejector.text_3": "Un objetivo válido puede estar a cualquier altura o distancia dentro del alcance", + "create.ponder.weighted_ejector.text_4": "Sin embargo, no pueden estar a un costado", + "create.ponder.weighted_ejector.text_5": "Si no se ha seleccionado ningún objetivo válido, simplemente se dirigirá al bloque que se encuentra justo delante", + "create.ponder.weighted_ejector.text_6": "Suministrale fuerza rotacional para cargarlo", + "create.ponder.weighted_ejector.text_7": "Los objetos colocados en el eyector hacen que se dispare", + "create.ponder.weighted_ejector.text_8": "Si se dirigen a un inventario, el eyector esperará hasta que haya espacio", + "create.ponder.weighted_ejector.text_9": "Con la llave inglesa se puede configurar el tamaño de pila requerido", + "create.ponder.weighted_ejector.text_10": "Ahora estára limitado a este tamaño de pila, y sólo se activara cuando su pila retenida alcance esta cantidad", + "create.ponder.weighted_ejector.text_11": "Otras entidades activarán el eyector al pisarlos", + + "create.ponder.weighted_ejector_redstone.header": "Controlar los eyectores de peso con redstone", + "create.ponder.weighted_ejector_redstone.text_1": "Cuando se alimentan con redstone, los eyectores no se activan", + "create.ponder.weighted_ejector_redstone.text_2": "Además, los observadores de contenido pueden detectar cuando los eyectores se activan", + + "create.ponder.weighted_ejector_tunnel.header": "Dividir pilas de objetos mediante eyectores de peso", + "create.ponder.weighted_ejector_tunnel.text_1": "En combinación con los túneles de latón, los eyectores de peso pueden dividir las pilas de objetos en cantidades específicas", + "create.ponder.weighted_ejector_tunnel.text_2": "En primer lugar, configure el túnel de latón en 'Preferir lo más cercano', para dar prioridad a su salida lateral", + "create.ponder.weighted_ejector_tunnel.text_3": "El tamaño de la pila fijado en el eyector determina ahora la cantidad que se va a dividir", + "create.ponder.weighted_ejector_tunnel.text_4": "Mientras una nueva pila del tamaño configurado se expulse por la salida lateral...", + "create.ponder.weighted_ejector_tunnel.text_5": "...el resto seguirá su camino", + + "create.ponder.windmill_source.header": "Generar fuerza rotacional mediante rodamientos del molino de viento", + "create.ponder.windmill_source.text_1": "Los rodamientos del molino de viento se fijan al bloque que tienen delante", + "create.ponder.windmill_source.text_2": "Si se unen suficientes bloques tipo vela al bloque, éste puede actuar como un molino de viento", + "create.ponder.windmill_source.text_3": "Activado con un clic derecho, el rodamiento del molino de viento comenzará a proporcionar fuerza rotacional", + "create.ponder.windmill_source.text_4": "La cantidad de bloques de vela determina su velocidad de rotación", + "create.ponder.windmill_source.text_5": "Utiliza una llave inglesa para configurar su sentido de rotación", + "create.ponder.windmill_source.text_6": "Haga clic derecho sobre el rodamiento del molino en cualquier momento para detener y editar la estructura de nuevo", + + "create.ponder.windmill_structure.header": "Artilugios para molinos de viento", + "create.ponder.windmill_structure.text_1": "Cualquier estructura puede contar como un molino de viento válido, siempre que contenga al menos 8 bloques tipo vela.", "_": "Thank you for translating Create!" diff --git a/src/main/resources/assets/create/lang/ja_jp.json b/src/main/resources/assets/create/lang/ja_jp.json index 6e05619b5..967b1a5d5 100644 --- a/src/main/resources/assets/create/lang/ja_jp.json +++ b/src/main/resources/assets/create/lang/ja_jp.json @@ -3,7 +3,7 @@ "_": "->------------------------] Game Elements [------------------------<-", "block.create.acacia_window": "アカシアの窓", - "block.create.acacia_window_pane": "アカシアの窓パネル", + "block.create.acacia_window_pane": "アカシアの窓板", "block.create.adjustable_chain_gearshift": "可変チェーンギアシフト", "block.create.adjustable_crate": "可変クレート", "block.create.adjustable_pulse_repeater": "可変パルスリピーター", @@ -13,12 +13,12 @@ "block.create.andesite_bricks": "安山岩レンガ", "block.create.andesite_bricks_slab": "安山岩レンガのハーフブロック", "block.create.andesite_bricks_stairs": "安山岩レンガの階段", - "block.create.andesite_bricks_wall": "安山岩レンガの壁", + "block.create.andesite_bricks_wall": "安山岩レンガの塀", "block.create.andesite_casing": "安山岩ケーシング", "block.create.andesite_cobblestone": "安山岩の丸石", "block.create.andesite_cobblestone_slab": "安山岩の丸石のハーフブロック", "block.create.andesite_cobblestone_stairs": "安山岩の丸石の階段", - "block.create.andesite_cobblestone_wall": "安山岩の丸石の壁", + "block.create.andesite_cobblestone_wall": "安山岩の丸石の塀", "block.create.andesite_encased_shaft": "安山岩のケース入りシャフト", "block.create.andesite_funnel": "安山岩ファンネル", "block.create.andesite_pillar": "安山岩の柱", @@ -26,11 +26,13 @@ "block.create.basin": "鉢", "block.create.belt": "メカニカルベルト", "block.create.birch_window": "シラカバの窓", - "block.create.birch_window_pane": "シラカバの窓パネル", + "block.create.birch_window_pane": "シラカバの窓板", + "block.create.black_nixie_tube": "黒色のニキシー管", "block.create.black_sail": "黒色の帆", "block.create.black_seat": "黒色のシート", "block.create.black_valve_handle": "黒色のバルブハンドル", "block.create.blaze_burner": "ブレイズバーナー", + "block.create.blue_nixie_tube": "青色のニキシー管", "block.create.blue_sail": "青色の帆", "block.create.blue_seat": "青色のシート", "block.create.blue_valve_handle": "青色のバルブハンドル", @@ -40,6 +42,7 @@ "block.create.brass_encased_shaft": "真鍮のケース入りシャフト", "block.create.brass_funnel": "真鍮ファンネル", "block.create.brass_tunnel": "真鍮トンネル", + "block.create.brown_nixie_tube": "茶色のニキシー管", "block.create.brown_sail": "茶色の帆", "block.create.brown_seat": "茶色のシート", "block.create.brown_valve_handle": "茶色のバルブハンドル", @@ -57,6 +60,7 @@ "block.create.cogwheel": "歯車", "block.create.content_observer": "コンテンツオブザーバー", "block.create.controller_rail": "コントローラーレール", + "block.create.copper_backtank": "銅のバックタンク", "block.create.copper_block": "銅ブロック", "block.create.copper_casing": "銅ケーシング", "block.create.copper_ore": "銅鉱石", @@ -67,45 +71,46 @@ "block.create.creative_fluid_tank": "クリエイティブ液体タンク", "block.create.creative_motor": "クリエイティブモーター", "block.create.crimson_window": "真紅の窓", - "block.create.crimson_window_pane": "真紅の窓パネル", + "block.create.crimson_window_pane": "真紅の窓板", "block.create.crushing_wheel": "破砕ホイール", "block.create.crushing_wheel_controller": "破砕ホイールコントローラー", "block.create.cuckoo_clock": "鳩時計", + "block.create.cyan_nixie_tube": "水色のニキシー管", "block.create.cyan_sail": "水色の帆", "block.create.cyan_seat": "水色のシート", "block.create.cyan_valve_handle": "水色のバルブハンドル", "block.create.dark_oak_window": "ダークオークの窓", - "block.create.dark_oak_window_pane": "ダークオークの窓パネル", + "block.create.dark_oak_window_pane": "ダークオークの窓板", "block.create.dark_scoria": "ダークスコリア", "block.create.dark_scoria_bricks": "ダークスコリアレンガ", "block.create.dark_scoria_bricks_slab": "ダークスコリアレンガのハーフブロック", "block.create.dark_scoria_bricks_stairs": "ダークスコリアレンガの階段", - "block.create.dark_scoria_bricks_wall": "ダークスコリアレンガの壁", + "block.create.dark_scoria_bricks_wall": "ダークスコリアレンガの塀", "block.create.dark_scoria_cobblestone": "ダークスコリアの丸石", "block.create.dark_scoria_cobblestone_slab": "ダークスコリアの丸石のハーフブロック", "block.create.dark_scoria_cobblestone_stairs": "ダークスコリアの丸石の階段", - "block.create.dark_scoria_cobblestone_wall": "ダークスコリアの丸石の壁", + "block.create.dark_scoria_cobblestone_wall": "ダークスコリアの丸石の塀", "block.create.dark_scoria_pillar": "ダークスコリアの柱", "block.create.deployer": "デプロイヤー", "block.create.depot": "デポ", "block.create.diorite_bricks": "閃緑岩レンガ", "block.create.diorite_bricks_slab": "閃緑岩レンガのハーフブロック", "block.create.diorite_bricks_stairs": "閃緑岩レンガの階段", - "block.create.diorite_bricks_wall": "閃緑岩レンガの壁", + "block.create.diorite_bricks_wall": "閃緑岩レンガの塀", "block.create.diorite_cobblestone": "閃緑岩の丸石", "block.create.diorite_cobblestone_slab": "閃緑岩の丸石のハーフブロック", "block.create.diorite_cobblestone_stairs": "閃緑岩の丸石の階段", - "block.create.diorite_cobblestone_wall": "閃緑岩の丸石の壁", + "block.create.diorite_cobblestone_wall": "閃緑岩の丸石の塀", "block.create.diorite_pillar": "閃緑岩の柱", "block.create.dolomite": "苦灰岩", "block.create.dolomite_bricks": "苦灰岩レンガ", "block.create.dolomite_bricks_slab": "苦灰岩レンガのハーフブロック", "block.create.dolomite_bricks_stairs": "苦灰岩レンガの階段", - "block.create.dolomite_bricks_wall": "苦灰岩レンガの壁", + "block.create.dolomite_bricks_wall": "苦灰岩レンガの塀", "block.create.dolomite_cobblestone": "苦灰岩の丸石", "block.create.dolomite_cobblestone_slab": "苦灰岩の丸石のハーフブロック", "block.create.dolomite_cobblestone_stairs": "苦灰岩の丸石の階段", - "block.create.dolomite_cobblestone_wall": "苦灰岩の丸石の壁", + "block.create.dolomite_cobblestone_wall": "苦灰岩の丸石の塀", "block.create.dolomite_pillar": "苦灰岩の柱", "block.create.encased_chain_drive": "ケース入りチェーンドライブ", "block.create.encased_fan": "ケース入りファン", @@ -113,39 +118,39 @@ "block.create.fancy_andesite_bricks": "装飾された安山岩レンガ", "block.create.fancy_andesite_bricks_slab": "装飾された安山岩レンガのハーフブロック", "block.create.fancy_andesite_bricks_stairs": "装飾された安山岩レンガの階段", - "block.create.fancy_andesite_bricks_wall": "装飾された安山岩レンガの壁", + "block.create.fancy_andesite_bricks_wall": "装飾された安山岩レンガの塀", "block.create.fancy_dark_scoria_bricks": "装飾されたダークスコリアレンガ", "block.create.fancy_dark_scoria_bricks_slab": "装飾されたダークスコリアレンガのハーフブロック", "block.create.fancy_dark_scoria_bricks_stairs": "装飾されたダークスコリアレンガの階段", - "block.create.fancy_dark_scoria_bricks_wall": "装飾されたダークスコリアレンガの壁", + "block.create.fancy_dark_scoria_bricks_wall": "装飾されたダークスコリアレンガの塀", "block.create.fancy_diorite_bricks": "装飾された閃緑岩レンガ", "block.create.fancy_diorite_bricks_slab": "装飾された閃緑岩レンガのハーフブロック", "block.create.fancy_diorite_bricks_stairs": "装飾された閃緑岩レンガの階段", - "block.create.fancy_diorite_bricks_wall": "装飾された閃緑岩レンガの壁", + "block.create.fancy_diorite_bricks_wall": "装飾された閃緑岩レンガの塀", "block.create.fancy_dolomite_bricks": "装飾された苦灰岩レンガ", "block.create.fancy_dolomite_bricks_slab": "装飾された苦灰岩レンガのハーフブロック", "block.create.fancy_dolomite_bricks_stairs": "装飾された苦灰岩レンガの階段", - "block.create.fancy_dolomite_bricks_wall": "装飾された苦灰岩レンガの壁", + "block.create.fancy_dolomite_bricks_wall": "装飾された苦灰岩レンガの塀", "block.create.fancy_gabbro_bricks": "装飾された斑れい岩レンガ", "block.create.fancy_gabbro_bricks_slab": "装飾された斑れい岩レンガのハーフブロック", "block.create.fancy_gabbro_bricks_stairs": "装飾された斑れい岩レンガの階段", - "block.create.fancy_gabbro_bricks_wall": "装飾された斑れい岩レンガの壁", + "block.create.fancy_gabbro_bricks_wall": "装飾された斑れい岩レンガの塀", "block.create.fancy_granite_bricks": "装飾された花崗岩レンガ", "block.create.fancy_granite_bricks_slab": "装飾された花崗岩レンガのハーフブロック", "block.create.fancy_granite_bricks_stairs": "装飾された花崗岩レンガの階段", - "block.create.fancy_granite_bricks_wall": "装飾された花崗岩レンガの壁", + "block.create.fancy_granite_bricks_wall": "装飾された花崗岩レンガの塀", "block.create.fancy_limestone_bricks": "装飾された石灰岩レンガ", "block.create.fancy_limestone_bricks_slab": "装飾された石灰岩レンガのハーフブロック", "block.create.fancy_limestone_bricks_stairs": "装飾された石灰岩レンガの階段", - "block.create.fancy_limestone_bricks_wall": "装飾された石灰岩レンガの壁", + "block.create.fancy_limestone_bricks_wall": "装飾された石灰岩レンガの塀", "block.create.fancy_scoria_bricks": "装飾されたスコリアレンガ", "block.create.fancy_scoria_bricks_slab": "装飾されたスコリアレンガのハーフブロック", "block.create.fancy_scoria_bricks_stairs": "装飾されたスコリアレンガの階段", - "block.create.fancy_scoria_bricks_wall": "装飾されたスコリアレンガの壁", + "block.create.fancy_scoria_bricks_wall": "装飾されたスコリアレンガの塀", "block.create.fancy_weathered_limestone_bricks": "装飾された風化した石灰岩レンガ", "block.create.fancy_weathered_limestone_bricks_slab": "装飾された風化した石灰岩レンガのハーフブロック", "block.create.fancy_weathered_limestone_bricks_stairs": "装飾された風化した石灰岩レンガの階段", - "block.create.fancy_weathered_limestone_bricks_wall": "装飾された風化した石灰岩レンガの壁", + "block.create.fancy_weathered_limestone_bricks_wall": "装飾された風化した石灰岩レンガの塀", "block.create.fluid_pipe": "液体パイプ", "block.create.fluid_tank": "液体タンク", "block.create.fluid_valve": "液体バルブ", @@ -157,11 +162,11 @@ "block.create.gabbro_bricks": "斑れい岩レンガ", "block.create.gabbro_bricks_slab": "斑れい岩レンガのハーフブロック", "block.create.gabbro_bricks_stairs": "斑れい岩レンガの階段", - "block.create.gabbro_bricks_wall": "斑れい岩レンガの壁", + "block.create.gabbro_bricks_wall": "斑れい岩レンガの塀", "block.create.gabbro_cobblestone": "斑れい岩の丸石", "block.create.gabbro_cobblestone_slab": "斑れい岩の丸石のハーフブロック", "block.create.gabbro_cobblestone_stairs": "斑れい岩の丸石の階段", - "block.create.gabbro_cobblestone_wall": "斑れい岩の丸石の壁", + "block.create.gabbro_cobblestone_wall": "斑れい岩の丸石の塀", "block.create.gabbro_pillar": "斑れい岩の柱", "block.create.gantry_carriage": "ガントリーキャリッジ", "block.create.gantry_shaft": "ガントリーシャフト", @@ -171,26 +176,29 @@ "block.create.granite_bricks": "花崗岩レンガ", "block.create.granite_bricks_slab": "花崗岩レンガのハーフブロック", "block.create.granite_bricks_stairs": "花崗岩レンガの階段", - "block.create.granite_bricks_wall": "花崗岩レンガの壁", + "block.create.granite_bricks_wall": "花崗岩レンガの塀", "block.create.granite_cobblestone": "花崗岩の丸石", "block.create.granite_cobblestone_slab": "花崗岩の丸石のハーフブロック", "block.create.granite_cobblestone_stairs": "花崗岩の丸石の階段", - "block.create.granite_cobblestone_wall": "花崗岩の丸石の壁", + "block.create.granite_cobblestone_wall": "花崗岩の丸石の塀", "block.create.granite_pillar": "花崗岩の柱", + "block.create.gray_nixie_tube": "灰色のニキシー管", "block.create.gray_sail": "灰色の帆", "block.create.gray_seat": "灰色のシート", "block.create.gray_valve_handle": "灰色のバルブハンドル", + "block.create.green_nixie_tube": "緑色のニキシー管", "block.create.green_sail": "緑色の帆", "block.create.green_seat": "緑色のシート", "block.create.green_valve_handle": "緑色のバルブハンドル", "block.create.hand_crank": "ハンドクランク", + "block.create.haunted_bell": "憑りつかれた鐘", "block.create.honey": "ハチミツ", "block.create.horizontal_framed_glass": "横型ガラス窓", "block.create.horizontal_framed_glass_pane": "横型ガラス窓板", "block.create.hose_pulley": "ホースプーリー", "block.create.item_drain": "アイテム排液口", "block.create.jungle_window": "ジャングルの窓", - "block.create.jungle_window_pane": "ジャングルの窓パネル", + "block.create.jungle_window_pane": "ジャングルの窓板", "block.create.large_cogwheel": "大きな歯車", "block.create.layered_andesite": "安山岩の組石", "block.create.layered_dark_scoria": "ダークスコリアの組石", @@ -201,12 +209,16 @@ "block.create.layered_limestone": "石灰岩の組石", "block.create.layered_scoria": "スコリアの組石", "block.create.layered_weathered_limestone": "風化した石灰岩の組石", + "block.create.lectern_controller": "書見台コントローラー", + "block.create.light_blue_nixie_tube": "空色のニキシー菅", "block.create.light_blue_sail": "空色の帆", "block.create.light_blue_seat": "空色のシート", "block.create.light_blue_valve_handle": "空色のバルブハンドル", + "block.create.light_gray_nixie_tube": "薄灰色のニキシー管", "block.create.light_gray_sail": "薄灰色の帆", "block.create.light_gray_seat": "薄灰色のシート", "block.create.light_gray_valve_handle": "薄灰色のバルブハンドル", + "block.create.lime_nixie_tube": "黄緑色のニキシー管", "block.create.lime_sail": "黄緑色の帆", "block.create.lime_seat": "黄緑色のシート", "block.create.lime_valve_handle": "黄緑色のバルブハンドル", @@ -215,14 +227,15 @@ "block.create.limestone_bricks": "石灰岩レンガ", "block.create.limestone_bricks_slab": "石灰岩レンガのハーフブロック", "block.create.limestone_bricks_stairs": "石灰岩レンガの階段", - "block.create.limestone_bricks_wall": "石灰岩レンガの壁", + "block.create.limestone_bricks_wall": "石灰岩レンガの塀", "block.create.limestone_cobblestone": "石灰岩の丸石", "block.create.limestone_cobblestone_slab": "石灰岩の丸石のハーフブロック", "block.create.limestone_cobblestone_stairs": "石灰岩の丸石の階段", - "block.create.limestone_cobblestone_wall": "石灰岩の丸石の壁", + "block.create.limestone_cobblestone_wall": "石灰岩の丸石の塀", "block.create.limestone_pillar": "石灰岩の柱", "block.create.linear_chassis": "リニアシャーシ", "block.create.lit_blaze_burner": "燃焼中のブレイズバーナー", + "block.create.magenta_nixie_tube": "赤紫色のニキシー管", "block.create.magenta_sail": "赤紫色の帆", "block.create.magenta_seat": "赤紫色のシート", "block.create.magenta_valve_handle": "赤紫色のバルブハンドル", @@ -255,12 +268,12 @@ "block.create.nixie_tube": "ニキシー管", "block.create.nozzle": "ノズル", "block.create.oak_window": "オークの窓", - "block.create.oak_window_pane": "オークの窓パネル", + "block.create.oak_window_pane": "オークの窓板", "block.create.orange_sail": "橙色の帆", "block.create.orange_seat": "橙色のシート", "block.create.orange_valve_handle": "橙色のバルブハンドル", "block.create.ornate_iron_window": "鉄の装飾ガラス", - "block.create.ornate_iron_window_pane": "鉄の装飾ガラスパネル", + "block.create.ornate_iron_window_pane": "鉄の装飾ガラス板", "block.create.overgrown_andesite": "生い茂った安山岩", "block.create.overgrown_dark_scoria": "生い茂ったダークスコリア", "block.create.overgrown_diorite": "生い茂った閃緑岩", @@ -273,39 +286,41 @@ "block.create.paved_andesite": "舗装された安山岩", "block.create.paved_andesite_slab": "舗装された安山岩のハーフブロック", "block.create.paved_andesite_stairs": "舗装された安山岩の階段", - "block.create.paved_andesite_wall": "舗装された安山岩の壁", + "block.create.paved_andesite_wall": "舗装された安山岩の塀", "block.create.paved_dark_scoria": "舗装されたダークスコリア", "block.create.paved_dark_scoria_slab": "舗装されたダークスコリアのハーフブロック", "block.create.paved_dark_scoria_stairs": "舗装されたダークスコリアの階段", - "block.create.paved_dark_scoria_wall": "舗装されたダークスコリアの壁", + "block.create.paved_dark_scoria_wall": "舗装されたダークスコリアの塀", "block.create.paved_diorite": "舗装された閃緑岩", "block.create.paved_diorite_slab": "舗装された閃緑岩のハーフブロック", "block.create.paved_diorite_stairs": "舗装された閃緑岩の階段", - "block.create.paved_diorite_wall": "舗装された閃緑岩の壁", + "block.create.paved_diorite_wall": "舗装された閃緑岩の塀", "block.create.paved_dolomite": "舗装された苦灰岩", "block.create.paved_dolomite_slab": "舗装された苦灰岩のハーフブロック", "block.create.paved_dolomite_stairs": "舗装された苦灰岩の階段", - "block.create.paved_dolomite_wall": "舗装された苦灰岩の壁", + "block.create.paved_dolomite_wall": "舗装された苦灰岩の塀", "block.create.paved_gabbro": "舗装された斑れい岩", "block.create.paved_gabbro_slab": "舗装された斑れい岩のハーフブロック", "block.create.paved_gabbro_stairs": "舗装された斑れい岩の階段", - "block.create.paved_gabbro_wall": "舗装された斑れい岩の壁", + "block.create.paved_gabbro_wall": "舗装された斑れい岩の塀", "block.create.paved_granite": "舗装された花崗岩", "block.create.paved_granite_slab": "舗装された花崗岩のハーフブロック", "block.create.paved_granite_stairs": "舗装された花崗岩の階段", - "block.create.paved_granite_wall": "舗装された花崗岩の壁", + "block.create.paved_granite_wall": "舗装された花崗岩の塀", "block.create.paved_limestone": "舗装された石灰岩", "block.create.paved_limestone_slab": "舗装された石灰岩のハーフブロック", "block.create.paved_limestone_stairs": "舗装された石灰岩の階段", - "block.create.paved_limestone_wall": "舗装された石灰岩の壁", + "block.create.paved_limestone_wall": "舗装された石灰岩の塀", "block.create.paved_scoria": "舗装されたスコリア", "block.create.paved_scoria_slab": "舗装されたスコリアのハーフブロック", "block.create.paved_scoria_stairs": "舗装されたスコリアの階段", - "block.create.paved_scoria_wall": "舗装されたスコリアの壁", + "block.create.paved_scoria_wall": "舗装されたスコリアの塀", "block.create.paved_weathered_limestone": "舗装された風化した石灰岩", "block.create.paved_weathered_limestone_slab": "舗装された風化した石灰岩のハーフブロック", "block.create.paved_weathered_limestone_stairs": "舗装された風化した石灰岩の階段", - "block.create.paved_weathered_limestone_wall": "舗装された風化した石灰岩の壁", + "block.create.paved_weathered_limestone_wall": "舗装された風化した石灰岩の塀", + "block.create.peculiar_bell": "風変わりな鐘", + "block.create.pink_nixie_tube": "桃色のニキシー管", "block.create.pink_sail": "桃色の帆", "block.create.pink_seat": "桃色のシート", "block.create.pink_valve_handle": "桃色のバルブハンドル", @@ -313,37 +328,39 @@ "block.create.polished_dark_scoria": "磨かれたダークスコリア", "block.create.polished_dark_scoria_slab": "磨かれたダークスコリアのハーフブロック", "block.create.polished_dark_scoria_stairs": "磨かれたダークスコリアの階段", - "block.create.polished_dark_scoria_wall": "磨かれたダークスコリアの壁", + "block.create.polished_dark_scoria_wall": "磨かれたダークスコリアの塀", "block.create.polished_dolomite": "磨かれた苦灰岩", "block.create.polished_dolomite_slab": "磨かれた苦灰岩のハーフブロック", "block.create.polished_dolomite_stairs": "磨かれた苦灰岩の階段", - "block.create.polished_dolomite_wall": "磨かれた苦灰岩の壁", + "block.create.polished_dolomite_wall": "磨かれた苦灰岩の塀", "block.create.polished_gabbro": "磨かれた斑れい岩", "block.create.polished_gabbro_slab": "磨かれた斑れい岩のハーフブロック", "block.create.polished_gabbro_stairs": "磨かれた斑れい岩の階段", - "block.create.polished_gabbro_wall": "磨かれた斑れい岩の壁", + "block.create.polished_gabbro_wall": "磨かれた斑れい岩の塀", "block.create.polished_limestone": "磨かれた石灰岩", "block.create.polished_limestone_slab": "磨かれた石灰岩のハーフブロック", "block.create.polished_limestone_stairs": "磨かれた石灰岩の階段", - "block.create.polished_limestone_wall": "磨かれた石灰岩の壁", + "block.create.polished_limestone_wall": "磨かれた石灰岩の塀", "block.create.polished_scoria": "磨かれたスコリア", "block.create.polished_scoria_slab": "磨かれたスコリアのハーフブロック", "block.create.polished_scoria_stairs": "磨かれたスコリアの階段", - "block.create.polished_scoria_wall": "磨かれたスコリアの壁", + "block.create.polished_scoria_wall": "磨かれたスコリアの塀", "block.create.polished_weathered_limestone": "磨かれた風化石灰岩", "block.create.polished_weathered_limestone_slab": "磨かれた風化石灰岩のハーフブロック", "block.create.polished_weathered_limestone_stairs": "磨かれた風化した石灰岩の階段", - "block.create.polished_weathered_limestone_wall": "磨かれた風化した石灰岩の壁", + "block.create.polished_weathered_limestone_wall": "磨かれた風化した石灰岩の塀", "block.create.portable_fluid_interface": "ポータブル液体インターフェース", "block.create.portable_storage_interface": "ポータブルストレージインターフェース", "block.create.powered_latch": "パワードラッチ", "block.create.powered_toggle_latch": "パワードトグルラッチ", "block.create.pulley_magnet": "プーリーマグネット", "block.create.pulse_repeater": "パルスリピーター", + "block.create.purple_nixie_tube": "紫色のニキシー管", "block.create.purple_sail": "紫色の帆", "block.create.purple_seat": "紫色のシート", "block.create.purple_valve_handle": "紫色のバルブハンドル", "block.create.radial_chassis": "ラジアルシャーシ", + "block.create.red_nixie_tube": "赤色のニキシー管", "block.create.red_sail": "赤色の帆", "block.create.red_seat": "赤色のシート", "block.create.red_valve_handle": "赤色のバルブハンドル", @@ -354,18 +371,18 @@ "block.create.rope": "ロープ", "block.create.rope_pulley": "ローププーリー", "block.create.rotation_speed_controller": "回転速度コントローラー", - "block.create.sail_frame": "帆のフレーム", + "block.create.sail_frame": "帆フレーム", "block.create.schematic_table": "概略図テーブル", "block.create.schematicannon": "概略図砲", "block.create.scoria": "スコリア", "block.create.scoria_bricks": "スコリアレンガ", "block.create.scoria_bricks_slab": "スコリアレンガのハーフブロック", "block.create.scoria_bricks_stairs": "スコリアレンガの階段", - "block.create.scoria_bricks_wall": "スコリアレンガの壁", + "block.create.scoria_bricks_wall": "スコリアレンガの塀", "block.create.scoria_cobblestone": "スコリアの丸石", "block.create.scoria_cobblestone_slab": "スコリアの丸石のハーフブロック", "block.create.scoria_cobblestone_stairs": "スコリアの丸石の階段", - "block.create.scoria_cobblestone_wall": "スコリアの丸石の壁", + "block.create.scoria_cobblestone_wall": "スコリアの丸石の塀", "block.create.scoria_pillar": "スコリアの柱", "block.create.secondary_linear_chassis": "セカンダリリニアシャーシ", "block.create.sequenced_gearshift": "シーケンスギアシフト", @@ -376,9 +393,9 @@ "block.create.speedometer": "速度メーター", "block.create.spout": "アイテム注液口", "block.create.spruce_window": "マツの窓", - "block.create.spruce_window_pane": "マツの窓パネル", + "block.create.spruce_window_pane": "マツの窓板", "block.create.sticker": "スティッカー", - "block.create.sticky_mechanical_piston": "粘着メカニカルピストン", + "block.create.sticky_mechanical_piston": "メカニカル粘着ピストン", "block.create.stockpile_switch": "在庫スイッチ", "block.create.stressometer": "応力メーター", "block.create.tiled_glass": "タイルガラス", @@ -387,32 +404,39 @@ "block.create.vertical_framed_glass": "縦型ガラス窓", "block.create.vertical_framed_glass_pane": "縦型ガラス窓板", "block.create.warped_window": "歪んだ窓", - "block.create.warped_window_pane": "歪んだ窓パネル", + "block.create.warped_window_pane": "歪んだ窓板", "block.create.water_wheel": "水車", "block.create.weathered_limestone": "風化した石灰岩", "block.create.weathered_limestone_bricks": "風化した石灰岩レンガ", "block.create.weathered_limestone_bricks_slab": "風化した石灰岩レンガのハーフブロック", "block.create.weathered_limestone_bricks_stairs": "風化した石灰岩レンガの階段", - "block.create.weathered_limestone_bricks_wall": "風化した石灰岩レンガの壁", + "block.create.weathered_limestone_bricks_wall": "風化した石灰岩レンガの塀", "block.create.weathered_limestone_cobblestone": "風化した石灰岩の丸石", "block.create.weathered_limestone_cobblestone_slab": "風化した石灰岩の丸石のハーフブロック", "block.create.weathered_limestone_cobblestone_stairs": "風化した石灰岩の丸石の階段", - "block.create.weathered_limestone_cobblestone_wall": "風化した石灰岩の丸石の壁", + "block.create.weathered_limestone_cobblestone_wall": "風化した石灰岩の丸石の塀", "block.create.weathered_limestone_pillar": "風化した石灰岩の柱", "block.create.weighted_ejector": "重量射出機", + "block.create.white_nixie_tube": "白色のニキシー管", "block.create.white_sail": "白色の帆", "block.create.white_seat": "白色のシート", "block.create.white_valve_handle": "白色のバルブハンドル", "block.create.windmill_bearing": "風車ベアリング", "block.create.wooden_bracket": "木製ブラケット", + "block.create.yellow_nixie_tube": "黄色のニキシー管", "block.create.yellow_sail": "黄色の帆", "block.create.yellow_seat": "黄色のシート", "block.create.yellow_valve_handle": "黄色のバルブハンドル", "block.create.zinc_block": "亜鉛ブロック", "block.create.zinc_ore": "亜鉛鉱石", + "enchantment.create.capacity": "容量増加", + "enchantment.create.potato_recovery": "ポテト回収", + "entity.create.contraption": "からくり", + "entity.create.crafting_blueprint": "クラフトブループリント", "entity.create.gantry_contraption": "ガントリーからくり", + "entity.create.potato_projectile": "ポテト弾", "entity.create.seat": "シート", "entity.create.stationary_contraption": "付設からくり", "entity.create.super_glue": "超粘着剤", @@ -437,10 +461,12 @@ "item.create.chocolate_glazed_berries": "チョコレートグレーズドベリー", "item.create.chromatic_compound": "色彩の化合物", "item.create.cinder_flour": "ネザーラックの粉", + "item.create.copper_backtank": "銅のバックタンク", "item.create.copper_ingot": "銅インゴット", "item.create.copper_nugget": "銅塊", "item.create.copper_sheet": "銅板", "item.create.crafter_slot_cover": "クラフタースロットカバー", + "item.create.crafting_blueprint": "クラフトブループリント", "item.create.crushed_aluminum_ore": "砕いたアルミニウム鉱石", "item.create.crushed_brass": "砕いた真鍮", "item.create.crushed_copper_ore": "砕いた銅鉱石", @@ -455,7 +481,8 @@ "item.create.crushed_tin_ore": "砕いた錫鉱石", "item.create.crushed_uranium_ore": "砕いたウラン鉱石", "item.create.crushed_zinc_ore": "砕いた亜鉛鉱石", - "item.create.deforester": "デフォレスター", + "item.create.diving_boots": "潜水ブーツ", + "item.create.diving_helmet": "潜水ヘルメット", "item.create.dough": "生地", "item.create.electron_tube": "電子管", "item.create.empty_blaze_burner": "空のブレイズバーナー", @@ -465,17 +492,20 @@ "item.create.furnace_minecart_contraption": "からくりかまど付きトロッコ", "item.create.goggles": "エンジニアのゴーグル", "item.create.golden_sheet": "金板", - "item.create.handheld_blockzapper": "携帯型ブロックザッパー", "item.create.handheld_worldshaper": "携帯型ワールドシェーパー", "item.create.honey_bucket": "ハチミツ入りバケツ", "item.create.honeyed_apple": "リンゴのハチミツかけ", - "item.create.integrated_circuit": "集積回路", + "item.create.incomplete_cogwheel": "組み立て中の歯車", + "item.create.incomplete_large_cogwheel": "組み立て中の大きな歯車", + "item.create.incomplete_precision_mechanism": "組み立て中の精密機構", "item.create.iron_sheet": "鉄板", - "item.create.lapis_sheet": "ラピスラズリ板", + "item.create.linked_controller": "リンクコントローラー", "item.create.minecart_contraption": "からくり付きトロッコ", "item.create.minecart_coupling": "トロッコ連結器", "item.create.polished_rose_quartz": "磨かれたローズクォーツ", + "item.create.potato_cannon": "ポテトキャノン", "item.create.powdered_obsidian": "黒曜石の粉", + "item.create.precision_mechanism": "精密機構", "item.create.propeller": "プロペラ", "item.create.red_sand_paper": "赤い紙やすり", "item.create.refined_radiance": "高貴な光輝", @@ -499,7 +529,7 @@ "_": "->------------------------] Advancements [------------------------<-", "advancement.create.root": "Createへようこそ", - "advancement.create.root.desc": "素晴らしいからくり機構を作る時間だ!", + "advancement.create.root.desc": "素晴らしいからくり仕掛けを作る時間だ!", "advancement.create.andesite_alloy": "大いに押韻", "advancement.create.andesite_alloy.desc": "Createの素材には変な名前がついています、安山岩合金もその一つです", "advancement.create.its_alive": "こいつ…動くぞ!", @@ -508,51 +538,51 @@ "advancement.create.shifting_gears.desc": "大きい歯車と小さい歯車を噛み合わせて回転速度を変更する", "advancement.create.overstressed": "超過応力", "advancement.create.overstressed.desc": "応力の限界を肌で感じる", - "advancement.create.belt": "コンブ駆動", + "advancement.create.belt": "ベルトコンブア", "advancement.create.belt.desc": "2つのシャフトをメカニカルベルトで繋ぐ", - "advancement.create.tunnel": "隠せ!", - "advancement.create.tunnel.desc": "メカニカルベルトをトンネルで装飾する", + "advancement.create.tunnel": "隠れろ!", + "advancement.create.tunnel.desc": "メカニカルベルトをトンネルで飾る", "advancement.create.splitter_tunnel": "困難は分割せよ", "advancement.create.splitter_tunnel.desc": "真鍮トンネルで仕分け機を作る", "advancement.create.chute": "転がり落ちる", "advancement.create.chute.desc": "メカニカルベルトの垂直バージョン、シュートを設置する", - "advancement.create.upward_chute": "空への誘い", + "advancement.create.upward_chute": "机上の空論", "advancement.create.upward_chute.desc": "落ちているアイテムがファンで駆動するシュートに飛んでいく様子を見る", - "advancement.create.belt_funnel": "ファンネルのぶらさがってる、ひらひらしたやつ", - "advancement.create.belt_funnel.desc": "ベルトやデポ等の上に横向きのファンネルを置き、特殊形態にする", - "advancement.create.belt_funnel_kiss": "オウムと羽ばたき", + "advancement.create.belt_funnel": "ファンネルのひらひら", + "advancement.create.belt_funnel.desc": "ベルトやデポなどの上に横向きのファンネルを置き、特殊形態にする", + "advancement.create.belt_funnel_kiss": "コウノトリの羽ばたき", "advancement.create.belt_funnel_kiss.desc": "2つのベルトに載せたファンネルにキスをさせる", "advancement.create.fan": "メカニカルエアベンダー", "advancement.create.fan.desc": "ケース入りファンから出る風に乗る", - "advancement.create.fan_lava": "地熱暖房器具", + "advancement.create.fan_lava": "地熱ファンヒーター", "advancement.create.fan_lava.desc": "アイテムを精錬する熱風に巻き込まれる", - "advancement.create.fan_water": "奇妙な洗濯機", + "advancement.create.fan_water": "風変りな洗濯機", "advancement.create.fan_water.desc": "アイテムを洗浄する涼風に巻き込まれる", "advancement.create.fan_smoke": "メカニカルふいご", "advancement.create.fan_smoke.desc": "アイテムを燻製する暖風に巻き込まれる", - "advancement.create.wrench": "便利に設定", + "advancement.create.wrench": "便利な設定", "advancement.create.wrench.desc": "からくり作りに役立つレンチを作る", "advancement.create.goggles": "応力をこの目で", "advancement.create.goggles.desc": "機械からより多くの情報を手に入れるために、エンジニアのゴーグルを作る", "advancement.create.speedometer": "正確な速度は?", - "advancement.create.speedometer.desc": "動作中の速度メーターをゴーグルで見て、正確な値を読み取る", + "advancement.create.speedometer.desc": "動作中の回転速度メーターをゴーグルで見て、正確な値を読み取る", "advancement.create.stressometer": "正確な応力は?", "advancement.create.stressometer.desc": "動作中の応力メーターをゴーグルを通して見て、正確な値を読み取る", "advancement.create.aesthetics": "装飾ブーム!", "advancement.create.aesthetics.desc": "シャフト、パイプ、歯車に木製ブラケットや金属ブラケットを取り付ける", "advancement.create.reinforced": "補強ブーム!", - "advancement.create.reinforced.desc": "シャフト、パイプ、メカニカルベルトなどにケーシングブロックを取り付ける", + "advancement.create.reinforced.desc": "シャフト、パイプ、メカニカルベルトにケーシングブロックを取り付ける", "advancement.create.water_wheel": "水力を使おう", "advancement.create.water_wheel.desc": "水車を置いて、回転させよう!", "advancement.create.chocolate_wheel": "味わい深い原動機", "advancement.create.chocolate_wheel.desc": "溶けたチョコレートで水車を回す", "advancement.create.lava_wheel": "マグマ・ホイール", - "advancement.create.lava_wheel.desc": "残念、これは無理だ", + "advancement.create.lava_wheel.desc": "こんなはずじゃなかった", "advancement.create.cuckoo": "今がその時だ", "advancement.create.cuckoo.desc": "鳩時計が就寝時間を告げるのを目撃する", - "advancement.create.millstone": "ポケット粉砕機", + "advancement.create.millstone": "ポケットクラッシャー", "advancement.create.millstone.desc": "石臼を置いて、回転させる", - "advancement.create.windmill": "凱風快晴", + "advancement.create.windmill": "微風", "advancement.create.windmill.desc": "風車を組み立てる", "advancement.create.maxed_windmill": "雄風", "advancement.create.maxed_windmill.desc": "最強の風車を組み立てる", @@ -584,13 +614,13 @@ "advancement.create.copper_casing.desc": "銅と木材を使って銅ケーシングを作る", "advancement.create.spout": "ぱしゃぱしゃ", "advancement.create.spout.desc": "アイテム注液口が液体を充填している様子を見る", - "advancement.create.spout_potion": "大きな醸造台", + "advancement.create.spout_potion": "世界のお薬屋さん", "advancement.create.spout_potion.desc": "アイテム注液口がポーションを瓶に詰めているところを見る", "advancement.create.chocolate": "夢の世界", "advancement.create.chocolate.desc": "溶けたチョコレート入りバケツを手に入れる", "advancement.create.item_drain": "バケツをひっくり返したような", "advancement.create.item_drain.desc": "アイテム排液口が液体アイテムを空にしている様子を見る", - "advancement.create.chained_item_drain": "鉛筆転がし!", + "advancement.create.chained_item_drain": "アイテムころりん", "advancement.create.chained_item_drain.desc": "自動化したアイテム排液口の上を転がるアイテムを見る", "advancement.create.glass_pipe": "フロウ・スパイ", "advancement.create.glass_pipe.desc": "まっすぐな液体パイプにレンチを使って、窓から通る液体を見る", @@ -606,7 +636,7 @@ "advancement.create.infinite_lava.desc": "無限と言えるほどの大量の溶岩を吸引する", "advancement.create.infinite_chocolate": "空想に溺れて", "advancement.create.infinite_chocolate.desc": "無限と言えるほどの大量の溶けたチョコレートを吸引する", - "advancement.create.crafter": "自動作業台", + "advancement.create.crafter": "部品集結!", "advancement.create.crafter.desc": "メカニカルクラフターを設置して、回転力を供給する", "advancement.create.clockwork_bearing": "時計仕掛け", "advancement.create.clockwork_bearing.desc": "時計仕掛けのベアリングの上に構造物を組み立てる", @@ -620,10 +650,10 @@ "advancement.create.flywheel.desc": "かまどエンジンを勢車に繋ぐ", "advancement.create.overstress_flywheel": "ハイレベル応力", "advancement.create.overstress_flywheel.desc": "かまどエンジンに超過応力をかける", - "advancement.create.integrated_circuit": "複素数の計算", - "advancement.create.integrated_circuit.desc": "集積回路を組み立てる", + "advancement.create.precision_mechanism": "手間暇かけた骨董品", + "advancement.create.precision_mechanism.desc": "精密機構を組み立てる", "advancement.create.mechanical_arm": "手が離せない!", - "advancement.create.mechanical_arm.desc": "搬入元と搬出先を設定したメカニカルアームを設置して、稼働させ、あなたのために一生懸命労働している様子を見る", + "advancement.create.mechanical_arm.desc": "搬入元と搬出先を設定したメカニカルアームを設置して稼働させ、あなたのために一生懸命働いている様子を見る", "advancement.create.musical_arm": "お気に入りの曲を流して!", "advancement.create.musical_arm.desc": "メカニカルアームがジュークボックスを使う様子を見る", "advancement.create.arm_many_targets": "整理整頓", @@ -644,16 +674,12 @@ "advancement.create.refined_radiance.desc": "究極の色彩、「高貴な光輝」を作る", "advancement.create.chromatic_age": "色彩の時代", "advancement.create.chromatic_age.desc": "光と闇のケーシングを作る", - "advancement.create.zapper": "風格ある建築", - "advancement.create.zapper.desc": "建築に役立つレーザー銃、ブロックザッパーを作る", - "advancement.create.upgraded_zapper": "究極の輝き", - "advancement.create.upgraded_zapper.desc": "ブロックザッパーを最大までアップグレードする", "advancement.create.wand_of_symmetry": "輝く鏡", "advancement.create.wand_of_symmetry.desc": "対象の杖を作る", - "advancement.create.deforester": "輝く斧", - "advancement.create.deforester.desc": "デフォレスターを作って、地元の森に別れを告げる", "advancement.create.extendo_grip": "ビヨヨーン!", "advancement.create.extendo_grip.desc": "マジックハンドを手に入れる", + "advancement.create.potato_cannon": "バキューン!", + "advancement.create.potato_cannon.desc": "ポテトキャノンで敵を倒す", "advancement.create.dual_extendo_grip": "究極のビヨンビヨン時代", "advancement.create.dual_extendo_grip.desc": "二刀流のマジックハンドで超人的なリーチを手に入れる", "advancement.create.eob": "ベータ版はここまで", @@ -665,16 +691,32 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create Palettes", - "death.attack.create.crush": "%1$s は破砕ホイールによって処理されました", - "death.attack.create.fan_fire": "%1$s は熱風で焼死した", - "death.attack.create.fan_lava": "%1$s は溶岩ファンによって焼死した", - "death.attack.create.mechanical_drill": "%1$s はメカニカルドリルに突き刺さった", - "death.attack.create.mechanical_saw": "%1$s はメカニカルソーで半分にカットされた", - "death.attack.create.cuckoo_clock_explosion": "%1$s は改ざんされた鳩時計に爆破された", + "death.attack.create.crush": "%1$sは破砕ホイールによって処理された", + "death.attack.create.crush.player": "%1$sは%2$sに破砕ホイールに投入された", + "death.attack.create.fan_fire": "%1$sはケース入りファンによって燻製にされた", + "death.attack.create.fan_fire.player": "%1$sは%2$sによって燻製にされた", + "death.attack.create.fan_lava": "%1$sはケース入りファンで精錬された", + "death.attack.create.fan_lava.player": "%1$sは%2$sによって熱風に投げ込まれた", + "death.attack.create.mechanical_drill": "%1$sはメカニカルドリルに突き抜かれた", + "death.attack.create.mechanical_drill.player": "%1$sは%2$sにドリルの目の前に投げ込まれた", + "death.attack.create.mechanical_saw": "%1$sはメカニカルソーで半分にカットされた", + "death.attack.create.mechanical_saw.player": "%1$sは%2$sによってメカニカルソーの回転する刃に投げ込まれた", + "death.attack.create.potato_cannon": "%1$sは%2$sのポテトキャノンに撃ち抜かれた", + "death.attack.create.potato_cannon.item": "%1$sは%3$sで%2$sに撃た抜かれた", + "death.attack.create.cuckoo_clock_explosion": "%1$sは改造された鳩時計に爆破された", + "death.attack.create.cuckoo_clock_explosion.player": "%1$sは何者かによって改造された鳩時計に爆破された", "create.block.deployer.damage_source_name": "悪いデプロイヤー", "create.block.cart_assembler.invalid": "トロッコアセンブラはレールの上にのみ設置できます", + "create.menu.return": "メニューに戻る", + "create.menu.configure": "設定...", + "create.menu.ponder_index": "思案索引", + "create.menu.only_ingame": "一時停止メニューで利用可能", + "create.menu.project_page": "プロジェクトページ", + "create.menu.report_bugs": "バグ報告", + "create.menu.support": "私たちを応援する", + "create.recipe.crushing": "粉砕", "create.recipe.milling": "製粉", "create.recipe.fan_washing": "一括洗浄", @@ -685,6 +727,7 @@ "create.recipe.fan_blasting.fan": "溶岩の奥のケース入りファン", "create.recipe.pressing": "プレス", "create.recipe.mixing": "混合", + "create.recipe.deploying": "使用", "create.recipe.automatic_shapeless": "自動不定形クラフト", "create.recipe.automatic_brewing": "自動醸造", "create.recipe.packing": "圧縮", @@ -694,11 +737,20 @@ "create.recipe.automatic_shaped": "自動定形クラフト", "create.recipe.block_cutting": "自動石切", "create.recipe.wood_cutting": "自動製材", - "create.recipe.blockzapper_upgrade": "携帯型ブロックザッパー", "create.recipe.sandpaper_polishing": "紙やすりでの研磨", "create.recipe.mystery_conversion": "神秘の変転", "create.recipe.spout_filling": "アイテム注液口による注入", "create.recipe.draining": "アイテムから排液", + "create.recipe.sequenced_assembly": "組立ライン", + "create.recipe.assembly.next": "次の工程: %1$s", + "create.recipe.assembly.step": "手順: %1$s:", + "create.recipe.assembly.progress": "進捗: %1$s/%2$s", + "create.recipe.assembly.pressing": "プレスする", + "create.recipe.assembly.spout_filling_fluid": "%1$sを注液", + "create.recipe.assembly.deploying_item": "%1$sを組み込む", + "create.recipe.assembly.cutting": "ソーでの切断", + "create.recipe.assembly.repeat": "%1$s回繰り返す", + "create.recipe.assembly.junk": "ランダムな仕損品", "create.recipe.processing.chance": "%1$s%%チャンス", "create.recipe.heat_requirement.none": "加熱不要", "create.recipe.heat_requirement.heated": "加熱が必要", @@ -751,20 +803,16 @@ "create.orientation.alongZ": "Z に沿る", "create.orientation.alongX": "X に沿る", - "create.gui.blockzapper.title": "携帯型ブロックザッパー", - "create.gui.blockzapper.replaceMode": "置換モード", - "create.gui.blockzapper.searchDiagonal": "対角線にフォロー", - "create.gui.blockzapper.searchFuzzy": "素材の境界を無視", - "create.gui.blockzapper.range": "範囲", - "create.gui.blockzapper.needsUpgradedAmplifier": "増幅アップグレードが必要", - "create.gui.blockzapper.patternSection": "模様", - "create.gui.blockzapper.pattern.solid": "敷き詰め", - "create.gui.blockzapper.pattern.checkered": "市松模様", - "create.gui.blockzapper.pattern.inversecheckered": "逆市松模様", - "create.gui.blockzapper.pattern.chance25": "25%", - "create.gui.blockzapper.pattern.chance50": "50%", - "create.gui.blockzapper.pattern.chance75": "75%", - "create.gui.terrainzapper.title": "携帯型ワールドシェーパー", + "create.gui.terrainzapper.title": "携帯型ブロックザッパー", + "create.gui.terrainzapper.searchDiagonal": "対角線にフォロー", + "create.gui.terrainzapper.searchFuzzy": "素材の境界を無視", + "create.gui.terrainzapper.patternSection": "模様", + "create.gui.terrainzapper.pattern.solid": "敷き詰め", + "create.gui.terrainzapper.pattern.checkered": "市松模様", + "create.gui.terrainzapper.pattern.inversecheckered": "逆市松模様", + "create.gui.terrainzapper.pattern.chance25": "25%", + "create.gui.terrainzapper.pattern.chance50": "50%", + "create.gui.terrainzapper.pattern.chance75": "75%", "create.gui.terrainzapper.placement": "配置", "create.gui.terrainzapper.placement.merged": "合併", "create.gui.terrainzapper.placement.attached": "添える", @@ -773,6 +821,8 @@ "create.gui.terrainzapper.brush.cuboid": "直方体", "create.gui.terrainzapper.brush.sphere": "球体", "create.gui.terrainzapper.brush.cylinder": "円筒", + "create.gui.terrainzapper.brush.surface": "表面", + "create.gui.terrainzapper.brush.cluster": "鉱石", "create.gui.terrainzapper.tool": "ツール", "create.gui.terrainzapper.tool.fill": "埋立", "create.gui.terrainzapper.tool.place": "設置", @@ -782,19 +832,8 @@ "create.gui.terrainzapper.tool.flatten": "なだらかに", "create.terrainzapper.shiftRightClickToSet": "シフト-右クリックで形状を選択", - - "create.blockzapper.usingBlock": "使用中: %1$s", - "create.blockzapper.componentUpgrades": "アップグレード部品:", - "create.blockzapper.component.body": "ボディー", - "create.blockzapper.component.amplifier": "範囲", - "create.blockzapper.component.accelerator": "連射", - "create.blockzapper.component.retriever": "回収", - "create.blockzapper.component.scope": "射程", - "create.blockzapper.componentTier.none": "無し", - "create.blockzapper.componentTier.brass": "真鍮", - "create.blockzapper.componentTier.chromatic": "色彩", - "create.blockzapper.leftClickToSet": "ブロックをスニークせず左クリックでブロックを選択", - "create.blockzapper.empty": "ブロック不足!", + "create.terrainzapper.usingBlock": "使用中: %1$s", + "create.terrainzapper.leftClickToSet": "ブロックをスニークせず左クリックでブロックを選択", "create.minecart_coupling.two_couplings_max": "トロッコを2つ以上連結させることはできません", "create.minecart_coupling.unloaded": "列車の一部のあるチャンクがロードされていません", @@ -1025,6 +1064,11 @@ "create.item_attributes.in_item_group.inverted": "%1$sに属していないか", "create.item_attributes.added_by": "%1$sによって追加されたか", "create.item_attributes.added_by.inverted": "%1$sによって追加されていないか", + "create.item_attributes.shulker_level": "%1$sシュルカーか", + "create.item_attributes.shulker_level.inverted": "%1$sシュルカーでないか", + "create.item_attributes.shulker_level.full": "満杯の", + "create.item_attributes.shulker_level.empty": "空の", + "create.item_attributes.shulker_level.partial": "一部埋まっている", "create.item_attributes.has_enchant": "エンチャントされているか%1$s", "create.item_attributes.has_enchant.inverted": "エンチャントがされていないか", "create.item_attributes.color": "%1$sで染められているか", @@ -1120,6 +1164,27 @@ "create.tooltip.chute.fans_pull_up": "ファンが上から吸い込んでいます", "create.tooltip.chute.fans_pull_down": "ファンが下から吸い込んでいます", "create.tooltip.chute.contains": "内容物: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "配布中", + "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "右クリックで取り出し", + + "create.linked_controller.bind_mode": "割り当てモード", + "create.linked_controller.press_keybind": "%1$s、%2$s、%3$s、%4$s、%5$sまたは%6$sを押すとこの周波数がそのキーに割り当てられます", + "create.linked_controller.key_bound": "周波数を割り当てました %1$s", + "create.linked_controller.frequency_slot_1": "キーバインド: %1$s、周波数 #1", + "create.linked_controller.frequency_slot_2": "キーバインド: %1$s、周波数 #2", + + "create.crafting_blueprint.crafting_slot": "材料スロット", + "create.crafting_blueprint.filter_items_viable": "フィルターが使えます", + "create.crafting_blueprint.display_slot": "表示スロット", + "create.crafting_blueprint.inferred": "レシピから推測", + "create.crafting_blueprint.manually_assigned": "手動割り当て", + "create.crafting_blueprint.secondary_display_slot": "第2表示スロット", + "create.crafting_blueprint.optional": "オプション", + + "create.potato_cannon.ammo.attack_damage": "攻撃力: %1$s", + "create.potato_cannon.ammo.reload_ticks": "リロード時間(tick): %1$s", + "create.potato_cannon.ammo.knockback": "ノックバック: %1$s", "create.hint.hose_pulley.title": "底なし搬出", "create.hint.hose_pulley": "対象となる液体は無限とみなされています。", @@ -1148,32 +1213,46 @@ "create.command.killTPSCommand.argument.tickTime": "tickTime", "create.contraption.minecart_contraption_too_big": "このからくりトロッコは大きすぎて拾えません。", + "create.contraption.minecart_contraption_illegal_pickup": "神秘的な力がからくりカートを世界に縛り付けています。", "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "歯車がゴロゴロと鳴る", - "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", "create.subtitle.contraption_disassemble": "からくりが止まる", - "create.subtitle.wrench_rotate": "レンチを使う", + "create.subtitle.peculiar_bell_use": "風変わりな鐘が鳴る", "create.subtitle.mixing": "混ぜる音", "create.subtitle.mechanical_press_activation_belt": "メカニカルプレスがボンと鳴る", - "create.subtitle.blockzapper_confirm": "成功音", + "create.subtitle.fwoomp": "ポテトランチャーがバキューンと鳴る", + "create.subtitle.worldshaper_place": "ワールドシェーパーが設置する", + "create.subtitle.crushing_1": "粉砕音", "create.subtitle.depot_slide": "アイテムが滑る", - "create.subtitle.blockzapper_place": "ブロックを発射して設置する", + "create.subtitle.saw_activate_stone": "メカニカルソーが動作する", "create.subtitle.blaze_munch": "ブレイズの咀嚼音", - "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", "create.subtitle.funnel_flap": "ファンネルがはためく", "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", + "create.subtitle.haunted_bell_use": "憑りつかれた鐘が鳴る", "create.subtitle.scroll_value": "スクロールのカチカチ音", + "create.subtitle.crafter_craft": "メカニカルクラフターがクラフトする", + "create.subtitle.controller_put": "コントローラのトントン音", + "create.subtitle.cranking": "ハンドクランクが回る", + "create.subtitle.wrench_remove": "機械を壊す", + "create.subtitle.cogs": "歯車がゴロゴロと鳴る", + "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", + "create.subtitle.wrench_rotate": "レンチが使用される", + "create.subtitle.potato_hit": "野菜が衝突する", + "create.subtitle.saw_activate_wood": "メカニカルソーが動作する", + "create.subtitle.haunted_bell_convert": "憑りつかれた鐘が目覚める", + "create.subtitle.deployer_polish": "デプロイヤーが磨く", + "create.subtitle.deny": "失敗音", + "create.subtitle.controller_click": "コントローラーのカチカチ音", + "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", + "create.subtitle.copper_armor_equip": "潜水服がチャリンと鳴る", + "create.subtitle.controller_take": "書見台が空になる", "create.subtitle.mechanical_press_activation": "メカニカルプレスがガーンと鳴る", "create.subtitle.contraption_assemble": "からくりが動く", - "create.subtitle.crafter_craft": "メカニカルクラフターがクラフトする", - "create.subtitle.blockzapper_deny": "失敗音", - "create.subtitle.cranking": "ハンドクランクが回る", "create.subtitle.crafter_click": "メカニカルクラフターのカチカチ音", - "create.subtitle.wrench_remove": "機械を壊す", "create.subtitle.depot_plop": "デプロイヤーにアイテムが入れられる", + "create.subtitle.confirm": "成功音", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1193,14 +1272,6 @@ "block.create.metal_bracket.tooltip": "金属ブラケット", "block.create.metal_bracket.tooltip.summary": "補強用の頑丈で工業的な欠片で_シャフト_、_歯車_、そして_パイプ_を_飾ろう_。", - "block.create.copper_casing.tooltip": "銅ケーシング", - "block.create.copper_casing.tooltip.summary": "様々な用途に使える丈夫なマシンケーシング。飾り付けにも安心してお使いいただけます。", - "block.create.copper_casing.tooltip.condition1": "液体パイプに使ったとき", - "block.create.copper_casing.tooltip.behaviour1": "_液体パイプ_を_銅ケーシング_で_覆います_。ケース入り液体パイプは_接続状態を固定_し、隣にパイプ等を置いても接続が変化しなくなります。", - - "block.create.encased_fluid_pipe.tooltip": "ケース入り液体パイプ", - "block.create.encased_fluid_pipe.tooltip.summary": "銅ケーシングに覆われた液体パイプ", - "block.create.seat.tooltip": "シート", "block.create.seat.tooltip.summary": "シートに座って乗り物を楽しもう!移動する_構造物_の上にプレイヤーを固定します。もちろん家具にも使えます。染色することも。", "block.create.seat.tooltip.condition1": "右クリックしたとき", @@ -1209,65 +1280,6 @@ "item.create.blaze_cake.tooltip": "ブレイズケーキ", "item.create.blaze_cake.tooltip.summary": "働き者の_ブレイズバーナー_達に美味しいご馳走を。彼らを燃え上がらせよう(物理)!", - "block.create.fluid_pipe.tooltip": "液体パイプ", - "block.create.fluid_pipe.tooltip.summary": "_液体_の輸送に使います。_液体_輸送にはメカニカルポンプが必要です。", - "block.create.fluid_pipe.tooltip.condition1": "液体輸送", - "block.create.fluid_pipe.tooltip.behaviour1": "_タンク_や_鉢_などの_液体コンテナ_に繋がります。また、_パイプ_の端が露出しているので液体を吹き出したり設置したりできます。液漏れ注意!", - "block.create.fluid_pipe.tooltip.condition2": "レンチで右クリックしたとき", - "block.create.fluid_pipe.tooltip.behaviour2": "可能ならパイプに窓を設けます。", - - "block.create.hose_pulley.tooltip": "ホースプーリー", - "block.create.hose_pulley.tooltip.summary": "ワールドの大量の_液体_を_吸引_したり、_放出_したりするのに使います。", - "block.create.hose_pulley.tooltip.condition1": "回転力を供給したとき", - "block.create.hose_pulley.tooltip.behaviour1": "ホースを_上げ下げ_して、どの程度の_高さ_まで_吸引_や_放出_を行うか決めます。", - "block.create.hose_pulley.tooltip.condition2": "プーリー本体から液体を吸い込むとき", - "block.create.hose_pulley.tooltip.behaviour2": "ホースの端がおろされた本体から_液体_ブロックを_吸引_し始めます。非常に_大量_の液体は_無限_と_みなされます_。", - "block.create.hose_pulley.tooltip.condition3": "プーリー本体に液体が押しこまれたとき", - "block.create.hose_pulley.tooltip.behaviour3": "ホースの端の_高さ_まで、_液体_の_放出_を始めます。", - - "block.create.fluid_tank.tooltip": "液体タンク", - "block.create.fluid_tank.tooltip.summary": "あなたのお気に入りのあらゆる_液体_を_貯蔵_できます。縦横に並べて大きさを調整できます。", - "block.create.fluid_tank.tooltip.condition1": "レンチで右クリックしたとき", - "block.create.fluid_tank.tooltip.behaviour1": "窓の付けたり、外したりします。", - - "block.create.creative_fluid_tank.tooltip": "クリエイティブ液体タンク", - "block.create.creative_fluid_tank.tooltip.summary": "この_液体タンク_は、あらゆる液体を無限に複製します。縦横に並べて大きさを調整できます。", - "block.create.creative_fluid_tank.tooltip.condition1": "液体がタンクに入っているとき", - "block.create.creative_fluid_tank.tooltip.behaviour1": "このタンクから何かを_取り出す_と、指定された液体が_無限_に_供給_されます。このタンクに_搬入_された液体は_消滅_します。", - "block.create.creative_fluid_tank.tooltip.condition2": "レンチで左クリックしたとき", - "block.create.creative_fluid_tank.tooltip.behaviour2": "窓を付け外しします。", - - "block.create.fluid_valve.tooltip": "液体バルブ", - "block.create.fluid_valve.tooltip.summary": "パイプ内の液体の流れを止めます。", - "block.create.fluid_valve.tooltip.condition1": "液体制御", - "block.create.fluid_valve.tooltip.behaviour1": "_回転力_を加えると_バルブ_は強制的に閉じ、_液体_の流れを止めます。_回転_方向を逆にするとバルブが再び開きます。", - - "block.create.mechanical_pump.tooltip": "メカニカルポンプ", - "block.create.mechanical_pump.tooltip.summary": "_回転力_を使って_パイプ_に沿って_液体_を輸送します。両方向に最大効果範囲があります。(デフォルト16ブロック)", - "block.create.mechanical_pump.tooltip.condition1": "液体輸送", - "block.create.mechanical_pump.tooltip.behaviour1": "_回転力_を加えると_パイプ_を流れる_液体_を移動させる圧力が発生します。_回転方向_を逆にすると、_液体_の流れる方向を切り替えられます。", - "block.create.mechanical_pump.tooltip.control1": "レンチで右クリックしたとき", - "block.create.mechanical_pump.tooltip.action1": "_ポンプ_の方向を反転させ、デフォルトの流れる方向を切り替えます。", - - "block.create.smart_fluid_pipe.tooltip": "スマート液体パイプ", - "block.create.smart_fluid_pipe.tooltip.summary": "フィルター付きの_液体パイプ_。どの_液体_を通過させるか設定できます。", - "block.create.smart_fluid_pipe.tooltip.condition1": "液体を搬入したとき", - "block.create.smart_fluid_pipe.tooltip.behaviour1": "フィルターに合わない液体を搬入したスマート液体パイプは、流れを遮断します。", - "block.create.smart_fluid_pipe.tooltip.condition2": "液体コンテナに隣接しているとき", - "block.create.smart_fluid_pipe.tooltip.behaviour2": "あらゆる容器から_流れ出す_スマート液体パイプは、その_フィルター_に_合った_液体のみを搬入します。", - - "block.create.spout.tooltip": "アイテム注液口", - "block.create.spout.tooltip.summary": "_液体_を注入する注液器。", - "block.create.spout.tooltip.condition1": "液体充填", - "block.create.spout.tooltip.behaviour1": "_バケツ_や_瓶_のような_容器アイテム_を下に置くと、貯蔵された_液体_でそれを満たします。", - "block.create.spout.tooltip.condition2": "液体自動化", - "block.create.spout.tooltip.behaviour2": "_ベルト_や_デポ_の上に置かれたアイテム注液口は、その下を通過する_容器アイテム_に反応します。", - - "block.create.item_drain.tooltip": "アイテム排液口", - "block.create.item_drain.tooltip.summary": "_液体アイテム_を空にする格子の付いたデポ。", - "block.create.item_drain.tooltip.condition1": "液体排液", - "block.create.item_drain.tooltip.behaviour1": "_バケツ_や_ボトル_などの_液体入り容器_を横から搬入すると、アイテム排液口はその_液体入り容器_に空にしようとします。その後、アイテムは反対側に排出されます。", - "item.create.wand_of_symmetry.tooltip": "対称の杖", "item.create.wand_of_symmetry.tooltip.summary": "対象の鏡をまたいだ範囲内のブロック設置を完全に複製します。", "item.create.wand_of_symmetry.tooltip.condition1": "ホットバーにあるとき", @@ -1277,16 +1289,7 @@ "item.create.wand_of_symmetry.tooltip.control2": "空中を右クリックしたとき", "item.create.wand_of_symmetry.tooltip.action2": "有効な対象の鏡を_削除_", "item.create.wand_of_symmetry.tooltip.control3": "スニークしながら右クリックしたとき", - "item.create.wand_of_symmetry.tooltip.action3": "_設定インターフェース_を開きます。", - - "item.create.handheld_blockzapper.tooltip": "携帯型ブロックザッパー", - "item.create.handheld_blockzapper.tooltip.summary": "離れた場所にブロックを設置または交換する新しいガジェット。", - "item.create.handheld_blockzapper.tooltip.control1": "ブロックを左クリックしたとき", - "item.create.handheld_blockzapper.tooltip.action1": "ターゲットのブロックをこのツールに設定します。", - "item.create.handheld_blockzapper.tooltip.control2": "ブロックを右クリックしたとき", - "item.create.handheld_blockzapper.tooltip.action2": "ターゲットブロックを_配置_または_置換_します。", - "item.create.handheld_blockzapper.tooltip.control3": "スニークしながら右クリックしたとき。", - "item.create.handheld_blockzapper.tooltip.action3": "_設定インターフェース_を開きます。", + "item.create.wand_of_symmetry.tooltip.action3": "_設定画面_を開きます。", "item.create.handheld_worldshaper.tooltip": "携帯型ワールドシェーパー", "item.create.handheld_worldshaper.tooltip.summary": "特色ある_風景_や_地形_を作成する便利なツール。", @@ -1295,44 +1298,50 @@ "item.create.handheld_worldshaper.tooltip.control2": "ブロックを右クリックしたとき", "item.create.handheld_worldshaper.tooltip.action2": "現在選択されている_ブラシ_と_ツール_を目標の場所に適用します。", "item.create.handheld_worldshaper.tooltip.control3": "スニークしながら右クリックしたとき", - "item.create.handheld_worldshaper.tooltip.action3": "_設定インターフェース_を開きます。", + "item.create.handheld_worldshaper.tooltip.action3": "_設定画面_を開きます。", "item.create.tree_fertilizer.tooltip": "樹木の肥料", "item.create.tree_fertilizer.tooltip.summary": "一般的な種類の木の成長を早めるのに適したミネラルを配合した強力な肥料。", "item.create.tree_fertilizer.tooltip.condition1": "苗木に使ったとき", "item.create.tree_fertilizer.tooltip.behaviour1": "_間隔の条件_に_関係なく_苗木を成長させる", - "item.create.deforester.tooltip": "デフォレスター", - "item.create.deforester.tooltip.summary": "一瞬で木を切り倒すことができる_輝く斧_。", - "item.create.extendo_grip.tooltip": "マジックハンド", "item.create.extendo_grip.tooltip.summary": "ビヨヨーン!着用者の_射程_を大幅に_伸ばし_ます。", "item.create.extendo_grip.tooltip.condition1": "オフハンドに装備したとき", "item.create.extendo_grip.tooltip.behaviour1": "_メインハンド_で使うアイテムの_射程_を_伸ばし_ます。", + "item.create.extendo_grip.tooltip.condition2": "銅のバックタンクを装備したとき", + "item.create.extendo_grip.tooltip.behaviour2": "_耐久値_を消費しなくなります。代わりに_圧縮空気_をタンクから消費します。", + + "item.create.potato_cannon.tooltip": "ポテトキャノン", + "item.create.potato_cannon.tooltip.summary": "バキューン!自分が育てた野菜を敵に発射します。_銅のバックタンク_の圧縮空気でも動かせます。", + "item.create.potato_cannon.tooltip.condition1": "左クリックしたとき", + "item.create.potato_cannon.tooltip.behaviour1": "_インベントリ_の中から_適切_なアイテムを発射します。", + "item.create.potato_cannon.tooltip.condition2": "銅のバックタンクを装備した時", + "item.create.potato_cannon.tooltip.behaviour2": "_耐久性_を消費しなくなります。代わりに_圧縮空気_をタンクから消費します", "item.create.filter.tooltip": "フィルター", "item.create.filter.tooltip.summary": "物流系の装置の_搬入_と_搬出_をより_正確_に_制御_し、_アイテムのセット_またはいくつかの_入れ子になったフィルター_と照合します。", "item.create.filter.tooltip.condition1": "フィルタースロットにセットしたとき", "item.create.filter.tooltip.behaviour1": "_設定_に応じてアイテムの流れを_制御_します。", "item.create.filter.tooltip.condition2": "右クリックしたとき", - "item.create.filter.tooltip.behaviour2": "_設定インターフェース_を開きます。", + "item.create.filter.tooltip.behaviour2": "_設定画面_を開きます。", "item.create.attribute_filter.tooltip": "属性フィルター", "item.create.attribute_filter.tooltip.summary": "物流系の装置の_搬入_と_搬出_をより_正確_に_制御_し、アイテムの_属性_と_カテゴリのセット_と照合します。", "item.create.attribute_filter.tooltip.condition1": "フィルタースロットにセットしたとき", "item.create.attribute_filter.tooltip.behaviour1": "_設定_に応じてアイテムの流れを_制御_します。", "item.create.attribute_filter.tooltip.condition2": "右クリックしたとき", - "item.create.attribute_filter.tooltip.behaviour2": "_設定インターフェース_を開きます。", + "item.create.attribute_filter.tooltip.behaviour2": "_設定画面_を開きます。", "item.create.empty_schematic.tooltip": "空の概略図", "item.create.empty_schematic.tooltip.summary": "レシピの材料、および_概略図テーブル_での書き込みに使われます。", "item.create.schematic.tooltip": "概略図", - "item.create.schematic.tooltip.summary": "ワールドに設置できる構造物を保持します。ホログラムを必要に応じて配置し、_概略図砲_を使って建築します。", + "item.create.schematic.tooltip.summary": "ワールドに設置できる構造物を保存します。ホログラムを必要に応じて配置し、_概略図砲_を使って建築します。", "item.create.schematic.tooltip.condition1": "持ったとき", "item.create.schematic.tooltip.behaviour1": "画面上のツールを使ってホログラムを配置します。", "item.create.schematic.tooltip.control1": "スニークしながら右クリックしたとき", - "item.create.schematic.tooltip.action1": "正確な_座標_を入力する_インターフェース_を開きます", + "item.create.schematic.tooltip.action1": "正確な_座標_の入力_画面_を開きます", "item.create.schematic_and_quill.tooltip": "概略図と羽根ペン", "item.create.schematic_and_quill.tooltip.summary": "ワールドの構造物を.nbtファイルに保存できます。", @@ -1348,9 +1357,9 @@ "item.create.schematic_and_quill.tooltip.action3": "選択を_リセット_して削除します。", "block.create.schematicannon.tooltip": "概略図砲", - "block.create.schematicannon.tooltip.summary": "ブロックを撃って、展開された_概略図_をもとにワールドに設置します。隣接する収納ブロックからのアイテムを自動搬入し、_火薬_を燃料とします。", + "block.create.schematicannon.tooltip.summary": "ブロックを撃って、_概略図_をもとにワールドに設置します。隣接する収納ブロックからのアイテムを自動搬入し、_火薬_を燃料とします。", "block.create.schematicannon.tooltip.condition1": "右クリックしたとき", - "block.create.schematicannon.tooltip.behaviour1": "_インターフェース_を開きます。", + "block.create.schematicannon.tooltip.behaviour1": "_UI_を開きます。", "block.create.schematic_table.tooltip": "概略図テーブル", "block.create.schematic_table.tooltip.summary": "保存された構造物を_空の概略図_に書き込みます。", @@ -1362,7 +1371,7 @@ "item.create.goggles.tooltip.condition1": "着用したとき", "item.create.goggles.tooltip.behaviour1": "設置された機械の_回転速度_および、_機械_の_応力への影響_と_許容量_を_色付きのインジケーター_で表示します。", "item.create.goggles.tooltip.condition2": "計器を見たとき", - "item.create.goggles.tooltip.behaviour2": "計器が接続されているネットワークの_回転速度_または_応力_に関する詳細情報を表示します。", + "item.create.goggles.tooltip.behaviour2": "計器が接続されている動力ネットワークの_回転速度_または_応力_に関する詳細情報を表示します。", "item.create.goggles.tooltip.condition3": "液体コンテナを見たとき", "item.create.goggles.tooltip.behaviour3": "ブロックの_容量_と、その中に貯蔵されている_液体_の詳細情報を表示します。", @@ -1384,28 +1393,21 @@ "block.create.turntable.tooltip": "ターンテーブル", "block.create.turntable.tooltip.summary": "_回転力_を洗練された乗り物酔いに変えます。", - "block.create.portable_fluid_interface.tooltip": "ポータブル液体インターフェース", - "block.create.portable_fluid_interface.tooltip.summary": "ピストン、ベアリング、トロッコ、またはプーリーで移動する_構造物_との間で_液体_を_移動_させる可搬式の交換ポイント。2つのインターフェースは、互いに_向かい合って_、_1~2ブロック離す_必要があります。", - "block.create.portable_fluid_interface.tooltip.condition1": "動かしたとき", - "block.create.portable_fluid_interface.tooltip.behaviour1": "設置してある_ポータブル液体インターフェース_と相互作用して、構造物との間で液体を移動させます。_設置してあるインターフェース_に搬入、または搬出するパイプは、構造物のタンクと_直接_相互作用します。液体が交換される間、構造物は一時的に停止します。", - "block.create.portable_fluid_interface.tooltip.condition2": "レッドストーン信号を受けたとき", - "block.create.portable_fluid_interface.tooltip.behaviour2": "アクティブな接続を即座に_切断_します。", - "block.create.stockpile_switch.tooltip": "在庫スイッチ", - "block.create.stockpile_switch.tooltip.summary": "接続されたコンテナの_空き容量_に基づいてレッドストーン信号を切り替えます。便利なフィルターが付属しています。_コンパレータ―_とは違って、_在庫スイッチ_は、信号が反転される_しきい値_を設定できます。", + "block.create.stockpile_switch.tooltip.summary": "接続されたコンテナの_空き容量_によってレッドストーン信号を切り替えます。便利なフィルターが付属しています。_コンパレータ―_とは違って、_在庫スイッチ_は、信号が反転される_しきい値_を設定できます。", "block.create.stockpile_switch.tooltip.condition1": "右クリックしたとき", - "block.create.stockpile_switch.tooltip.behaviour1": "_設定インターフェース_を開きます。", + "block.create.stockpile_switch.tooltip.behaviour1": "_設定画面_を開きます。", "block.create.content_observer.tooltip": "コンテンツオブザーバー", - "block.create.content_observer.tooltip.summary": "設定された_フィルター_に一致する_コンテナ_や_メカニカルベルト_内の_アイテム_を_検出_します。観察している_収納ブロック_、_ベルト_、または_シュート_に一致するアイテムが含まれている場合、このは_レッドストーン信号_を発します。観察された_ファンネル_が一致するアイテムを_運搬_すると、このコンポーネントは_レッドストーンパルス_を発します。", + "block.create.content_observer.tooltip.summary": "設定された_フィルター_に一致する_コンテナ_や_メカニカルベルト_内の_アイテム_を_検出_します。観察している_収納ブロック_、_ベルト_、または_シュート_に一致するアイテムが含まれている場合、このは_レッドストーン信号_を発します。観察している_ファンネル_が一致するアイテムを_運搬_すると、このコンポーネントは_レッドストーンパルス_を発します。", "block.create.adjustable_crate.tooltip": "可変クレート", "block.create.adjustable_crate.tooltip.summary": "この_収納ブロック_は、容量を手動で調整できます。任意のアイテムを_16スタック_まで収納できます。_レッドストーンコンパレーター_に対応しています。", - "block.create.adjustable_crate.tooltip.condition": "右クリックしたとき", - "block.create.adjustable_crate.tooltip.behaviour1": "_インターフェース_を開きます。", + "block.create.adjustable_crate.tooltip.condition1": "右クリックしたとき", + "block.create.adjustable_crate.tooltip.behaviour1": "_UI_を開きます。", "block.create.creative_crate.tooltip": "クリエイティブクレート", - "block.create.creative_crate.tooltip.summary": "この_収納ブロック_は、あらゆるアイテムを無限に複製します。隣接する_概略図砲_へブロックを無限に供給します。", + "block.create.creative_crate.tooltip.summary": "あらゆるアイテムを無限に複製する_収納ブロック_。隣接する_概略図砲_へブロックを無限に供給します。", "block.create.creative_crate.tooltip.condition1": "フィルタースロットにアイテムが入っているとき", "block.create.creative_crate.tooltip.behaviour1": "このクレートから何かを_搬出_すると、指定されたアイテムが_無限_に_搬出_されます。このクレートに_搬入_されたアイテムは_消滅_します。", @@ -1424,27 +1426,61 @@ "item.create.refined_radiance.tooltip": "高貴な光輝", "item.create.refined_radiance.tooltip.summary": "_吸収した光輝_から鍛造した色彩素材。", + "item.create.refined_radiance.tooltip.condition1": "作業中", + "item.create.refined_radiance.tooltip.behaviour1": "この素材の使用方法は将来のリリースで実装予定です。", "item.create.shadow_steel.tooltip": "シャドウスチール", "item.create.shadow_steel.tooltip.summary": "_奈落の虚無_から鍛造した色彩素材。", + "item.create.shadow_steel.tooltip.condition1": "作業中", + "item.create.shadow_steel.tooltip.behaviour1": "この素材の使用方法は将来のリリースで実装予定です。", + + "item.create.linked_controller.tooltip": "リンクコントローラー", + "item.create.linked_controller.tooltip.summary": "_6つのボタン_に割り当てられた_レッドストーンリンク_周波数を_片手_で_制御_できます。", + "item.create.linked_controller.tooltip.condition1": "左クリック", + "item.create.linked_controller.tooltip.behaviour1": "コントローラーを_オンオフ_します。_制御_がオンのときは_移動_できません。", + "item.create.linked_controller.tooltip.condition2": "スニークしながら左クリック", + "item.create.linked_controller.tooltip.behaviour2": "手動_設定画面_を開きます", + "item.create.linked_controller.tooltip.condition3": "レッドストーンリンク受信機を左クリックしたとき", + "item.create.linked_controller.tooltip.behaviour3": "_割り当てモード_をオンにします。_6つのコントロール_のうち1つを押してリンクの周波数に_割り当て_ます。", + "item.create.linked_controller.tooltip.condition4": "書見台を左クリックしたとき", + "item.create.linked_controller.tooltip.behaviour4": "コントローラーを書見台に設置し、簡単に使えるようにします。(スニーク中に左クリックで取り出せます)", + + "item.create.diving_helmet.tooltip": "潜水ヘルメット", + "item.create.diving_helmet.tooltip.summary": "_銅のバックタンク_と一緒に使うと、長時間_水中_で_呼吸_できるようになるヘルメット。", + "item.create.diving_helmet.tooltip.condition1": "装備したとき", + "item.create.diving_helmet.tooltip.behaviour1": "バックタンクからゆっくりと_圧縮空気_を排出しながら、_水中呼吸_の効果を供給します。", + + "item.create.copper_backtank.tooltip": "銅のバックタンク", + "item.create.copper_backtank.tooltip.summary": "圧縮空気を運ぶため_携帯タンク_", + "item.create.copper_backtank.tooltip.condition1": "装備したとき", + "item.create.copper_backtank.tooltip.behaviour1": "必要な装備に_圧縮空気_を供給します。", + "item.create.copper_backtank.tooltip.condition2": "設置して動力を供給したとき", + "item.create.copper_backtank.tooltip.behaviour2": "_圧縮空気_を_集めます_。速度は回転速度によって決まります。", + + "item.create.diving_boots.tooltip": "潜水ブーツ", + "item.create.diving_boots.tooltip.summary": "海底を歩けるようになる_重いブーツ_。", + "item.create.diving_boots.tooltip.condition1": "装備したとき", + "item.create.diving_boots.tooltip.behaviour1": "_沈むのが早くなり_、_泳げなく_なります。その代わり、水中で_歩行_と_ジャンプ_が可能になります。また、メカニカルベルトの影響を受けなくなります。", + + "item.create.crafting_blueprint.tooltip": "クラフトブループリント", + "item.create.crafting_blueprint.tooltip.summary": "壁に_貼り_、_材料_の_配置_を_指定_することで手作業でのクラフトを簡単にできます。各スロットが1つのレシピを表しています。", + "item.create.crafting_blueprint.tooltip.condition1": "空きスロットを左クリックしたとき", + "item.create.crafting_blueprint.tooltip.behaviour1": "_レシピ_や表示するアイテムを_設定_できる_クラフトメニュー_を開きます。", + "item.create.crafting_blueprint.tooltip.condition2": "設定済みスロットを左クリックしたとき", + "item.create.crafting_blueprint.tooltip.behaviour2": "_インベントリ_にある一致する材料で_設定されたレシピ_を_クラフト_します。_スニーク_すれば最大_スタック_分を一気にクラフトできます", "item.create.minecart_coupling.tooltip": "トロッコ連結器", "item.create.minecart_coupling.tooltip.summary": "壮大な列車を作るために_トロッコ_や_からくり車両_を_連結_しよう。", "item.create.minecart_coupling.tooltip.condition1": "トロッコに使ったとき", "item.create.minecart_coupling.tooltip.behaviour1": "_2台_のトロッコを連結します。それらは移動中に_一定_の_距離_を保とうします。", - "create.tooltip.wip": "WIP", - "create.tooltip.workInProgress": "作業中です!", - "create.tooltip.randomWipDescription0": "お子様の手の届かないところに保管してください。", - "create.tooltip.randomWipDescription1": "赤ちゃんパンダは、このアイテムを使うたびに死にます。そう、いつでもね。", - "create.tooltip.randomWipDescription2": "自己責任。", - "create.tooltip.randomWipDescription3": "これはあなたが探しているアイテムではありません。*人差し指を振って*ちっちっちっ、解散!", - "create.tooltip.randomWipDescription4": "このアイテムは10秒で自爆します。10、9、8 ...", - "create.tooltip.randomWipDescription5": "私を信じて、それは無駄だ。", - "create.tooltip.randomWipDescription6": "このアイテムを使うことにより、お客様は免責事項に同意し、その条件を承諾するものとします。", - "create.tooltip.randomWipDescription7": "これは君に向いていないかもしれない。あれはどう??", - "create.tooltip.randomWipDescription8": "それを使ったことをすぐ後悔するだろう。", + "block.create.peculiar_bell.tooltip": "風変わりな鐘", + "block.create.peculiar_bell.tooltip.summary": "装飾用の_真鍮の鐘。_魂の炎_の真上に置くと、別の使い方が見つかるかもしれません...", + "block.create.haunted_bell.tooltip": "憑りつかれた鐘", + "block.create.haunted_bell.tooltip.summary": "ネザーに彷徨う魂が宿る、呪われた鐘", + "block.create.haunted_bell.tooltip.condition1": "持ったとき、鳴らしたとき", + "block.create.haunted_bell.tooltip.behaviour1": "_敵モブ_がスポーンする近くの_光のない場所_を示します", "_": "->------------------------] Ponder Content [------------------------<-", @@ -1461,6 +1497,11 @@ "create.ponder.replay": "最初から", "create.ponder.think_back": "戻る", "create.ponder.slow_text": "熟考(スロー再生)", + "create.ponder.exit": "終了", + "create.ponder.welcome": "思案画面へようこそ", + "create.ponder.categories": "Createで利用可能なカゴテリ", + "create.ponder.index_description": "アイテムをクリックすると、関連するアイテムやブロックの情報が表示されます。", + "create.ponder.index_title": "思案索引", "create.ponder.shared.movement_anchors": "シャーシや超粘着剤を使えば大きな構造物も動かせます", "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.sneak_and": "スニーク +", @@ -1521,10 +1562,10 @@ "create.ponder.andesite_tunnel.text_4": "残ったものは、そのルートを進み続けます", "create.ponder.basin.header": "鉢によるアイテム加工", - "create.ponder.basin.text_1": "鉢には材料となるアイテムや液体を入れられます", + "create.ponder.basin.text_1": "鉢には素材となるアイテムや液体を入れられます", "create.ponder.basin.text_2": "鉢は完成品アイテムを斜め下へ搬出しようとします", - "create.ponder.basin.text_3": "搬出できる機械が存在する場合、鉢には搬出用の蛇口が表示されます", - "create.ponder.basin.text_4": "ここではいくつかの選択肢があります", + "create.ponder.basin.text_3": "搬出できるブロックが存在する場合、鉢には搬出用の蛇口が表示されます", + "create.ponder.basin.text_4": "搬出先のブロックにはいくつかの選択肢があります", "create.ponder.basin.text_5": "搬出したアイテムは下の収納ブロックに入ります", "create.ponder.basin.text_6": "搬出先がない場合、鉢は完成品アイテムを保持します", "create.ponder.basin.text_7": "これは、完成品アイテムを材料として再利用する必要がある場合に役立ちます", @@ -1533,7 +1574,7 @@ "create.ponder.bearing_modes.header": ":メカニカルベアリングの動作モード", "create.ponder.bearing_modes.text_1": "止まったとき、ベアリングは格子に沿った近い角度に構造物を配置します", - "create.ponder.bearing_modes.text_2": "通常のブロックに戻らないように設定したり、開始時の角度のみブロックに戻るように設定することもできます", + "create.ponder.bearing_modes.text_2": "通常のブロックに戻らないように設定したり、開始時の角度のみブロックに戻るように設定したりできます", "create.ponder.belt_casing.header": "ケース入りベルト", "create.ponder.belt_casing.text_1": "真鍮か安山岩のケーシングを使ってメカニカルベルトを飾れます", @@ -1542,16 +1583,16 @@ "create.ponder.belt_connector.header": "メカニカルベルトの使い方", "create.ponder.belt_connector.text_1": "メカニカルベルトを持って2つのシャフトを右クリックすると、シャフトにベルトコンベアを繋げて設置されます", "create.ponder.belt_connector.text_2": "誤ったシャフトをクリックしてしまった場合、スニークしながら右クリックでキャンセルできます", - "create.ponder.belt_connector.text_3": "ベルトの何処にでもシャフトを追加できます", + "create.ponder.belt_connector.text_3": "ベルト内のどこでも、シャフトを追加できます", "create.ponder.belt_connector.text_4": "ベルトを介して接続されたシャフトは、同じ速度・方向で回転します", "create.ponder.belt_connector.text_5": "追加したシャフトは、レンチで取り除けま", "create.ponder.belt_connector.text_6": "メカニカルベルトは見栄えのために染色できます", "create.ponder.belt_directions.header": "メカニカルベルトの有効な向きについて", "create.ponder.belt_directions.text_1": "ベルトは自由な方向に接続できるわけではありません", - "create.ponder.belt_directions.text_2": "1.水平方向", + "create.ponder.belt_directions.text_2": "1.水平", "create.ponder.belt_directions.text_3": "2.斜め", - "create.ponder.belt_directions.text_4": "3.垂直方向", + "create.ponder.belt_directions.text_4": "3.垂直", "create.ponder.belt_directions.text_5": "4.垂直方向のシャフトを水平に", "create.ponder.belt_directions.text_6": "これらはすべて接続可能な方向です。ベルトの長さは2~20ブロックの間で自由に接続できます", @@ -1562,7 +1603,7 @@ "create.ponder.blaze_burner.header": "ブレイズバーナーへの餌やり", "create.ponder.blaze_burner.text_1": "ブレイズバーナーは、鉢で加工するアイテムを加熱できます", "create.ponder.blaze_burner.text_2": "その為には、ブレイズに燃料を与える必要があります", - "create.ponder.blaze_burner.text_3": "ブレイズケーキを与えると、バーナーはさらに強力な火力を出せます", + "create.ponder.blaze_burner.text_3": "ブレイズケーキを与えると、バーナーはさらに火力を出せます", "create.ponder.blaze_burner.text_4": "供給作業は、デプロイヤーやメカニカルアームで自動化できます", "create.ponder.brass_funnel.header": "真鍮ファンネル", @@ -1581,7 +1622,7 @@ "create.ponder.brass_tunnel.text_7": "搬入したアイテムは、接続されているすべての搬出口に分配されます", "create.ponder.brass_tunnel.text_8": "アイテムをトンネルへ直接搬入することもできます", - "create.ponder.brass_tunnel_modes.header": "真鍮トンネルのモード", + "create.ponder.brass_tunnel_modes.header": "真鍮トンネルの動作モード", "create.ponder.brass_tunnel_modes.text_1": "真鍮トンネルはレンチを使って分配モードを変更できます", "create.ponder.brass_tunnel_modes.text_10": "「同期」は、真鍮製トンネルのデフォルト設定です", "create.ponder.brass_tunnel_modes.text_11": "アイテムはグループ内の全てのトンネルがアイテムを搬入できる場合のみ通過を許可します", @@ -1596,34 +1637,35 @@ "create.ponder.brass_tunnel_modes.text_9": "「ランダム」は、スタック全体をランダムに選択された搬出口に分配します ", "create.ponder.cart_assembler.header": "トロッコアセンブラによる構造物の移動", - "create.ponder.cart_assembler.text_1": "レッドストーン信号を受けたアセンブラは、通過するトロッコに接続された構造物を取り付けます", + "create.ponder.cart_assembler.text_1": "レッドストーン信号を受けたアセンブラは通過するトロッコに、取り付けられた構造物を取り付けます", "create.ponder.cart_assembler.text_2": "レッドストーン信号を受けていない場合、通過するトロッコの構造物を取り外し、ブロックへ戻します", "create.ponder.cart_assembler.text_3": "トロッコにレンチを使うと、構造物を付けたまま別の場所へ運べます", "create.ponder.cart_assembler_dual.header": "列車を組み立てる", "create.ponder.cart_assembler_dual.text_1": "2つのトロッコアセンブラが構造物を共有している場合...", - "create.ponder.cart_assembler_dual.text_2": "...どちらかにレッドストーン信号を受けると、列車が組み立てられます", + "create.ponder.cart_assembler_dual.text_2": "...どちらかにレッドストーン信号を与えると、列車が組み立てられます", "create.ponder.cart_assembler_dual.text_3": "トロッコ連結器で接続されたトロッコと同様の動作をします", "create.ponder.cart_assembler_modes.header": "からくり付きトロッコの方向設定", "create.ponder.cart_assembler_modes.text_1": "トロッコの構造物は、トロッコの動きに合わせて回転します", - "create.ponder.cart_assembler_modes.text_2": "アセンブラーが「常に向きを固定する」に設定されている場合、構造物の向きは変わりません", + "create.ponder.cart_assembler_modes.text_2": "この矢印は、構造物のどちら側が前面かを示します", + "create.ponder.cart_assembler_modes.text_3": "アセンブラが「常に向きを固定する」に設定されている場合、からくりの向きは変わりません", "create.ponder.cart_assembler_rails.header": "その他のトロッコとレールの種類", "create.ponder.cart_assembler_rails.text_1": "通常のレールに設置されたトロッコアセンブラは、通過するカートの動きに影響を与えません", "create.ponder.cart_assembler_rails.text_2": "パワードレールやコントローラーレールでは、レッドストーン信号を受けるまでトロッコは固定されます", - "create.ponder.cart_assembler_rails.text_3": "他のトロッコをアンカーとして使えます", + "create.ponder.cart_assembler_rails.text_3": "他のトロッコを使うこともできます", "create.ponder.cart_assembler_rails.text_4": "かまど付きトロッコは、構造物の収納ブロックから燃料を確保します", "create.ponder.chain_drive.header": "ケース入りチェーンドライブによる回転力の伝達", "create.ponder.chain_drive.text_1": "チェーンドライブは、一列に並べると回転を伝達します", - "create.ponder.chain_drive.text_2": "この様に接続された全てのシャフトは、回転方向が同じです", - "create.ponder.chain_drive.text_3": "列のどの部分でも90度回転させて設置できます", + "create.ponder.chain_drive.text_2": "このように、に接続された全てのシャフトは、回転方向が同じです", + "create.ponder.chain_drive.text_3": "列の任意の部分を90度方向を変えて設置できます", "create.ponder.chain_gearshift.header": "チェーンギアシフトによる回転速度の制御", "create.ponder.chain_gearshift.text_1": "信号を受けていないチェーンギアシフトは、チェーンドライブと同じように動作します", "create.ponder.chain_gearshift.text_2": "信号を受けている時は、列内の他のチェーンドライブに伝達される速度が2倍になります", - "create.ponder.chain_gearshift.text_3": "信号を受けているチェーンギアシフトが動力源に無い場合、速度が半分になります", + "create.ponder.chain_gearshift.text_3": "信号を受けているチェーンギアシフトが動力源でない場合、速度が半分になります", "create.ponder.chain_gearshift.text_4": "いずれの場合も、列内のチェーンドライブは常に「信号入りチェーンギアシフト」の2倍の速度で動作します", "create.ponder.chain_gearshift.text_5": "レッドストーン信号の強度で、比率を1と2の間でより正確に調整できます", "create.ponder.chain_gearshift.text_6": "12 RPM", @@ -1635,7 +1677,7 @@ "create.ponder.chute_upward.header": "シュートでの上方向へ運搬", "create.ponder.chute_upward.text_1": "シュートの上部または下部にファンを配置すると、アイテムを上方向へ運搬できます", - "create.ponder.chute_upward.text_2": "エンジニアのゴーグルを付けてシュートを見ると、移動方向の情報が表示されます", + "create.ponder.chute_upward.text_2": "エンジニアのゴーグルを付けてシュートを見ると、移動方向が表示されます", "create.ponder.chute_upward.text_3": "ブロックで詰まっている端では、アイテムを側面から搬出入する必要があります", "create.ponder.clockwork_bearing.header": "時計仕掛けのベアリングを使った構造物のアニメーション", @@ -1649,21 +1691,27 @@ "create.ponder.clockwork_bearing.text_8": "2つ目の構造物は分針として回転します", "create.ponder.clutch.header": "クラッチによる回転力の制御", - "create.ponder.clutch.text_1": "クラッチは直線に回転を伝達します", - "create.ponder.clutch.text_2": "レッドストーン信号を受けると、回転の伝達を停止します", + "create.ponder.clutch.text_1": "クラッチはまっすぐ回転を伝達します", + "create.ponder.clutch.text_2": "レッドストーン信号を与えると、回転の伝達が止まります", "create.ponder.cog_speedup.header": "歯車による回転速度変化", "create.ponder.cog_speedup.text_1": "大小の歯車は斜めに接続できます", - "create.ponder.cog_speedup.text_2": "大きな歯車から歯車に接続すると、伝達される回転速度が2倍になります", - "create.ponder.cog_speedup.text_3": "逆に接続すると、伝達される回転速度が半分になります", + "create.ponder.cog_speedup.text_2": "大きな歯車から歯車に接続すると、伝達先の回転速度が2倍になります", + "create.ponder.cog_speedup.text_3": "逆に接続すると、伝達先の回転速度が半分になります", "create.ponder.cogwheel.header": "歯車による回転力の伝達", "create.ponder.cogwheel.text_1": "歯車は隣接する歯車へ回転力を伝達します", "create.ponder.cogwheel.text_2": "このように連結された隣のシャフトは、逆方向に回転します", + "create.ponder.creative_fluid_tank.header": "クリエイティブ液体タンク", + "create.ponder.creative_fluid_tank.text_1": "クリエイティブ液体タンクは、液体を無限に供給できます", + "create.ponder.creative_fluid_tank.text_2": "液体容器アイテムで右クリックで液体を指定できます", + "create.ponder.creative_fluid_tank.text_3": "液体ネットワークはタンクから指定された液体を無限に引き出すことができます", + "create.ponder.creative_fluid_tank.text_4": "クリエイティブ液体タンクに押し入れた液体は消滅します", + "create.ponder.creative_motor.header": "クリエイティブモーターによる回転力の生成", - "create.ponder.creative_motor.text_1": "クリエイティブモーターは、コンパクトで調整できる原動機です", - "create.ponder.creative_motor.text_2": "背面パネルを見てスクロールすると、モーターの回転速度を変更できます", + "create.ponder.creative_motor.text_1": "クリエイティブモーターは、コンパクトで調整可能な原動機です", + "create.ponder.creative_motor.text_2": "背面パネルを見ながらスクロールすると、モーターの回転速度を変更できます", "create.ponder.crushing_wheels.header": "破砕ホイールによるアイテム加工", "create.ponder.crushing_wheels.text_1": "一対の破砕ホイールは、非常に効果的にアイテムを粉砕できます", @@ -1679,7 +1727,7 @@ "create.ponder.deployer.text_13": "フィルターを設定すると、一致するアイテムを持っている時だけ稼働します", "create.ponder.deployer.text_14": "また、フィルターに一致するアイテムのみが搬入されるようになり...", "create.ponder.deployer.text_15": "...一致しないアイテムのみが搬出されます", - "create.ponder.deployer.text_2": "動作は、常に前方2ブロックの位置へ行われます", + "create.ponder.deployer.text_2": "動作は、常に手前2ブロックの位置へ行われます", "create.ponder.deployer.text_3": "真正面のブロックが邪魔になることはありません", "create.ponder.deployer.text_4": "デプロイヤーは以下の動作に使えます", "create.ponder.deployer.text_5": "ブロックの設置", @@ -1693,31 +1741,43 @@ "create.ponder.deployer_contraption.text_2": "...稼働した場所ごとに稼働し、からくり内の収納ブロックのアイテムを使用します", "create.ponder.deployer_contraption.text_3": "フィルタースロットを使って、どのアイテムを使用するか指定できます", - "create.ponder.deployer_modes.header": "デプロイヤーのモード", + "create.ponder.deployer_modes.header": "デプロイヤーの動作モード", "create.ponder.deployer_modes.text_1": "デフォルトでは、デプロイヤーは右クリックの動作を模倣します", "create.ponder.deployer_modes.text_2": "レンチを使えば、左クリックの動作を模倣するように設定できます", + "create.ponder.deployer_processing.header": "デプロイヤーによるアイテムの処理", + "create.ponder.deployer_processing.text_1": "装着されたアイテムで、デプロイヤーの先にあるアイテムを処理することができます", + "create.ponder.deployer_processing.text_2": "加工したいアイテムはドロップしたり、デプロイヤーの下のデポに置いてください", + "create.ponder.deployer_processing.text_3": "ベルトでアイテムを供給すると", + "create.ponder.deployer_processing.text_4": "デプロイヤーが自動でアイテムを止め、加工します。", + "create.ponder.deployer_redstone.header": "レッドストーン信号によるデプロイヤーの制御", "create.ponder.deployer_redstone.text_1": "レッドストーン信号を受けている間、デプロイヤーは稼働しません", "create.ponder.deployer_redstone.text_2": "デプロイヤーは停止する前に、開始したサイクルは終了させます", - "create.ponder.deployer_redstone.text_3": "その為、オフのパルス信号を使って丁度1サイクルだけ稼働させられます", + "create.ponder.deployer_redstone.text_3": "その為、反転したパルス信号を使って丁度1サイクルだけ稼働させられます", "create.ponder.depot.header": "デポの使い方", "create.ponder.depot.text_1": "デポは動かないメカニカルベルトのようなブロックです", - "create.ponder.depot.text_2": "右クリックして、手動でのアイテム搬出入できます", + "create.ponder.depot.text_2": "右クリックして、手動でアイテム搬出入できます", "create.ponder.depot.text_3": "メカニカルベルトのように、載せたアイテムを加工できます", "create.ponder.depot.text_4": "また、メカニカルアームにアイテムを供給することもできます", "create.ponder.empty_blaze_burner.header": "空のブレイズバーナーの使い方", - "create.ponder.empty_blaze_burner.text_1": "空のバーナーでブレイズを右クリックし捕獲できます", + "create.ponder.empty_blaze_burner.text_1": "空のバーナーでブレイズを右クリックすると捕獲できます", "create.ponder.empty_blaze_burner.text_2": "また、ブレイズはスポーンブロックから直接捕獲することもできます", - "create.ponder.empty_blaze_burner.text_3": "これで、様々な機械で利用する理想的な熱源が得られます", + "create.ponder.empty_blaze_burner.text_3": "これで、様々な機械で利用できる理想的な熱源が得られます", "create.ponder.empty_blaze_burner.text_4": "空のブレイズバーナーは火打石と打ち金を使って火を付ければ装飾にも使えます", - "create.ponder.empty_blaze_burner.text_5": "しかし、これは加工用の熱源には適していません", + "create.ponder.empty_blaze_burner.text_5": "さらに、魂の宿ったアイテムを使うことで炎を変化させられます", + "create.ponder.empty_blaze_burner.text_6": "しかし、これは加工用の熱源には適していません", + + "create.ponder.encased_fluid_pipe.header": "ケース入り液体パイプ", + "create.ponder.encased_fluid_pipe.text_1": "銅ケーシングで液体パイプを飾ることができます", + "create.ponder.encased_fluid_pipe.text_2": "ただの飾りではなく、ケース入りパイプは接続がロックされます", + "create.ponder.encased_fluid_pipe.text_3": "隣接するブロックの設置や破壊などの更新に反応しなくなります", "create.ponder.fan_direction.header": "ケース入りファンの気流", "create.ponder.fan_direction.text_1": "ケース入りファンは、回転力を利用して気流を生み出します", - "create.ponder.fan_direction.text_2": "気流の強さと方向は、供給される回転力に依存します", + "create.ponder.fan_direction.text_2": "気流の強さと方向は、供給される回転力によって決まります", "create.ponder.fan_processing.header": "ケース付きファンによるアイテム加工", "create.ponder.fan_processing.text_1": "溶岩を通過した気流は、加熱されます", @@ -1733,6 +1793,35 @@ "create.ponder.fan_source.text_1": "ファンを熱源に向けて設置すると、回転力を生成できます", "create.ponder.fan_source.text_2": "レッドストーン信号を受けると、回転力が生成されます", + "create.ponder.fluid_pipe_flow.header": "銅パイプを使った液体の移動", + "create.ponder.fluid_pipe_flow.text_1": "液体パイプは2つ以上の液体源と輸送先を繋ぐことができます", + "create.ponder.fluid_pipe_flow.text_2": "レンチを使うと、まっすぐなパイプに窓を付けられます", + "create.ponder.fluid_pipe_flow.text_3": "窓付きパイプは側面と隣接するパイプとつながりません", + "create.ponder.fluid_pipe_flow.text_4": "メカニカルポンプを使えば液体を輸送できます", + "create.ponder.fluid_pipe_flow.text_5": "はじめは液体が輸送されません", + "create.ponder.fluid_pipe_flow.text_6": "液れが終点まで届くと徐々に輸送されていきます", + "create.ponder.fluid_pipe_flow.text_7": "つまり、パイプブロック自体には液体は物理的に入っていないということです", + + "create.ponder.fluid_pipe_interaction.header": "液体容器の排出と充填", + "create.ponder.fluid_pipe_interaction.text_1": "液体ネットワークは終点でさまざまなブロックとやりとりできます", + "create.ponder.fluid_pipe_interaction.text_2": "液体を溜めることができれば、どのようなブロックでも液体の搬入・搬出ができます", + "create.ponder.fluid_pipe_interaction.text_3": "開いているパイプの端の目の前の液体ブロックは吸い込めます", + "create.ponder.fluid_pipe_interaction.text_4": "また、開いたスペースに液体ブロックを設置できます", + "create.ponder.fluid_pipe_interaction.text_5": "パイプは、いくつかのブロックから直接液体を吸い込めます", + + "create.ponder.fluid_tank_sizes.header": "液体タンクのサイズ", + "create.ponder.fluid_tank_sizes.text_1": "液体タンクは複数組み合わせて容量を増やせます。", + "create.ponder.fluid_tank_sizes.text_2": "横幅は最大3ブロック", + "create.ponder.fluid_tank_sizes.text_3": "高さは30ブロック以上重ねられます", + "create.ponder.fluid_tank_sizes.text_4": "レンチを使って、タンクの窓を付け外しできます", + + "create.ponder.fluid_tank_storage.header": "液体タンクへの液体の貯蔵", + "create.ponder.fluid_tank_storage.text_1": "液体タンクは大量の液体を貯蔵することができます", + "create.ponder.fluid_tank_storage.text_2": "どの方向からでも液体を搬出入できます", + "create.ponder.fluid_tank_storage.text_3": "コンパレーターで液体量を測れます", + "create.ponder.fluid_tank_storage.text_4": "しかし、サバイバルモードでは手動で液体を出し入れできません。", + "create.ponder.fluid_tank_storage.text_5": "鉢、アイテム排液口、アイテム注液口などを使えばアイテムから液体を出し入れできます。", + "create.ponder.flywheel.header": "勢車による回転力の生成", "create.ponder.flywheel.text_1": "かまどエンジンで回転力を生成するには、勢車が必要です", "create.ponder.flywheel.text_2": "これによって生成される回転力は、非常に大きな応力許容量を持っています", @@ -1745,9 +1834,9 @@ "create.ponder.funnel_compat.text_4": "アイテム排液口など", "create.ponder.funnel_direction.header": "運搬の方向", - "create.ponder.funnel_direction.text_1": "通常の配置では、収納ブロックからアイテムを搬出ます", + "create.ponder.funnel_direction.text_1": "通常の配置では、収納ブロックからアイテムを搬出します", "create.ponder.funnel_direction.text_2": "スニークしながら設置すると、収納ブロックにアイテムを搬入します", - "create.ponder.funnel_direction.text_3": "レンチを使って、設置後にファンネルのモードを変えられます", + "create.ponder.funnel_direction.text_3": "レンチを使って、設置後にファンネルの動作モードを変えられます", "create.ponder.funnel_direction.text_4": "ほとんどの方向で同じことができます", "create.ponder.funnel_direction.text_5": "ベルト上のファンネルは、ベルトの移動方向に応じて搬入/搬出が決まります", @@ -1768,18 +1857,18 @@ "create.ponder.furnace_engine.text_3": "溶鉱炉を使うと、エンジンの効率が2倍になります", "create.ponder.gantry_carriage.header": "ガントリーキャリッジの使い方", - "create.ponder.gantry_carriage.text_1": "ガントリーキャリッジは、ガントリーシャフトに取り付けてスライドさせられます", - "create.ponder.gantry_carriage.text_2": "ガントリーの仕掛けは、取り付けたブロックを動かせます", + "create.ponder.gantry_carriage.text_1": "ガントリーキャリッジは、ガントリーシャフトに取り付けてスライドできます", + "create.ponder.gantry_carriage.text_2": "ガントリーは、取り付けられたブロックを動かします", - "create.ponder.gantry_cascaded.header": "立体ガンドリー", + "create.ponder.gantry_cascaded.header": "立体ガントリー", "create.ponder.gantry_cascaded.text_1": "ガントリーシャフトは、超粘着剤を使わずにキャリッジに取り付けられます", "create.ponder.gantry_cascaded.text_2": "そのガントリーシャフトに取り付けたキャリッジも同様です", - "create.ponder.gantry_cascaded.text_3": "このように、ガントリー機構を立体的に接続すると、複数の移動軸をカバーできます", + "create.ponder.gantry_cascaded.text_3": "このように、ガントリーを立体的に接続すると、複数の移動軸をカバーできます", "create.ponder.gantry_direction.header": "ガントリーの移動方向", "create.ponder.gantry_direction.text_1": "ガントリーシャフトは、向きを反対に設置できます", "create.ponder.gantry_direction.text_2": "キャリッジの移動方向は、シャフトの向きによって決まります", - "create.ponder.gantry_direction.text_3": "また、シャフトの回転方向にも依存します", + "create.ponder.gantry_direction.text_3": "また、シャフトの回転方向によっても決まります", "create.ponder.gantry_direction.text_4": "キャリッジへ伝達する回転力も同じルールが適用されます", "create.ponder.gantry_redstone.header": "ガントリーでの回転力の伝播", @@ -1793,11 +1882,11 @@ "create.ponder.gearbox.header": "ギアボックスによる回転力の伝達", "create.ponder.gearbox.text_1": "回転軸の向きを変えようとすると、すぐに機構がかさばってしまいます", "create.ponder.gearbox.text_2": "これをコンパクトにしたものがギアボックスです", - "create.ponder.gearbox.text_3": "角を曲がったシャフトは鏡映しの方向に回転します", - "create.ponder.gearbox.text_4": "直線方向への接続は、回転方向が逆になります", + "create.ponder.gearbox.text_3": "直角に曲げて伝達すると、鏡映しの方向に回転します", + "create.ponder.gearbox.text_4": "まっすぐ伝達すると、回転方向が逆になります", "create.ponder.gearshift.header": "ギアシフトによる回転力の制御", - "create.ponder.gearshift.text_1": "ギアシフトは、直線に回転を伝達します", + "create.ponder.gearshift.text_1": "ギアシフトは、まっすぐ回転を伝達します", "create.ponder.gearshift.text_2": "レッドストーン信号を受けると、回転方向を逆に伝達します", "create.ponder.hand_crank.header": "ハンドクランクによる回転力の生成", @@ -1806,6 +1895,34 @@ "create.ponder.hand_crank.text_3": "回転速度は比較的速めです", "create.ponder.hand_crank.text_4": "スニークしながら右クリックし続けると、時計回りに回転します", + "create.ponder.hose_pulley.header": "ホースプーリーを使った液体の吸入・放出", + "create.ponder.hose_pulley.text_1": "ホースプーリーは、大規模な液体の吸入や放出に使います", + "create.ponder.hose_pulley.text_2": "回転力の入出口はプーリーのホースの高さを変えるのに使います", + "create.ponder.hose_pulley.text_3": "回転方向を逆にするとプーリーが収納されます", + "create.ponder.hose_pulley.text_4": "反対側にはパイプを接続できます", + "create.ponder.hose_pulley.text_5": "接続された液体ネットワークはプーリーに液体を供給し、放出できます", + "create.ponder.hose_pulley.text_6": "また、プーリーから吸い出し、代わりに吸入することもできます", + "create.ponder.hose_pulley.text_7": "プーリーの吸入・放出速度は液体ネットワークの性能で決まります", + + "create.ponder.hose_pulley_infinite.header": "大規模な液体の無限の吸入・放出", + "create.ponder.hose_pulley_infinite.text_1": "ホースプーリーを十分に大きな海に設置すると", + "create.ponder.hose_pulley_infinite.text_2": "海に影響を与えずに液体を吸入・放出できます", + "create.ponder.hose_pulley_infinite.text_3": "つまり、液体ネットワークはこのプーリーから液体を無限に出し入れできます", + + "create.ponder.hose_pulley_level.header": "ホースプーリーの吸入・放出レベル", + "create.ponder.hose_pulley_level.text_1": "完全に収納された状態では、ホースプーリーは稼働しません", + "create.ponder.hose_pulley_level.text_2": "上から下に水を吸入します", + "create.ponder.hose_pulley_level.text_3": "表面の高さはホースのすぐ下になります", + "create.ponder.hose_pulley_level.text_4": "下から上に向かって放出します", + "create.ponder.hose_pulley_level.text_5": "ホースの端より上に放出されることはありません", + + "create.ponder.item_drain.header": "アイテム排液口で液体容器を空にする", + "create.ponder.item_drain.text_1": "アイテム排液口はアイテムから液体を取り出せます", + "create.ponder.item_drain.text_2": "右クリックすると、持っているアイテムの中の液体を注ぐことができます", + "create.ponder.item_drain.text_3": "横からアイテムを入れると...", + "create.ponder.item_drain.text_4": "...中に詰まった液体を出しながら横に転がっていきます", + "create.ponder.item_drain.text_5": "液体ネットワークで、排液口から液体を取り出せます", + "create.ponder.large_cogwheel.header": "大きな歯車による回転力の伝達", "create.ponder.large_cogwheel.text_1": "大きな歯車は、直角に接続できます", "create.ponder.large_cogwheel.text_2": "回転力の回転軸を変えてに伝達するのに役立ちます", @@ -1816,12 +1933,12 @@ "create.ponder.linear_chassis_attachment.text_3": "素手でスニークしながら右クリックすると粘着剤を剥がせます", "create.ponder.linear_chassis_attachment.text_4": "リニアシャーシの特殊な粘着面は、ブロックの列をまとめてくっつけることができます", "create.ponder.linear_chassis_attachment.text_5": "レンチを使って、このシャーシの粘着範囲を正確に調整できます", - "create.ponder.linear_chassis_attachment.text_6": "CTRLを押しながらスクロールすると、接続している全てのシャーシブロックの範囲を調整できます", + "create.ponder.linear_chassis_attachment.text_6": "CTRLを押しながらスクロールすると、接続している全てのシャーシブロックの範囲を一気に調整できます", "create.ponder.linear_chassis_attachment.text_7": "他の面にブロックを接着するには、超粘着剤を使う必要があります", "create.ponder.linear_chassis_attachment.text_8": "この仕組みを使えば、どんな形の構造物もからくりとして動かせます", "create.ponder.linear_chassis_group.header": "リニアシャーシをグループで動かす", - "create.ponder.linear_chassis_group.text_1": "リニアシャーシは、隣の同じシャーシブロックと接続します", + "create.ponder.linear_chassis_group.text_1": "リニアシャーシは、隣の同じ種類のシャーシと繋がります", "create.ponder.linear_chassis_group.text_2": "からくり機械で1つを動かすと、他のリニアシャーシも一緒に動きます", "create.ponder.linear_chassis_group.text_3": "異なる種類のシャーシや、別の方向を向いているシャーシは接続されません", @@ -1846,7 +1963,7 @@ "create.ponder.mechanical_arm_modes.header": "メカニカルアームの分配モード", "create.ponder.mechanical_arm_modes.text_1": "搬入元", "create.ponder.mechanical_arm_modes.text_2": "搬出先", - "create.ponder.mechanical_arm_modes.text_3": "アームに複数の有効な搬出先が設定されている場合...", + "create.ponder.mechanical_arm_modes.text_3": "アームは複数の有効な搬出先が設定されていると...", "create.ponder.mechanical_arm_modes.text_4": "...設定に従ってアイテムを分配します", "create.ponder.mechanical_arm_modes.text_5": "レンチを持ってスクロールすると設定を変えられます", "create.ponder.mechanical_arm_modes.text_6": "「順繰り分配」は、有効な全ての搬出先へ順番に搬出します", @@ -1860,8 +1977,8 @@ "create.ponder.mechanical_arm_redstone.text_3": "それを利用し、反転したパルス信号を使って1回だけ稼働させられます", "create.ponder.mechanical_bearing.header": "メカニカルベアリングによる構造物の移動", - "create.ponder.mechanical_bearing.text_1": "メカニカルベアリングは、前方にブロックを取り付けられます", - "create.ponder.mechanical_bearing.text_2": "回転力を供給すると、組み立てた構造物を回転できます", + "create.ponder.mechanical_bearing.text_1": "メカニカルベアリングは、手前にブロックを取り付けられます", + "create.ponder.mechanical_bearing.text_2": "回転力を供給すると、組み立てた構造物を回せます", "create.ponder.mechanical_crafter.header": "メカニカルクラフターの配置", "create.ponder.mechanical_crafter.text_1": "メカニカルクラフターは、あらゆるクラフトレシピを自動化できます", @@ -1885,7 +2002,7 @@ "create.ponder.mechanical_drill.header": "メカニカルドリルでブロックを破壊する", "create.ponder.mechanical_drill.text_1": "メカニカルドリルは回転力を供給すると、目の前のブロックを破壊します", - "create.ponder.mechanical_drill.text_2": "採掘速度は回転速度に依存します", + "create.ponder.mechanical_drill.text_2": "採掘速度は回転速度で決まります", "create.ponder.mechanical_drill_contraption.header": "からくりに組み込んでのメカニカルドリルの使い方", "create.ponder.mechanical_drill_contraption.text_1": "からくりの一部として、メカニカルドリルを動かすと...", @@ -1899,34 +2016,49 @@ "create.ponder.mechanical_mixer.text_1": "ミキサーと鉢があれば、いくつかのクラフトレシピを自動化できます", "create.ponder.mechanical_mixer.text_2": "自動化できるのは不定形レシピといくつかの追加レシピです", "create.ponder.mechanical_mixer.text_3": "レシピの中には、ブレイズバーナーの熱を必要とするものもあります", - "create.ponder.mechanical_mixer.text_4": "フィルタースロットは、2つのレシピが競合する場合に使えます", + "create.ponder.mechanical_mixer.text_4": "フィルタースロットは、2つのレシピが競合するときに使えます", "create.ponder.mechanical_piston.header": "メカニカルピストンによる構造物の移動", - "create.ponder.mechanical_piston.text_1": "メカニカルピストンは、前方にあるブロックを動かせます", - "create.ponder.mechanical_piston.text_2": "移動の速度と方向は、供給する回転力に依存します", - "create.ponder.mechanical_piston.text_3": "粘着性メカニカルピストンは、取り付けられたブロックを引き戻せます", + "create.ponder.mechanical_piston.text_1": "メカニカルピストンは、手前にあるブロックを動かせます", + "create.ponder.mechanical_piston.text_2": "移動の速度と方向は、供給する回転力で決まります", + "create.ponder.mechanical_piston.text_3": "メカニカル粘着ピストンは、取り付けられたブロックを引き戻せます", "create.ponder.mechanical_piston_modes.header": "メカニカルピストンの動作モード", "create.ponder.mechanical_piston_modes.text_1": "ピストンの動作が止まると、移動した構造物はブロックへ戻ります", - "create.ponder.mechanical_piston_modes.text_2": "ブロックに戻らないように設定したり、動かし始めた場所でのみブロックに戻るように設定できます", + "create.ponder.mechanical_piston_modes.text_2": "ブロックに戻らないように設定したり、動かし始めた場所でのみブロックに戻るように設定したりできます", "create.ponder.mechanical_plough.header": "からくりに組み込んでのメカニカルプラウの使い方", "create.ponder.mechanical_plough.text_1": "プラウを組み込んだからくりを動かすと...", - "create.ponder.mechanical_plough.text_2": "...当たり判定のないブロックが破壊されます", + "create.ponder.mechanical_plough.text_2": "...当たり判定のないブロックが破壊します", "create.ponder.mechanical_plough.text_3": "さらに、プラウは土を耕やします", "create.ponder.mechanical_plough.text_4": "また、エンティティを傷つけずに飛ばすこともできます", "create.ponder.mechanical_press.header": "メカニカルプレスによるアイテム加工", "create.ponder.mechanical_press.text_1": "メカニカルプレスは、その下に配置されたアイテムを加工できます", - "create.ponder.mechanical_press.text_2": "加工するアイテムは下に落としたり、プレス機の下にあるデポに置いたり", - "create.ponder.mechanical_press.text_3": "アイテムがベルトへ供給されると...", - "create.ponder.mechanical_press.text_4": "...プレス機が自動的にアイテムを保持し、加工します", + "create.ponder.mechanical_press.text_2": "加工するアイテムは下に落としたり、プレス機の下にあるデポに置いたりしてください", + "create.ponder.mechanical_press.text_3": "アイテムがベルトで供給されると...", + "create.ponder.mechanical_press.text_4": "...プレスが自動でアイテムを止め、加工します", "create.ponder.mechanical_press_compacting.header": "メカニカルプレスでの圧縮加工", "create.ponder.mechanical_press_compacting.text_1": "鉢に入れられたアイテムをプレスし、圧縮加工できます", "create.ponder.mechanical_press_compacting.text_2": "圧縮加工には、2x2、3x3のクラフトレシピに加え、いくつかの追加レシピがあります", "create.ponder.mechanical_press_compacting.text_3": "これらのレシピの中には、ブレイズバーナーの熱を必要とするものがあります", - "create.ponder.mechanical_press_compacting.text_4": "フィルタースロットは、2つのレシピが競合する場合に使えます", + "create.ponder.mechanical_press_compacting.text_4": "フィルタースロットは、2つのレシピが競合するときに使えます", + + "create.ponder.mechanical_pump_flow.header": "メカニカルポンプによる液体輸送", + "create.ponder.mechanical_pump_flow.text_1": "メカニカルポンプは、接続されたネットワークの液体の流れを制御します", + "create.ponder.mechanical_pump_flow.text_2": "稼働させると、矢印が液体の流れる方向を示します", + "create.ponder.mechanical_pump_flow.text_3": "後ろのネットワークが液体を吸い取っているのに対し...", + "create.ponder.mechanical_pump_flow.text_4": "...前のネットワークが液体を外側に送っています", + "create.ponder.mechanical_pump_flow.text_5": "回転方向を逆にすると、流れの方向が逆になります", + "create.ponder.mechanical_pump_flow.text_6": "レンチを使って手動でポンプの向きを変えることもできます", + + "create.ponder.mechanical_pump_speed.header": "メカニカルポンプの輸送速度", + "create.ponder.mechanical_pump_speed.text_1": "速度に関わらず、メカニカルポンプは16ブロック先までのパイプに影響を与えます", + "create.ponder.mechanical_pump_speed.text_2": "回転速度を速くすることで、流れの送られる速度と...", + "create.ponder.mechanical_pump_speed.text_3": "...液体の輸送速度が変わります", + "create.ponder.mechanical_pump_speed.text_4": "液体ネットワーク内のポンプはそれぞれ別の速度で動かすことができます", + "create.ponder.mechanical_pump_speed.text_5": "向きを交互にすることで、流れの方向を揃えることができます", "create.ponder.mechanical_saw_breaker.header": "メカニカルソーによる伐採", "create.ponder.mechanical_saw_breaker.text_1": "メカニカルソーは回転力を供給すると、目の前の木を伐採できます", @@ -1941,7 +2073,7 @@ "create.ponder.mechanical_saw_processing.text_2": "加工されたアイテムは、常にソーの回転方向とは逆に移動します", "create.ponder.mechanical_saw_processing.text_3": "ソーはメカニカルベルトと繋げて加工できます", "create.ponder.mechanical_saw_processing.text_4": "複数の完成品がある場合、フィルタースロットでどの完成品を作るかを指定できます", - "create.ponder.mechanical_saw_processing.text_5": "フィルターがない場合、ソーは全ての加工結果を順番に繰り返します", + "create.ponder.mechanical_saw_processing.text_5": "フィルターがない場合、ソーは全ての加工を順番に繰り返します", "create.ponder.millstone.header": "石臼でのアイテム加工", "create.ponder.millstone.text_1": "石臼はアイテムを粉砕加工する機械です", @@ -1953,17 +2085,28 @@ "create.ponder.nixie_tube.header": "ニキシー管の使い方", "create.ponder.nixie_tube.text_1": "ニキシー管は受けたレッドストーン信号の強度を表示します", "create.ponder.nixie_tube.text_2": "金床で名付けた名札を使って、好きな文字を表示することもできます", + "create.ponder.nixie_tube.text_3": "染料で右クリックすることで表示の色を変えられます", "create.ponder.piston_pole.header": "ピストン延長ポール", "create.ponder.piston_pole.text_1": "ポールが無いとメカニカルピストンは動きません", "create.ponder.piston_pole.text_2": "後ろに付けたポールの長さによって、伸び縮みする長さが決まります", + "create.ponder.portable_fluid_interface.header": "からくり液体交換", + "create.ponder.portable_fluid_interface.text_1": "移動しているからくりの液体タンクは、どんなパイプでも出し入れできません", + "create.ponder.portable_fluid_interface.text_2": "この機械は、からくりをブロックに戻すことなく液体を出し入れできます", + "create.ponder.portable_fluid_interface.text_3": "1~2ブロックの隙間を開けて2つ目のインターフェースを設置しましょう", + "create.ponder.portable_fluid_interface.text_4": "すれ違ったときに必ず接続されます", + "create.ponder.portable_fluid_interface.text_5": "接続中は、設置されている方のインターフェースはからくり内全てのタンクのように振る舞います", + "create.ponder.portable_fluid_interface.text_6": "液体の搬入と...", + "create.ponder.portable_fluid_interface.text_7": "...搬出ができるます", + "create.ponder.portable_fluid_interface.text_8": "しばらく中身が出し入れされないと、このからくりはまた動き出します", + "create.ponder.portable_storage_interface.header": "稼働中のからくりとの搬出入", "create.ponder.portable_storage_interface.text_1": "稼働中のからくりに組み込まれた収納ブロックは、プレイヤーが開くことはできません", "create.ponder.portable_storage_interface.text_2": "この装置は、からくりを停止することなく、収納ブロックと搬出入できます", - "create.ponder.portable_storage_interface.text_3": "1~2ブロックの間隔をあけて、二つ目のインターフェースを設置しましょう", + "create.ponder.portable_storage_interface.text_3": "1~2ブロックの間隔をあけて、2つ目のインターフェースを設置しましょう", "create.ponder.portable_storage_interface.text_4": "両者がすれ違うたびに接続されます", - "create.ponder.portable_storage_interface.text_5": "接続されている間、設置されている方のインターフェースはからくり内全ての収納ブロックのように振る舞います", + "create.ponder.portable_storage_interface.text_5": "接続中、設置されている方のインターフェースはからくり内全ての収納ブロックのように振る舞います", "create.ponder.portable_storage_interface.text_6": "アイテムを搬入したり...", "create.ponder.portable_storage_interface.text_7": "...アイテムを搬出したりできます", "create.ponder.portable_storage_interface.text_8": "しばらくの間アイテムのやり取りがないと、からくりは稼働を再開します", @@ -1975,19 +2118,19 @@ "create.ponder.powered_latch.text_1": "パワードラッチはレッドストーン信号で制御できるレバーです", "create.ponder.powered_latch.text_2": "後ろからの信号でオンに", "create.ponder.powered_latch.text_3": "側面からの信号でオフに戻ります", - "create.ponder.powered_latch.text_4": "パワードラッチは、手動でも切り替えられます", + "create.ponder.powered_latch.text_4": "パワードラッチは、手動でもオンオフできます", "create.ponder.powered_toggle_latch.header": "パワードトグルラッチによる信号制御", "create.ponder.powered_toggle_latch.text_1": "パワードトグルラッチはレッドストーン信号で切り替えできるレバーです", "create.ponder.powered_toggle_latch.text_2": "後ろからの信号で切り替えできます", "create.ponder.powered_toggle_latch.text_3": "何度も信号を送るとオンとオフと繰り返します", - "create.ponder.powered_toggle_latch.text_4": "パワードトグルラッチは、手動で切り替えることもできます", + "create.ponder.powered_toggle_latch.text_4": "パワードトグルラッチは、手動でもオンオフもできます", "create.ponder.pulse_repeater.header": "パルスリピーターによる信号制御", "create.ponder.pulse_repeater.text_1": "パルスリピーターは、レッドストーン信号を短縮して1tickのパルス信号にします", "create.ponder.radial_chassis.header": "ラジアルシャーシによるブロックの取り付け", - "create.ponder.radial_chassis.text_1": "ラジアルシャーシは、同種のシャーシブロックと繋がります", + "create.ponder.radial_chassis.text_1": "ラジアルシャーシは、同じ種類のシャーシと繋がります", "create.ponder.radial_chassis.text_2": "からくり機械によって1つが動かされると、他も一緒に動きます", "create.ponder.radial_chassis.text_3": "ラジアルシャーシの側面を粘着面にできます", "create.ponder.radial_chassis.text_4": "もう一度クリックすると、他の全ての面も粘着面になります", @@ -2011,7 +2154,7 @@ "create.ponder.rope_pulley.header": "ローププーリーによる構造物の移動", "create.ponder.rope_pulley.text_1": "ローププーリーは、回転力を供給するとブロックを垂直に動かせます", - "create.ponder.rope_pulley.text_2": "移動の方向と速度は、供給される回転力に依存します", + "create.ponder.rope_pulley.text_2": "移動の方向と速度は、供給される回転力で決まります", "create.ponder.rope_pulley_attachment.header": "プーリーをからくりの一部として動かす", "create.ponder.rope_pulley_attachment.text_1": "プーリーがからくりによって動かされると...", @@ -2020,11 +2163,11 @@ "create.ponder.rope_pulley_modes.header": "ローププーリーの動作モード", "create.ponder.rope_pulley_modes.text_1": "プーリーの動きが止まると、移動した構造物はブロックに戻ります", - "create.ponder.rope_pulley_modes.text_2": "ブロックに戻らないように設定することも、動かし始めた場所でのみブロックに戻るように設定することもできます", + "create.ponder.rope_pulley_modes.text_2": "ブロックに戻らないように設定したり、動かし始めた場所でのみブロックに戻るように設定したりできます", "create.ponder.rotation_speed_controller.header": "回転速度コントローラーの使い方", "create.ponder.rotation_speed_controller.text_1": "コントローラーは、側面の軸から上の大きな歯車に回転を伝達します", - "create.ponder.rotation_speed_controller.text_2": "側面のパネルを見てスクロールすると、伝達する回転速度を調整できます", + "create.ponder.rotation_speed_controller.text_2": "側面のパネルを見ながらスクロールすると、伝達する回転速度を調整できます", "create.ponder.sail.header": "帆による風車の組み立て", "create.ponder.sail.text_1": "帆は、風車を作るのに便利なブロックです", @@ -2038,7 +2181,7 @@ "create.ponder.sequenced_gearshift.header": "シーケンスギアシフトによる回転の制御", "create.ponder.sequenced_gearshift.text_1": "シーケンスギアシフトは、設定されたプログラムに従って回転を伝達します", - "create.ponder.sequenced_gearshift.text_2": "右クリックで設定インターフェースを開けます", + "create.ponder.sequenced_gearshift.text_2": "右クリックで設定画面を開けます", "create.ponder.sequenced_gearshift.text_3": "レッドストーン信号を受けると、設定されたプログラムを実行します", "create.ponder.sequenced_gearshift.text_4": "終了すると止まり、また次のレッドストーン信号を受けると同じように実行します", "create.ponder.sequenced_gearshift.text_5": "レッドストーンコンパレータで、現在の進捗を読み取れます", @@ -2055,22 +2198,36 @@ "create.ponder.smart_chute.text_3": "マウスホイールで搬出するスタック量を指定できます", "create.ponder.smart_chute.text_4": "レッドストーン信号で、スマートシュートを停止させることもできます", + "create.ponder.smart_pipe.header": "スマートパイプによる液体制御", + "create.ponder.smart_pipe.text_1": "スマートパイプは液体の種類によって流れを制御できます", + "create.ponder.smart_pipe.text_2": "搬入元に直接つなげることで、搬出する液体の種類を指定できます", + "create.ponder.smart_pipe.text_3": "フィルタースロットを右クリックして、液体の入ったアイテムを装着して指定することもできます", + "create.ponder.smart_pipe.text_4": "スマートパイプは、パイプネットワークの搬出先に設置すると指定された液体のみを流します", + "create.ponder.speedometer.header": "速度メーターによる動力情報の監視", "create.ponder.speedometer.text_1": "速度メーターは、接続された機械の現在の回転速度を表示します", "create.ponder.speedometer.text_2": "エンジニアのゴーグルを装着していると、より詳細な情報を得られます", "create.ponder.speedometer.text_3": "コンパレータは、速度メーターの測定値に応じたレッドストーン信号を出力します", + "create.ponder.spout_filling.header": "アイテム注液口によるアイテム充填", + "create.ponder.spout_filling.text_1": "注液口は、その下に用意されたアイテムを液体で満たすことができます", + "create.ponder.spout_filling.text_2": "注液口の中身は手動で出し入れすることはできません", + "create.ponder.spout_filling.text_3": "代わりに、パイプを使って液体を供給しましょう", + "create.ponder.spout_filling.text_4": "容器アイテムは、注液口の下のデポに置きましょう", + "create.ponder.spout_filling.text_5": "ベルトでアイテムを供給すると...", + "create.ponder.spout_filling.text_6": "...注液口が自動でアイテムを止め、加工します", + "create.ponder.stabilized_bearings.header": "からくりの角度の固定", - "create.ponder.stabilized_bearings.text_1": "メカニカルベアリングが動いている構造物に組み込まれているとき ...", + "create.ponder.stabilized_bearings.text_1": "メカニカルベアリングが動いている構造物に組み込まれているとき...", "create.ponder.stabilized_bearings.text_2": "...自身の角度を真っ直ぐに保とうとします", "create.ponder.stabilized_bearings.text_3": "ベアリングにブロックを取り付けると", "create.ponder.stabilized_bearings.text_4": "ベアリングに取り付けたサブのからくり全体が角度を真っ直ぐに保ったままになります", "create.ponder.sticker.header": "スティッカーを使ったブロックの付け外し", "create.ponder.sticker.text_1": "スティッカーは、ブロックの付け外しをレッドストーン信号で制御できます", - "create.ponder.sticker.text_2": "信号を受けると、状態が切り替わります", - "create.ponder.sticker.text_3": "付けているときは、からくりで動かされるとブロックも一緒に動きます", - "create.ponder.sticker.text_4": "もう一度信号を受けると、ブロックは離れます", + "create.ponder.sticker.text_2": "レッドストーン信号を受けると、状態が切り替わります", + "create.ponder.sticker.text_3": "付いているときは、からくりが動かされるとブロックも一緒に動きます", + "create.ponder.sticker.text_4": "もう一度信号を受けると、ブロックは外れます", "create.ponder.stressometer.header": "応力メーターによる動力情報の監視", "create.ponder.stressometer.text_1": "応力メーターは、接続された動力ネットワークの現在の応力許容量を表示します", @@ -2091,6 +2248,12 @@ "create.ponder.valve_handle.text_4": "スニーク状態で右クリックし続けると、時計回りに回転します", "create.ponder.valve_handle.text_5": "バルブハンドルは、染色できます", + "create.ponder.valve_pipe.header": "バルブによる液体制御", + "create.ponder.valve_pipe.text_1": "バルブは、液体ネットワークに流れる液体を制御するのに役立ちます", + "create.ponder.valve_pipe.text_2": "回転力で、液体が現在通過できるか制御します", + "create.ponder.valve_pipe.text_3": "開放方向に回転力を与えるとバルブが開きます", + "create.ponder.valve_pipe.text_4": "回転方向を逆にすることでバルブを閉められます", + "create.ponder.water_wheel.header": "水車による回転力の生成", "create.ponder.water_wheel.text_1": "水車は隣接する水流から回転力を生み出します", "create.ponder.water_wheel.text_2": "水流を受ける面が多ければ多いほど、水車の回転速度は速くなります", @@ -2130,5 +2293,8 @@ "create.ponder.windmill_source.text_6": "いつでもベアリングを右クリックすれば、回転を停止させて構造物を組み立てなおせます", "create.ponder.windmill_structure.header": "からくり風車", - "create.ponder.windmill_structure.text_1": "帆とみなされるブロックが8個以上あれば、どのような構造物でも風車として動きます" -} \ No newline at end of file + "create.ponder.windmill_structure.text_1": "帆とみなされるブロックが8個以上あれば、どのような構造物でも風車として動きます", + + "_": "Thank you for translating Create!" + +} diff --git a/src/main/resources/assets/create/lang/ko_kr.json b/src/main/resources/assets/create/lang/ko_kr.json index 3e8843be4..0f02f0855 100644 --- a/src/main/resources/assets/create/lang/ko_kr.json +++ b/src/main/resources/assets/create/lang/ko_kr.json @@ -1,8 +1,8 @@ { "_": "->------------------------] Game Elements [------------------------<-", - "block.create.andesite_bricks": "안산안 벽돌", - "block.create.layered_andesite": "층이 있는 안산암", + "block.create.andesite_bricks": "안산암 벽돌", + "block.create.layered_andesite": "이어지는 안산암", "block.create.andesite_bricks": "안산암 벽돌", "block.create.andesite_bricks_slab": "안산암 벽돌 반 블록", "block.create.andesite_bricks_stairs": "안산암 벽돌 계단", @@ -41,7 +41,7 @@ "block.create.fancy_dark_scoria_bricks_slab": "장식된 짙은 스코리아 벽돌 반 블록", "block.create.fancy_dark_scoria_bricks_stairs": "장식된 짙은 스코리아 벽돌 계단", "block.create.fancy_dark_scoria_bricks_wall": "장식된 짙은 스코리아 벽돌 담장", - "block.create.layered_dark_scoria": "층이 있는 짙은 스코리아", + "block.create.layered_dark_scoria": "이어지는 짙은 스코리아", "block.create.mossy_dark_scoria": "이끼 낀 짙은 스코리아", "block.create.overgrown_dark_scoria": "이끼가 뒤덮힌 짙은 스코리아", "block.create.paved_dark_scoria": "포장된 짙은 스코리아", @@ -67,7 +67,7 @@ "block.create.fancy_diorite_bricks_slab": "장식된 섬록암 벽돌 반 블록", "block.create.fancy_diorite_bricks_stairs": "장식된 섬록암 벽돌 계단", "block.create.fancy_diorite_bricks_wall": "장식된 섬록암 벽돌 담장", - "block.create.layered_diorite": "층이 있는 섬록암", + "block.create.layered_diorite": "이어지는 섬록암", "block.create.mossy_diorite": "이끼 낀 섬록암", "block.create.overgrown_diorite": "이끼로 뒤덮힌 섬록암", "block.create.paved_diorite": "포장된 섬록암", @@ -85,7 +85,7 @@ "block.create.dolomite_bricks_stairs": "백운암 벽돌 계단", "block.create.dolomite_bricks_slab": "백운암 벽돌 반 블록", "block.create.polished_dolomite": "윤나는 백운암", - "block.create.layered_dolomite": "층이 있는 백운암", + "block.create.layered_dolomite": "이어지는 백운암", "block.create.dolomite_cobblestone": "백운암 조약돌", "block.create.dolomite_cobblestone_slab": "백운암 조약돌 반 블록", "block.create.dolomite_cobblestone_stairs": "백운암 조약돌 계단", @@ -94,7 +94,7 @@ "block.create.fancy_dolomite_bricks_slab": "장식된 백운암 벽돌 반 블록", "block.create.fancy_dolomite_bricks_stairs": "장식된 백운암 벽돌 계단", "block.create.fancy_dolomite_bricks_wall": "장식된 백운암 벽돌 담장", - "block.create.paved_dolomite": "포장된 백운암", + "block.create.paved_dolomite": "포장된 백운암", "block.create.paved_dolomite_slab": "포장된 백운암 반 블록", "block.create.paved_dolomite_stairs": "포장된 백운암 계단", "block.create.paved_dolomite_wall": "포장된 백운암 담장", @@ -102,7 +102,7 @@ "block.create.polished_dolomite_stairs": "윤나는 백운암 계단", "block.create.polished_dolomite_wall": "윤나는 백운암 담장", "block.create.chiseled_dolomite": "조각된 백운암", - "block.create.mossy_dolomite": "이끼낀 백운암", + "block.create.mossy_dolomite": "이끼 낀 백운암", "block.create.overgrown_dolomite": "이끼로 뒤덮힌 백운암", "block.create.dolomite_pillar": "백운암 기둥", @@ -129,8 +129,8 @@ "block.create.gabbro_cobblestone_slab": "반려암 조약돌 반 블록", "block.create.gabbro_cobblestone_stairs": "반려암 조약돌 계단", "block.create.gabbro_cobblestone_wall": "반려암 조약돌 담장", - "block.create.layered_gabbro": "층이 있는 반려암", - "block.create.mossy_gabbro": "이끼낀 반려암", + "block.create.layered_gabbro": "이어지는 반려암", + "block.create.mossy_gabbro": "이끼 낀 반려암", "block.create.overgrown_gabbro": "이끼로 뒤덮힌 반려암", "block.create.paved_gabbro": "포장된 반려암", "block.create.paved_gabbro_slab": "포장된 반려암 반 블록", @@ -144,14 +144,14 @@ "block.create.gabbro_pillar": "반려암 기둥", "block.create.granite_bricks": "화강암 벽돌", - "block.create.layered_granite": "층이 있는 화강암", + "block.create.layered_granite": "이어지는 화강암", "block.create.fancy_granite_bricks": "장식된 화강암 벽돌", "block.create.fancy_granite_bricks_slab": "장식된 화강암 벽돌 반 블록", "block.create.fancy_granite_bricks_stairs": "장식된 화강암 벽돌 계단", "block.create.fancy_granite_bricks_wall": "장식된 화강암 벽돌 담장", - "block.create.granite_bricks_slab": "화강함 벽돌 반 블록", - "block.create.granite_bricks_stairs": "화강함 벽돌 계단", - "block.create.granite_bricks_wall": "화강함 벽돌 담장", + "block.create.granite_bricks_slab": "화강암 벽돌 반 블록", + "block.create.granite_bricks_stairs": "화강암 벽돌 계단", + "block.create.granite_bricks_wall": "화강암 벽돌 담장", "block.create.granite_cobblestone": "화강암 조약돌", "block.create.granite_cobblestone_slab": "화강암 조약돌 반 블록", "block.create.granite_cobblestone_stairs": "화강암 조약돌 계단", @@ -176,7 +176,7 @@ "block.create.polished_limestone": "윤나는 석회암", "block.create.polished_limestone_slab": "윤나는 석회암 반 블록", "block.create.limestone_pillar": "석회암 기둥", - "block.create.layered_limestone": "층이 있는 석회암", + "block.create.layered_limestone": "이어지는 석회암", "block.create.chiseled_limestone": "조각된 석회암", "block.create.fancy_limestone_bricks": "장식된 석회암 벽돌", "block.create.fancy_limestone_bricks_slab": "장식된 석회암 벽돌 반 블록", @@ -204,7 +204,7 @@ "block.create.polished_scoria": "윤나는 스코리아", "block.create.polished_scoria_slab": "윤나는 스코리아 반 블록", "block.create.scoria_pillar": "스코리아 기둥", - "block.create.layered_scoria": "층이 있는 스코리아", + "block.create.layered_scoria": "이어지는 스코리아", "block.create.chiseled_scoria": "조각된 스코리아", "block.create.fancy_scoria_bricks": "장식된 스코리아 벽돌", "block.create.fancy_scoria_bricks_slab": "장식된 스코리아 벽돌 반 블록", @@ -237,7 +237,7 @@ "block.create.weathered_limestone_bricks_wall": "풍화된 석회암 벽돌 담장", "block.create.weathered_limestone_bricks_slab": "풍화된 석회암 벽돌 반 블록", "block.create.weathered_limestone_pillar": "풍화된 석회암 기둥", - "block.create.layered_weathered_limestone": "층이 있는 풍화된 석회암", + "block.create.layered_weathered_limestone": "이어지는 풍화된 석회암", "block.create.chiseled_weathered_limestone": "조각된 풍화된 석회암", "block.create.fancy_weathered_limestone_bricks": "장식된 풍화된 석회암 벽돌", "block.create.fancy_weathered_limestone_bricks_slab": "장식된 풍화된 석회암 벽돌 반 블록", @@ -267,7 +267,8 @@ "block.create.dark_oak_window": "짙은 참나무 유리창", "block.create.acacia_window": "아카시아 유리창", "block.create.ornate_iron_window": "장식된 철 유리창", - + "block.create.crimson_window": "진홍빛 유리창", + "block.create.warped_window": "뒤틀린 유리창", "block.create.tiled_glass_pane": "타일 유리판", "block.create.framed_glass_pane": "큰 유리판", @@ -280,6 +281,8 @@ "block.create.dark_oak_window_pane": "짙은 참나무 유리판", "block.create.acacia_window_pane": "아카시아나무 유리판 ", "block.create.ornate_iron_window_pane": "장식된 철 유리판", + "block.create.crimson_window_pane": "진홍빛 유리판", + "block.create.warped_window_pane": "뒤틀린 유리판", "block.create.black_seat": "검은색 좌석", "block.create.blue_seat": "파란색 좌석", @@ -316,16 +319,7 @@ "block.create.yellow_valve_handle": "노란색 밸브 손잡이", "block.create.purple_valve_handle": "보라색 밸브 손잡이", - "block.create.encased_fluid_pipe": "구리 케이스를 씌운 파이프", - "block.create.fluid_pipe": "액체 파이프", - "block.create.fluid_tank": "액체 탱크", - "block.create.fluid_valve": "액체 밸브", - "block.create.glass_fluid_pipe": "액체 파이프", - "block.create.mechanical_pump": "펌프", - "block.create.smart_fluid_pipe": "스마트 액체 파이프", - "block.create.creative_fluid_tank": "크리에이티브 탱크", - - "block.create.sail_frame": "풍차 날개 프레임", + "block.create.sail_frame": "풍차 날개 틀", "block.create.black_sail": "검은색 날개", "block.create.blue_sail": "파란색 날개", "block.create.brown_sail": "갈색 날개", @@ -342,113 +336,151 @@ "block.create.red_sail": "빨간색 날개", "block.create.white_sail": "하얀색 날개", "block.create.yellow_sail": "노란색 날개", + + "block.create.nixie_tube": "닉시관", + "block.create.black_nixie_tube": "검은색 닉시관", + "block.create.blue_nixie_tube": "파란색 닉시관", + "block.create.brown_nixie_tube": "갈색 닉시관", + "block.create.cyan_nixie_tube": "청록색 닉시관", + "block.create.gray_nixie_tube": "회색 닉시관", + "block.create.green_nixie_tube": "초록색 닉시관", + "block.create.light_blue_nixie_tube": "하늘핵 닉시관", + "block.create.light_gray_nixie_tube": "회백색 닉시관", + "block.create.lime_nixie_tube": "연두색 닉시관", + "block.create.magenta_nixie_tube": "자홍색 닉시관", + "block.create.pink_nixie_tube": "분홍색 닉시관", + "block.create.purple_nixie_tube": "보라샥 닉시관", + "block.create.red_nixie_tube": "빨간색 닉시관", + "block.create.white_nixie_tube": "하얀색 닉시관", + "block.create.yellow_nixie_tube": "노란색 닉시관", + "block.create.encased_fluid_pipe": "구리 케이스를 씌운 파이프", + "block.create.fluid_pipe": "액체 파이프", + "block.create.fluid_tank": "액체 탱크", + "block.create.fluid_valve": "액체 밸브", + "block.create.glass_fluid_pipe": "액체 파이프", + "block.create.mechanical_pump": "펌프", + "block.create.smart_fluid_pipe": "스마트 액체 파이프", + "block.create.creative_fluid_tank": "크리에이티브 탱크", + "block.create.portable_fluid_interface": "액체 인터페이스", + "block.create.hose_pulley": "호스 도르래", + "block.create.item_drain": "아이템 배수구", + "block.create.spout": "주입기", + "block.create.creative_motor": "크리에이티브 모터", "block.create.encased_fan": "선풍기", "block.create.flywheel": "플라이휠", "block.create.furnace_engine": "화로 엔진", - "block.create.cogwheel": "톱니바퀴", - "block.create.encased_chain_drive": "케이스를 씌운 축", - "block.create.encased_shaft": "케이스를 씌운 축", - "block.create.belt": "컨베이어 벨트", - "block.create.adjustable_chain_gearshift": "벨트 변속기", - "block.create.gearbox": "기어박스", - "block.create.gearshift": "기어쉬프트", + "block.create.water_wheel": "물레바퀴", + "block.create.windmill_bearing": "풍차 베어링", "block.create.hand_crank": "핸드 크랭크", + + "item.create.belt_connector": "벨트", + "block.create.shaft": "축", + "block.create.belt": "벨트", + "block.create.cogwheel": "톱니바퀴", "block.create.large_cogwheel": "큰 톱니바퀴", "block.create.rotation_speed_controller": "회전 속도 컨트롤러", - "block.create.shaft": "축", + "block.create.andesite_encased_shaft": "안산암 케이스를 씌운 축", + "block.create.brass_encased_shaft": "황동 케이스를 씌운 축", + + "item.create.vertical_gearbox": "수직 기어박스", + "block.create.gearbox": "기어박스", + "block.create.gearshift": "기어쉬프트", + "block.create.clutch": "클러치", + "block.create.encased_chain_drive": "체인 드라이브", + "block.create.adjustable_chain_gearshift": "벨트 변속기", "block.create.speedometer": "속도 계측기", "block.create.stressometer": "피로도 계측기", - "block.create.water_wheel": "물레방아", - "item.create.belt_connector": "기계식 벨트", - "item.create.vertical_gearbox": "수직 기어박스", - "block.create.clutch": "클러치", - "block.create.windmill_bearing": "풍차 베어링", - "block.create.cart_assembler": "카트 조립기", "block.create.linear_chassis": "어두운 직선 섀시", - "block.create.mechanical_arm": "기계 팔", "block.create.mechanical_bearing": "베어링", - "block.create.mechanical_crafter": "기계식 조합기", - "block.create.mechanical_drill": "드릴", - "block.create.mechanical_harvester": "수확기", - "block.create.mechanical_mixer": "믹서", + "block.create.clockwork_bearing": "시계 베어링", + "block.create.cart_assembler": "카트 조립기", "block.create.mechanical_piston": "기계식 피스톤", "block.create.mechanical_piston_head": "기계식 피스톤 머리", + "block.create.sticky_mechanical_piston": "기계식 끈끈이 피스톤", + "block.create.sticker": "부착기", + "block.create.pulley_magnet": "도르래 자석", + "block.create.radial_chassis": "원형 섀시", + "block.create.secondary_linear_chassis": "밝은 직선 섀시", + "block.create.piston_extension_pole": "피스톤 연장 축", + "block.create.sequenced_gearshift": "순서 기어쉬프트", + "block.create.rope": "밧줄", + "block.create.rope_pulley": "밧줄 도르래", + "block.create.gantry_carriage": "갠트리 운반대", + "block.create.gantry_shaft": "갠트리 축", + + "block.create.millstone": "맷돌", + "block.create.mechanical_mixer": "믹서", + "block.create.mechanical_arm": "기계 팔", + "block.create.mechanical_crafter": "조합기", + "block.create.mechanical_drill": "드릴", + "block.create.mechanical_harvester": "수확기", "block.create.mechanical_plough": "쟁기", "block.create.mechanical_press": "압착기", "block.create.mechanical_saw": "톱", - "block.create.millstone": "맷돌", + "block.create.deployer": "배포기", "block.create.minecart_anchor": "광산 수레 정박기", "block.create.mysterious_cuckoo_clock": "뻐꾸기 시계?", "block.create.crushing_wheel": "분쇄 휠", "block.create.crushing_wheel_controller": "분쇄 휠 컨트롤러", "block.create.cuckoo_clock": "뻐꾸기 시계", - "block.create.clockwork_bearing": "시계 베어링", - "block.create.deployer": "배포기", - "block.create.nozzle": "노즐", - "block.create.blaze_burner": "블레이즈 버너", - "block.create.brass_belt_funnel": "황동 깔때기", - "block.create.brass_block": "황동 블록", - "block.create.brass_casing": "황동 케이스", - "block.create.brass_funnel": "황동 깔때기", - "block.create.brass_tunnel": "황동 터널", - "block.create.pulley_magnet": "도르래 자석", - "block.create.radial_chassis": "원형 섀시", - "block.create.secondary_linear_chassis": "밝은 직선 섀시", - "block.create.sequenced_gearshift": "순서 기어쉬프트", - "block.create.piston_extension_pole": "피스톤 연장 축", - "block.create.portable_fluid_interface": "이동식 액체 인터페이스", - "block.create.portable_storage_interface": "이동식 아이템 인터페이스", + "block.create.nozzle": "노즐", + "block.create.portable_storage_interface": "아이템 인터페이스", + "block.create.turntable": "돌림판", + "block.create.weighted_ejector": "투척기", "block.create.content_observer": "정보 감지기", "block.create.chute": "슈트", + "block.create.smart_chute": "스마트 슈트", "block.create.basin": "대야", "block.create.depot": "아이템 거치대", "block.create.adjustable_crate": "가변 창고", - "block.create.nixie_tube": "디지털 표시증", - "block.create.rope": "밧줄", - "block.create.rope_pulley": "밧줄 도르래", - "block.create.hose_pulley": "호스 도르래", - "block.create.item_drain": "아이템 배수구", - "block.create.schematic_table": "청사진 테이블", - "block.create.schematicannon": "청사진 대포", - "block.create.spout": "수도꼭지", - "block.create.sticky_mechanical_piston": "끈끈이 기계식 피스톤", - "block.create.turntable": "돌림판", - "entity.create.contraption": "장치", - "entity.create.seat": "좌석", - "entity.create.stationary_contraption": "고정된 장치", - "entity.create.super_glue": "강력 접착제", "block.create.andesite_casing": "안산암 케이스", - "block.create.andesite_funnel": "안산암 깔때기", - "block.create.andesite_belt_funnel": "안산암 깔때기", + "block.create.andesite_funnel": "안산암 퍼널", + "block.create.andesite_belt_funnel": "안산암 퍼널", "block.create.andesite_tunnel": "안산암 터널", "block.create.reinforced_rail": "강화된 레일", + "block.create.blaze_burner": "블레이즈 버너", + "block.create.brass_belt_funnel": "황동 퍼널", + "block.create.brass_block": "황동 블록", + "block.create.brass_casing": "황동 케이스", + "block.create.brass_funnel": "황동 퍼널", + "block.create.brass_tunnel": "황동 터널", + + "entity.create.contraption": "구조물", + "entity.create.seat": "좌석", + "entity.create.stationary_contraption": "고정된 구조물", + "entity.create.super_glue": "강력 접착제", + "entity.create.crafting_blueprint": "조합 청사진", + "entity.create.gantry_contraption": "갠트리 구조물", + "entity.create.potato_projectile": "감자포 투사체", + "item.create.attribute_filter": "속성 필터 틀", - "item.create.furnace_minecart_contraption": "화로가 실린 광산 수레 장치", - "item.create.chest_minecart_contraption": "상자가 실린 광산 수레 장치", - "item.create.minecart_contraption": "광산 수레 장치", + "item.create.furnace_minecart_contraption": "화로가 실린 광산 수레 구조물", + "item.create.chest_minecart_contraption": "상자가 실린 광산 수레 구조물", + "item.create.minecart_contraption": "광산 수레 구조물", "item.create.minecart_coupling": "광산 수레 커플링", - "block.create.andesite_encased_shaft": "안산암 케이스를 씌운 축", - "block.create.brass_encased_shaft": "황동 케이스를 씌운 축", + "block.create.powered_latch": "레드스톤 걸쇠", "block.create.powered_toggle_latch": "레드스톤 토글 걸쇠", - "block.create.pulse_repeater": "펄스 리피터", + "block.create.pulse_repeater": "펄스 중계기", "block.create.redstone_contact": "동형 감지기", "block.create.redstone_link": "레드스톤 링크", - "block.create.adjustable_pulse_repeater": "가변 펄스 리피터", - "block.create.adjustable_repeater": "가변 리피터", + "block.create.adjustable_pulse_repeater": "가변 펄스 중계기", + "block.create.adjustable_repeater": "가변 중계기", "block.create.analog_lever": "아날로그 레버", "block.create.stockpile_switch": "수량 스위치", "block.create.controller_rail": "방향 레일", "block.create.creative_crate": "크리에이티브 창고", + "block.create.schematic_table": "청사진 탁자", + "block.create.schematicannon": "청사진 대포", "item.create.deforester": "산림파괴자", "item.create.extendo_grip": "외장형 연장 팔", "item.create.handheld_blockzapper": "휴대용 블록발사기", - "item.create.handheld_worldshaper": "휴대용 세계편집기", + "item.create.handheld_worldshaper": "크리에이티브 세계편집기", "item.create.goggles": "엔지니어의 고글", "item.create.red_sand_paper": "붉은 사포", "item.create.sand_paper": "사포", @@ -463,7 +495,7 @@ "block.create.copper_tiles": "구리 타일", "block.create.refined_radiance_casing": "빛나는 케이스", "block.create.shadow_steel_casing": "그림자 케이스", - "block.create.zinc_block": "아연 블", + "block.create.zinc_block": "아연 블록", "block.create.zinc_ore": "아연 광석", "item.create.andesite_alloy": "안산암 합금", "item.create.blaze_cake": "블레이즈 케이크", @@ -508,6 +540,20 @@ "block.create.metal_bracket": "금속 지지대", "block.create.wooden_bracket": "나무 지지대", "block.create.lit_blaze_burner": "불타는 빈 블레이즈 버너", + "item.create.precision_mechanism": "정밀 기계장치", + "item.create.potato_cannon": "감자포", + "item.create.linked_controller": "레드스톤 링크 조작기", + "item.create.incomplete_cogwheel": "미완성된 톱니바퀴", + "item.create.incomplete_large_cogwheel": "미완성된 큰 톱니바퀴", + "item.create.incomplete_precision_mechanism": "미완성된 정밀 기계장치", + "item.create.diving_boots": "다이빙 부츠", + "item.create.diving_helmet": "다이빙 헬멧", + "block.create.copper_backtank": "구리 산소통", + "item.create.crafting_blueprint": "조합 청사진", + "item.create.copper_backtank": "구리 산소통", + "block.create.peculiar_bell": "황동 종", + "block.create.lectern_controller": "독서대 조작기", + "block.create.haunted_bell": "귀신들린 종", "block.create.chocolate": "초콜릿", "block.create.honey": "꿀", @@ -520,34 +566,40 @@ "item.create.bar_of_chocolate": "초콜릿 바", "item.create.chocolate_bucket": "초콜릿 양동이", "item.create.honey_bucket": "꿀 양동이", + "item.create.sweet_roll": "롤빵", + "item.create.chocolate_glazed_berries": "초콜릿 바른 열매", + "item.create.honeyed_apple": "꿀 바른 사과", + + "enchantment.create.capacity": "저장량", + "enchantment.create.potato_recovery": "대포알 회수", "_": "->------------------------] Advancements [------------------------<-", - "advancement.create.root": "Create모드에 어서오세요", - "advancement.create.root.desc": "멋진 장치들을 만들 시간입니다!", - "advancement.create.andesite_alloy": "합금..?", + "advancement.create.root": "Create!", + "advancement.create.root.desc": "멋진 장치들을 창조할 시간입니다!", + "advancement.create.andesite_alloy": "이게 합금?", "advancement.create.andesite_alloy.desc": "암석으로도 합금을 만들 수 있나요?", "advancement.create.its_alive": "살아 움직이는", - "advancement.create.its_alive.desc": "당신의 첫 장치가 움직이는 것을 보세요.", - "advancement.create.shifting_gears": "기어 변환", + "advancement.create.its_alive.desc": "당신의 첫 장치가 움직입니다!", + "advancement.create.shifting_gears": "톱니바퀴 돌리고!", "advancement.create.shifting_gears.desc": "크기가 다른 톱니바퀴를 연결하여 장치의 속도를 바꿀 수 있습니다.", - "advancement.create.overstressed": "과부화", - "advancement.create.overstressed.desc": "직접 피로도의 한계를 경험해보세요.", - "advancement.create.belt": "켈프 드라이브", - "advancement.create.belt.desc": "두 축에 컨베이어 벨트를 이으세요.", - "advancement.create.tunnel": "엄폐!", + "advancement.create.overstressed": "과부하", + "advancement.create.overstressed.desc": "피로도의 한계를 경험해보세요.", + "advancement.create.belt": "켈프 벨트", + "advancement.create.belt.desc": "두 축에 벨트를 이으세요.", + "advancement.create.tunnel": "벨트 꾸미기", "advancement.create.tunnel.desc": "터널을 이용해 벨트를 꾸며보세요.", "advancement.create.splitter_tunnel": "분할 정복 알고리즘", - "advancement.create.splitter_tunnel.desc": "여러 황동 터널을 이용하여 분리기를 만드세요.", + "advancement.create.splitter_tunnel.desc": "여러 황동 터널을 일렬로 설치해, 아이템을 나누세요.", "advancement.create.chute": "쏟아져 내려와", "advancement.create.chute.desc": "수직 벨트역할을 하는 슈트를 설치하세요.", - "advancement.create.upward_chute": "공중 납치", - "advancement.create.upward_chute.desc": "아이템이 바람을 받은 슈트안에서 날아가는 것을 보세요.", - "advancement.create.belt_funnel": "펄럭거리는 깔기", - "advancement.create.belt_funnel.desc": "깔때기를 벨트나 아이템 거치대에 설치하여 특별한 모양을 만들어 보세요.", - "advancement.create.belt_funnel_kiss": "깔때기는 어떻게 태어나?", - "advancement.create.belt_funnel_kiss.desc": "두 벨트 깔때기를 만나게하세요. 쪽!", + "advancement.create.upward_chute": "바람 납치", + "advancement.create.upward_chute.desc": "선풍기를 설치하고, 슈트 안에서 아이템이 날아가는 것을 보세요.", + "advancement.create.belt_funnel": "퍼널 깔기", + "advancement.create.belt_funnel.desc": "퍼널을 벨트나 아이템 거치대에 설치하여 특별한 모양을 만들어 보세요.", + "advancement.create.belt_funnel_kiss": "퍼널는 어떻게 태어나?", + "advancement.create.belt_funnel_kiss.desc": "두 벨트 퍼널을 만나게하세요. 쪽!", "advancement.create.fan": "바람의 힘을 느껴라", "advancement.create.fan.desc": "선풍기 바람을 느껴보세요.", "advancement.create.fan_lava": "지열 난방기", @@ -561,43 +613,43 @@ "advancement.create.goggles": "피로돋보기", "advancement.create.goggles.desc": "장치에 대한 운동 정보를 가져다 줄 고글을 만드세요.", "advancement.create.speedometer": "근데 얼마나 빨라?", - "advancement.create.speedometer.desc": "속도 계측기를 가동하세요. 고글을 통해 수치가 얼마나 되는지 보세요.", + "advancement.create.speedometer.desc": "속도 계측기를 작동하세요. 고글을 통해 수치가 얼마나 되는지 보세요.", "advancement.create.stressometer": "근데 얼마나 피로해?", - "advancement.create.stressometer.desc": "피로도 계측기를 가동하세요. 고글을 통해 수치가 얼마나 되는지 보세요.", - "advancement.create.aesthetics": "짠! 예술!", + "advancement.create.stressometer.desc": "피로도 계측기를 작동하세요. 고글을 통해 수치가 얼마나 되는지 보세요.", + "advancement.create.aesthetics": "미적 감각!", "advancement.create.aesthetics.desc": "축, 파이프, 톱니바퀴에 지지대를 설치하세요.", - "advancement.create.reinforced": "짠! 강화!", + "advancement.create.reinforced": "튼튼 보강!", "advancement.create.reinforced.desc": "축, 파이프, 벨트에 적절한 케이스를 씌우세요.", "advancement.create.water_wheel": "수력 동력화", - "advancement.create.water_wheel.desc": "물레방아를 설치하고 회전하게 만드세요!", - "advancement.create.chocolate_wheel": "초콜릿방아", - "advancement.create.chocolate_wheel.desc": "녹은 초콜릿으로 물레방아를 돌리세요.", - "advancement.create.lava_wheel": "불레방아", - "advancement.create.lava_wheel.desc": "이건 일어나지 않았어야 하는데...", - "advancement.create.cuckoo": "잘자...", - "advancement.create.cuckoo.desc": "뻐꾸기 시계가 잘 시간을 알리는 것을 관찰하세요.", + "advancement.create.water_wheel.desc": "물레바퀴를 설치하고 회전하게 만드세요!", + "advancement.create.chocolate_wheel": "초콜릿바퀴", + "advancement.create.chocolate_wheel.desc": "녹은 초콜릿으로 물레바퀴를 돌리세요.", + "advancement.create.lava_wheel": "불레바퀴", + "advancement.create.lava_wheel.desc": "용암으로 물레바퀴를 회전하게 만드세ㅇ... 어?", + "advancement.create.cuckoo": "벌써 이렇게나 시간이 지났어?", + "advancement.create.cuckoo.desc": "뻐꾸기 시계가 잘 시간을 알립니다. 잘 자...", "advancement.create.millstone": "나만의 작은 분쇄기", - "advancement.create.millstone.desc": "멧돌을 설치하고 가동시키세요.", - "advancement.create.windmill": "선선한 바람", + "advancement.create.millstone.desc": "멧돌을 설치하고 작동시키세요.", + "advancement.create.windmill": "산들 바람", "advancement.create.windmill.desc": "풍차 베어링을 작동시키세요.", - "advancement.create.maxed_windmill": "강한 바람", + "advancement.create.maxed_windmill": "거센 바람", "advancement.create.maxed_windmill.desc": "풍차 베어링을 최대 속력으로 작동시키세요.", "advancement.create.andesite_casing": "안산암 시대", "advancement.create.andesite_casing.desc": "안산암과 나무를 이용하여 기본 케이스를 만드세요.", - "advancement.create.mechanical_drill": "굴착기 가동", - "advancement.create.mechanical_drill.desc": "드릴을 설치하고 가동시키세요.", + "advancement.create.mechanical_drill": "굴착기 작동", + "advancement.create.mechanical_drill.desc": "드릴을 설치하고 작동시키세요.", "advancement.create.press": "'깡!'", "advancement.create.press.desc": "프레스를 만들고 금속 판을 만들어보세요.", "advancement.create.polished_rose_quartz": "장밋빛 다이아몬드", "advancement.create.polished_rose_quartz.desc": "장밋빛 석영을 투명해지도록 열심히 사포질하세요.", - "advancement.create.electron_tube": "삐빅-", + "advancement.create.electron_tube": "삐-빅", "advancement.create.electron_tube.desc": "전지 튜브를 만드세요. 발전된 장치들에 쓰입니다.", - "advancement.create.mechanical_saw": "벌목기 가동", - "advancement.create.mechanical_saw.desc": "톱을 설치하고 가동시키세요.", + "advancement.create.mechanical_saw": "벌목기 작동", + "advancement.create.mechanical_saw.desc": "톱을 설치하고 작동시키세요.", "advancement.create.basin": "대야 시스템", "advancement.create.basin.desc": "대야를 설치하고 아이템을 던져보세요.", "advancement.create.mixer": "섞고 돌리고 섞고", - "advancement.create.mixer.desc": "대야 위에 믹서를 설치하고, 가동시켜 재료를 만드세요.", + "advancement.create.mixer.desc": "대야 위에 믹서를 설치하고, 작동시켜 재료를 만드세요.", "advancement.create.blaze_burner": "살아있는 불", "advancement.create.blaze_burner.desc": "블레이즈 버너를 얻으세요.", "advancement.create.compact": "자동 압축", @@ -610,38 +662,38 @@ "advancement.create.copper_casing": "구리 시대", "advancement.create.copper_casing.desc": "구리 판을 이용해 구리 케이스를 만드세요.", "advancement.create.spout": "쪼르록", - "advancement.create.spout.desc": "수도꼭지가 아이템에 액체를 채우는 것을 보세요.", + "advancement.create.spout.desc": "주입기를 사용하여 아이템에 액체를 채우세요.", "advancement.create.spout_potion": "대규모 양조", - "advancement.create.spout_potion.desc": "수도꼭지가 병에 포션을 채우는 것을 보세요.", + "advancement.create.spout_potion.desc": "주입기를 사용하여 유리병에 물약을 채우세요.", "advancement.create.chocolate": "상상의 세계", - "advancement.create.chocolate.desc": "양동이에 녹은 초콜릿을 채우세요.", + "advancement.create.chocolate.desc": "초콜릿 양동이를 얻으세요.", "advancement.create.item_drain": "회전 배수", "advancement.create.item_drain.desc": "아이템 배수구가 액체를 비우는 것을 보세요.", "advancement.create.chained_item_drain": "구른다!", "advancement.create.chained_item_drain.desc": "아이템이 여러 배수구 위를 굴러가는 것을 보세요.", "advancement.create.glass_pipe": "액체 엿보기", - "advancement.create.glass_pipe.desc": "액체가 창이 달린 파이프를 지나는 것을 보세요. 직선 파이프에 렌치로 우클릭하면 창문이 생깁니다.", - "advancement.create.pipe_collision": "액체를 만나게하지 마세요!", - "advancement.create.pipe_collision.desc": "파이프 안에서 두 액체를 만나게 하세요.", + "advancement.create.glass_pipe.desc": "액체가 창이 달린 파이프를 지나는 것을 보세요. 직선 파이프를 렌치로 우클릭하면 창문이 생깁니다.", + "advancement.create.pipe_collision": "그 액체를 섞지 마오", + "advancement.create.pipe_collision.desc": "액체관에서 두 가지 액체가 만나는 것을 관찰하세요.", "advancement.create.pipe_spill": "누출 사고", "advancement.create.pipe_spill.desc": "파이프 끝을 열어 액체가 밖으로 나오는 것을 보세요.", "advancement.create.hose_pulley": "공업 펌프", "advancement.create.hose_pulley.desc": "호스 도르래를 사용하여 액체를 채우거나 빨아들이세요.", "advancement.create.infinite_water": "바다를 흡수하다", "advancement.create.infinite_water.desc": "무한으로 인식되는 물 웅덩이에서 물을 끌어올리세요.", - "advancement.create.infinite_lava": "세계의 핵을 흡수하다", + "advancement.create.infinite_lava": "지옥을 흡수하다", "advancement.create.infinite_lava.desc": "무한으로 인식되는 용암 웅덩이에서 용암을 끌어올리세요.", "advancement.create.infinite_chocolate": "상상 속에 잠기다", - "advancement.create.infinite_chocolate.desc": "무한으로 인식되는 초콜릿 웅덩이에서 초콜릿을 끌어올리세요..", + "advancement.create.infinite_chocolate.desc": "무한으로 인식되는 초콜릿 웅덩이에서 초콜릿을 끌어올리세요.", "advancement.create.crafter": "자동 조합", - "advancement.create.crafter.desc": "기계식 조합기를 설치하고 가동시키세요.", + "advancement.create.crafter.desc": "기계식 조합기를 설치하고 작동시키세요.", "advancement.create.clockwork_bearing": "시계 제작", "advancement.create.clockwork_bearing.desc": "시계 베어링에 구조물을 달고 작동시키세요.", - "advancement.create.nixie_tube": "스타일있게 표시하기", - "advancement.create.nixie_tube.desc": "디지털 표시등을 얻고 설치하세요.", + "advancement.create.nixie_tube": "나는 스타일있게 표시해", + "advancement.create.nixie_tube.desc": "닉시관을 만들고 설치하세요.", "advancement.create.deployer": "찌르고, 설치하고, 공격!", - "advancement.create.deployer.desc": "당신의 분신, 배포기를 설치하고 가동시키세요.", + "advancement.create.deployer.desc": "당신의 분신, 배포기를 설치하고 작동시키세요.", "advancement.create.fist_bump": "하이파이브!", "advancement.create.fist_bump.desc": "두 배포기를 서로 부딫치게 하세요.", "advancement.create.crushing_wheel": "한 쌍의 거인들", @@ -650,11 +702,11 @@ "advancement.create.speed_controller.desc": "궁극의 회전속도 변경장치, 회전 속도 컨트롤러를 설치하세요.", "advancement.create.flywheel": "공장의 심장", "advancement.create.flywheel.desc": "화로엔진에 플라이휠을 연결하세요.", - "advancement.create.overstress_flywheel": "정말 높은 피로", + "advancement.create.overstress_flywheel": "정말정말 높은 피로", "advancement.create.overstress_flywheel.desc": "화로 엔진을 과부하하세요.", "advancement.create.integrated_circuit": "복잡한 계산", "advancement.create.integrated_circuit.desc": "집적 회로를 제작하세요.", - "advancement.create.mechanical_arm": "할일이 많아!", + "advancement.create.mechanical_arm": "바쁘다 바빠!", "advancement.create.mechanical_arm.desc": "기계 팔을 조합하고, 입력부와 출력부를 정하고, 설치한 다음 돌리세요. 그리고 그것이 작동하는 것을 보세요.", "advancement.create.musical_arm": "볼륨 최대로!", "advancement.create.musical_arm.desc": "기계 팔이 주크박스를 작동시키는 것을 보세요.", @@ -664,18 +716,22 @@ "advancement.create.arm_blaze_burner.desc": "기계 팔이 블레이즈 버너에 연료를 넣도록 하세요.", "advancement.create.chromatic_compound": "양극성 재료", "advancement.create.chromatic_compound.desc": "색채 혼합물를 만드세요.", - "advancement.create.shadow_steel": "공허를 받아들이다", + "advancement.create.shadow_steel": "공허에서의 복귀", "advancement.create.shadow_steel.desc": "무의 금속, 그림자 강철을 생성하세요.", - "advancement.create.refined_radiance": "빛으로 제련되다", + "advancement.create.refined_radiance": "빛으로부터의 자극", "advancement.create.refined_radiance.desc": "강력한 색채 물질, 정제된 빛을 생성하세요.", "advancement.create.chromatic_age": "양극 시대", "advancement.create.chromatic_age.desc": "빛과 어둠의 케이스를 제작하세요.", - "advancement.create.blaze_cake": "설탕 러시", + "advancement.create.blaze_cake": "폭주", "advancement.create.blaze_cake.desc": "블레이즈 버너에게 줄 특별한 케이크를 만드세요.", "advancement.create.extendo_grip": "띠요오옹!", - "advancement.create.extendo_grip.desc": "외장형 연장 팔을 드세요.", + "advancement.create.extendo_grip.desc": "외장형 연장 팔을 손에 쥐세요.", "advancement.create.dual_extendo_grip": "궁극의 띠용!", "advancement.create.dual_extendo_grip.desc": "쌍으로 외장형 연장 팔을 들어 인간을 뛰어넘은 사거리를 가지세요.", + "advancement.create.potato_cannon": "퐁!", + "advancement.create.potato_cannon.desc": "감자포로 적을 처치하세요.", + "advancement.create.precision_mechanism": "복잡한 호기심", + "advancement.create.precision_mechanism.desc": "정밀 기계장치를 조립하세요.", "advancement.create.zapper": "나는 스타일있게 건축해", "advancement.create.zapper.desc": "당신의 건축을 도와줄 멋진 레이저 건, 휴대용 블록발사기를 만드세요.", @@ -694,18 +750,34 @@ "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create 팔레트", - "death.attack.create.crush": "%1$s이(가) 분쇄 휠에 의해 가공되었습니다", - "death.attack.create.fan_fire": "%1$s이(가) 뜨거운 바람에 의해 익어버렸습니다", - "death.attack.create.fan_lava": "%1$s이(가) 용암 바람으로 구워졌습니다", + "death.attack.create.crush": "%1$s이(가) 분쇄 휠로 가공되었습니다", + "death.attack.create.crush.player": "%1$s이(가) %2$s 때문에 분쇄 휠에서 가공되었습니다", + "death.attack.create.fan_fire": "%1$s이(가) 뜨거운 바람에 익어버렸습니다", + "death.attack.create.fan_fire.player": "%1$s이(가) %2$s 때문에 뜨거운 바람으로 익어버렸습니다", + "death.attack.create.fan_lava": "%1$s이(가) 용암 바람으로 제가 되었습니다", + "death.attack.create.fan_lava.player": "%1$s이(가) %2$s 때문에 용암 바람으로 재가 되었습니다", "death.attack.create.mechanical_drill": "%1$s이(가) 드릴에 관통당했습니다", + "death.attack.create.mechanical_drill.player": "%1$s이(가) %2$s 때문에 드릴에 관통당했습니다", "death.attack.create.mechanical_saw": "%1$s이(가) 톱날에 반으로 갈라져 죽었습니다", + "death.attack.create.mechanical_saw.player": "%1$s이(가) %2$s 때문에 톱날에 반으로 갈라져 죽었습니다", + "death.attack.create.potato_cannon": "%1$s이(가) %2$s의 감자포에 맞고 죽었습니다.", + "death.attack.create.potato_cannon.item": "%1$s이(가) %3$s을(를) 사용한 %2$s에게 맞아 죽었습니다.", "death.attack.create.cuckoo_clock_explosion": "%1$s이(가) 조작된 뻐꾸기 시계에 의해 폭파당했습니다", + "death.attack.create.cuckoo_clock_explosion.player": "%1$s이(가) 조작된 뻐꾸기 시계에 의해 폭파당했습니다", "create.block.deployer.damage_source_name": "배포기", - "create.block.cart_assembler.invalid": "카트조립기를 레일 위에 설치하세요", + "create.block.cart_assembler.invalid": "카트 조립기를 레일 위에 설치하세요", + + "create.menu.return": "메뉴로 돌아가기", + "create.menu.configure": "설정...", + "create.menu.ponder_index": "분석 메뉴", + "create.menu.only_ingame": "일시 정지 메뉴에서 가능합니다", + "create.menu.project_page": "Curseforge 페이지", + "create.menu.report_bugs": "버그 제보하기", + "create.menu.support": "후원하기", "create.recipe.crushing": "분쇄", - "create.recipe.milling": "맷돌질", + "create.recipe.milling": "제분", "create.recipe.fan_washing": "세척", "create.recipe.fan_washing.fan": "물과 선풍기", "create.recipe.fan_smoking": "훈연", @@ -721,16 +793,27 @@ "create.recipe.sawing": "제재", "create.recipe.mechanical_crafting": "기계 조합", "create.recipe.automatic_shaped": "유형 자동 조합", - "create.recipe.block_cutting": "블 절단", + "create.recipe.block_cutting": "블록 절단", + "create.recipe.wood_cutting": "나무 절단", "create.recipe.blockzapper_upgrade": "휴대용 블록발사기 업그레이드", "create.recipe.sandpaper_polishing": "사포질", "create.recipe.mystery_conversion": "?", "create.recipe.spout_filling": "채우기", "create.recipe.draining": "배수", + "create.recipe.sequenced_assembly": "순서 조립", + "create.recipe.assembly.next": "다음 단계: %1$s", + "create.recipe.assembly.step": "단계 %1$s:", + "create.recipe.assembly.progress": "진행도: %1$s/%2$s", + "create.recipe.assembly.pressing": "압착하기", + "create.recipe.assembly.spout_filling_fluid": "%1$s 주입하기", + "create.recipe.assembly.deploying_item": "%1$s 사용하기", + "create.recipe.assembly.cutting": "톱으로 자르기", + "create.recipe.assembly.repeat": "%1$s번 반복하기", + "create.recipe.assembly.junk": "조립 실패한 조각들", "create.recipe.processing.chance": "%1$s%% 확률", "create.recipe.heat_requirement.none": "열이 필요하지 않음", - "create.recipe.heat_requirement.heated": "고온으로 가열됨", - "create.recipe.heat_requirement.superheated": "초고온으로 가열됨", + "create.recipe.heat_requirement.heated": "가열됨", + "create.recipe.heat_requirement.superheated": "초고온 가열됨", "create.generic.range": "범위", "create.generic.radius": "반지름", @@ -756,8 +839,8 @@ "create.action.discard": "삭제", "create.keyinfo.toolmenu": "메뉴 세부정보 보기", - "create.keyinfo.scrollup": "Simulate Mousewheel Up (inworld)", - "create.keyinfo.scrolldown": "Simulate Mousewheel Down (inworld)", + "create.keyinfo.scrollup": "마우스 휠을 위로 이동 (인게임에서)", + "create.keyinfo.scrolldown": "마우스 휠을 아래로 이동 (인게임에서)", "create.gui.scrollInput.defaultTitle": "옵션을 선택하세요:", "create.gui.scrollInput.scrollToModify": "스크롤로 수정하기", @@ -766,12 +849,12 @@ "create.gui.scrollInput.shiftScrollsFaster": "쉬프트-스크롤로 빨리 수정하기", "create.gui.toolmenu.focusKey": "[%1$s]를 눌러 세부정보 보기", "create.gui.toolmenu.cycle": "스크롤로 순환", - "create.gui.symmetryWand.mirrorType": "반사", - "create.gui.symmetryWand.orientation": "방위", + "create.gui.symmetryWand.mirrorType": "거울의 형태", + "create.gui.symmetryWand.orientation": "거울의 방향", - "create.symmetry.mirror.plane": "거울 모드", - "create.symmetry.mirror.doublePlane": "사각형 모드", - "create.symmetry.mirror.triplePlane": "팔각형 모드", + "create.symmetry.mirror.plane": "거울", + "create.symmetry.mirror.doublePlane": "사각형", + "create.symmetry.mirror.triplePlane": "팔각형", "create.orientation.orthogonal": "수직으로", "create.orientation.diagonal": "대각선으로", @@ -779,50 +862,37 @@ "create.orientation.alongZ": "Z좌표를 따라", "create.orientation.alongX": "X좌표를 따라", - "create.gui.blockzapper.title": "휴대용 블록발사기", - "create.gui.blockzapper.replaceMode": "대체 모드", - "create.gui.blockzapper.searchDiagonal": "대각선을 따라", - "create.gui.blockzapper.searchFuzzy": "물질 경계 무시", - "create.gui.blockzapper.range": "범위", - "create.gui.blockzapper.needsUpgradedAmplifier": "업그레이드가 필요합니다", - "create.gui.blockzapper.patternSection": "패턴 설정", - "create.gui.blockzapper.pattern.solid": "원형", - "create.gui.blockzapper.pattern.checkered": "체스판", - "create.gui.blockzapper.pattern.inversecheckered": "반전된 체스판", - "create.gui.blockzapper.pattern.chance25": "랜덤으로 25% 채우기", - "create.gui.blockzapper.pattern.chance50": "랜덤으로 50% 채우기", - "create.gui.blockzapper.pattern.chance75": "랜덤으로 75% 채우기", - "create.gui.terrainzapper.title": "휴대용 세계편집기", - "create.gui.terrainzapper.placement": "설치방식", + "create.gui.terrainzapper.title": "크리에이티브 세계편집기", + "create.gui.terrainzapper.searchDiagonal": "대각선 블록 포함", + "create.gui.terrainzapper.searchFuzzy": "물질 경계 무시", + "create.gui.terrainzapper.patternSection": "패턴", + "create.gui.terrainzapper.pattern.solid": "기본", + "create.gui.terrainzapper.pattern.checkered": "체스판", + "create.gui.terrainzapper.pattern.inversecheckered": "반전된 체스판", + "create.gui.terrainzapper.pattern.chance25": "랜덤하게 25% 채우기", + "create.gui.terrainzapper.pattern.chance50": "랜덤하게 50% 채우기", + "create.gui.terrainzapper.pattern.chance75": "랜덤하게 75% 채우기", + "create.gui.terrainzapper.placement": "설치 기준", "create.gui.terrainzapper.placement.merged": "선택한 블록에", - "create.gui.terrainzapper.placement.attached": "선택한 블록 옆에", + "create.gui.terrainzapper.placement.attached": "선택한 블록 밖에", "create.gui.terrainzapper.placement.inserted": "선택한 블록 안에", "create.gui.terrainzapper.brush": "브러쉬", "create.gui.terrainzapper.brush.cuboid": "정육면체", "create.gui.terrainzapper.brush.sphere": "구", - "create.gui.terrainzapper.brush.cylinder": "원통", - "create.gui.terrainzapper.tool": "도구", + "create.gui.terrainzapper.brush.cylinder": "원기둥", + "create.gui.terrainzapper.brush.surface": "면", + "create.gui.terrainzapper.brush.cluster": "원", + "create.gui.terrainzapper.tool": "설치 방식", "create.gui.terrainzapper.tool.fill": "채우기", - "create.gui.terrainzapper.tool.place": "설치", + "create.gui.terrainzapper.tool.place": "설치하기", "create.gui.terrainzapper.tool.replace": "대체", "create.gui.terrainzapper.tool.clear": "지우기", "create.gui.terrainzapper.tool.overlay": "덮어씌우기", - "create.gui.terrainzapper.tool.flatten": "평탄화", + "create.gui.terrainzapper.tool.flatten": "다듬기", "create.terrainzapper.shiftRightClickToSet": "쉬프트-우클릭으로 모양 설정하기", - - "create.blockzapper.usingBlock": "현재 블록: %1$s", - "create.blockzapper.componentUpgrades": "부품 업그레이드:", - "create.blockzapper.component.body": "몸통", - "create.blockzapper.component.amplifier": "증폭기", - "create.blockzapper.component.accelerator": "가속기", - "create.blockzapper.component.retriever": "회수기", - "create.blockzapper.component.scope": "스코프", - "create.blockzapper.componentTier.none": "없음", - "create.blockzapper.componentTier.brass": "황동", - "create.blockzapper.componentTier.chromatic": "혼돈의 결정체", - "create.blockzapper.leftClickToSet": "좌클릭으로 블록 설정하기", - "create.blockzapper.empty": "블록이 없습니다!", + "create.terrainzapper.usingBlock": "사용 중: %1$s", + "create.terrainzapper.leftClickToSet": "좌클릭으로 재료로 쓸 블록을 선택하세요", "create.minecart_coupling.two_couplings_max": "광산 수레는 최대 2개의 커플링만 가질 수 있습니다", "create.minecart_coupling.unloaded": "열차 일부분이 로딩되지 않은 청크에 있는 것 같습니다", @@ -831,18 +901,18 @@ "create.minecart_coupling.too_far": "광산 수레들이 너무 멀리 떨어져 있습니다", "create.contraptions.movement_mode": "이동 설정", - "create.contraptions.movement_mode.move_place": "멈췄을때 항상 블록을 설치함", - "create.contraptions.movement_mode.move_place_returned": "멈췄을떄 최초 위치에서만 블록을 설치함", - "create.contraptions.movement_mode.move_never_place": "멈춰도 블록을 설치하지 않음", - "create.contraptions.movement_mode.rotate_place": "멈췄을때 항상 블록을 설치함", - "create.contraptions.movement_mode.rotate_place_returned": "멈췄을떄 최초 위치에서만 블록을 설치함", - "create.contraptions.movement_mode.rotate_never_place": "멈춰도 블록을 설치하지 않음", + "create.contraptions.movement_mode.move_place": "멈췄을 때 항상 구조물을 설치함", + "create.contraptions.movement_mode.move_place_returned": "멈췄을 때 시작 위치에서만 구조물을 설치함", + "create.contraptions.movement_mode.move_never_place": "멈춰도 구조물을 설치하지 않음", + "create.contraptions.movement_mode.rotate_place": "멈췄을 때 항상 구조물을 설치함", + "create.contraptions.movement_mode.rotate_place_returned": "멈췄을 때 시작 위치에서만 구조물을 설치함", + "create.contraptions.movement_mode.rotate_never_place": "멈춰도 구조물을 설치하지 않음", "create.contraptions.cart_movement_mode": "수레 장치 이동 설정", - "create.contraptions.cart_movement_mode.rotate": "장치가 항상 전방을 향함", - "create.contraptions.cart_movement_mode.rotate_paused": "수레가 회전할때 장치 행동을 멈춤", - "create.contraptions.cart_movement_mode.rotation_locked": "장치가 회전하지 않음", + "create.contraptions.cart_movement_mode.rotate": "구조물이 항상 전방을 향함", + "create.contraptions.cart_movement_mode.rotate_paused": "수레가 회전할때 구조물이 행동을 멈춤", + "create.contraptions.cart_movement_mode.rotation_locked": "구조물이 회전하지 않음", "create.contraptions.windmill.rotation_direction": "회전 방향", - "create.contraptions.clockwork.clock_hands": "시계 바늘", + "create.contraptions.clockwork.clock_hands": "시계침", "create.contraptions.clockwork.hour_first": "시침 먼저", "create.contraptions.clockwork.minute_first": "분침 먼저", "create.contraptions.clockwork.hour_first_24": "24시간 바늘 먼저", @@ -850,55 +920,70 @@ "create.logistics.filter": "필터", "create.logistics.recipe_filter": "조합법 필터", "create.logistics.fluid_filter": "액체 필터", - "create.logistics.firstFrequency": "주파수. #1", - "create.logistics.secondFrequency": "주파수. #2", - "create.logistics.filter.apply": "%1$s에 필터 저장됨", - "create.logistics.filter.apply_click_again": "%1$s에 필터 저장됨 / 다시 눌러 수량 복사하기", - "create.logistics.filter.apply_count": "필터에 추출 횟수를 적용했습니다.", + "create.logistics.firstFrequency": "주파수 #1", + "create.logistics.secondFrequency": "주파수 #2", + "create.logistics.filter.apply": "%1$s에 필터를 적용했습니다.", + "create.logistics.filter.apply_click_again": "%1$s에 필터를 적용했습니다. 다시 적용하면 가지고 있는 아이템의 수량을 복사하여 필터에 적용합니다.", + "create.logistics.filter.apply_count": "필터에 수량을 적용했습니다.", - "create.gui.goggles.generator_stats": "발동 상태:", - "create.gui.goggles.kinetic_stats": "가동 상태:", + "create.gui.goggles.generator_stats": "동력 상태:", + "create.gui.goggles.kinetic_stats": "작동 상태:", "create.gui.goggles.at_current_speed": "현재 에너지량", - "create.gui.goggles.base_value": "기본 수치", - "create.gui.gauge.info_header": "게이지 정보:", + "create.gui.goggles.pole_length": "축 길이:", + "create.gui.goggles.fluid_container": "액체 저장 정보:", + "create.gui.goggles.fluid_container.capacity": "용량: ", + "create.gui.assembly.exception": "이 구조물은 움직일 수 없습니다:", + "create.gui.assembly.exception.unmovableBlock": "[%1$s,%2$s,%3$s]에 움직일 수 없는 [%4$s]이(가) 있습니다.", + "create.gui.assembly.exception.chunkNotLoaded": "[%1$s,%2$s,%3$s]에 있는 블록이 로드되지 않은 청크에 있습니다.", + "create.gui.assembly.exception.structureTooLarge": "이 구조물에 너무 많은 블록이 포함되어 있습니다.\n설정된 최댓값: %1$s개", + "create.gui.assembly.exception.tooManyPistonPoles": "이 피스톤에 너무 많은 연장 축이 부착되어 있습니다.\n설정된 최댓값: %1$s개", + "create.gui.assembly.exception.noPistonPoles": "이 피스톤은 연장 축이 없습니다.", + "create.gui.assembly.exception.not_enough_sails": "부착된 구조물에 날개 블록이 부족합니다. 현재: %1$s개 \n최소 %2$s개가 필요합니다.", + "create.gui.gauge.info_header": "계측기 정보:", "create.gui.speedometer.title": "회전 속도", "create.gui.stressometer.title": "네트워크 부하", "create.gui.stressometer.capacity": "용량", "create.gui.stressometer.overstressed": "과부하됨", - "create.gui.stressometer.no_rotation": "회전없음", + "create.gui.stressometer.no_rotation": "동력없음", "create.gui.contraptions.not_fast_enough": "이 %1$s은(는) 작동하기에 _회전 속도_가 _부족합니다_", "create.gui.contraptions.network_overstressed": "_과부하!_ _높은 피로도_ _용량_을 가진 발전기를 추가로 설치하거나 _장치 속도_를 _늦추세요_.", "create.gui.goggles.contraptions.unmovable_block": "움직일 수 없는 블록: (%d, %d, %d)의 \"%s\"", - "create.gui.adjustable_crate.title": "가변 창고 ", + "create.gui.adjustable_crate.title": "가변 창고", "create.gui.adjustable_crate.storageSpace": "저장 공간", "create.gui.stockpile_switch.title": "수량 스위치", "create.gui.stockpile_switch.invert_signal": "신호 반전", "create.gui.stockpile_switch.move_to_lower_at": "최소 신호 발동 비율:%1$s%%", "create.gui.stockpile_switch.move_to_upper_at": "최소 신호 유지 비율:%1$s%%", "create.gui.sequenced_gearshift.title": "순서 기어쉬프트", - "create.gui.sequenced_gearshift.instruction": "설명", - "create.gui.sequenced_gearshift.instruction.turn_angle": "회전", + "create.gui.sequenced_gearshift.instruction": "지시", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "축 회전", + "create.gui.sequenced_gearshift.instruction.turn_angle": "축 회전", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "각도", - "create.gui.sequenced_gearshift.instruction.turn_distance": "피스톤", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "피스톤/도르래/겐트리 회전", + "create.gui.sequenced_gearshift.instruction.turn_distance": "장치 회전", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "거리", - "create.gui.sequenced_gearshift.instruction.wait": "정지", - "create.gui.sequenced_gearshift.instruction.wait.duration": "지속시간", - "create.gui.sequenced_gearshift.instruction.end": "마침", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "지연 시간", + "create.gui.sequenced_gearshift.instruction.delay": "지연", + "create.gui.sequenced_gearshift.instruction.delay.duration": "지연시간", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "종료", + "create.gui.sequenced_gearshift.instruction.end": "종료", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "새 레드스톤 신호 대기", + "create.gui.sequenced_gearshift.instruction.await": "대기", "create.gui.sequenced_gearshift.speed": "속도, 방향", - "create.gui.sequenced_gearshift.speed.forward": "입력된 속도, 그대로 회전", - "create.gui.sequenced_gearshift.speed.forward_fast": "입력된 속도의 2배, 그대로 회전", - "create.gui.sequenced_gearshift.speed.back": "입력된 속도, 반대로 회전", - "create.gui.sequenced_gearshift.speed.back_fast": "입력된 속도의 2배, 반대로 회전", + "create.gui.sequenced_gearshift.speed.forward": "입력 속도, 그대로 회전", + "create.gui.sequenced_gearshift.speed.forward_fast": "입력 속도의 2배, 그대로 회전", + "create.gui.sequenced_gearshift.speed.back": "입력 속도, 반대로 회전", + "create.gui.sequenced_gearshift.speed.back_fast": "입력 속도의 2배, 반대로 회전", - "create.schematicAndQuill.dimensions": "청사진 크기: %1$sx%2$sx%3$s", - "create.schematicAndQuill.firstPos": "첫번쨰 위치 지정됨.", - "create.schematicAndQuill.secondPos": "두번째 위치 지정됨.", - "create.schematicAndQuill.noTarget": "[Ctrl]을 눌러 공기 블록을 선택하기.", - "create.schematicAndQuill.abort": "위치 제거됨.", - "create.schematicAndQuill.title": "청사진 이름", - "create.schematicAndQuill.convert": "저장하고 바로 설치하기", - "create.schematicAndQuill.fallbackName": "내 청사진", - "create.schematicAndQuill.saved": "%1$s로 저장됨", + "create.schematicAndQuill.dimensions": "설계도 크기: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "첫 번째 위치를 설정했습니다.", + "create.schematicAndQuill.secondPos": "두 번째 위치를 설정했습니다.", + "create.schematicAndQuill.noTarget": "[Ctrl]을(를) 누르면 허공을 선택할 수 있습니다.", + "create.schematicAndQuill.abort": "위치 설정을 제거했습니다.", + "create.schematicAndQuill.title": "설계도 이름:", + "create.schematicAndQuill.convert": "저장하고 즉시 적용", + "create.schematicAndQuill.fallbackName": "My Schematic", + "create.schematicAndQuill.saved": "%1$s으(로) 저장했습니다", "create.schematic.invalid": "[!] 없는 아이템 - 청사진 테이블을 이용하세요", "create.schematic.position": "위치", @@ -917,12 +1002,12 @@ "create.schematic.tool.rotate": "회전", "create.schematic.tool.print": "설치", "create.schematic.tool.flip": "뒤집기", - "create.schematic.tool.deploy.description.0": "구조물을 해당 위치로 고정합니다.", - "create.schematic.tool.deploy.description.1": "땅에다 우클릭으로 설치합니다.", - "create.schematic.tool.deploy.description.2": "[Ctrl]을 눌러 플레이어-청사진의 거리를 설정합니다.", - "create.schematic.tool.deploy.description.3": "[Ctrl]-스크롤로 거리를 조정합니다.", - "create.schematic.tool.move.description.0": "청사진을 수평 이동시킵니다.", - "create.schematic.tool.move.description.1": "청사진을 보고 [CTRL]-스크롤로 밉니다.", + "create.schematic.tool.deploy.description.0": "구조물의 위치를 설정합니다.", + "create.schematic.tool.deploy.description.1": "오른쪽 버튼을 누르면 땅에 배치합니다.", + "create.schematic.tool.deploy.description.2": "[Ctrl]을 누르면 일정 거리를 유지합니다.", + "create.schematic.tool.deploy.description.3": "[Ctrl]을 누르고 스크롤하면 거리를 변경합니다.", + "create.schematic.tool.move.description.0": "청사진이 수평 이동합니다.", + "create.schematic.tool.move.description.1": "청사진을 바라보며 [CTRL]을 누르고 스크롤하면 청사진을 밀어냅니다.", "create.schematic.tool.move.description.2": "", "create.schematic.tool.move.description.3": "", "create.schematic.tool.movey.description.0": "청사진을 수직 이동시킵니다.", @@ -934,7 +1019,7 @@ "create.schematic.tool.rotate.description.2": "", "create.schematic.tool.rotate.description.3": "", "create.schematic.tool.print.description.0": "구조물을 즉시 설치합니다.", - "create.schematic.tool.print.description.1": "[우클릭]으로 현재 지점에 설치를 허가합니다.", + "create.schematic.tool.print.description.1": "[우클릭]으로 현재 지점에 설치합니다.", "create.schematic.tool.print.description.2": "이 도구는 크리에이티브 모드 전용입니다.", "create.schematic.tool.print.description.3": "", "create.schematic.tool.flip.description.0": "당신이 보는 면으로 청사진을 뒤집습니다.", @@ -944,7 +1029,7 @@ "create.schematics.synchronizing": "동기화 중...", "create.schematics.uploadTooLarge": "청사진이 너무 큽니다!.", - "create.schematics.maxAllowedSize": "최대 청사진 파일 크기는:", + "create.schematics.maxAllowedSize": "최대 청사진 파일 크기:", "create.gui.schematicTable.title": "청사진 테이블", "create.gui.schematicTable.refresh": "파일 새로고침", @@ -954,7 +1039,7 @@ "create.gui.schematicTable.uploading": "업로딩 중...", "create.gui.schematicTable.finished": "업로드 완료!", "create.gui.schematicannon.title": "청사진 대포", - "create.gui.schematicannon.listPrinter": "재료 목록 프린터", + "create.gui.schematicannon.listPrinter": "재료 목록 인쇄", "create.gui.schematicannon.gunpowderLevel": "화약 용량 %1$s%%", "create.gui.schematicannon.shotsRemaining": "남은 발포 수 : %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "화약 여분: %1$s", @@ -975,16 +1060,16 @@ "create.gui.schematicannon.option.dontReplaceSolid.description": "대포가 작업구역의 온전한 블록을 대체하지 않습니다.", "create.gui.schematicannon.option.replaceWithSolid.description": "대포가 작업구역의 온전한 블록을 대포가 가진 재료로 대체합니다.", "create.gui.schematicannon.option.replaceWithAny.description": "대포가 작업구역의 온전한 블록을 대포가 가진 어떠한 재료로든 대체합니다.", - "create.gui.schematicannon.option.replaceWithEmpty.description": "대포가 작업구역의 블록들을 제거하고 공기로 채웁니다.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "대포가 작업구역의 블록들을 제거합니다.", "create.schematicannon.status.idle": "휴식", "create.schematicannon.status.ready": "준비됨", - "create.schematicannon.status.running": "가동 중", + "create.schematicannon.status.running": "작동 중", "create.schematicannon.status.finished": "완료", - "create.schematicannon.status.paused": "멈춤", + "create.schematicannon.status.paused": "일시 중지", "create.schematicannon.status.stopped": "중단됨", "create.schematicannon.status.noGunpowder": "화약이 부족함", - "create.schematicannon.status.targetNotLoaded": "블록이 준비되지 않음", + "create.schematicannon.status.targetNotLoaded": "목표가 없음", "create.schematicannon.status.targetOutsideRange": "목표가 너무 멀리 떨어져 있습니다.", "create.schematicannon.status.searching": "검색 중", "create.schematicannon.status.skipping": "건너뛰는 중", @@ -995,6 +1080,9 @@ "create.schematicannon.status.schematicNotPlaced": "청사진이 전개되지 않음", "create.schematicannon.status.schematicExpired": "청사진 파일이 제거됨", + "create.materialChecklist": "재료 목록", + "create.materialChecklist.blocksNotLoaded": "* 경고 *\n\n관련된 청크가 불러와지지 않아 재료 목록이 부정확할 수 있습니다.", + "create.gui.filter.blacklist": "블랙리스트", "create.gui.filter.blacklist.description": "위 목록에 맞지않는 아이템이면 통과합니다. 빈 블랙리스트는 모두 통과시킵니다.", "create.gui.filter.whitelist": "화이트리스트", @@ -1036,24 +1124,57 @@ "create.item_attributes.in_item_group.inverted": "%1$s탭에 속함", "create.item_attributes.added_by": "%1$s모드가 추가함", "create.item_attributes.added_by.inverted": "%1$s모드가 추가하지 않음", + "create.item_attributes.shulker_level": "셜커가 %1$s있음", + "create.item_attributes.shulker_level.inverted": "셜커가 %1$s있지 않음", + "create.item_attributes.shulker_level.full": "가득 차", + "create.item_attributes.shulker_level.empty": "비어", + "create.item_attributes.shulker_level.partial": "조금 차", + "create.item_attributes.has_enchant": "%1$s 마법부여를 가지고 있음", + "create.item_attributes.has_enchant.inverted": "%1$s 마법부여를 가지고 있지 않음", + "create.item_attributes.color": "염색됨", + "create.item_attributes.color.inverted": "염색되지 않음", + "create.item_attributes.max_enchanted": "마법부여가 최고 레벨임", + "create.item_attributes.max_enchanted.inverted": "마법부여가 최고 레벨이 아님", + "create.item_attributes.has_fluid": "%1$s을(를) 담고 있음", + "create.item_attributes.has_fluid.inverted": "%1$s을(를) 담고 있지 않음", + "create.item_attributes.has_name": "%1$s이라는 이름을 갖고 있음", + "create.item_attributes.has_name.inverted": "%1$s이라는 이름을 갖고 있지 않음", + "create.item_attributes.book_author": "%1$s이(가) 작성함", + "create.item_attributes.book_author.inverted": "%1$s이(가) 작성하지 않음", + "create.item_attributes.book_copy_original": "원본임", + "create.item_attributes.book_copy_original.inverted": "원본이 아님", + "create.item_attributes.book_copy_first": "원본의 복사본임", + "create.item_attributes.book_copy_first.inverted": "원본의 복사본이 아님", + "create.item_attributes.book_copy_second": "복사본의 복사본임", + "create.item_attributes.book_copy_second.inverted": "복사본의 복사본이 아님", + "create.item_attributes.book_copy_tattered": "낡고 헐었음", + "create.item_attributes.book_copy_tattered.inverted": "낡고 헐지 않음", + "create.item_attributes.astralsorcery_crystal": "%1$s 수정 속성을 가짐", + "create.item_attributes.astralsorcery_crystal.inverted": "%1$s 수정 속성을 가지고 있지 않음", + "create.item_attributes.astralsorcery_constellation": "%1$s에 조율됨", + "create.item_attributes.astralsorcery_constellation.inverted": "%1$s에 조율되지 않음", + "create.item_attributes.astralsorcery_perk_gem": "%1$s 퍽 속성을 가짐", + "create.item_attributes.astralsorcery_perk_gem.inverted": "%1$s 퍽 속성을 가지고 있지 않음", + "create.item_attributes.astralsorcery_amulet": "%1$s이(가) 향상됨", + "create.item_attributes.astralsorcery_amulet.inverted": "%1$s이(가) 향상되지 않음", "create.gui.attribute_filter.no_selected_attributes": "속성이 선택되지 않음", "create.gui.attribute_filter.selected_attributes": "선택된 속성:", "create.gui.attribute_filter.add_attribute": "리스트에 속성을 추가합니다", "create.gui.attribute_filter.add_inverted_attribute": "리스트에 반대 속성을 추가합니다.", - "create.gui.attribute_filter.whitelist_disjunctive": "화이트리스트 (최소)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.", - "create.gui.attribute_filter.whitelist_conjunctive": "화이트리스트 (모두)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "아이템이 선택된 속성 모두를 가지고 있어야 통과시킵니다.", - "create.gui.attribute_filter.blacklist": "블랙리스트", - "create.gui.attribute_filter.blacklist.description": "아이템이 선택된 속성이 없다면 통과시킵니다.", + "create.gui.attribute_filter.allow_list_disjunctive": "화이트리스트 (최소)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.", + "create.gui.attribute_filter.allow_list_conjunctive": "화이트리스트 (모두)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "아이템이 선택된 속성 모두를 가지고 있어야 통과시킵니다.", + "create.gui.attribute_filter.deny_list": "블랙리스트", + "create.gui.attribute_filter.deny_list.description": "아이템이 선택된 속성이 없다면 통과시킵니다.", "create.gui.attribute_filter.add_reference_item": "참고할 아이템을 추가하기", - "create.tooltip.holdKey": "[%1$s]를 눌러 설명보기", - "create.tooltip.holdKeyOrKey": "[%1$s] 또는 [%2$s]를 눌러 설명보기", + "create.tooltip.holdForDescription": "[%1$s]을 눌러 설명 보기", + "create.tooltip.holdForControls": "[%1$s]을 눌러 조작법 보기", "create.tooltip.keyShift": "Shift", "create.tooltip.keyCtrl": "Ctrl", - "create.tooltip.speedRequirement": "회전속도 요구: %1$s", + "create.tooltip.speedRequirement": "요구 회전속도: %1$s", "create.tooltip.speedRequirement.none": "없음", "create.tooltip.speedRequirement.medium": "보통", "create.tooltip.speedRequirement.high": "빠름", @@ -1061,50 +1182,79 @@ "create.tooltip.stressImpact.low": "낮음", "create.tooltip.stressImpact.medium": "보통", "create.tooltip.stressImpact.high": "높음", - "create.tooltip.stressImpact.overstressed": "과부하됨", + "create.tooltip.stressImpact.overstressed": "과부하", "create.tooltip.capacityProvided": "피로도 용량: %1$s", "create.tooltip.capacityProvided.low": "적음", "create.tooltip.capacityProvided.medium": "보통", "create.tooltip.capacityProvided.high": "큼", - "create.tooltip.capacityProvided.asGenerator": "", "create.tooltip.generationSpeed": "%1$s %2$s만큼 발전함", "create.tooltip.analogStrength": "레드스톤 출력: %1$s/15", - "create.mechanical_arm.extract_from": "%1$s에서 아이템을 가져감", - "create.mechanical_arm.deposit_to": "%1$s에 아이템을 넣음", - "create.mechanical_arm.summary": "이 기계 팔은 %1$s개의 입력부와 %2$s개의 출력부를 가졌습니다.", - "create.mechanical_arm.points_outside_range": "%1$s개의 상호작용 포인트가 거리제한으로 인해 삭제되었습니다.", + "create.mechanical_arm.extract_from": "%1$s을(를) 입력구로 설정했습니다", + "create.mechanical_arm.deposit_to": "%1$s을(를) 출력구로 설정했습니다", + "create.mechanical_arm.summary": "이 기계식 팔은 %1$s개의 입력구와 %2$s개의 출력구가 있습니다", + "create.mechanical_arm.points_outside_range": "범위 제한으로 인해 %1$s개의 선택된 지점이 해제되었습니다", - "create.logistics.when_multiple_outputs_available": "다수의 입력부가 존재할 때", - "create.mechanical_arm.selection_mode.round_robin": "순서대로 옮김", - "create.mechanical_arm.selection_mode.forced_round_robin": "순서대로 옮김(강제적)", - "create.mechanical_arm.selection_mode.prefer_first": "첫 포인트 우선", + "create.weighted_ejector.target_set": "투척 지점이 설정되었습니다", + "create.weighted_ejector.target_not_valid": "인접한 블록에다 발사합니다 (투척 지점이 올바르지 않습니다)", + "create.weighted_ejector.no_target": "인접한 블록에다 발사합니다 (투척 지점이 설정되지 않았습니다)", + "create.weighted_ejector.targeting": "[%1$s,%2$s,%3$s]에다 투척합니다", + "create.weighted_ejector.stack_size": "투척하는 아이템의 수량", + + "create.logistics.when_multiple_outputs_available": "여러 출력구가 있을 때", - "create.tunnel.selection_mode.split": "분리", - "create.tunnel.selection_mode.forced_split": "강제 분리", - "create.tunnel.selection_mode.round_robin": "순차적 배분", - "create.tunnel.selection_mode.forced_round_robin": "강제 순차적 배분", - "create.tunnel.selection_mode.prefer_nearest": "가까운 곳 선호", - "create.tunnel.selection_mode.randomize": "랜덤", - "create.tunnel.selection_mode.synchronize": "입력부 동기화", + "create.mechanical_arm.selection_mode.round_robin": "돌아가며 처리", + "create.mechanical_arm.selection_mode.forced_round_robin": "돌아가며 처리(강제적)", + "create.mechanical_arm.selection_mode.prefer_first": "설정 순서 우선시", + + "create.tunnel.selection_mode.split": "분할", + "create.tunnel.selection_mode.forced_split": "분할(강제적)", + "create.tunnel.selection_mode.round_robin": "순서대로 처리", + "create.tunnel.selection_mode.forced_round_robin": "순서대로 처리(강제적)", + "create.tunnel.selection_mode.prefer_nearest": "가장 가까운 곳", + "create.tunnel.selection_mode.randomize": "무작위", + "create.tunnel.selection_mode.synchronize": "입력 동기화", "create.tooltip.chute.header": "슈트 정보", - "create.tooltip.chute.items_move_down": "아이템이 아래로 이동합니다.", - "create.tooltip.chute.items_move_up": "아이템이 위로 이동합니다.", + "create.tooltip.chute.items_move_down": "아이템이 아래로 이동", + "create.tooltip.chute.items_move_up": "아이템이 위로 이동", "create.tooltip.chute.no_fans_attached": "선풍기가 부착되지 않음", "create.tooltip.chute.fans_push_up": "선풍기가 아래에서 밈", "create.tooltip.chute.fans_push_down": "선풍기가 위에서 밈", "create.tooltip.chute.fans_pull_up": "선풍기가 위에서 당김", "create.tooltip.chute.fans_pull_down": "선풍기가 아래에서 당김", + "create.tooltip.chute.contains": "들어있는 아이템: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "분배 중인 아이템:", + "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "우클릭하여 회수", + "create.linked_controller.bind_mode": "연결 모드 활성화", + "create.linked_controller.press_keybind": "%1$s, %2$s, %3$s, %4$s, %5$s, %6$s 중 하나를 눌러 이 주파수를 해당 조작키에 연결하세요", + "create.linked_controller.key_bound": "%1$s에 주파수가 연결되었습니다", + "create.linked_controller.frequency_slot_1": "조작키: %1$s, 주파수 #1", + "create.linked_controller.frequency_slot_2": "조작키: %1$s, 주파수 #2", + + "create.crafting_blueprint.crafting_slot": "재료 슬롯", + "create.crafting_blueprint.filter_items_viable": "필터도 가능합니다", + "create.crafting_blueprint.display_slot": "전시 슬롯", + "create.crafting_blueprint.inferred": "실제 조합법과 같음", + "create.crafting_blueprint.manually_assigned": "직접 지정함", + "create.crafting_blueprint.secondary_display_slot": "두번째 전시 슬롯", + "create.crafting_blueprint.optional": "추가적", + + "create.potato_cannon.ammo.attack_damage": "%1$s 공격 피해", + "create.potato_cannon.ammo.reload_ticks": "%1$s 재장전 틱", + "create.potato_cannon.ammo.knockback": "%1$s 밀쳐내는 거리", + + "create.hint.hose_pulley.title": "무한 공급", + "create.hint.hose_pulley": "해당 액체는 _무한_합니다.", "create.hint.mechanical_arm_no_targets.title": "목표 없음", - "create.hint.mechanical_arm_no_targets": "이 _기계 팔_은 _목표_가 설정되지 않은 것 같습니다. _기계 팔을 손에 들고_ 벨트, 아이템 거치대, 깔때기를 _우클릭_하여 목표로 지정하세요.", - "create.hint.horizontal_funnel.title": "깔때기가 수평임", - "create.hint.horizontal_funnel": "깔때기는 더이상 아이템을 _직접_ 이동시킬 수 없습니다. _벨트나 아이템 거치대_위에 깔때기를 설치하여 아이템을 이동시키세요.", - "create.hint.upward_funnel.title": "깔때기가 위를 바라보고 있음", - "create.hint.upward_funnel": "_기계 팔_, 선풍기가 부착된 _슈트_를 이용하거나, 혹은 아이템이 _던져져야만_ 이동시킬 수 있습니다. 아이템을 _수직으로_ 옮기고 싶다면 _슈트_를 사용해보세요.", - "create.hint.empty_bearing.title": "베어링 업데이트_", + "create.hint.mechanical_arm_no_targets": "이 _기계 팔_은 _목표_가 설정되지 않았습니다. _기계 팔을 손에 들고_ 벨트, 아이템 거치대, 퍼널을 _우클릭_하여 목표로 지정하세요.", + "create.hint.empty_bearing.title": "베어링 업데이트", "create.hint.empty_bearing": "_맨 손_으로 베어링을 _우클릭_하여 구조물을 _부착_하세요.", + "create.hint.full_deployer.title": "배포기 아이템 과적", + "create.hint.full_deployer": "이 _배포기_는 _배출_할 아이템을 가지고 있습니다. 호퍼 , 퍼널 등을 이용해 아이템을 빼내세요.", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", @@ -1123,16 +1273,46 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", + "create.contraption.minecart_contraption_too_big": "이 수레 구조물은 들기에 너무 큽니다", + "create.contraption.minecart_contraption_illegal_pickup": "신비로운 힘이 이 수레 구조물을 세계에 묶어두고 있습니다", + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.contraption_disassemble": "구조물이 멈춤", + "create.subtitle.peculiar_bell_use": "황동 종이 울림", + "create.subtitle.mixing": "섞는 소리", + "create.subtitle.mechanical_press_activation_belt": "압착기가 작동함", + "create.subtitle.fwoomp": "감자포를 쏨", + "create.subtitle.worldshaper_place": "세계편집기가 쏨", + "create.subtitle.crushing_1": "분쇄되는 소리", + "create.subtitle.depot_slide": "아이템이 미끄러짐", + "create.subtitle.saw_activate_stone": "톱이 작동함", + "create.subtitle.blaze_munch": "블레이즈 버너가 섭취함", + "create.subtitle.funnel_flap": "퍼널이 펄럭거림", "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", + "create.subtitle.haunted_bell_use": "귀신들린 종이 울림", + "create.subtitle.scroll_value": "스크롤 소리", + "create.subtitle.crafter_craft": "조합기가 조합함", + "create.subtitle.controller_put": "조작기를 놓음", + "create.subtitle.cranking": "크랭크가 돌아감", + "create.subtitle.wrench_remove": "장치가 부숴짐", + "create.subtitle.cogs": "톱니바퀴가 돌아감", "create.subtitle.slime_added": "슬라임이 철퍽거림", - "create.subtitle.mechanical_press_activation": "압착기가 가동됨", - "create.subtitle.mechanical_press_item_break": "금속이 부딫힘", - "create.subtitle.blockzapper_place": "블록이 순간이동됨", - "create.subtitle.blockzapper_confirm": "확인 효과음", - "create.subtitle.blockzapper_deny": "취소 효과음", - "create.subtitle.block_funnel_eat": "깔때기가 흡입함", - "create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함", + "create.subtitle.wrench_rotate": "렌치를 사용함", + "create.subtitle.potato_hit": "채소가 부딫힘", + "create.subtitle.saw_activate_wood": "톱이 작동함", + "create.subtitle.haunted_bell_convert": "종에 귀신이 들림", + "create.subtitle.deployer_polish": "배포기가 윤나게 함", + "create.subtitle.deny": "취소음", + "create.subtitle.controller_click": "조작기를 누름", + "create.subtitle.schematicannon_launch_block": "청사진 대포가 발사함", + "create.subtitle.copper_armor_equip": "잠수용 장비가 철커덕거림", + "create.subtitle.controller_take": "독서대가 비워짐", + "create.subtitle.mechanical_press_activation": "압착기가 작동함", + "create.subtitle.contraption_assemble": "구조물이 움직임", + "create.subtitle.crafter_click": "조합기가 작동함", + "create.subtitle.depot_plop": "아이템이 놓임", + "create.subtitle.confirm": "확인음", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1146,170 +1326,22 @@ "item.create.example_item.tooltip.control1": "When Ctrl pressed", "item.create.example_item.tooltip.action1": "These controls are displayed.", - "block.create.andesite_encased_shaft.tooltip": "안산암 케이스 축", - "block.create.andesite_encased_shaft.tooltip.summary": "_크리에이티브_ _전용_ 아이템입니다. 축에 _안산암 케이스_를 씌운 것입니다. 케이스는 소모되지 않습니다.", - - "block.create.brass_encased_shaft.tooltip": "황동 케이스 축", - "block.create.brass_encased_shaft.tooltip.summary": "_크리에이티브_ _전용_ 아이템입니다. 축에 _황동 케이스_를 씌운 것입니다. 케이스는 소모되지 않습니다.", - "block.create.wooden_bracket.tooltip": "나무 지지대", "block.create.wooden_bracket.tooltip.summary": "나무를 이용해 _축, 톱니바퀴, 파이프_를 꾸며보세요.", "block.create.metal_bracket.tooltip": "금속 지지대", "block.create.metal_bracket.tooltip.summary": "금속을 이용해 _축, 톱니바퀴, 파이프_를 꾸며보세요.", - "block.create.andesite_casing.tooltip": "안산암 케이스", - "block.create.andesite_casing.tooltip.summary": "다양한 용도로 쓰일 수 있는 단순한 기계 케이스입니다. 장식용으로 써도 무방합니다. _축_이나 _벨트_에 _씌울 수 있습니다_.", - - "block.create.andesite_funnel.tooltip": "안산암 깔때기", - "block.create.andesite_funnel.tooltip.summary": "저장소간 아이템을 옮기는 일반적인 아이템 수송장치입니다. _레드스톤_ _신호_로 조정할 수 있습니다.", - "block.create.andesite_funnel.tooltip.condition1": "일반적인 사용처", - "block.create.andesite_funnel.tooltip.behaviour1": "_열린 면_은 _앞_에 있는 아이템을 가져오고 깔때기 _반대편_에 있는 _아이템 저장소_에 _옮겨 넣습니다_.", - "block.create.andesite_funnel.tooltip.condition2": "벨트, 아이템 거치대 등에 설치할 때", - "block.create.andesite_funnel.tooltip.behaviour2": "_장착된 장치_에 있는 아이템을 _가져가거나_, 반대편에서 아이템을 _가져옵니다_. 렌치를 이용하여 깔때기의 _방향_을 조정할 수 있습니다.", - "block.create.andesite_funnel.tooltip.condition3": "두 저장소사이에 수직으로 설치할 때", - "block.create.andesite_funnel.tooltip.behaviour3": "_아이템 칸이 없는_ 호퍼처럼 아이템을 _아래로_ 옮깁니다.", - - "block.create.andesite_tunnel.tooltip": "안산암 터널", - "block.create.andesite_tunnel.tooltip.summary": "벨트의 안전한 _덮개_이며, 벨트로 인한 구멍을 메울 훌륭한 수단입니다.", - "block.create.andesite_tunnel.tooltip.control1": "측면에서 렌치로 우클릭", - "block.create.andesite_tunnel.tooltip.action1": "터널에 창문이 존재할경우, _창문_ _셔터_를 조정합니다.", - - "block.create.brass_funnel.tooltip": "황동 깔기", - "block.create.brass_funnel.tooltip.summary": "저장소간 아이템을 옮기는 일반적인 아이템 수송장치입니다. _레드스톤_ _신호_로 조정할 수 있습니다. 필터도 넣을 수 있습니다.", - "block.create.brass_funnel.tooltip.condition1": "일반적인 사용처", - "block.create.brass_funnel.tooltip.behaviour1": "_열린 면_은 _앞_에 있는 아이템을 가져오고 깔때기 _반대편_에 있는 _아이템 저장소_에 _옮겨 넣습니다_.", - "block.create.brass_funnel.tooltip.condition2": "벨트, 아이템 거치대 등에 설치할 때", - "block.create.brass_funnel.tooltip.behaviour2": "_장착된 장치_에 있는 아이템을 _가져가거나_, 반대편에서 아이템을 _가져옵니다_. 렌치를 이용하여 깔때기의 _방향_을 조정할 수 있습니다.", - "block.create.brass_funnel.tooltip.condition3": "두 저장소사이에 수직으로 설치할 때", - "block.create.brass_funnel.tooltip.behaviour3": "_아이템 칸이 없는_ 호퍼처럼 아이템을 _아래로_ 옮깁니다.", - - "block.create.brass_tunnel.tooltip": "황동 터널", - "block.create.brass_tunnel.tooltip.summary": "벨트에 다양한 _필터링_, _분리_ 기능을 탑재해줄 _황동 터널_입니다.", - "block.create.brass_tunnel.tooltip.condition1": "측면에 순서대로 설치했을 때", - "block.create.brass_tunnel.tooltip.behaviour1": "_서로_ _연결된_ 황동 터널은 한 벨트의 아이템을 _다른 벨트로_ 옮길 수 있습니다.", - "block.create.brass_tunnel.tooltip.condition2": "필터링", - "block.create.brass_tunnel.tooltip.behaviour2": "_황동 터널_은 _입력_, _출력_필터를 설정할 수 있습니다. 터널 출력 필터에 _허용되지_ _않은_ 아이템은, _연결된_ _다른_ 터널로 옮겨집니다.", - "block.create.brass_tunnel.tooltip.condition3": "분리", - "block.create.brass_tunnel.tooltip.behaviour3": "_황동_ _터널_은 _연결된_ _벨트_에 아이템이 다양하게 _분배되도록_ 설정할 수 있습니다.", - "block.create.brass_tunnel.tooltip.control1": "측면에서 렌치로 우클릭", - "block.create.brass_tunnel.tooltip.action1": "터널에 창문이 존재할경우, _창문_ _셔터_를 조정합니다.", - "block.create.brass_tunnel.tooltip.control2": "상면에서 렌치로 우클릭", - "block.create.brass_tunnel.tooltip.action2": "연결된 _터널_의 분리 방식을 바꿉니다.", - - "block.create.copper_casing.tooltip": "구리 케이스", - "block.create.copper_casing.tooltip.summary": "다양한 용도로 쓰일 수 있는 견고한 기계 케이스입니다. 장식용으로 써도 무방합니다.", - "block.create.copper_casing.tooltip.condition1": "액체 파이프에 사용할 때", - "block.create.copper_casing.tooltip.behaviour1": "_액체_ _파이프_를 구리 케이스로 _덮습니다._ 케이스를 씌운 파이프는 _연결이 고정_되어, 다른 파이프와 상호작용하지 않습니다.", - - "block.create.encased_fluid_pipe.tooltip": "ENCASED FLUID PIPE", - "block.create.encased_fluid_pipe.tooltip.summary": "_구리 케이스_를 씌운 액체 파이프입니다.", - - "block.create.copper_valve_handle.tooltip": "구리 밸브 손잡이", - "block.create.copper_valve_handle.tooltip.summary": "_플레이어의_ _상호작용_이 필요한 정확한 _회전력_의 _근원_입니다. 근육통 주의하세요!", - "block.create.copper_valve_handle.tooltip.condition1": "사용할 때", - "block.create.copper_valve_handle.tooltip.behaviour1": "연결된 장치에 _회전력_을 _제공_합니다. 웅크리면 _반대로_ 회전시킵니다.", - - "block.create.fluid_pipe.tooltip": "FLUID PIPE", - "block.create.fluid_pipe.tooltip.summary": "_액체_를 수송시킬 때 쓰입니다. 액체를 옮기려면 _펌프_가 필요합니다.", - "block.create.fluid_pipe.tooltip.condition1": "액체 수송", - "block.create.fluid_pipe.tooltip.behaviour1": "_탱크_와 _대야_같은 _액체_ _저장소_에 연결할 수 있습니다. 노출된 파이프 구멍은 액체를 _흡입, 배출_할 수 있습니다. 누수에 주의하세요!", - "block.create.fluid_pipe.tooltip.control1": "렌치로 우클릭", - "block.create.fluid_pipe.tooltip.action1": "가능하면 파이프에 창문을 설치합니다.", - - - "block.create.hose_pulley.tooltip": "HOSE PULLEY", - "block.create.hose_pulley.tooltip.summary": "세계에 _많은 양_의 액체를 _배출_하거나 _흡수_하는데 쓰입니다.", - "block.create.hose_pulley.tooltip.condition1": "동력을 받을 때", - "block.create.hose_pulley.tooltip.behaviour1": "호스를 올리거나 내립니다. _호스의 위치_로 액체를 _채우거나 빼낼_ 높이가 정해집니다.", - "block.create.hose_pulley.tooltip.condition2": "액체가 도르래에 흡수될 때", - "block.create.hose_pulley.tooltip.behaviour2": "_호스 끝의 높이_에서 액체 블록을 _흡수_하기 시작합니다. _매우 많은 양의 액체_는 무한으로 간주됩니다.", - "block.create.hose_pulley.tooltip.condition3": "액체가 도르래에서 배출 될 때", - "block.create.hose_pulley.tooltip.behaviour3": "_호스 끝의 높이_에서 액체를 _채우기_ 시작합니다.", - - "block.create.fluid_tank.tooltip": "FLUID TANK", - "block.create.fluid_tank.tooltip.summary": "당신이 좋아하는 _액체_를 모두 _저장_하세요. 넓이와 높이를 조정할 수 있습니다.", - "block.create.fluid_tank.tooltip.condition1": "렌치로 우클릭", - "block.create.fluid_tank.tooltip.behaviour1": "창문 설정을 변경합니다.", - - "block.create.creative_fluid_tank.tooltip": "CREATIVE FLUID TANK", - "block.create.creative_fluid_tank.tooltip.summary": "이 액체 탱크는 모든 액체를 _무한정 복제_합니다. 넓이와 높이를 조정할 수 있습니다.", - "block.create.creative_fluid_tank.tooltip.condition1": "탱크에 액체가 들어있을 때", - "block.create.creative_fluid_tank.tooltip.behaviour1": "이 탱크에서 추출되는 액체는 _무한정 공급_됩니다. 이 탱크에 들어가는 액체는 _사라집니다_.", - "block.create.creative_fluid_tank.tooltip.condition2": "렌치로 우클릭", - "block.create.creative_fluid_tank.tooltip.behaviour2": "창문 설정을 변경합니다.", - - "block.create.fluid_valve.tooltip": "FLUID VALVE", - "block.create.fluid_valve.tooltip.summary": "파이프 속 액체의 흐름을 멈춥니다.", - "block.create.fluid_valve.tooltip.condition1": "설정가능한 흐름", - "block.create.fluid_valve.tooltip.behaviour1": "_회전력_은 밸브를 닫게만들어, 액체의 흐름을 _중지_시킵니다. _반대_ _방향의_ 회전력은 밸브를 다시 엽니다.", - - "block.create.mechanical_pump.tooltip": "MECHANICAL PUMP", - "block.create.mechanical_pump.tooltip.summary": "_회전력_을 가지고 액체를 파이프에서 _움직일_ _수_ _있게_ 합니다. 양방향 최대 범위가 있습니다. (기본설정은 16블록)", - "block.create.mechanical_pump.tooltip.condition1": "액체의 흐름", - "block.create.mechanical_pump.tooltip.behaviour1": "_회전력_이 파이프 안의 _액체_를 _움직이게_ 하는 압력을 발생시킵니다. 회전력의 방향을 _반전_시켜, 액체의 흐름을 _바꿀_ _수_ 있습니다.", - "block.create.mechanical_pump.tooltip.control1": "렌치로 우클릭", - "block.create.mechanical_pump.tooltip.action1": "_펌프_의 방향을 반전시켜, 흐름의 _기본_ _방향_을 바꿉니다.", - - "block.create.smart_fluid_pipe.tooltip": "SMART FLUID PIPE", - "block.create.smart_fluid_pipe.tooltip.summary": "_필터_가 있는 액체 파이프입니다. 어떤 액체가 지나갈 수 있는지 _특정_할 수 있습니다.", - "block.create.smart_fluid_pipe.tooltip.condition1": "액체가 흘러들어올 때", - "block.create.smart_fluid_pipe.tooltip.behaviour1": "_필터에 맞지 않는_ 액체는 멈춥니다.", - "block.create.smart_fluid_pipe.tooltip.condition2": "액체 용기에 접해있을 때", - "block.create.smart_fluid_pipe.tooltip.behaviour2": "_필터에 맞는_ 액체만 빼냅니다.", - - - "block.create.spout.tooltip": "SPOUT", - "block.create.spout.tooltip.summary": "액체 용기를 _리필_해주는 펌프입니다.", - "block.create.spout.tooltip.condition1": "액체 수송", - "block.create.spout.tooltip.behaviour1": "양동이나 물병같이 _액체를_ _담는_ _용기_가 아래에 있다면, 수도꼭지는 _자신이_ _가진_ _액체_로 채웁니다.", - "block.create.spout.tooltip.condition2": "액체 자동화", - "block.create.spout.tooltip.behaviour2": "수도꼭지가 _벨트_나 _아이템 거치대_위에 설치되어있다면, 아래를 지나가는 액체 용기와 _자동으로_ 반응합니다.", - - "block.create.item_drain.tooltip": "ITEM DRAIN", - "block.create.item_drain.tooltip.summary": "액체 용기를 _비우기위해_ 철창을 붙인 아이템 거치대입니다.", - "block.create.item_drain.tooltip.condition1": "액체 수송", - "block.create.item_drain.tooltip.behaviour1": "_양동이나 병같은_ 액체 용기가 옆에서 들어오면, 배수구는 자신의 용기에 액체를 _쏟아낼_ 것입니다. 아이템은 반대편으로 배출됩니다.", - - "block.create.mechanical_arm.tooltip": "MECHANICAL ARM", - "block.create.mechanical_arm.tooltip.summary": "_아이템_ 재배치를 위한 _고급_ _장치_입니다.", - "block.create.mechanical_arm.tooltip.condition1": "아이템 이동", - "block.create.mechanical_arm.tooltip.behaviour1": "_벨트_, _아이템 거치대_, _깔때기_, _기계_ _조합기_와 같은 접근가능한 인벤토리에서 아이템을 _가져오거나_ _놓을_ 수 있습니다.", - "block.create.mechanical_arm.tooltip.control1": "손에 있을 때", - "block.create.mechanical_arm.tooltip.action1": "_접근가능한_ _인벤토리_에 우클릭해서 기계 팔이 아이템을 _가져갈_ _곳_을 설정합니다. 한번 더 우클릭하여 아이템을 _놓을_ _곳_을 설정합니다.", - "block.create.mechanical_arm.tooltip.control2": "렌치를 들고 스크롤", - "block.create.mechanical_arm.tooltip.action2": "_기계_ _팔_이 아이템을 _놓을_ _패턴_을 설정합니다.", - - "block.create.copper_valve_handle.tooltip": "구리 밸브 손잡이", - "block.create.copper_valve_handle.tooltip.summary": "_플레이어의_ _상호작용_이 필요한 정확한 _회전력_의 _근원_입니다. 피곤해지지 않도록 주의하세요!", - "block.create.copper_valve_handle.tooltip.condition1": "사용할 때", - "block.create.copper_valve_handle.tooltip.behaviour1": "연결된 장치에 _회전력_을 _제공_합니다. 웅크리면 _반대로_ 회전시킵니다.", - "block.create.seat.tooltip": "SEAT", - "block.create.seat.tooltip.summary": "앉아서 드라이브를 즐기세요! _움직이는 장치_에 _플레이어_를 _고정_시킵니다. 가구용으로도 좋습니다! 다양한 색깔이 존재합니다.", + "block.create.seat.tooltip.summary": "앉아서 드라이브를 즐기세요! _움직이는 구조물_에 _플레이어_를 _고정_시킵니다. 가구용으로도 좋습니다! 다양한 색깔이 존재합니다.", "block.create.seat.tooltip.condition1": "좌석에 우클릭", "block.create.seat.tooltip.behaviour1": "플레이어가 좌석에 _앉습니다_. _왼쪽 쉬프트_를 눌러 좌석에서 _일어섭니다_.", - "block.create.chute.tooltip": "슈트", - "block.create.chute.tooltip.summary": "아이템을 _수직, 대각선으로_ 수송합니다. _아이템_ _저장소_에서 아이템을 뺴오거나 넣을 수 있습니다. _호퍼나 벨트_로 슈트의 옆면과 연결할 수 있습니다.", - "block.create.chute.tooltip.condition1": "선풍기 바람을 받을 때", - "block.create.chute.tooltip.behaviour1": "_선풍기_ _바람_을 받은 슈트는 아이템을 _위로_ 수송하거나, _벨트_, _아이템 거치대_에서 아이템을 빨아들일 수 있습니다", - - "block.create.depot.tooltip": "아이템 거치대", - "block.create.depot.tooltip.summary": "아이템을 _간편하게_ 두기에 좋은 블록입니다. 몇몇 장치에 상호작용 포인트를 제공합니다.", - "block.create.depot.tooltip.condition1": "우클릭", - "block.create.depot.tooltip.behaviour1": "_아이템 거치대_에서 아이템을 두거나 가져옵니다. _벨트_에 작용하는 블록, 장치도 _아이템 거치대_와 작용합니다.", - "item.create.blaze_cake.tooltip": "블레이즈 케이크", - "item.create.blaze_cake.tooltip.summary": "열심히 일하는 _블레이즈_ _버너_의 식사입니다. 그들을 더 화끈하게 만드세요!", - - "item.create.empty_blaze_burner.tooltip": "EMPTY BLAZE BURNER", - "item.create.empty_blaze_burner.tooltip.summary": "불타는 친구를 위한 작은 집입니다. 그들을 _좋은 곳_에 쓸 수 있을 겁니다.", - "item.create.empty_blaze_burner.tooltip.condition1": "블레이즈나 블레이즈 스포너에 사용했을 때", - "item.create.empty_blaze_burner.tooltip.behaviour1": "블레이즈를 _포획_합니다.", + "item.create.blaze_cake.tooltip.summary": "열심히 일하는 _블레이즈_ _버너_의 식사입니다. 블레이즈를 더 뜨겁게 만드세요!", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", - "item.create.wand_of_symmetry.tooltip.summary": "설정된 반사 모드에 따라 블록 설치를 _똑같이_ _재현_합니다.", + "item.create.wand_of_symmetry.tooltip.summary": "설정된 반사 모드에 따라 블록 설치를 _똑같이_ _배치_합니다.", "item.create.wand_of_symmetry.tooltip.condition1": "단축바에 있을 때", "item.create.wand_of_symmetry.tooltip.behaviour1": "활성화 유지", "item.create.wand_of_symmetry.tooltip.control1": "땅에다 우클릭", @@ -1319,15 +1351,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "웅크린 상태에서 우클릭", "item.create.wand_of_symmetry.tooltip.action3": "_설정_ _창_을 엽니다.", - "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "멀리있는 블록을 교체, 설치하는 놀라운 도구입니다.", - "item.create.handheld_blockzapper.tooltip.control1": "블록을 보고 좌클릭", - "item.create.handheld_blockzapper.tooltip.action1": "이 도구로 설치할 블록을 설정합니다.", - "item.create.handheld_blockzapper.tooltip.control2": "블록을 보고 우클릭", - "item.create.handheld_blockzapper.tooltip.action2": "해당 위치에 설정된 블록으로 설치하거나 교체합니다.", - "item.create.handheld_blockzapper.tooltip.control3": "웅크린 상태에서 우클릭", - "item.create.handheld_blockzapper.tooltip.action3": "_설정_ _창_을 엽니다.", - "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip.summary": "_지형경관_을 만들 때 좋은 간편한 도구입니다.", "item.create.handheld_worldshaper.tooltip.control1": "블록을 보고 좌클릭", @@ -1342,16 +1365,22 @@ "item.create.tree_fertilizer.tooltip.condition1": "묘목에 사용했을 때", "item.create.tree_fertilizer.tooltip.behaviour1": "묘목을 주위 공간과 _상관없이_ 성장시킵니다.", - "item.create.deforester.tooltip": "DEFORESTER", - "item.create.deforester.tooltip.summary": "수 초 만에 나무를 쓰러뜨리는 _놀라운_ _도끼_입니다.", - "item.create.extendo_grip.tooltip": "EXTENDO GRIP", "item.create.extendo_grip.tooltip.summary": "띠요오옹! 사용자의 _사거리_를 늘려줍니다.", "item.create.extendo_grip.tooltip.condition1": "다른 손에 있을 때", "item.create.extendo_grip.tooltip.behaviour1": "_기존_ _손_에있는 아이템의 사거리를 늘립니다.", + "item.create.extendo_grip.tooltip.condition2": "구리 산소통을 착용했을 때", + "item.create.extendo_grip.tooltip.behaviour2": "_내구도_가 _소모되지_ _않고_, 탱크에서 _공기_가 _소모됩니다_.", + + "item.create.potato_cannon.tooltip": "POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "퐁! 집에서 키운 작물로 적을 처치하세요! _구리_ _산소통_의 산소로 움직일 수 있습니다.", + "item.create.potato_cannon.tooltip.condition1": "우클릭", + "item.create.potato_cannon.tooltip.behaviour1": "_인벤토리_에서 적당한 아이템을 _쏩니다_.", + "item.create.potato_cannon.tooltip.condition2": "구리 산소통을 착용했을 때", + "item.create.potato_cannon.tooltip.behaviour2": "_내구도_가 _소모되지_ _않고_, 탱크에서 _공기_가 _소모됩니다_.", "item.create.filter.tooltip": "FILTER", - "item.create.filter.tooltip.summary": "장치의 _입력_과 _출력_을 필터 _아이템_ 목록에 따라 _조정_합니다.", + "item.create.filter.tooltip.summary": "장치의 _입력_과 _출력_을 _필터_ 목록에 따라 _조정_합니다.", "item.create.filter.tooltip.condition1": "필터 슬롯에 있을 때", "item.create.filter.tooltip.behaviour1": "필터 _설정_에 따라 아이템 흐름을 _조정_합니다.", "item.create.filter.tooltip.condition2": "우클릭", @@ -1369,7 +1398,7 @@ "item.create.schematic.tooltip": "SCHEMATIC", "item.create.schematic.tooltip.summary": "세계에 구조물을 _홀로그램으로_ 불러와 지정하고 설치합니다. 지정된 홀로그램은 _청사진_ _대포_의 _작업_ _영역_이 됩니다.", - "item.create.schematic.tooltip.condition1": "들고 있을 떄", + "item.create.schematic.tooltip.condition1": "들고 있을 때", "item.create.schematic.tooltip.behaviour1": "UI의 도구로 _변경/설치_ 할 수 있습니다.", "item.create.schematic.tooltip.control1": "웅크린 상태에서 우클릭", "item.create.schematic.tooltip.action1": "정확한 _좌표_ 입력을 위한 창을 엽니다.", @@ -1388,392 +1417,72 @@ "item.create.schematic_and_quill.tooltip.action3": "선택 영역을 리셋하고 _삭제_합니다.", "block.create.schematicannon.tooltip": "SCHEMATICANNON", - "block.create.schematicannon.tooltip.summary": "장착된 청사진을 바탕으로 블록들을 _발포_합니다. _화약_을 연료로 사용하고 주변 인벤토리 공간에서 아이템을 사용합니다.", - "block.create.schematicannon.tooltip.control1": "우클릭", - "block.create.schematicannon.tooltip.action1": "창을 엽니다.", + "block.create.schematicannon.tooltip.summary": "장착된 청사진을 바탕으로 블록들을 _발포_합니다. _화약_을 연료로 사용하고 주변 보관함에서 아이템을 사용합니다.", + "block.create.schematicannon.tooltip.condition1": "우클릭", + "block.create.schematicannon.tooltip.behaviour1": "설정 창을 엽니다.", "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", "block.create.schematic_table.tooltip.summary": "_빈_ _청사진_에 저장된 청사진을 불러옵니다.", "block.create.schematic_table.tooltip.condition1": "빈 청사진을 넣을 때", "block.create.schematic_table.tooltip.behaviour1": "Schematics 폴더에서 선택한 파일을 업로드합니다.", - "block.create.shaft.tooltip": "SHAFT", - "block.create.shaft.tooltip.summary": "_일직선_으로 _회전_을 전달합니다.", - - "block.create.cogwheel.tooltip": "COGWHEEL", - "block.create.cogwheel.tooltip.summary": " _일직선_이나 _옆_ _톱니바퀴_로 _회전_을 _전달_합니다.", - - "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", - "block.create.large_cogwheel.tooltip.summary": "큰 톱니바퀴입니다. 작은 톱니바퀴와 맞물렸을때, _회전 속도_가 _변합니다_.", - - "block.create.encased_shaft.tooltip": "ENCASED SHAFT", - "block.create.encased_shaft.tooltip.summary": "_일직선_으로 _회전_을 전달합니다. _벽을_ _넘어_ 회전을 보낼 때 유용합니다.", - - "block.create.gearbox.tooltip": "GEARBOX", - "block.create.gearbox.tooltip.summary": "_전후좌우_로 회전을 보냅니다. 한번 더 조합해서 설정을 바꿀 수 있습니다.", - - "block.create.gearshift.tooltip": "GEARSHIFT", - "block.create.gearshift.tooltip.summary": "연결된 축의 회전 방향을 _변경_합니다.", - "block.create.gearshift.tooltip.condition1": "레드스톤 신호를 받았을 때", - "block.create.gearshift.tooltip.behaviour1": "_출력_ 회전 방향을 _반전_시킵니다.", - - "block.create.clutch.tooltip": "CLUTCH", - "block.create.clutch.tooltip.summary": "연결된 축의 회전을 _끄고_ _킬_ 수 있습니다.", - "block.create.clutch.tooltip.condition1": "레드스톤 신호를 받았을 때", - "block.create.clutch.tooltip.behaviour1": "출력 방향 회전을 _멈춥니다_.", - - "block.create.encased_chain_drive.tooltip": "ENCASED_CHAIN_DRIVE", - "block.create.encased_chain_drive.tooltip.summary": "회전을 _직선으로_, 또는 다른 _케이스를 씌운 벨트_로 전달합니다. 이 블록들은 축이 없는 면에 붙일 때 서로 연결됩니다. 방향이 일치할 필요는 없습니다.", - "block.create.encased_chain_drive.tooltip.condition1": "연결되었을 때", - "block.create.encased_chain_drive.tooltip.behaviour1": "연결된 블록들은 이 축과 같은 회전속도와 방얗을 가집니다.", - - "block.create.adjustable_chain_gearshift.tooltip": "ADJUSTABLE CHAIN GEARSHIFT", - "block.create.adjustable_chain_gearshift.tooltip.summary": "케이스를 씌운 벨트와 같은 역할을 가집니다. 또한 레드스톤 신호 세기에 따라 _회전_ _속도_를 _조정_할 수 있습니다.", - "block.create.adjustable_chain_gearshift.tooltip.condition1": "레드스톤 신호 설정", - "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "신호가 없다면, 인접한 벨트의 회전속도는 그대로 유지 됩니다. 최대 신호라면, 회전 속도가 정확히 2배가 됩니다. 중간 신호는 회전 속도를 1~2배 증가시킬 것입니다.", - - "item.create.belt_connector.tooltip": "BELT CONNECTOR", - "item.create.belt_connector.tooltip.summary": "두 개 이상의 _축_을 벨트로 연결할 수 있습니다. 연결된 축들은 _모두_ _같은_ _속도_와 _방향_을 가집니다. 벨트는 _아이템_이나 _엔티티_를 _옮길_ _수_ _있습니다_.", - "item.create.belt_connector.tooltip.control1": "축에다 우클릭", - "item.create.belt_connector.tooltip.action1": "첫번째 벨트 끝부분을 설정합니다. 두번째 축은 반드시 _수평_이나 _수직_, _대각선_ 방향에 있는 축에 연결해야합니다.", - "item.create.belt_connector.tooltip.control2": "웅크린 상태에서 우클릭", - "item.create.belt_connector.tooltip.action2": "첫번째 벨트 설정을 초기화합니다.", - "item.create.goggles.tooltip": "GOGGLES", "item.create.goggles.tooltip.summary": "_장치 정보_를 착용자의 시야에 띄어주는 안경입니다.", "item.create.goggles.tooltip.condition1": "장착했을 때", "item.create.goggles.tooltip.behaviour1": "해당 장치의 _속도_, _피로도_, _용량_을 레벨에 따라 에 따라 색상 UI를 보여줍니다.", "item.create.goggles.tooltip.condition2": "계측기를 바라볼 때", "item.create.goggles.tooltip.behaviour2": "계측기가 연결된 네트워크의 _속도_나 _스트레스_의 자세한 정보를 보여줍니다.", + "item.create.goggles.tooltip.condition3": "액체 용기를 바라볼 때", + "item.create.goggles.tooltip.behaviour3": "_용량_이 얼마나 되는지, _어떤 액체_가 들어있는 지 알려줍니다.", - "item.create.wrench.tooltip": "WRENCH", + "item.create.wrench.tooltip": "렌치", "item.create.wrench.tooltip.summary": "장치 구성에 유용한 도구입니다. 장치를 _회전_, _설정_, _해체_하는 데 쓰입니다.", "item.create.wrench.tooltip.control1": "장치에 우클릭", "item.create.wrench.tooltip.action1": "사용자가 바라보는 _면으로_ 혹은 _반대로_ 장치를 돌립니다.", "item.create.wrench.tooltip.control2": "웅크린 상태에서 우클릭", - "item.create.wrench.tooltip.action2": "_장치_를 _해체_하고 _즉시_ _인벤토리_로 넣습니다.", - - "block.create.creative_motor.tooltip": "CREATIVE MOTOR", - "block.create.creative_motor.tooltip.summary": "회전 속도를 _조정_할 수 있는 장치입니다.", - - "block.create.water_wheel.tooltip": "WATER WHEEL", - "block.create.water_wheel.tooltip.summary": "인접한 _물의_ _흐름_에서 얻은 회전을 제공합니다.", - - "block.create.encased_fan.tooltip": "ENCASED FAN", - "block.create.encased_fan.tooltip.summary": "회전력을 _바람으로_ 전환합니다. 다양한 용도로 사용 가능합니다.", - "block.create.encased_fan.tooltip.condition1": "레드스톤 신호를 받을 때", - "block.create.encased_fan.tooltip.behaviour1": "장치 아래의 _열_을 _회전력_으로 _바꾸어_ 제공합니다. 날개가 아래를 바라보아야 합니다.", - "block.create.encased_fan.tooltip.condition2": "돌려질 때", - "block.create.encased_fan.tooltip.behaviour2": "들어오는 회적 속도에 따라 엔티티를 밀거나 당깁니다.", - "block.create.encased_fan.tooltip.condition3": "특정 블록을 통해 바람을 보낼 때", - "block.create.encased_fan.tooltip.behaviour3": "공기 흐름에 _액체_ 혹은 _불꽃_ 효과가 _추가_됩니다. 이는 아이템을 _공정_하는데 쓰일 수 있습니다.", + "item.create.wrench.tooltip.action2": "_장치_를 _해체_하고 _즉시_ _보관함_으로 넣습니다.", "block.create.nozzle.tooltip": "NOZZLE", - "block.create.nozzle.tooltip.summary": "덮힌 환풍기 _앞_에 붙여 환풍기의 효과를 _전방_으로 _확대_합니다.", - - "block.create.hand_crank.tooltip": "HAND CRANK", - "block.create.hand_crank.tooltip.summary": "간단한 회전력을 제공합니다. 플레이어의 _상호작용_이 필요합니다.", - "block.create.hand_crank.tooltip.condition1": "사용될 때", - "block.create.hand_crank.tooltip.behaviour1": "연결된 장치에 _회전력_을 _제공_합니다. 웅크리면 _반대로_ 회전시킵니다.", - + "block.create.nozzle.tooltip.summary": "선풍기 _앞_에 붙여 선풍기의 효과를 _전방향_으로 _확대_합니다.", + "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", "block.create.cuckoo_clock.tooltip.summary": "_시간의_ _흐름_을 알고 공간을 _꾸미는_ 데 좋은 공예품입니다.", "block.create.cuckoo_clock.tooltip.condition1": "회전할 때", "block.create.cuckoo_clock.tooltip.behaviour1": "현재 시각을 보여주고 하루에 두 번 울립니다. 점심과 플레이어가 바로 잘 수 있는 저녁에 울립니다.", "block.create.turntable.tooltip": "TURNTABLE", - "block.create.turntable.tooltip.summary": "_회전력_으로 _멀미_를 일으킵니다.", - - "block.create.millstone.tooltip": "MILLSTONE", - "block.create.millstone.tooltip.summary": "투입된 _재료_를 _가는_ 데 좋은 장치입니다. 측면 톱니바퀴나 바닥에 축을 이어 작동합니다. 결과물은 직접 빼내야 합니다.", - "block.create.millstone.tooltip.condition1": "회전 할 때", - "block.create.millstone.tooltip.behaviour1": "옆이나 위에서 투입된 아이템을 _맷돌질_합니다.", - "block.create.millstone.tooltip.condition2": "우클릭할때", - "block.create.millstone.tooltip.behaviour2": "결과물을 직접 꺼냅니다.", - - "block.create.crushing_wheel.tooltip": "CRUSHING WHEEL", - "block.create.crushing_wheel.tooltip.summary": "모든 것을 _부숴버리는_ 큰 바퀴입니다.", - "block.create.crushing_wheel.tooltip.condition1": "다른 분쇄 휠과 붙어있을 때", - "block.create.crushing_wheel.tooltip.behaviour1": "다양한 것을 _분쇄_하는 분쇄 기계를 형성합니다. 휠의 이빨이 _같은_ _속력_으로, _반대_ _방향_으로 맞물려야합니다.", - - "block.create.mechanical_press.tooltip": "MECHANICAL PRESS", - "block.create.mechanical_press.tooltip.summary": "아래있는 아이템을 _눌러버리는_ 힘센 피스톤입니다. _지속적인_ _회전력_이 필요합니다.", - "block.create.mechanical_press.tooltip.condition1": "레드스톤 신호를 받았을 때", - "block.create.mechanical_press.tooltip.behaviour1": "_아래 있는_ 아이템을 누르기 시작합니다.", - "block.create.mechanical_press.tooltip.condition2": "컨베이어 벨트 위에 있을 때", - "block.create.mechanical_press.tooltip.behaviour2": "_자동으로_ 벨트 위를 지나가는 아이템을 누릅니다.", - "block.create.mechanical_press.tooltip.condition3": "대야 위에 있을 때", - "block.create.mechanical_press.tooltip.behaviour3": "필요한 재료들이 _들어올_ _때마다_ 아이템을 _압축_시킵니다.", - - "block.create.basin.tooltip": "BASIN", - "block.create.basin.tooltip.summary": "믹서나 압착기와 같이 쓰이는 간편한 _아이템_ _저장소_입니다. 레드스톤 비교기와 호환됩니다.", - "block.create.basin.tooltip.condition1": "자동 배출", - "block.create.basin.tooltip.behaviour1": "벨트, 다른 대야, 아이템 거치대, 아이템 배수구와 같은 열린 인벤토리가 대야 아래 있다면, 아이템/액체 조합 결과가 자동으로 옮겨집니다. 자동화에 유용합니다.", - - "block.create.blaze_burner.tooltip": "BLAZE HEATER", - "block.create.blaze_burner.tooltip.summary": "길들인 _블레이즈_를 통해 _대야_를 달구는 블록입니다.", - "block.create.blaze_burner.tooltip.condition1": "대야 아래 설치 할 때", - "block.create.blaze_burner.tooltip.behaviour1": "대야를 이용한 조합법에 _열_을 제공합니다.", - "block.create.blaze_burner.tooltip.condition2": "연료가 블레이즈 버너에 사용되었을 때", - "block.create.blaze_burner.tooltip.behaviour2": "_불타는_ _시간_을 화로 연료로 사용되는 시간만큼 늘립니다. _특별한_ _연료_로 최고 화력을 얻으세요.", - - "block.create.reinforced_rail.tooltip": "REINFORCED RAIL", - "block.create.reinforced_rail.tooltip.summary": "목재로 안정된 레일입니다. _지지대_가 _필요하지_ _않습니다_.", - - "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", - "block.create.mechanical_mixer.tooltip.summary": "아래있는 아이템을 조합할 혼합기입니다. _지속적인_ _회전력_과 한 칸 아래에 _대야_가 필요합니다.", - "block.create.mechanical_mixer.tooltip.condition1": "대야 위에 있을 때", - "block.create.mechanical_mixer.tooltip.behaviour1": "모든 필요한 아이템이 준비될 때마다 대야 안의 아이템을 섞기 시작합니다.", - "block.create.mechanical_mixer.tooltip.control1": "레드스톤 신호를 받았을 때", - "block.create.mechanical_mixer.tooltip.action1": "믹서를 멈춥니다. 재료를 _처음_ 조합할 때 유요합니다.", - - "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", - "block.create.mechanical_crafter.tooltip.summary": "모든 조합법을 _자동화_할 장치입니다. 조합법대로 여러개를 _격자_로 설치하고, 화살표를 돌려 _한_ _곳으로_ _모이게_ 설정해야합니다.", - "block.create.mechanical_crafter.tooltip.condition1": "회전할 때", - "block.create.mechanical_crafter.tooltip.behaviour1": "모든 조합칸에 있는 아이템들을 조합하기 시작합니다.", - "block.create.mechanical_crafter.tooltip.condition2": "레드스톤 신호를 받을 때", - "block.create.mechanical_crafter.tooltip.behaviour2": "_현재_ _격자_ 안에 있는 아이템들로 _조합_을 _강제로_ 시도합니다.", - "block.create.mechanical_crafter.tooltip.control1": "전면을 렌치로 조정할 때", - "block.create.mechanical_crafter.tooltip.action1": "각 기계식 조합기의 아이템 이동 방향을 설정합니다. 모든 조합기의 방향은 _하나의_ _최종_ _조합기_로 이동해야하며, 최종 조합기는 조합기 _바깥으로_ 아이템을 운송해야합니다.", - "block.create.mechanical_crafter.tooltip.control2": "측면/후면에서 렌치로 조정할 때", - "block.create.mechanical_crafter.tooltip.action2": "인접한 조합기와 입력 공간을 _연결_합니다. 이를 통해 일일히 아이템을 넣는 노력을 줄일 수 있습니다.", - - "block.create.furnace_engine.tooltip": "FURNACE ENGINE", - "block.create.furnace_engine.tooltip.summary": "_화로의_ _작동_을 필요로 하는 강력한 회전 동력원입니다.", - "block.create.furnace_engine.tooltip.condition1": "작동하는 화로에 붙였을 때", - "block.create.furnace_engine.tooltip.behaviour1": "붙어있는(한칸 띄어져있는) _플라이휠_에 동력을 공급합니다. _용광로_는 _두_ _배_의 화력을 냅니다.", - - "block.create.flywheel.tooltip": "FLYWHEEL", - "block.create.flywheel.tooltip.summary": "붙어있는 _화로_ _엔진_에서 생산된 힘을 안정시키고 _동력화_하는 거대한 금속 바퀴입니다. 화로 엔진으로부터 _한_ _칸_ _떨어져_ 설치해야 합니다.", - "block.create.flywheel.tooltip.condition1": "작동하는 엔진에 붙었을 때", - "block.create.flywheel.tooltip.behaviour1": "엔진의 힘에 따라 연결된 장치에 _회전력_을 제공합니다.", - - "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", - "block.create.portable_storage_interface.tooltip.summary": "움직이는 피스톤, 베어링, 수레, 밧줄 도르래에서 _아이템을_ _교환하는_ 장치입니다. 두 인터페이스는 _서로 마주보고_ _1-2블록_ 떨어져있어야 합니다.", - "block.create.portable_storage_interface.tooltip.condition1": "움직일 때", - "block.create.portable_storage_interface.tooltip.behaviour1": "_고정된 인터페이스_와 아이템을 주고 받습니다. 고정된 인터페이스에 아이템을 수송하는 것은 _움직이는 장치와 직접 수송하는 것_과 같습니다. 아이템이 이동하는 동안 움직이는 장치는 _멈춥니다_.", - "block.create.portable_storage_interface.tooltip.condition2": "레드스톤 신호를 받을 때", - "block.create.portable_storage_interface.tooltip.behaviour2": "활성화된 연결을 _해제_합니다.", - - "block.create.portable_fluid_interface.tooltip": "PORTABLE FLUID INTERFACE", - "block.create.portable_fluid_interface.tooltip.summary": "움직이는 피스톤, 베어링, 수레, 밧줄 도르래에서 _액체를_ _교환하는_ 휴대용 장치입니다. 두 인터페이스는 _서로 마주보고_ _1-2블록_ 떨어져있어야 합니다.", - "block.create.portable_fluid_interface.tooltip.condition1": "움직일 때", - "block.create.portable_fluid_interface.tooltip.behaviour1": "_고정된 인터페이스_와 액체를 주고 받습니다. 고정된 인터페이스에 액체를 수송하는 것은 _움직이는 장치에 직접 수송하는 것_과 같습니다. 액체가 이동하는 동안 움직이는 장치는 _멈춥니다_", - "block.create.portable_fluid_interface.tooltip.condition2": "레드스톤 신호를 받을 때", - "block.create.portable_fluid_interface.tooltip.behaviour2": "활성화된 연결을 _해제_합니다.", - - "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", - "block.create.rotation_speed_controller.tooltip.summary": "해당 톱니바퀴의 속도를 _변경_할 수 있는 컨트롤러입니다.", - "block.create.rotation_speed_controller.tooltip.condition1": "큰 톱니바퀴와 연결되었을 때", - "block.create.rotation_speed_controller.tooltip.behaviour1": "들어오는 회전력을 받아, 대상의 속도를 변경합니다. _큰_ _톱니바퀴_가 컨트롤러 위에 있어야합니다.", - - "block.create.mechanical_piston.tooltip": "MECHANICAL PISTON", - "block.create.mechanical_piston.tooltip.summary": "_피스톤_의 업그레이드 버전입니다. 회전력을 사용해 연결된 구조물을 옮깁니다. _피스톤_ _연장_ _축_을 후면에 붙여 이 장치의 사거리를 늘이거나 줄일 수 있습니다. 축이 없다면 움직이지 않습니다. _섀시_나 _슬라임_ _블록_을 붙여 일직선의 블록들을 움직일 수 있습니다.", - "block.create.mechanical_piston.tooltip.condition1": "회전될 때", - "block.create.mechanical_piston.tooltip.behaviour1": "붙어있는 구조물을 움직이기 시작합니다. 속도와 방향은 들어오는 회전 속도와 방향에 따라 달라집니다.", - - "block.create.piston_extension_pole.tooltip": "PISTON POLE", - "block.create.piston_extension_pole.tooltip.summary": "기계식 피스톤의 _사거리_를 늘려줍니다.", - "block.create.piston_extension_pole.tooltip.condition1": "기계식 피스톤에 연결했을 때", - "block.create.piston_extension_pole.tooltip.behaviour1": "피스톤의 사거리를 한 블록 늘립니다.", - - "block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING", - "block.create.mechanical_bearing.tooltip.summary": "큰 구조물을 _회전_시키거나 _바람으로부터_ 회전력을 얻습니다.", - "block.create.mechanical_bearing.tooltip.condition1": "회전될 때", - "block.create.mechanical_bearing.tooltip.behaviour1": "연결된 블록들을 돌리기 시작합니다. _섀시_나 _슬라임_ _블록_을 이용해 더 많은 블록을 움직이세요.", - - "block.create.windmill_bearing.tooltip": "WINDMILL BEARING", - "block.create.windmill_bearing.tooltip.summary": "_바람_을 _회전력으로 바꾸는 데_ 사용됩니다. 당신의 디자인을 붙이고 도는 걸 감사하세요!", - "block.create.windmill_bearing.tooltip.condition1": "우클릭했을 때", - "block.create.windmill_bearing.tooltip.behaviour1": "_붙여진 구조물_의 _회전_으로 얻어진 회전력을 제공합니다. 구조물은 _날개_나 _양털_을 포함해야합니다. _섀시, 슬라임볼, 강력 접착제_를 이용하여 여러 블록을 움직여보세요.", - - "block.create.sail_frame.tooltip": "SAIL FRAME", - "block.create.sail_frame.tooltip.summary": "유용한 건축 블록이며, _풍차 베어링_에 달아 동력을 만들 수도 있습니다.", - - "block.create.white_sail.tooltip": "SAIL", - "block.create.white_sail.tooltip.summary": "유용한 건축 블록이며, _풍차 베어링_에 달아 동력을 만들 수도 있습니다. 다양한 색깔이 있습니다.", - "block.create.white_sail.tooltip.condition1": "염료를 들고 우클릭", - "block.create.white_sail.tooltip.behaviour1": "날개의 색깔을 바꿉니다.", - - "block.create.clockwork_bearing.tooltip": "CLOCKWORK BEARING", - "block.create.clockwork_bearing.tooltip.summary": "현재 _인게임_ _시간_을 알려주는 _시침_, _분침_을 돌리는 업그레이드된 베어링입니다.", - "block.create.clockwork_bearing.tooltip.condition1": "회전될 때", - "block.create.clockwork_bearing.tooltip.behaviour1": "현재 시간에 맞춰 연결된 구조물을 _시침_으로써 돌리기 시작합니다. _다른_ _종류의_ _섀시_가 있다면, _분침_처럼 돌립니다.", - - "block.create.sequenced_gearshift.tooltip": "SEQUENCED GEARSHIFT", - "block.create.sequenced_gearshift.tooltip.summary": "연속으로 5개의 회전 명령을 내릴 수 있는 _프로그램이_ _가능한_ 장치입니다. 이것으로 베어링, 피스톤, 도르래의 움직임과 타이밍을 정할 수 있습니다. 빠른 속력에는 부정확해질 수 있습니다.", - "block.create.sequenced_gearshift.tooltip.condition1": "레드스톤 신호를 받을 때", - "block.create.sequenced_gearshift.tooltip.behaviour1": "입력 속도에 따른 프로그램된 명령들을 수행하기 시작합니다.", - "block.create.sequenced_gearshift.tooltip.condition2": "우클릭했을 때", - "block.create.sequenced_gearshift.tooltip.behaviour2": "설정 창을 엽니다.", - - "block.create.cart_assembler.tooltip": "CART ASSEMBLER", - "block.create.cart_assembler.tooltip.summary": "레일 위에 설치되었을 때, 지나가는 _광산_ _수레_에 연결된 구조물을 _설치/해체_합니다. [Ctrl]키를 눌러 레일 종류에 따른 작동 방법을 알아보세요.", - "block.create.cart_assembler.tooltip.condition1": "단일 수레 장치", - "block.create.cart_assembler.tooltip.behaviour1": "_한 조립기_만 있다면, 구조물은 _한 수레에만_ 연결됩니다. _렌치_를 이용해 _특정 회전 동작_을 설정하세요.", - "block.create.cart_assembler.tooltip.condition2": "기차 장치", - "block.create.cart_assembler.tooltip.behaviour2": "_구조물로 연결된_ 두 카트 조립기는 _모두_ 수레를 가지고 있을 때 _구조물로 두 수레를 연결_합니다. 구조물은 _광산 수레 커플링_과 유사하게 기능합니다.", - "block.create.cart_assembler.tooltip.control1": "레일 위에 설치되었을 때", - "block.create.cart_assembler.tooltip.action1": "신호를 받았을 때 _조립_하고, 아니라면 _해체_합니다.", - "block.create.cart_assembler.tooltip.control2": "전동 레일 위에 설치되었을 때", - "block.create.cart_assembler.tooltip.action2": "신호를 받았을 때 _조립_하고 _가속_하지만, 아니라면 _해체_하고 _멈춥니다_.", - "block.create.cart_assembler.tooltip.control3": "탐지 레일 위에 설치되었을 때", - "block.create.cart_assembler.tooltip.action3": "해체된 수레를 _조립_하고, 조립된 수레를 _해체_합니다.", - "block.create.cart_assembler.tooltip.control4": "활성화 레일 위에 설치되었을 때", - "block.create.cart_assembler.tooltip.action4": "신호를 받았을 때 _해체_합니다.", - - "block.create.rope_pulley.tooltip": "ROPE PULLEY", - "block.create.rope_pulley.tooltip.summary": "_수직으로_ 붙은 구조물을 움직입니다. _섀시_나 _슬라임_ _블록_을 붙여 일직선의 블록들을 움직일 수 있습니다.", - "block.create.rope_pulley.tooltip.condition1": "회전될 때", - "block.create.rope_pulley.tooltip.behaviour1": "연결된 구조물을 움직이기 시작합니다. 속도와 방향은 들어오는 회전 속도, 방향에 따라 다릅니다.", - - "block.create.linear_chassis.tooltip": "TRANSLATION CHASSIS", - "block.create.linear_chassis.tooltip.summary": "연결된 구조물의 이동을 _도와주는_ 베이스 블록입니다.", - "block.create.linear_chassis.tooltip.condition1": "움직일 때", - "block.create.linear_chassis.tooltip.behaviour1": "섀시의 _기둥_ _방향_으로 붙어있는 모든 블록들을 같은 방향으로 옮깁니다. 블록들은 섀시가 끈끈할 때만 당겨집니다 ([Ctrl]를 누르세요).", - "block.create.linear_chassis.tooltip.condition2": "렌치로 조정할 때", - "block.create.linear_chassis.tooltip.behaviour2": "대상 섀시의 _사거리_를 조정합니다. 또는 CTRL을 눌러 인접한 모든 섀시의 사거리를 조정합니다.", - "block.create.linear_chassis.tooltip.control1": "슬라임 볼로 우클릭", - "block.create.linear_chassis.tooltip.action1": "대상 면을 끈끈하게 만듭니다. 당겨질 때, 섀시는 연결된 _모든_ _블록_을 움직이는 방향에 상관없이 당깁니다.", - - "block.create.secondary_linear_chassis.tooltip": "SECONDARY LINEAR CHASSIS", - "block.create.secondary_linear_chassis.tooltip.summary": "다른 타입의 직선 섀시와 _이어지지_ _않는_ 두번째 종류의 직선 섀시입니다.", - - "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", - "block.create.radial_chassis.tooltip.summary": "연결된 구조물의 이동을 _도와주는_ 베이스 블록입니다.", - "block.create.radial_chassis.tooltip.condition1": "움직일 때", - "block.create.radial_chassis.tooltip.behaviour1": "섀시의 _원_ _방향_으로 붙어있는 모든 블록들을 같은 방향으로 옮깁니다. 블록들이 섀시가 끈끈한 면에 붙어있을 때만 움직입니다 ([Ctrl]를 누르세요).", - "block.create.radial_chassis.tooltip.condition2": "렌치로 조정할 때", - "block.create.radial_chassis.tooltip.behaviour2": "대상 섀시의 _사거리_를 조정합니다. 또는 CTRL을 눌러 인접한 모든 섀시의 사거리를 조정합니다.", - "block.create.radial_chassis.tooltip.control1": "슬라임 볼로 우클릭", - "block.create.radial_chassis.tooltip.action1": "대상 면을 끈끈하게 만듭니다. 당겨질 때, 끈끈한 면에 붙은 _모든_ _블록_을 움직이게 합니다", - - "block.create.mechanical_drill.tooltip": "MECHANICAL mechanical_drill", - "block.create.mechanical_drill.tooltip.summary": "블록을 _파괴하는_ 데 적합한 장치입니다. 베어링이나 기계식 피스톤으로 움직여집니다.", - "block.create.mechanical_drill.tooltip.condition1": "회전될 때", - "block.create.mechanical_drill.tooltip.behaviour1": "고정되어 블록을 부숩니다. 또한 해당영역의 엔티티에게 피해를 줍니다.", - "block.create.mechanical_drill.tooltip.condition2": "움직일 때", - "block.create.mechanical_drill.tooltip.behaviour2": "드릴이 부딫히는 모든 블록을 부숩니다.", - - "block.create.mechanical_harvester.tooltip": "MECHANICAL mechanical_harvester", - "block.create.mechanical_harvester.tooltip.summary": "중간 크기의 작물 자동화에 적합한 _작물_ _수확기_입니다. 베어링이나 기계식 피스톤으로 움직여집니다.", - "block.create.mechanical_harvester.tooltip.condition1": "움직일 때", - "block.create.mechanical_harvester.tooltip.behaviour1": "칼날에 닿는 모두 자란 작물을 수확하고 최초 성장 상태로 변경합니다.", - - "block.create.mechanical_plough.tooltip": "MECHANICAL PLOUGH", - "block.create.mechanical_plough.tooltip.summary": "다양한 용도로 쓸 수 있는 _쟁기_입니다. 기계식 피스톤, 베어링이나 기계식 피스톤으로 움직여집니다.", - "block.create.mechanical_plough.tooltip.condition1": "움직일 때", - "block.create.mechanical_plough.tooltip.behaviour1": "횃불, 눈, 레일 등 _통과되는_ 블록들을 부숩니다. 엔티티를 _해치지_ _않습니다_. _괭이_를 사용한 것처럼 땅도 갑니다.", - - "block.create.mechanical_saw.tooltip": "MECHANICAL mechanical_saw", - "block.create.mechanical_saw.tooltip.summary": "효율적인 _벌목_과 블록을 _제재_하는데 적합합니다. 베어링이나 기계식 피스톤으로 움직여집니다.", - "block.create.mechanical_saw.tooltip.condition1": "위를 바라볼 때", - "block.create.mechanical_saw.tooltip.behaviour1": "_제재_와 _석재_ _절단_ 조합법을 떨어진/투입된 아이템에 적용합니다. 결과물이 여러 종류고 필터가 적용이 되지 않았다면, 결과물은 _목록_ _순서_대로 배출됩니다.", - "block.create.mechanical_saw.tooltip.condition2": "옆을 바라볼 때", - "block.create.mechanical_saw.tooltip.behaviour2": "앞에 있는 원목을 자릅니다. 나무의 원목이라면, 나무가 쓰러지면서 아이템을 떨굽니다.", - "block.create.mechanical_saw.tooltip.condition3": "움직일 때", - "block.create.mechanical_saw.tooltip.behaviour3": "톱이 만나는 모든 나무를 벱니다.", + "block.create.turntable.tooltip.summary": "_동력_으로 _멀미_를 일으킵니다.", "block.create.stockpile_switch.tooltip": "stockpile_switch", - "block.create.stockpile_switch.tooltip.summary": "붙어있는 _저장소_에 들어있는 아이템을 기반으로 레드스톤 신호를 보냅니다. 필터도 제공됩니다. _비교기_와 반대로, 수량 스위치는 신호가 반전되는 _임계점_을 조절할 수 있습니다.", - "block.create.stockpile_switch.tooltip.condition1": "우클릭 할 때", - "block.create.stockpile_switch.tooltip.behaviour1": "UI를 엽니다.", + "block.create.stockpile_switch.tooltip.summary": "붙어있는 _보관함_에 들어있는 아이템을 기반으로 레드스톤 신호를 보냅니다. 필터도 제공됩니다. _비교기_와 반대로, 수량 스위치는 신호가 반전되는 _임계점_을 조절할 수 있습니다.", + "block.create.stockpile_switch.tooltip.condition1": "우클릭", + "block.create.stockpile_switch.tooltip.behaviour1": "설정 창을 엽니다.", "block.create.content_observer.tooltip": "CONTENT OBSERVER", - "block.create.content_observer.tooltip.summary": "저장소나 벨트의 아이템을 등록된 _필터_를 이용해 _탐지_합니다. _인벤토리, 벨트, 슈트_ 안에 해당 아이템을 탐지하는 동안, 레드스톤 신호를 보냅니다. _깔대기_가 해당 아이템을 수송하면, _1틱_의 레드스톤 신호를 보냅니다.", - - "block.create.redstone_link.tooltip": "REDSTONE LINK", - "block.create.redstone_link.tooltip.summary": "_무선_ 레드스톤 단말기입니다. 아무 아이템으로 두 개의 _주파수_를 설정할 수 있습니다. 통신거리는 제한되어 있지만, 그래도 충분히 넓습니다.", - "block.create.redstone_link.tooltip.condition1": "신호를 줄 때", - "block.create.redstone_link.tooltip.behaviour1": "같은 주파주의 다른 단말기에서 레드스톤 신호를 받습니다.", - "block.create.redstone_link.tooltip.control1": "아이템을 들고 우클릭", - "block.create.redstone_link.tooltip.action1": "그 아이템으로 주파수를 설정합니다. 주파수는 최대 두가지 아이템 조합으로 이룰 수 있습니다.", - "block.create.redstone_link.tooltip.control2": "웅크린 상태에서 우클릭", - "block.create.redstone_link.tooltip.action2": "수신/발신 모드로 바꿉니다.", - - "block.create.nixie_tube.tooltip": "NIXIE TUBE", - "block.create.nixie_tube.tooltip.summary": "숫자와 문자를 나타내는 멋진 표시등입니다.", - "block.create.nixie_tube.tooltip.condition1": "레드스톤 신호를 받을 때", - "block.create.nixie_tube.tooltip.behaviour1": "_현재_ 레드스톤 _신호_ _세기_를 표시합니다.", - "block.create.nixie_tube.tooltip.condition2": "이름표를 사용할 때", - "block.create.nixie_tube.tooltip.behaviour2": "한 줄로 놓인 표시등에 _문자_를 표시합니다.", - - "block.create.redstone_contact.tooltip": "REDSTONE redstone_contact", - "block.create.redstone_contact.tooltip.summary": "_한_ _쌍_이 _서로_ _바라보고_ 있을 때 레드스톤 신호를 보냅니다. 베어링이나 기계식 피스톤으로 움직여집니다.", - "block.create.redstone_contact.tooltip.condition1": "다른 동형 감지기를 맞댈 때", - "block.create.redstone_contact.tooltip.behaviour1": "레드스톤 신호를 보냅니다.", - "block.create.redstone_contact.tooltip.condition2": "움직일 때", - "block.create.redstone_contact.tooltip.behaviour2": "지나가는 모든 고정된 동형 감지기를 작동시킵니다.", + "block.create.content_observer.tooltip.summary": "보관함이나 벨트의 아이템을 등록된 _필터_를 이용해 _탐지_합니다. _보관함, 벨트, 슈트_ 안에 해당 아이템을 탐지하는 동안, 레드스톤 신호를 보냅니다. _퍼널_가 해당 아이템을 수송하면, _1틱_의 레드스톤 신호를 보냅니다.", "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", - "block.create.adjustable_crate.tooltip.summary": "이 저장소는 용량을 _직접_ _정할_ 수 있습니다. 아무아이템이나 최대 16스택씩 담을 수 있습니다. 레드스톤 비교기와 호환됩니다.", - "block.create.adjustable_crate.tooltip.control1": "우클릭 했을 때", - "block.create.adjustable_crate.tooltip.action1": "창을 엽니다.", + "block.create.adjustable_crate.tooltip.summary": "이 보관함는 용량을 _직접_ _정할_ 수 있습니다. 아무아이템이나 최대 16스택씩 담을 수 있습니다. 레드스톤 비교기와 호환됩니다.", + "block.create.adjustable_crate.tooltip.condition1": "우클릭", + "block.create.adjustable_crate.tooltip.behaviour1": "설정 창을 엽니다.", "block.create.creative_crate.tooltip": "THE ENDLESS CRATE", "block.create.creative_crate.tooltip.summary": "이 상자는 아무 아이템을 _무한히_ 저장합니다. 청사진 대포 옆에 놓을 시 준비물을 _전부_ 공급합니다.", "block.create.creative_crate.tooltip.condition1": "필터에 아이템을 설정할 시", "block.create.creative_crate.tooltip.behaviour1": "선택된 아이템을 _무한정_으로 _빼낼_ 수 있습니다. 대신 _들어간_ 아이템은 _삭제_됩니다.", - "block.create.deployer.tooltip": "DEPLOYER", - "block.create.deployer.tooltip.summary": " _때리고_, _사용하고_ _작동시킵니다_. 이 장치는 _플레이어_를 가능한 한 _흉내내려할_ _것입니다_. 주변 인벤토리에서 아이템을 쓰거나 넣을 수 있습니다.", - "block.create.deployer.tooltip.condition1": "회전될 때", - "block.create.deployer.tooltip.behaviour1": "팔을 늘려 한 칸앞에 있는 공간에서 행동합니다.", - "block.create.deployer.tooltip.condition2": "렌치로 우클릭할 때", - "block.create.deployer.tooltip.behaviour2": "_공격_ _모드_로 바꿉니다. 이 상태에서는 배포기가 아이템을 가지고 _부수거나_ _때리려고_ 할 것입니다.", - "block.create.deployer.tooltip.condition3": "필터를 설정했을 때", - "block.create.deployer.tooltip.behaviour3": "_필터_에 맞지 않는 아이템은 사용하지 않습니다. 필터에 맞지 않는 아이템은 빼내거나 넣을 수 없습니다.", - - "block.create.brass_casing.tooltip": "BRASS CASING", - "block.create.brass_casing.tooltip.summary": "다양한 용도로 쓰일 수 있는 단단한 기계 케이스입니다. 장식용으로 써도 무방합니다. _축_이나 _벨트_에 _씌울 수 있습니다_.", - - "block.create.pulse_repeater.tooltip": "PULSE REPEATER", - "block.create.pulse_repeater.tooltip.summary": "_1틱_의 레드스톤 신호를 보내는 간단한 리피터입니다.", - - "block.create.adjustable_repeater.tooltip": "FLEX REPEATER", - "block.create.adjustable_repeater.tooltip.summary": "최대 30분까지 _딜레이_를 설정할 수 있는 업그레이드된 _레드스톤_ _리피터_입니다.", - - "block.create.adjustable_pulse_repeater.tooltip": "FLEX PULSE REPEATER", - "block.create.adjustable_pulse_repeater.tooltip.summary": "최대 30분까지 _딜레이_를 설정할 수 있는 _펄스_ _리피터_입니다.", - - "block.create.analog_lever.tooltip": "ANALOG LEVER", - "block.create.analog_lever.tooltip.summary": "레드스톤 _신호_ _세기_를 자세히 _조정_할 수 있는 레버입니다.", - - "block.create.powered_toggle_latch.tooltip": "POWERED TOGGLE LATCH", - "block.create.powered_toggle_latch.tooltip.summary": "레드스톤 신호로 끄고 켤 수 있는 _레버_입니다.", - - "block.create.powered_latch.tooltip": "POWERED LATCH", - "block.create.powered_latch.tooltip.summary": "레드스톤 신호로 컨트롤 할 수 있는 _레버_입니다. 후면에서 들어오는 신호는 레버를 키고, 측면에서 들어오는 신호는 레버를 초기화합니다.", - "block.create.controller_rail.tooltip": "CONTROLLER RAIL", "block.create.controller_rail.tooltip.summary": "_광산 수레_의 _이동속도_를 _세밀하게_ _조정_할 수 있는 _양방향_ _전동 레일_입니다.", "block.create.controller_rail.tooltip.condition1": "레드스톤 신호를 받을 때", "block.create.controller_rail.tooltip.behaviour1": "_신호 세기에 따라_ 지나가는 수레를 _가속, 감속_합니다. 레드스톤 신호는 다른 방향 레일에도 전달됩니다. 두 방향레일에 다른 세기를 전달하면 중간 레일들은 두 세기 사이의 신호를 받습니다.", - "block.create.speedometer.tooltip": "SPEEDOMETER", - "block.create.speedometer.tooltip.summary": "연결된 장치의 _회전_ _속도_를 _계측_하고 _나타냅니다_. 레드스톤 비교기와 호환됩니다.", - "block.create.speedometer.tooltip.condition1": "회전될 때", - "block.create.speedometer.tooltip.behaviour1": "속도에 따라 색깔을 나타냅니다. _초록색_은 _느림_을, _파랑색_은 _보통_, _보라색_은 _빠른_ _속도_를 나타냅니다. 몇몇 장치들은 작동하기 위해 일정수준 이상의 속도가 필요합니다.", - - "block.create.stressometer.tooltip": "STRESSOMETER", - "block.create.stressometer.tooltip.summary": "연결된 네트워크의 _전체_ _피로도_ _수치_를 _계측_하고 _나타냅니다_. 레드스톤 비교기와 호환됩니다.", - "block.create.stressometer.tooltip.condition1": "회전될 때", - "block.create.stressometer.tooltip.behaviour1": "피로도에 따라 색깔을 나타냅니다. _과부화된_ _네트워크_는 움직이는 것을 멈춥니다. 과부하는 네트워크에 _추가_ _피로도_ _용량_을 가진 장치를 설치하면 해결됩니다. ", - "item.create.sand_paper.tooltip": "SAND PAPER", "item.create.sand_paper.tooltip.summary": "재료들을 _윤내는 데_ 쓰이는 거친 종이입니다. 배포기가 자동으로 쓸 수 있습니다.", "item.create.sand_paper.tooltip.condition1": "사용할 때", "item.create.sand_paper.tooltip.behaviour1": "_다른 손_에있는 아이템과 _바닥에 있는 아이템_을 윤냅니다.", - - "item.create.super_glue.tooltip": "SUPER GLUE", - "item.create.super_glue.tooltip.summary": "블록 사이에 풀칠하면, 절대 떨어지지 않습니다.", - "item.create.super_glue.tooltip.condition1": "사용했을 때", - "item.create.super_glue.tooltip.behaviour1": "선택한 블록의 면을 _끈끈하게_ 만듭니다. 끈끈한 면에 붙은 다른 블록은 기계식 피스톤, 베어링 등에 _같이_ _움직이게_ 됩니다.", - "item.create.super_glue.tooltip.condition2": "다른 손에 들고 있을 때", - "item.create.super_glue.tooltip.behaviour2": "블록을 설치할 때 그것이 _설치된_ _곳_에 _자동으로_ 풀칠합니다.", "item.create.builders_tea.tooltip": "BUILDERS TEA", - "item.create.builders_tea.tooltip.summary": "하루를 시작하기에 좋은 음료입니다. _ 새로운 영감_을 줍니다.", + "item.create.builders_tea.tooltip.summary": "하루를 시작하기에 좋은 음료입니다. _새로운 영감_을 줍니다.", "item.create.refined_radiance.tooltip": "REFINED RADIANCE", "item.create.refined_radiance.tooltip.summary": "_흡수된_ _빛_으로 제련된 색채 혼합물입니다.", @@ -1781,13 +1490,53 @@ "item.create.shadow_steel.tooltip": "SHADOW STEEL", "item.create.shadow_steel.tooltip.summary": "_공허_에서 제련된 색채 혼합물입니다.", + "item.create.linked_controller.tooltip": "LINKED CONTROLLER", + "item.create.linked_controller.tooltip.summary": "_여섯_ _버튼_으로 _레드스톤_ _링크_와 연결되는 _휴대용_ _조작기_입니다.", + "item.create.linked_controller.tooltip.condition1": "우클릭", + "item.create.linked_controller.tooltip.behaviour1": "조작기를 킵니다. 조작하면서 _움직일_ _수_ _없습니다_.", + "item.create.linked_controller.tooltip.condition2": "웅크리면서 우클릭", + "item.create.linked_controller.tooltip.behaviour2": "_설정_ _창_을 엽니다.", + "item.create.linked_controller.tooltip.condition3": "레드스톤 링크 수신기에 우클릭", + "item.create.linked_controller.tooltip.behaviour3": "_연결_ _모드_를 활성화하고, _여섯_ _버튼_ 중 하나를 눌러 조작기를 주파수와 연결합니다.", + "item.create.linked_controller.tooltip.condition4": "독서대에 우클릭", + "item.create.linked_controller.tooltip.behaviour4": "조작기를 독서대에 올려놓아 쉽게 조작할 수 있습니다. (웅크리면서 우클릭으로 회수헙니다.)", + + "item.create.diving_helmet.tooltip": "DIVING HELMET", + "item.create.diving_helmet.tooltip.summary": "_구리_ _산소통_과 함께, 착용자가 물 속에서 _오랫동안_ _호흡_할 수 있게합니다.", + "item.create.diving_helmet.tooltip.condition1": "착용했을 때", + "item.create.diving_helmet.tooltip.behaviour1": "산소통에서 공기를 느리게 빨아들이며 _수중_ _호흡_ 효과를 제공합니다.", + + "item.create.copper_backtank.tooltip": "COPPER BACKTANK", + "item.create.copper_backtank.tooltip.summary": "공기를 옮길 수 있는 _착용가능한_ 탱크입니다.", + "item.create.copper_backtank.tooltip.condition1": "착용했을 때", + "item.create.copper_backtank.tooltip.behaviour1": "필요한 장비에 _공기_를 제공합니다.", + "item.create.copper_backtank.tooltip.condition2": "설치되고 동력으로 회전될 때", + "item.create.copper_backtank.tooltip.behaviour2": "동력 속도에 따라 _공기_를 _모읍니다_.", + + "item.create.diving_boots.tooltip": "DIVING BOOTS", + "item.create.diving_boots.tooltip.summary": "해저를 돌아다니기에 적합한 _무거운_ _부츠_ 한 켤레입니다.", + "item.create.diving_boots.tooltip.condition1": "착용했을 때", + "item.create.diving_boots.tooltip.behaviour1": "착용자는 빠르게 가라앉고 _수영_할 수 _없습니다_. 대신 물 속에서 _걷고_, _뛸_ 수 있습니다. 또한 _벨트_에 영향받지 않습니다.", + + "item.create.crafting_blueprint.tooltip": "CRAFTING BLUEPRINT", + "item.create.crafting_blueprint.tooltip.summary": "벽에 설치해 _특정_ _재료_로 더 _쉽게_ _조합_할 수 있습니다. 각 슬롯은 조합법을 나타냅니다.", + "item.create.crafting_blueprint.condition1": "빈 슬롯을 우클릭", + "item.create.crafting_blueprint.behaviour1": "_조합법_과 전시할 아이템을 설정하는 창을 엽니다.", + "item.create.crafting_blueprint.condition2": "설정된 슬롯에 우클릭", + "item.create.crafting_blueprint.behaviour2": "자신의 _인벤토리_에서 해당 슬롯의 _조합법_을 _실행_합니다. _웅크리면서_ 우클릭하면 한 번에 여러개를 조합합니다.", + "item.create.minecart_coupling.tooltip": "MINECART COUPLING", "item.create.minecart_coupling.tooltip.summary": "당신의 모든 _수레들을 이어 _멋진 _기차_를 만들어보세요.", "item.create.minecart_coupling.tooltip.condition1": "광산 수레에 사용할 때", "item.create.minecart_coupling.tooltip.behaviour1": "_두 수레를 묶어_ 이동할 때 고정된 _거리를 유지하게_ 합니다.", - "item.create.crafter_slot_cover.tooltip": "SLOT COVER", - "item.create.crafter_slot_cover.tooltip.summary": "기계 조합기에서 _빈_ _슬롯_을 표시하기 위해 쓰입니다. 조합기들은 정사각형 모양을 형성할 필요는 없습니다. 재료가 서로 대각선인 조합법이있을 때 유용합니다.", + "block.create.peculiar_bell.tooltip": "PECULIAR BELL", + "block.create.peculiar_bell.tooltip.summary": "장식을 위한 황동 종입니다. 영혼 불꽃 위에 설치하면 _기이한_ 일이 일어난다고 합니다...", + + "block.create.haunted_bell.tooltip": "HAUNTED BELL", + "block.create.haunted_bell.tooltip.summary": "지옥의 길잃은 영혼들이 씌인 _저주받은_ 종입니다.", + "block.create.haunted_bell.tooltip.condition1": "들고 있거나 종을 울릴 때", + "block.create.haunted_bell.tooltip.behaviour1": "_적대적_ _몹_이 생성되는 _빛이_ _없는_ 자리를 표시합니다.", "create.tooltip.wip": "WIP", "create.tooltip.workInProgress": "Work in progress!", @@ -1801,5 +1550,816 @@ "create.tooltip.randomWipDescription7": "This one maybe isn't for you. What about that one?", "create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.", + "_": "->------------------------] Ponder Content [------------------------<-", + + "create.ponder.hold_to_ponder": "[%1$s]키를 눌러 분석하기", + "create.ponder.subject": "분석의 주제", + "create.ponder.pondering": "분석 중입니다...", + "create.ponder.identify_mode": "탐색모드가 활성화되어 있습니다. \n[%1$s]를 눌러 중지합니다.", + "create.ponder.associated": "연관된 항목들", + "create.ponder.close": "닫기", + "create.ponder.identify": "탐색", + "create.ponder.next": "다음 장면", + "create.ponder.previous": "이전 장면", + "create.ponder.replay": "다시 재생", + "create.ponder.think_back": "되돌아가기", + "create.ponder.slow_text": "편하게 읽기", + "create.ponder.exit": "나가기", + "create.ponder.welcome": "분석 메뉴에 어서오세요", + "create.ponder.categories": "Create에서 둘러볼 수 있는 목록들", + "create.ponder.index_description": "아이콘을 클릭해 관련 아이템과 블록에 대해 알아볼 수 있습니다.", + "create.ponder.index_title": "분석 메뉴 제목", + "create.ponder.shared.movement_anchors": "섀시나 강력 접착제를 이용해 큰 구조물도 옮길 수 있습니다.", + "create.ponder.shared.rpm32": "32 RPM", + "create.ponder.shared.sneak_and": "웅크리기 +", + "create.ponder.shared.storage_on_contraption": "구조물에 부착된 보관함은 구조물이 떨어뜨린 아이템을 자동으로 줍습니다.", + "create.ponder.shared.behaviour_modify_wrench": "이 기능은 렌치를 이용해 변경할 수 있습니다.", + "create.ponder.shared.rpm8": "8 RPM", + "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm16_source": "기본 속도: 16 RPM", + "create.ponder.shared.rpm16": "16 RPM", + "create.ponder.tag.kinetic_sources": "동력 생산", + "create.ponder.tag.kinetic_sources.description": "동력을 생산하는 장치입니다.", + "create.ponder.tag.contraption_actor": "구조물 장치", + "create.ponder.tag.contraption_actor.description": "움직이는 구조물에 부착되어 특정 기능을 수행하는 장치입니다.", + "create.ponder.tag.arm_targets": "기계 팔의 목표 대상", + "create.ponder.tag.arm_targets.description": "기계 팔이 가져가거나 놓을 곳으로 선택할 수 있는 부품입니다.", + "create.ponder.tag.logistics": "아이템 수송", + "create.ponder.tag.logistics.description": "아이템을 옮기는데 도움을 줄 부품입니다.", + "create.ponder.tag.movement_anchor": "이동 고정장치", + "create.ponder.tag.movement_anchor.description": "부착된 구조물을 다양한 방법으로 움직이게하는 장치입니다.", + "create.ponder.tag.creative": "크리에이티브 모드", + "create.ponder.tag.creative.description": "서바이벌 모드에서는 얻을 수 없는 부품입니다.", + "create.ponder.tag.kinetic_relays": "동력 부품", + "create.ponder.tag.kinetic_relays.description": "동력을 다른 곳으로 연결할 때 도움을 주는 부품입니다.", + "create.ponder.tag.windmill_sails": "풍차 베어링의 날개", + "create.ponder.tag.windmill_sails.description": "조립되었을 때 풍차 구조물의 동력에 영향을 주는 블록들입니다. 이 블록들은 동일한 효율을 가집니다.", + "create.ponder.tag.contraption_assembly": "블록 부착 도구", + "create.ponder.tag.contraption_assembly.description": "블록들을 이어 구조물로 만들게해주는 도구와 부품입니다.", + "create.ponder.tag.decoration": "장식", + "create.ponder.tag.decoration.description": "주로 장식 용도로 쓰이는 부품입니다.", + "create.ponder.tag.kinetic_appliances": "동력 장치", + "create.ponder.tag.kinetic_appliances.description": "동력을 사용하는 장치입니다.", + "create.ponder.tag.redstone": "레드스톤 부품", + "create.ponder.tag.redstone.description": "레드스톤 공학에 쓰이는 부품입니다.", + "create.ponder.tag.fluids": "액체 조정", + "create.ponder.tag.fluids.description": "액체를 나르고 사용하는 장치입니다.", + + "create.ponder.adjustable_pulse_repeater.header": "가변 펄스 중계기를 이용해 신호 조절하기", + "create.ponder.adjustable_pulse_repeater.text_1": "가변 펄스 중계기는 딜레이 이후 짧은 신호를 보냅니다.", + "create.ponder.adjustable_pulse_repeater.text_2": "마우스 휠을 이용하여 딜레이를 조절합니다.", + "create.ponder.adjustable_pulse_repeater.text_3": "딜레이는 최대 30분까지 조절할 수 있습니다.", + + "create.ponder.adjustable_repeater.header": "가변 중계기를 이용해 신호 조절하기", + "create.ponder.adjustable_repeater.text_1": "가변 중계기는 기존 중계기와 비슷합니다.", + "create.ponder.adjustable_repeater.text_2": "정해진 딜레이만큼 신호를 주고...", + "create.ponder.adjustable_repeater.text_3": "...정해진 딜레이만큼 쉽니다.", + "create.ponder.adjustable_repeater.text_4": "마우스 휠을 이용해 딜레이를 조절합니다.", + "create.ponder.adjustable_repeater.text_5": "딜레이는 최대 30분까지 조절할 수 있습니다.", + + "create.ponder.analog_lever.header": "아날로그 레버를 이용해 신호 조절하기", + "create.ponder.analog_lever.text_1": "아날로그 레버는 정확하고 간편하게 레드스톤 신호의 세기를 조절합니다.", + "create.ponder.analog_lever.text_2": "우클릭으로 세기를 높입니다.", + "create.ponder.analog_lever.text_3": "웅크리면서 우클릭하면, 세기를 낮춥니다.", + + "create.ponder.andesite_tunnel.header": "안산암 터널 사용하기", + "create.ponder.andesite_tunnel.text_1": "안산암 터널은 벨트를 덮는데 사용할 수 있습니다.", + "create.ponder.andesite_tunnel.text_2": "인신임 터널의 옆면에 접촉점이 있다면...", + "create.ponder.andesite_tunnel.text_3": "...터널은 통과하는 아이템 스택에서 1개의 아이템을 분리시킵니다.", + "create.ponder.andesite_tunnel.text_4": "나머지는 가던 길을 갑니다.", + + "create.ponder.basin.header": "대야 안에서 아이템 처리하기", + "create.ponder.basin.text_1": "대야는 아이템과 액체를 담을 수 있습니다.", + "create.ponder.basin.text_2": "처리 이후, 대야는 옆면 아래로 결과물을 내보냅니다.", + "create.ponder.basin.text_3": "알맞는 부품이 있다면, 대야는 수송관을 나타냅니다.", + "create.ponder.basin.text_4": "다양한 부품들이 아이템을 받을 수 있습니다.", + "create.ponder.basin.text_5": "결과물은 아래 보관함에 떨어집니다.", + "create.ponder.basin.text_6": "수송관이 없다면, 대야는 처리된 아이템을 보관합니다.", + "create.ponder.basin.text_7": "결과물이 다시 사용될 때 유용합니다.", + "create.ponder.basin.text_8": "이 경우, 대야에서 특정 결과물을 빼내야 합니다.", + "create.ponder.basin.text_9": "처리되지 않은 아이템이 나오는 것을 방지하기 위해서는 필터가 필요합니다.", + + "create.ponder.bearing_modes.header": "베어링의 이동 설정", + "create.ponder.bearing_modes.text_1": "멈췄을 때, 베어링은 구조물을 가까운 수직 각도로 설치합니다.", + "create.ponder.bearing_modes.text_2": "이는 절대 설치하지 않거나, 시작한 지점에만 설치하도록 설정할 수 있습니다.", + + "create.ponder.belt_casing.header": "벨트 덮기", + "create.ponder.belt_casing.text_1": "황동, 안산암 케이스는 벨트를 꾸미는데 사용됩니다.", + "create.ponder.belt_casing.text_2": "렌치로 케이스를 없앨 수 있습니다.", + + "create.ponder.belt_connector.header": "벨트 사용하기", + "create.ponder.belt_connector.text_1": "두 축을 벨트로 우클릭하여 연결합니다.", + "create.ponder.belt_connector.text_2": "실수로 선택했다면, 웅크리면서 우클릭하여 취소합니다.", + "create.ponder.belt_connector.text_3": "벨트에 축을 추가로 넣을 수 있습니다.", + "create.ponder.belt_connector.text_4": "벨트로 연결된 축들은 같은 속도, 방향으로 회전합니다.", + "create.ponder.belt_connector.text_5": "추가된 축은 렌치로 없앨 수 있습니다.", + "create.ponder.belt_connector.text_6": "벨트를 염색하여 꾸밀 수 있습니다.", + + "create.ponder.belt_directions.header": "벨트 설치에 알맞는 방향", + "create.ponder.belt_directions.text_1": "벨트는 임의의 각도로 설치할 수 없습니다.", + "create.ponder.belt_directions.text_2": "1. 수평으로 연결할 수 있습니다.", + "create.ponder.belt_directions.text_3": "2. 대각선으로 연결할 수 있습니다.", + "create.ponder.belt_directions.text_4": "3. 수직으로 연결할 수 있습니다.", + "create.ponder.belt_directions.text_5": "4. 또한 수직 축을 평행하게 연결할 수 있습니다.", + "create.ponder.belt_directions.text_6": "이것들이 가능한 방향입니다. 벨트는 2 ~ 20 블록 길이를 연결합니다.", + + "create.ponder.belt_transport.header": "벨트를 이용한 수송", + "create.ponder.belt_transport.text_1": "움직이는 벨트는 아이템과 엔티티를 옮깁니다.", + "create.ponder.belt_transport.text_2": "빈손으로 우클릭하여 벨트 위의 아이템을 가져옵니다.", + + "create.ponder.blaze_burner.header": "블레이즈 버너 데우기", + "create.ponder.blaze_burner.text_1": "블레이즈 버너는 대야 안에서 처리되는 아이템에 열을 제공합니다.", + "create.ponder.blaze_burner.text_2": "이런 식으로, 블레이즈는 가연성 물질을 먹습니다.", + "create.ponder.blaze_burner.text_3": "블레이즈 케아크를 먹이면 버너는 더 뜨겁게 타오릅니다.", + "create.ponder.blaze_burner.text_4": "이 시스템은 배포기나 기계 팔을 이용해 자동화될 수 있습니다.", + + "create.ponder.brass_funnel.header": "황동 퍼널", + "create.ponder.brass_funnel.text_1": "안산암 퍼널는 아이템 한 개만 뽑아냅니다.", + "create.ponder.brass_funnel.text_2": "황동 퍼널는 한 스택까지 뽑을 수 있습니다.", + "create.ponder.brass_funnel.text_3": "핕터 슬롯을 스크롤하여 추출 갯수를 조절합니다.", + "create.ponder.brass_funnel.text_4": "필터 슬롯에 아이템을 사용하여 추출할 아이템 종류를 정합니다.", + + "create.ponder.brass_tunnel.header": "황동 터널 사용하기", + "create.ponder.brass_tunnel.text_1": "황동 터널은 벨트를 덮는데 사용할 수 있습니다.", + "create.ponder.brass_tunnel.text_2": "황동 터널은 열린 면마다 필터 슬롯이 있습니다.", + "create.ponder.brass_tunnel.text_3": "입구 필터는 맞지않는 아이템을 막습니다.", + "create.ponder.brass_tunnel.text_4": "출구 필터는 종류에 따라 아이템을 분류합니다.", + "create.ponder.brass_tunnel.text_5": "지나가는 아이템의 출구가 여러개일 때, 분배 모드가 어떻게 분배할지 정합니다.", + "create.ponder.brass_tunnel.text_6": "벨트 위, 평행한 황동 터널끼리는 연결됩니다.", + "create.ponder.brass_tunnel.text_7": "들어오는 아이템은 연결된 모든 출구로 분배됩니다.", + "create.ponder.brass_tunnel.text_8": "이런 식으로, 터널을 통해 직접 아이템을 넣을 수 있습니다.", + + "create.ponder.brass_tunnel_modes.header": "황동 터널의 분배 모드", + "create.ponder.brass_tunnel_modes.text_1": "렌치를 이용해, 황동 터널이 어떻게 분배할지 설정합니다.", + "create.ponder.brass_tunnel_modes.text_10": "[입력 동기화] 설정은 황동 터널만의 고유 설정입니다.", + "create.ponder.brass_tunnel_modes.text_11": "모든 입구에 아이템이 있어야만 통과할 수 있습니다.", + "create.ponder.brass_tunnel_modes.text_12": "이 설정은 연결된 모든 벨트에 아이템을 동시에 공급할 수 있습니다.", + "create.ponder.brass_tunnel_modes.text_2": "[분할] 설정은 가능한 출구에 아이템을 동등하게 분배하려 합니다.", + "create.ponder.brass_tunnel_modes.text_3": "한 출구가 아이템을 더 받을 수 없을 때, 그 출구는 제외됩니다.", + "create.ponder.brass_tunnel_modes.text_4": "[분리(강제적)] 설정은 출구를 제외하지 않습니다. 대신, 모두 아이템을 받을 수 있을 때까지 기다립니다.", + "create.ponder.brass_tunnel_modes.text_5": "[순서대로 처리] 설정은 아이템 수량을 유지한 채, 출구 차례대로 아이템을 분배합니다.", + "create.ponder.brass_tunnel_modes.text_6": "전 설정과 마찬가지로, 한 출구가 아이템을 더 받을 수 없다면, 그 출구는 제외됩니다.", + "create.ponder.brass_tunnel_modes.text_7": "[순서대로 처리(강제적)] 설정은 출구를 제외하지 않습니다.", + "create.ponder.brass_tunnel_modes.text_8": "[가장 가까운 곳] 설정은 입구와 가까운 출구 순서로 우선순위를 정합니다.", + "create.ponder.brass_tunnel_modes.text_9": "[무작위] 설정은 랜덤한 출구로 아이템을 분배합니다.", + + "create.ponder.cart_assembler.header": "카트 조립기로 구조물 움직이기", + "create.ponder.cart_assembler.text_1": "활성화된 카트 조립기는 지나가는 수레에 구조물을 부착합니다.", + "create.ponder.cart_assembler.text_2": "신호가 없다면, 구조물을 때어냅니다.", + "create.ponder.cart_assembler.text_3": "수레에 렌치로 우클릭하면 구조물을 들고 다닐 수 있습니다.", + + "create.ponder.cart_assembler_dual.header": "기차 구조물 조립하기", + "create.ponder.cart_assembler_dual.text_1": "두 조립기가 같은 구조물을 공유할 때...", + "create.ponder.cart_assembler_dual.text_2": "둘 중 하나를 작동시키면 기차 구조물이 됩니다.", + "create.ponder.cart_assembler_dual.text_3": "두 수레는 수레 커플링으로 연결된 것처럼 행동합니다.", + + "create.ponder.cart_assembler_modes.header": "수레 구조물 회전 설정", + "create.ponder.cart_assembler_modes.text_1": "구조물이 바라보는 방향은 수레의 방향과 동일합니다.", + "create.ponder.cart_assembler_modes.text_2": "이 화살표는 구조물이 바라보는 방향을 나타냅니다.", + "create.ponder.cart_assembler_modes.text_3": "조립기 설정에서 회전을 잠갔다면, 구조물은 회전하지 않습니다.", + + "create.ponder.cart_assembler_rails.header": "다른 종류의 수레와 레일", + "create.ponder.cart_assembler_rails.text_1": "일반 레일위의 조립기는 지나가는 수레에 아무 영향을 미치지 않습니다.", + "create.ponder.cart_assembler_rails.text_2": "전동 레일, 방향 레일 위에 있을 때, 신호를 받을 때까지 수레는 멈춥니다.", + "create.ponder.cart_assembler_rails.text_3": "다른 수레들도 쓸 수 있습니다.", + "create.ponder.cart_assembler_rails.text_4": "화로 수레는 부착된 보관함에서 연료를 가져와 스스로 움직입니다.", + + "create.ponder.chain_drive.header": "체인 드라이브로 회전 전달하기", + "create.ponder.chain_drive.text_1": "체인 드라이브는 한 줄로 회전을 전달합니다.", + "create.ponder.chain_drive.text_2": "이렇게 연결된 모든 축들은 같은 방향으로 회전합니다.", + "create.ponder.chain_drive.text_3": "한 줄의 아무 부분을 90도 돌릴 수 있습니다.", + + "create.ponder.chain_gearshift.header": "벨트 변속기를 통해 회전 속도 조절하기", + "create.ponder.chain_gearshift.text_1": "신호를 받지 않은 벨트 변속기는 체인 드라이브와 똑같이 작동합니다.", + "create.ponder.chain_gearshift.text_2": "신호를 받으면, 다른 체인 드라이브에 전달되는 속도는 2배가 됩니다.", + "create.ponder.chain_gearshift.text_3": "반대로 벨트 변속기가 직접 회전을 받지 않고 있다면, 변속기의 속도는 절반이 됩니다.", + "create.ponder.chain_gearshift.text_4": "두 가지 경우에도, 같은 줄의 체인 드라이브의 속도는 변속기 속도의 2배가 됩니다.", + "create.ponder.chain_gearshift.text_5": "아날로그 레버를 사용하면, 속도 비율을 1 ~ 2배 사이로 맞출 수 있습니다.", + "create.ponder.chain_gearshift.text_6": "12 RPM", + + "create.ponder.chute.header": "슈트를 이용해 아이템을 아래로 옮기기", + "create.ponder.chute.text_1": "슈트는 보관함에 있는 아이템을 수직으로 옮깁니다.", + "create.ponder.chute.text_2": "렌치를 이용해 창문을 만들 수 있습니다.", + "create.ponder.chute.text_3": "슈트 옆면에 다른 슈트를 설치하면 대각선으로 연결됩니다.", + + "create.ponder.chute_upward.header": "슈트를 이용해 아이템을 위로 옮기기", + "create.ponder.chute_upward.text_1": "선풍기를 위/아래에 설치하면, 슈트는 아이템을 위로 보냅니다.", + "create.ponder.chute_upward.text_2": "엔지니어의 고글로 슈트를 관찰하여 이동 방향을 확인하세요.", + "create.ponder.chute_upward.text_3": "막힌 끝 부분에서 아이템은 옆에서 넣거나 빼내야합니다.", + + "create.ponder.clockwork_bearing.header": "시계 베어링을 이용한 구조물 움직이기", + "create.ponder.clockwork_bearing.text_1": "시계 베어링은 앞에 있는 블록을 부착시킵니다.", + "create.ponder.clockwork_bearing.text_2": "동력을 받으면, 현재 시간에 맞춰 구조물이 돌아갑니다.", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "베어링을 우클릭하여 구조물을 멈추거나 움직이세요.", + "create.ponder.clockwork_bearing.text_6": "시침 구조물 앞에 분침 구조물을 추가할 수 있습니다.", + "create.ponder.clockwork_bearing.text_7": "접착제나 슬라임볼로 두 구조물을 연결하지 마세요.", + "create.ponder.clockwork_bearing.text_8": "두번째 구조물은 분침처럼 돌아갑니다.", + + "create.ponder.clutch.header": "클러치를 이용해 동력 조절하기", + "create.ponder.clutch.text_1": "클러치는 한 줄로 동력을 전달합니다.", + "create.ponder.clutch.text_2": "레드스톤 신호를 받으면, 동력 전달을 끊습니다.", + + "create.ponder.cog_speedup.header": "톱니바퀴로 기어변속하기", + "create.ponder.cog_speedup.text_1": "큰 톱니바퀴와 작은 톱니바퀴는 대각선으로 연결됩니다.", + "create.ponder.cog_speedup.text_2": "큰 쪽에서 작은 쪽으로 가는 속도는 2배가 됩니다.", + "create.ponder.cog_speedup.text_3": "반대의 경우에는 속도가 절반이 됩니다.", + + "create.ponder.cogwheel.header": "톱니바퀴를 이용해 동력 전달하기", + "create.ponder.cogwheel.text_1": "톱니바퀴는 인접한 톱니바퀴에 동력을 전달합니다.", + "create.ponder.cogwheel.text_2": "이렇게 연결된 톱니바퀴 축은 반대방향으로 돌아갑니다.", + + "create.ponder.creative_fluid_tank.header": "크리에이티브 탱크", + "create.ponder.creative_fluid_tank.text_1": "크리에이티브 탱크는 무한히 액체를 공급합니다.", + "create.ponder.creative_fluid_tank.text_2": "액체가 든 용기로 우클릭하여 액체를 채울 수 있습니다.", + "create.ponder.creative_fluid_tank.text_3": "파이프로 탱크에서 액체를 무한히 뽑아낼 수 있습니다.", + "create.ponder.creative_fluid_tank.text_4": "크리에이티브 탱크로 들어가는 모든 액체는 사라집니다.", + + "create.ponder.creative_motor.header": "크리에이티브 모터를 이용해 동력 생산하기", + "create.ponder.creative_motor.text_1": "크리에이티브 모터는 동력을 쉽게 생산, 조절합니다.", + "create.ponder.creative_motor.text_2": "모터 후면을 스크롤해서 모터의 RPM을 조절합니다.", + + "create.ponder.crushing_wheels.header": "분쇄 휠을 이용해 아이템 가공하기", + "create.ponder.crushing_wheels.text_1": "한 쌍의 분쇄 휠은 아이템을 매우 효과적으로 갈아버립니다.", + "create.ponder.crushing_wheels.text_2": "동력을 전달하여 서로 맞물리게 해야합니다.", + "create.ponder.crushing_wheels.text_3": "위에서 투입된 아이템은 가공되고, 아래로 떨어집니다.", + "create.ponder.crushing_wheels.text_4": "이 과정은 자동화 될 수 있습니다.", + + "create.ponder.deployer.header": "배포기 이용하기", + "create.ponder.deployer.text_1": "동력을 받으면, 배포기는 플레이어의 행동을 흉내냅니다.", + "create.ponder.deployer.text_10": "손에다 우클릭하여 배포기가 쓸 아이템을 건네세요.", + "create.ponder.deployer.text_11": "아이템은 자동으로 투입될 수 있습니다.", + "create.ponder.deployer.text_12": "필터 슬롯도 있습니다.", + "create.ponder.deployer.text_13": "필터가 설정되면, 필터에 맞는 아이템을 들고있을 때 작동합니다.", + "create.ponder.deployer.text_14": "필터에 맞는 아이템만 들어가며...", + "create.ponder.deployer.text_15": "...그 외의 아이템은 배출됩니다.", + "create.ponder.deployer.text_2": "배포기는 한 칸 떨어진 블록에 상호작용합니다.", + "create.ponder.deployer.text_3": "바로 앞에 블록이 있어도 상괸없습니다.", + "create.ponder.deployer.text_4": "배포기가 할 수 있는 것:", + "create.ponder.deployer.text_5": "블록 설치하기", + "create.ponder.deployer.text_6": "아이템 사용하기", + "create.ponder.deployer.text_7": "블록 활성화하기", + "create.ponder.deployer.text_8": "블록 수확하기", + "create.ponder.deployer.text_9": "몹 공격하기", + + "create.ponder.deployer_contraption.header": "구조물에서의 배포기", + "create.ponder.deployer_contraption.text_1": "배포기가 움직이는 구조물의 일부면...", + "create.ponder.deployer_contraption.text_2": "...배포기는 움직일 때마다 작동하며, 구조물에 붙어있는 아무 보관함의 아이템을 사용합니다.", + "create.ponder.deployer_contraption.text_3": "필터를 이용해 어떤 아이템을 사용할 지 정할 수 있습니다.", + + "create.ponder.deployer_modes.header": "배포기의 작동 방식", + "create.ponder.deployer_modes.text_1": "배포기는 기본적으로 우클릭을 흉내냅니다.", + "create.ponder.deployer_modes.text_2": "렌치를 이용해, 좌클릭을 흉내내도록 설정할 수 있습니다.", + + "create.ponder.deployer_processing.header": "배포기로 아이템 가공하기", + "create.ponder.deployer_processing.text_1": "배포기가 적절한 아이템을 가지고 있으면, 아래 있는 아이템을 가공합니다.", + "create.ponder.deployer_processing.text_2": "가공할 아이템은 배포기 아래에 떨구거나 아이템 거치대에 올려두어야 합니다.", + "create.ponder.deployer_processing.text_3": "아이템이 벨트에 있으면...", + "create.ponder.deployer_processing.text_4": "...압착기가 알아서 아이템 이동을 멈추고 가공합니다.", + + "create.ponder.deployer_redstone.header": "레드스톤과 배포기", + "create.ponder.deployer_redstone.text_1": "레드스톤 신호를 받으면, 배포기는 작동하지 않습니다.", + "create.ponder.deployer_redstone.text_2": "작동을 멈추기 전에, 배포기는 입력된 행동을 마무리합니다.", + "create.ponder.deployer_redstone.text_3": "따라서 부정 펄스는 한 번만 작동하게 합니다.", + + "create.ponder.depot.header": "아이템 거치대 사용하기", + "create.ponder.depot.text_1": "아이템 거치대는 고정된 벨트 역할입니다.", + "create.ponder.depot.text_2": "우클릭해서 아이템을 놓거나 가져갑니다.", + "create.ponder.depot.text_3": "벨트처럼, 놓여진 아이템은 가공될 수 있습니다.", + "create.ponder.depot.text_4": "그리고 기계 팔의 목표가 될 수 있습니다.", + + "create.ponder.empty_blaze_burner.header": "빈 블레이즈 버너 사용하기", + "create.ponder.empty_blaze_burner.text_1": "블레이즈를 우클릭하여 버너에 가둡니다.", + "create.ponder.empty_blaze_burner.text_2": "또는 스포너에서도 블레이즈를 가둘 수 있습니다.", + "create.ponder.empty_blaze_burner.text_3": "이제 당신은 다양한 장치에 쓰일 이상적인 열원을 얻었습니다.", + "create.ponder.empty_blaze_burner.text_4": "장식적인 요소로는 라이터로 불을 붙일 수 있습니다.", + "create.ponder.empty_blaze_burner.text_5": "불꽃은 영혼불꽃으로 바꿀 수 있습니다.", + "create.ponder.empty_blaze_burner.text_6": "그러나 장치에 쓰일 열원으로는 적합하지 않습니다.", + + "create.ponder.encased_fluid_pipe.header": "파이프에 케이스 씌우기", + "create.ponder.encased_fluid_pipe.text_1": "구리 케이스로 파이프를 꾸밀 수 있습니다.", + "create.ponder.encased_fluid_pipe.text_2": "파이프를 가려주는 것 외에도, 파이프의 방향을 고정시키는 역할도 합니다.", + "create.ponder.encased_fluid_pipe.text_3": "이 파이프는 이제 나중에 추가된 블록에 영향받지 않습니다.", + + "create.ponder.fan_direction.header": "선풍기의 공기흐름", + "create.ponder.fan_direction.text_1": "선풍기는 동력을 이용해 바람을 만들어냅니다.", + "create.ponder.fan_direction.text_2": "바람의 세기와 방향, 거리는 동력에 따라 달라집니다.", + + "create.ponder.fan_processing.header": "선풍기로 아이템 가공하기", + "create.ponder.fan_processing.text_1": "바람이 용암을 통과하면, 공기가 뜨거워집니다.", + "create.ponder.fan_processing.text_2": "바람이 지나가는 자리의 아이템은 구워집니다.", + "create.ponder.fan_processing.text_3": "음식은 불타 없어집니다.", + "create.ponder.fan_processing.text_4": "대신, 불을 이용하면 음식을 굽습니다.", + "create.ponder.fan_processing.text_5": "물을 통과하는 바람을 통해 세척할 수 있습니다.", + "create.ponder.fan_processing.text_6": "이를 통해 새로운 가공을 할 수 있습니다.", + "create.ponder.fan_processing.text_7": "선풍기의 속도는 가공 속도와 관련이 없습니다!", + "create.ponder.fan_processing.text_8": "선풍기 가공은 벨트나 아이템 거치대의 아이템에도 적용됩니다.", + + "create.ponder.fan_source.header": "선풍기를 이용해 동력 생산하기", + "create.ponder.fan_source.text_1": "열원을 향한 선풍기는 동력을 제공합니다.", + "create.ponder.fan_source.text_2": "레드스톤 신호를 받으면, 동력을 제공하기 시작합니다.", + + "create.ponder.fluid_pipe_flow.header": "파이프로 액체 옮기기", + "create.ponder.fluid_pipe_flow.text_1": "파이프는 한 종류의 액체만 옮깁니다.", + "create.ponder.fluid_pipe_flow.text_2": "렌치를 이용하여 직선 파이프에 창문을 달 수 있습니다.", + "create.ponder.fluid_pipe_flow.text_3": "창문이 있는 파이프는 옆에 있는 파이프와 연결되지 않습니다.", + "create.ponder.fluid_pipe_flow.text_4": "펌프를 이용하면 파이프로 액체를 옮길 수 있습니다.", + "create.ponder.fluid_pipe_flow.text_5": "처음엔 액체가 빠지지 않습니다.", + "create.ponder.fluid_pipe_flow.text_6": "액체 흐름이 이어지면, 시작 탱크에서 끝 탱크로 액체가 본격적으로 이동합니다.", + "create.ponder.fluid_pipe_flow.text_7": "이렇기 때문에, 파이프는 실질적으로 아무런 액체도 담지 않습니다.", + + "create.ponder.fluid_pipe_interaction.header": "액체 용기를 비우고 채우기", + "create.ponder.fluid_pipe_interaction.text_1": "파이프의 끝은 다양한 블록과 상호작용할 수 있습니다.", + "create.ponder.fluid_pipe_interaction.text_2": "액체를 담을 수 있는 모든 블록은 비우거나 채울 수 있습니다.", + "create.ponder.fluid_pipe_interaction.text_3": "끝 부분에 있는 액체의 원천도 흡수할 수 있으며...", + "create.ponder.fluid_pipe_interaction.text_4": "...비어있는 곳에 액체를 배출할 수도 있습니다.", + "create.ponder.fluid_pipe_interaction.text_5": "다양한 다른 블록에서도 액체를 뽑아낼 수도 있습니다.", + + "create.ponder.fluid_tank_sizes.header": "액체 탱크의 크기", + "create.ponder.fluid_tank_sizes.text_1": "액체 탱크는 여러개 연결하여 용량을 늘릴 수 있습니다.", + "create.ponder.fluid_tank_sizes.text_2": "밑면 너비는 3블록까지 늘릴 수 있습니다.", + "create.ponder.fluid_tank_sizes.text_3": "높이는 32블록까지 가능합니다.", + "create.ponder.fluid_tank_sizes.text_4": "렌치를 이용해 탱크의 창문을 닫을 수 있습니다.", + + "create.ponder.fluid_tank_storage.header": "탱크에 액체 저장하기", + "create.ponder.fluid_tank_storage.text_1": "탱크는 많은 양의 액체를 저장합니다.", + "create.ponder.fluid_tank_storage.text_2": "어느 쪽에서나 파이프로 액체를 넣고 빼낼 수 있습니다.", + "create.ponder.fluid_tank_storage.text_3": "담긴 액체의 양은 비교기로 측정할 수 있습니다.", + "create.ponder.fluid_tank_storage.text_4": "그러나 서바이벌 모드에서는 액체를 직접 빼내고 넣을 순 없습니다.", + "create.ponder.fluid_tank_storage.text_5": "대야, 아이템 배수구, 주입기를 통해 액체를 빼내거나 채울 수 있습니다.", + + "create.ponder.flywheel.header": "플라이휠로 동력 생산하기", + "create.ponder.flywheel.text_1": "플라이휠로 동력을 생산하기 위해선, 화로 엔진이 필요합니다.", + "create.ponder.flywheel.text_2": "플라이휠은 피로도 용량이 매우 높습니다.", + "create.ponder.flywheel.text_3": "용광로를 사용하면 동력 속도가 2배가 됩니다.", + + "create.ponder.funnel_compat.header": "퍼널 호환성", + "create.ponder.funnel_compat.text_1": "퍼널은 다른 장치들 위에 설치할 수 있습니다.", + "create.ponder.funnel_compat.text_2": "세로 톱", + "create.ponder.funnel_compat.text_3": "아이템 거치대", + "create.ponder.funnel_compat.text_4": "아이템 배수구", + + "create.ponder.funnel_direction.header": "수송 방향", + "create.ponder.funnel_direction.text_1": "설치하면, 보관함에서 아이템을 빼냅니다.", + "create.ponder.funnel_direction.text_2": "웅크리면서 설치하면, 아이템을 가져갑니다.", + "create.ponder.funnel_direction.text_3": "렌치를 이용해 설치 이후에도 설정을 변경할 수 있습니다.", + "create.ponder.funnel_direction.text_4": "다른 면에 설치해도 같은 규칙을 따릅니다.", + "create.ponder.funnel_direction.text_5": "벨트 위의 퍼널는 벨트의 움직임에 따라 아이템을 빼내거나 가져갑니다.", + + "create.ponder.funnel_intro.header": "퍼널 사용하기", + "create.ponder.funnel_intro.text_1": "퍼널는 보관함에서 아이템을 옮기거나 빼낼 때 유용합니다.", + + "create.ponder.funnel_redstone.header": "레드스톤 신호", + "create.ponder.funnel_redstone.text_1": "레드스톤 신호를 받으면 동작을 멈춥니다.", + + "create.ponder.funnel_transfer.header": "직접 수송", + "create.ponder.funnel_transfer.text_1": "퍼널는 아이템을 보관함에서 다른 보관함로 옮깁니다.", + "create.ponder.funnel_transfer.text_2": "슈트나 스마트 슈트가 이런 목적에 더 적합합니다.", + "create.ponder.funnel_transfer.text_3": "수평 방향으로는 벨트가 적합합니다.", + + "create.ponder.furnace_engine.header": "화로 엔진을 이용해 동력 생산하기", + "create.ponder.furnace_engine.text_1": "화로 엔진은 부착된 화로가 타오를 때 동력을 생산합니다.", + "create.ponder.furnace_engine.text_2": "제공되는 피로도 용량이 매우 높습니다.", + "create.ponder.furnace_engine.text_3": "용광로를 사용하면 동력 속도가 2배가 됩니다.", + + "create.ponder.gantry_carriage.header": "갠트리 운반대 사용하기", + "create.ponder.gantry_carriage.text_1": "갠트리 운반대는 갠트리 축 위에서 움직입니다.", + "create.ponder.gantry_carriage.text_2": "갠트리 장치는 부착된 블록들을 움직입니다.", + + "create.ponder.gantry_cascaded.header": "계단식 갠트리", + "create.ponder.gantry_cascaded.text_1": "갠트리 운반대에 접착제 없이 갠트리 축을 붙일 수 있습니다.", + "create.ponder.gantry_cascaded.text_2": "움직이는 축 위의 운반대에도 적용됩니다.", + "create.ponder.gantry_cascaded.text_3": "아렇게 갠트리 시스템은 여러 축으로 이어나갈 수 있습니다.", + + "create.ponder.gantry_direction.header": "갠트리 동작 방향", + "create.ponder.gantry_direction.text_1": "갠트리 축은 서로 반대되게 설치할 수 있습니다.", + "create.ponder.gantry_direction.text_2": "운반대의 이동 방향은 축의 방향을 따릅니다.", + "create.ponder.gantry_direction.text_3": "축의 회전방향도 마찬가지입니다.", + "create.ponder.gantry_direction.text_4": "운반대 축의 회전에도 적용됩니다.", + + "create.ponder.gantry_redstone.header": "갠트리 동력 전달", + "create.ponder.gantry_redstone.text_1": "레드스톤 신호를 받은 갠트리 축은 운반대를 멈춤니다.", + "create.ponder.gantry_redstone.text_2": "대신, 동력은 운반대의 축에게 이어집니다.", + + "create.ponder.gantry_shaft.header": "갠트리 축 사용하기", + "create.ponder.gantry_shaft.text_1": "갠트리 축은 갠트리 장치에 필요합니다. 갠트리 운반대가 축을 따라 움직입니다.", + "create.ponder.gantry_shaft.text_2": "갠트리 장치는 부착된 블록들을 움직입니다.", + + "create.ponder.gearbox.header": "기어박스를 이용해 동력 전달하기", + "create.ponder.gearbox.text_1": "회전축을 변경하는 일은 쉽게 귀찮아집니다.", + "create.ponder.gearbox.text_2": "기어박스는 그런 문제를 쉽게 해결합니다.", + "create.ponder.gearbox.text_3": "모서리 축들은 서로 다른 방향으로 돌아갑니다.", + "create.ponder.gearbox.text_4": "반대편 축은 거꾸로 돌아갑니다.", + + "create.ponder.gearshift.header": "기어쉬프트를 이용해 동력 조절하기", + "create.ponder.gearshift.text_1": "기어쉬프트는 한 줄로 동력을 전달합니다.", + "create.ponder.gearshift.text_2": "레드스톤 신호를 받으면, 회전을 반전시킵니다.", + + "create.ponder.hand_crank.header": "핸드 크랭크로 동력 생산하기", + "create.ponder.hand_crank.text_1": "핸드 크랭크는 플레이어가 직접 동력을 생산하는 장치입니다.", + "create.ponder.hand_crank.text_2": "우클릭하면 시계 반대방향으로 회전합니다.", + "create.ponder.hand_crank.text_3": "동력 속도는 생각보다 빠릅니다.", + "create.ponder.hand_crank.text_4": "웅크리고 우클릭하면 시계 방향으로 회전합니다.", + + "create.ponder.hose_pulley.header": "호스 도르래로 액체 채우고 비우기", + "create.ponder.hose_pulley.text_1": "호스 도르래는 많은 양의 액체를 채우거나 비울 수 있습니다.", + "create.ponder.hose_pulley.text_2": "동력을 전달하여 호스의 높이를 정합니다.", + "create.ponder.hose_pulley.text_3": "동력 방향이 반전되면 호스는 올라갑니다.", + "create.ponder.hose_pulley.text_4": "반대쪽에는 파이프를 연결할 수 있습니다.", + "create.ponder.hose_pulley.text_5": "연결된 파이프에서 호스로 전달하여 액체를 채우거나...", + "create.ponder.hose_pulley.text_6": "...반대 방향으로 방향을 바꿔 액체를 비울 수 있습니다.", + "create.ponder.hose_pulley.text_7": "호스의 채우거나 비우는 속도는 펌프 속도에 기반합니다.", + + "create.ponder.hose_pulley_infinite.header": "매우 많은 양의 액체를 채우고 비우기", + "create.ponder.hose_pulley_infinite.text_1": "넓은 바다에서 호스 도르래를 작동시키면...", + "create.ponder.hose_pulley_infinite.text_2": "...물 블록을 없애거나 추가하지 않고 액체를 얻거나 버릴 수 있습니다.", + "create.ponder.hose_pulley_infinite.text_3": "파이프로 이런 도르래에서 무한한 액체를 얻을 수 있습니다.", + + "create.ponder.hose_pulley_level.header": "호스 도르래의 채우고 비우는 기준", + "create.ponder.hose_pulley_level.text_1": "호스가 완전히 올라가 있을 때, 도르래는 작동하지 않습니다.", + "create.ponder.hose_pulley_level.text_2": "맨 위부터 비웁니다.", + "create.ponder.hose_pulley_level.text_3": "호스 끝부분 아래의 액체는 그대로 남습니다.", + "create.ponder.hose_pulley_level.text_4": "맨 아래부터 채웁니다.", + "create.ponder.hose_pulley_level.text_5": "호스 끝부분 위는 채우지 않습니다.", + + "create.ponder.item_drain.header": "아이템 배수구로 액체 비우기", + "create.ponder.item_drain.text_1": "배수구는 아이템에서 액체를 비웁니다.", + "create.ponder.item_drain.text_2": "우클릭하여 손에 든 아이템에서 액체를 붓습니다.", + "create.ponder.item_drain.text_3": "아이템이 옆에서 들어온다면...", + "create.ponder.item_drain.text_4": "...아이템은 굴라가며 담긴 액체를 비웁니다.", + "create.ponder.item_drain.text_5": "배수구 탱크에 있는 액체는 파이프로 옮길 수 있습니다.", + + "create.ponder.large_cogwheel.header": "큰 톱니바퀴로 동력 전달하기", + "create.ponder.large_cogwheel.text_1": "큰 톱니바퀴는 수직으로 서로 맞물립니다.", + "create.ponder.large_cogwheel.text_2": "이는 다른 축으로 동력을 전달하는데 도움이 됩니다.", + + "create.ponder.linear_chassis_attachment.header": "직선 섀시를 이용해 블록 붙이기", + "create.ponder.linear_chassis_attachment.text_1": "직선 섀시의 열린 면은 접착할 수 있습니다.", + "create.ponder.linear_chassis_attachment.text_2": "다시 클릭하면 다른 면도 접착할 수 있게 만듭니다.", + "create.ponder.linear_chassis_attachment.text_3": "빈 손으로 웅크리고 우클릭하여 접착제를 없앨 수 있습니다.", + "create.ponder.linear_chassis_attachment.text_4": "직선 섀시의 접착면은 접착면 앞에 있는 블록들을 연결합니다.", + "create.ponder.linear_chassis_attachment.text_5": "렌치로 이용해 섀시의 접착 거리를 조절할 수 있습니다.", + "create.ponder.linear_chassis_attachment.text_6": "[CTRL]키를 누르고 스크롤하면 연결된 모든 섀시의 거리를 조절할 수 있습니다.", + "create.ponder.linear_chassis_attachment.text_7": "다른 면에 블록을 붙이려면 접착제가 필요합니다.", + "create.ponder.linear_chassis_attachment.text_8": "이런 원리를 통해 구조물이 장치로써 움직일 수 있게 됩니다.", + + "create.ponder.linear_chassis_group.header": "여러 직선 섀시 움직이기", + "create.ponder.linear_chassis_group.text_1": "직선 섀시는 다른 직선 섀시와 연결될 수 있습니다.", + "create.ponder.linear_chassis_group.text_2": "하나가 움직이면, 다른 섀시도 같이 움직입니다.", + "create.ponder.linear_chassis_group.text_3": "다른 종류의 섀시, 다른 면을 바라보는 섀시는 붙지 않습니다.", + + "create.ponder.mechanical_arm.header": "기계 팔 설치하기", + "create.ponder.mechanical_arm.text_1": "기계 팔은 설치되기 전, 입력부와 출력부를 지정해야 합니다.", + "create.ponder.mechanical_arm.text_2": "우클릭으로 보관함을 가진 블록을 대상으로 지정합니다.", + "create.ponder.mechanical_arm.text_3": "다시 우클릭하여 입력부(파랑) 출력부(주황)을 설정합니다.", + "create.ponder.mechanical_arm.text_4": "좌클릭하여 대상 선택을 해제합니다.", + "create.ponder.mechanical_arm.text_5": "설치된 기계 팔은 이전에 선택된 블록들을 대상으로 정합니다.", + "create.ponder.mechanical_arm.text_6": "거리안에 있다면 여러 블록을 지정할 수 있습니다.", + "create.ponder.mechanical_arm.text_7": "하지만 모든 보관함을 지닌 블록이 지정되지는 않습니다.", + "create.ponder.mechanical_arm.text_8": "퍼널와 아이템 거치대가 이런 문제를 해결할 수 있습니다.", + + "create.ponder.mechanical_arm_filtering.header": "기계 팔 필터링", + "create.ponder.mechanical_arm_filtering.text_1": "입력부", + "create.ponder.mechanical_arm_filtering.text_2": "출력부", + "create.ponder.mechanical_arm_filtering.text_3": "때때로 기계 팔이 필터에 맞추어 동작해야할 때가 있습니다.", + "create.ponder.mechanical_arm_filtering.text_4": "하지만 기계 팔자체에서 필터 기능을 지원하지는 않습니다.", + "create.ponder.mechanical_arm_filtering.text_5": "대신, 황동 퍼널의 필터는 기계 팔의 필터역할을 합니다.", + "create.ponder.mechanical_arm_filtering.text_6": "기계 팔은 필터에 맞게 적당한 양만 가져가는 똑똑한 친구입니다.", + + "create.ponder.mechanical_arm_modes.header": "기계 팔의 분배 설정", + "create.ponder.mechanical_arm_modes.text_1": "입력부", + "create.ponder.mechanical_arm_modes.text_2": "출력부", + "create.ponder.mechanical_arm_modes.text_3": "기계 팔이 여러 곳에 아이템을 전달해야 한다면...", + "create.ponder.mechanical_arm_modes.text_4": "...현재 분배 설정에 따라 행동합니다.", + "create.ponder.mechanical_arm_modes.text_5": "렌치로 스크롤하여 어떻게 분배할지 설정하세요.", + "create.ponder.mechanical_arm_modes.text_6": "'순서대로 옮김'은 가능한 곳을 순환하며 아이템을 분배합니다.", + "create.ponder.mechanical_arm_modes.text_7": "어느 한 곳이 더 전달받을 수 없다면, 그 곳은 넘어갑니다.", + "create.ponder.mechanical_arm_modes.text_8": "[돌아가며 처리(강제적)]은 전달할 곳을 절대 넘어가지 않고, 공간이 남을 때까지 기다립니다.", + "create.ponder.mechanical_arm_modes.text_9": "[설정 순서 우선시]은 기계 팔을 설치할 때 설정한 곳 순서대로 아이템을 전달합니다.", + + "create.ponder.mechanical_arm_redstone.header": "기계 팔과 레드스톤", + "create.ponder.mechanical_arm_redstone.text_1": "레드스톤 신호를 받으면, 기계 팔은 작동을 멈춥니다.", + "create.ponder.mechanical_arm_redstone.text_2": "작동을 멈추기 전에, 기계 팔은 입력된 행동을 마무리합니다.", + "create.ponder.mechanical_arm_redstone.text_3": "따라서 부정 펄스는 한 번만 작동하게 합니다.", + + "create.ponder.mechanical_bearing.header": "베어링으로 구조물 옮기기", + "create.ponder.mechanical_bearing.text_1": "베어링은 앞에 있는 블록을 부착시킵니다.", + "create.ponder.mechanical_bearing.text_2": "동력을 받으면, 블록들은 회전하는 구조물로 변합니다.", + + "create.ponder.mechanical_crafter.header": "조합기 설치하기", + "create.ponder.mechanical_crafter.text_1": "다수의 조합기로 모든 조합을 자동화할 수 있습니다.", + "create.ponder.mechanical_crafter.text_2": "렌치를 이용해, 조합기의 경로를 변경할 수 있습니다.", + "create.ponder.mechanical_crafter.text_3": "올바른 조합을 위해서는, 모든 조합기의 경로가 외부로 나가는 한 길로 이어져야합니다.", + "create.ponder.mechanical_crafter.text_4": "결과물은 경로 끝 보관함에 보내집니다.", + "create.ponder.mechanical_crafter.text_5": "조합기는 동력이 요구됩니다.", + "create.ponder.mechanical_crafter.text_6": "앞면을 우클릭해서 직접 아이템을 넣습니다.", + "create.ponder.mechanical_crafter.text_7": "모든 면이 아이템을 가지고 있다면, 조합이 시작됩니다.", + "create.ponder.mechanical_crafter.text_8": "모든 면이 아이템을 가지고 있지 않아도, 레드스톤 신호로 조합을 강제 시작할 수 있습니다.", + + "create.ponder.mechanical_crafter_connect.header": "조합기에 아이템 넣기", + "create.ponder.mechanical_crafter_connect.text_1": "조합기에 아이템을 자동으로 넣을 수 있습니다.", + "create.ponder.mechanical_crafter_connect.text_2": "후면에 렌치를 이용해 조합기 보관함을 연결할 수 있습니다.", + "create.ponder.mechanical_crafter_connect.text_3": "이제 모든 조합기가 한 곳에서 아이템을 받습니다.", + + "create.ponder.mechanical_crafter_covers.header": "조합기 슬롯 덮기", + "create.ponder.mechanical_crafter_covers.text_1": "몇몇 조합은 빈 공간을 채워줄 조합기가 필요합니다.", + "create.ponder.mechanical_crafter_covers.text_2": "슬롯 덮개를 이용해, 조합기에 빈 공간을 만들 수 있습니다.", + "create.ponder.mechanical_crafter_covers.text_3": "렌치를 이용해 보관함을 연결해도 덮개가 있는 조합기에는 아이템이 들어오지 않습니다.", + + "create.ponder.mechanical_drill.header": "드릴을 이용해 블록 부수기", + "create.ponder.mechanical_drill.text_1": "동력을 받으면, 드릴은 앞에 있는 블록을 파괴합니다.", + "create.ponder.mechanical_drill.text_2": "채굴 속도는 동력 속도에 비례합니다.", + + "create.ponder.mechanical_drill_contraption.header": "구조물에서의 드릴", + "create.ponder.mechanical_drill_contraption.text_1": "드릴이 움직이는 구조물의 일부면...", + "create.ponder.mechanical_drill_contraption.text_2": "...드릴이 부딫히는 블록을 파괴합니다.", + + "create.ponder.mechanical_harvester.header": "구조물에서의 수확기", + "create.ponder.mechanical_harvester.text_1": "수확기가 움직이는 구조물의 일부면...", + "create.ponder.mechanical_harvester.text_2": "...지나가는 길에 있는 작물을 수확하고, 성장 수치를 초기화합니다.", + + "create.ponder.mechanical_mixer.header": "믹서로 아이템 가공하기", + "create.ponder.mechanical_mixer.text_1": "믹서와 대야를 이용해 몇몇 조합을 자동화할 수 있습니다.", + "create.ponder.mechanical_mixer.text_2": "가능한 조합법은 어느 무형 조합법이나 가능하며, 모드에서 추가된 조합법도 있습니다.", + "create.ponder.mechanical_mixer.text_3": "몇몇 조합법은 블레이즈 버너의 열을 요구합니다.", + "create.ponder.mechanical_mixer.text_4": "필터 슬롯을 이용해 조합법이 겹치는 것을 방지합니다.", + + "create.ponder.mechanical_piston.header": "기계식 피스톤으로 구조물 옮기기", + "create.ponder.mechanical_piston.text_1": "기계식 피스톤은 블록들을 앞으로 움직입니다.", + "create.ponder.mechanical_piston.text_2": "속도와 방향은 들어오는 동력에 기반합니다.", + "create.ponder.mechanical_piston.text_3": "끈끈이 기계식 피스톤은 블록들을 다시 끌어옵니다.", + + "create.ponder.mechanical_piston_modes.header": "기계식 피스톤의 이동 설정", + "create.ponder.mechanical_piston_modes.text_1": "피스톤이 움직임을 멈추면, 움직인 구조물은 블록으로 바뀝니다.", + "create.ponder.mechanical_piston_modes.text_2": "블록으로 바뀌지 않게 하거나, 시작지점에서만 바뀌도록 설정할 수 있습니다.", + + "create.ponder.mechanical_plough.header": "구조물에서의 쟁기", + "create.ponder.mechanical_plough.text_1": "쟁기가 움직이는 구조물의 일부면...", + "create.ponder.mechanical_plough.text_2": "...히트박스가 없는 블록을 파괴합니다.", + "create.ponder.mechanical_plough.text_3": "또, 쟁기는 경작지를 만들 수 있습니다.", + "create.ponder.mechanical_plough.text_4": "...그리고 엔티티를 피해없이 날려보낼 수도 있습니다!", + + "create.ponder.mechanical_press.header": "압착기로 아이템 가공하기", + "create.ponder.mechanical_press.text_1": "압착기는 아래에 놓인 아이템을 가공할 수 있습니다.", + "create.ponder.mechanical_press.text_2": "가공할 아이템은 압착기 아래에 떨구거나 아이템 거치대에 올려두어야 합니다.", + "create.ponder.mechanical_press.text_3": "아이템이 벨트에 있으면...", + "create.ponder.mechanical_press.text_4": "...압착기가 알아서 아이템 이동을 멈추고 가공합니다.", + + "create.ponder.mechanical_press_compacting.header": "압착기로 아이템 압축하기", + "create.ponder.mechanical_press_compacting.text_1": "대야와 함께 사용해서 아이템을 압축할 수 있습니다.", + "create.ponder.mechanical_press_compacting.text_2": "가능한 조합법은 2x2 / 3x3 조합법을 포함하고, 모드에서 추가된 조합법도 있습니다.", + "create.ponder.mechanical_press_compacting.text_3": "몇몇 조합법은 블레이즈 버너의 열을 요구합니다.", + "create.ponder.mechanical_press_compacting.text_4": "필터 슬롯을 이용해 조합법이 겹치는 것을 방지합니다.", + + "create.ponder.mechanical_pump_flow.header": "펌프를 이용해 액체 옮기기", + "create.ponder.mechanical_pump_flow.text_1": "펌프는 연결된 파이프속 흐름을 관리합니다.", + "create.ponder.mechanical_pump_flow.text_2": "동력을 전달받으면 화살표가 흐름의 방향을 알려줍니다.", + "create.ponder.mechanical_pump_flow.text_3": "화살표 뒤의 파이프는 액체를 뽑아내고...", + "create.ponder.mechanical_pump_flow.text_4": "...화살표 앞의 파이프는 액체를 밀어냅니다.", + "create.ponder.mechanical_pump_flow.text_5": "동력 방향을 반전시키면 흐름의 방향도 반전됩니다.", + "create.ponder.mechanical_pump_flow.text_6": "렌치로 펌프 방향 자체를 돌릴 수도 있습니다.", + + "create.ponder.mechanical_pump_speed.header": "펌프의 처리율", + "create.ponder.mechanical_pump_speed.text_1": "동력 속도와는 상관없이 펌프는 16블록 길이의 파이프까지 영향을 미칩니다.", + "create.ponder.mechanical_pump_speed.text_2": "동력 속도를 높이면 액체가 흐르는 속도가 높아지고...", + "create.ponder.mechanical_pump_speed.text_3": "...옮기는 액체의 양도 증가합니다.", + "create.ponder.mechanical_pump_speed.text_4": "펌프는 병렬로 설치할 수 있습니다.", + "create.ponder.mechanical_pump_speed.text_5": "펌프 방향을 바꾸어 흐름의 뱡향을 통일할 수 있습니다.", + + "create.ponder.mechanical_saw_breaker.header": "톱으로 나무 베기", + "create.ponder.mechanical_saw_breaker.text_1": "동력을 받으면 앞에 있는 나무를 벱니다.", + "create.ponder.mechanical_saw_breaker.text_2": "두꺼운 나무를 벨려면, 땅에 붙어있는 마지막 나무 블록을 파괴해야합니다.", + + "create.ponder.mechanical_saw_contraption.header": "구조물에서의 톱", + "create.ponder.mechanical_saw_contraption.text_1": "톱이 움직이는 구조물의 일부면...", + "create.ponder.mechanical_saw_contraption.text_2": "...부딫히는 모든 나무를 벱니다.", + + "create.ponder.mechanical_saw_processing.header": "톱으로 아이템 가공하기", + "create.ponder.mechanical_saw_processing.text_1": "위를 바라보는 톱은 다양한 아이템을 가공합니다.", + "create.ponder.mechanical_saw_processing.text_2": "가공되는 아이템은 언제나 동력의 반대로 움직입니다.", + "create.ponder.mechanical_saw_processing.text_3": "톱은 벨트와 연동이 가능합니다.", + "create.ponder.mechanical_saw_processing.text_4": "재료가 여러 결과물로 가공될 수 있을 때, 필터로 제한할 수 있습니다.", + "create.ponder.mechanical_saw_processing.text_5": "필터가 없다면 톱은 모든 결과물을 순서대로 만듭니다.", + + "create.ponder.millstone.header": "맷돌로 아이템 갈기", + "create.ponder.millstone.text_1": "맷돌은 아이템을 갈아버립니다!", + "create.ponder.millstone.text_2": "톱니바퀴를 옆에 설치하여 돌릴 수 있습니다.", + "create.ponder.millstone.text_3": "윗면으로 아이템을 투입하세요.", + "create.ponder.millstone.text_4": "시간이 지난 후, 우클릭으로 결과물을 얻을 수 있습니다.", + "create.ponder.millstone.text_5": "결과물은 자동으로 빼낼 수 있습니다.", + + "create.ponder.nixie_tube.header": "닉시관 사용하기", + "create.ponder.nixie_tube.text_1": "레드스톤 신호를 받으면, 닉시관은 레드스톤 신호 세기를 나타냅니다.", + "create.ponder.nixie_tube.text_2": "이름표를 사용하여 원하는 글자를 나타낼 수도 있습니다.", + "create.ponder.nixie_tube.text_3": "염료를 들고 우클릭하여 색을 바꿀 수 있습니다.", + + "create.ponder.piston_pole.header": "피스톤 연장 축", + "create.ponder.piston_pole.text_1": "연장 축이 없으면, 기계식 피스톤은 움직일 수 없습니다.", + "create.ponder.piston_pole.text_2": "연장 축의 수가 곧 피스톤이 연장할 수 있는 거리입니다.", + + "create.ponder.portable_storage_interface.header": "구조물 장치의 아이템 교환", + "create.ponder.portable_storage_interface.text_1": "움직이는 장치의 보관함은 플레이어가 열 수 없습니다.", + "create.ponder.portable_storage_interface.text_2": "아이템 인터페이스는 장치를 멈추지 않아도 장치 보관함과 상호작용할 수 있습니다.", + "create.ponder.portable_storage_interface.text_3": "두 번째 인터페이스를 1~2 블록 띄우고 설치하세요.", + "create.ponder.portable_storage_interface.text_4": "서로를 마주칠 때마다, 접속을 시도합니다.", + "create.ponder.portable_storage_interface.text_5": "접속한 상태에서, 블록 상태의 인터페이스는 장치의 모든 보관함과 동일합니다.", + "create.ponder.portable_storage_interface.text_6": "아이템을 넣을 수도 있고...", + "create.ponder.portable_storage_interface.text_7": "...장치에서 아이템을 뺄 수도 있습니다.", + "create.ponder.portable_storage_interface.text_8": "일정 시간동안 아이템이 교환되지 않으면, 장치는 움직입니다.", + + "create.ponder.portable_fluid_interface.header": "구조물 장치의 액체 교환", + "create.ponder.portable_fluid_interface.text_1": "액체 인터페이스는 장치를 멈추지 않아도 탱크와 상호작용할 수 있습니다.", + "create.ponder.portable_fluid_interface.text_3": "두 번째 인터페이스를 1~2 블록 띄우고 설치하세요.", + "create.ponder.portable_fluid_interface.text_4": "서로를 마주칠 때마다, 접속을 시도합니다.", + "create.ponder.portable_fluid_interface.text_5": "접속한 상태에서, 블록 상태의 인터페이스는 장치의 모든 탱크와 동일합니다.", + "create.ponder.portable_fluid_interface.text_6": "액체를 넣을 수도 있고...", + "create.ponder.portable_fluid_interface.text_7": "...장치에서 액체를 뺄 수도 있습니다.", + "create.ponder.portable_fluid_interface.text_8": "일정 시간동안 액체가 교환되지 않으면, 장치는 움직입니다.", + + "create.ponder.portable_storage_interface_redstone.header": "레드스톤 설정", + "create.ponder.portable_storage_interface_redstone.text_1": "레드스톤 신호를 받으면 인터페이스가 작동하지 않습니다.", + + "create.ponder.powered_latch.header": "레드스톤 걸쇠 사용하기", + "create.ponder.powered_latch.text_1": "레드스톤 걸쇠는 설정 가능한 레버입니다.", + "create.ponder.powered_latch.text_2": "뒤에서 오는 신호는 걸쇠 신호를 키고...", + "create.ponder.powered_latch.text_3": "...옆에서 오는 신호는 걸쇠 신호를 끕니다.", + "create.ponder.powered_latch.text_4": "레드스톤 걸쇠는 직접 끄고 킬 수도 있습니다.", + + "create.ponder.powered_toggle_latch.header": "레드스톤 토글 걸쇠 사용하기", + "create.ponder.powered_toggle_latch.text_1": "레드스톤 토글 걸쇠는 설정 가능한 레버입니다.", + "create.ponder.powered_toggle_latch.text_2": "뒤에서 오는 신호는 걸쇠의 신호를 킵니다.", + "create.ponder.powered_toggle_latch.text_3": "혹은 끕니다.", + "create.ponder.powered_toggle_latch.text_4": "레드스톤 토글 걸쇠는 직접 끄고 킬 수도 있습니다.", + + "create.ponder.pulse_repeater.header": "펄스 중계기 사용하기", + "create.ponder.pulse_repeater.text_1": "펄스 중계기는 어느 레드스톤 신호라도 1틱 신호로 바꿉니다.", + + "create.ponder.radial_chassis.header": "원형 섀시를 이용해 블록 붙이기", + "create.ponder.radial_chassis.text_1": "원형 섀시는 다른 원형 섀시와 이어집니다.", + "create.ponder.radial_chassis.text_2": "하나가 움직이면, 다른 섀시도 같이 움직입니다.", + "create.ponder.radial_chassis.text_3": "원형 섀시의 옆면은 접착할 수 있습니다.", + "create.ponder.radial_chassis.text_4": "한번 더 클릭하여 모든 면을 접착면으로 만들 수 있습니다.", + "create.ponder.radial_chassis.text_5": "빈손으로 웅크리고 우클릭하여 접착제를 없앨 수 있습니다.", + "create.ponder.radial_chassis.text_6": "접착면에 블록이 있으면...", + "create.ponder.radial_chassis.text_7": "...해당 층 반지름 안에 있는 모든 블록을 연결합니다.", + "create.ponder.radial_chassis.text_8": "렌치룰 이용하여, 섀시의 부착 반지름을 조절할 수 있습니다.", + "create.ponder.radial_chassis.text_9": "접착면 반지름 밖의 블록은 붙지 않습니다.", + + "create.ponder.redstone_contact.header": "동형 감지기", + "create.ponder.redstone_contact.text_1": "서로 마주보는 동형 감지기는 레드스톤 신호를 발생시킵니다.", + "create.ponder.redstone_contact.text_2": "어느 한쪽이 움직이는 장치의 일부라도 동일하게 작동합니다.", + + "create.ponder.redstone_link.header": "레드스톤 링크 사용하기", + "create.ponder.redstone_link.text_1": "레드스톤 링크는 레드스톤 신호를 무선으로 전달합니다.", + "create.ponder.redstone_link.text_2": "웅크리면서 우클릭하여 신호를 수신하게 만듭니다.", + "create.ponder.redstone_link.text_3": "렌치로 우클릭도 같은 기능을 합니다.", + "create.ponder.redstone_link.text_4": "수신기는 128블록이내의 발신기 레드스톤 신호 세기를 전달합니다.", + "create.ponder.redstone_link.text_5": "두 슬롯에 아이템을 두어 주파수를 설정할 수 있습니다.", + "create.ponder.redstone_link.text_6": "맞는 주파수끼리만 레드스톤 링크가 작동합니다.", + + "create.ponder.rope_pulley.header": "밧줄 도르래로 구조물 옮기기", + "create.ponder.rope_pulley.text_1": "밧줄 도르래는 동력을 받으면 블록을 수직으로 옮깁니다.", + "create.ponder.rope_pulley.text_2": "방향과 속도는 들어오는 동력에 기반합니다.", + + "create.ponder.rope_pulley_attachment.header": "구조물로서의 밧줄 도르래", + "create.ponder.rope_pulley_attachment.text_1": "도르래가 장치에 의해 움직여지면...", + "create.ponder.rope_pulley_attachment.text_2": "...도르래에 딸린 구조물도 함께 움직입니다.", + "create.ponder.rope_pulley_attachment.text_3": "다만 도르래는 멈춰있을 때만 작동합니다.", + + "create.ponder.rope_pulley_modes.header": "밧줄 도르래의 이동 설정", + "create.ponder.rope_pulley_modes.text_1": "도르래가 움직임을 멈추면, 움직인 구조물은 블록으로 바뀝니다.", + "create.ponder.rope_pulley_modes.text_2": "블록으로 바뀌지 않게 하거나, 시작지점에서만 바뀌도록 설정할 수 있습니다.", + + "create.ponder.rotation_speed_controller.header": "회전 속도 컨트롤러 사용하기", + "create.ponder.rotation_speed_controller.text_1": "회전 속도 컨트롤러는 회전을 위 톱니바퀴로 회전을 전달합니다.", + "create.ponder.rotation_speed_controller.text_2": "스크롤하여 톱니바퀴에 전달되는 RPM을 조절합니다.", + + "create.ponder.sail.header": "날개를 이용해 풍차 조립하기", + "create.ponder.sail.text_1": "날개는 풍차를 만들기에 좋은 블록입니다.", + "create.ponder.sail.text_2": "강력 접착제나 섀시 없이 연결할 수 있습니다", + "create.ponder.sail.text_3": "염료로 우클릭하여 염색합니다.", + "create.ponder.sail.text_4": "가위로 우클릭하여 틀만 남길 수 있습니다.", + + "create.ponder.sail_frame.header": "날개 틀을 이용해 풍차 조립하기", + "create.ponder.sail_frame.text_1": "날개 틀은 풍차를 만들기에 좋은 블록입니다.", + "create.ponder.sail_frame.text_2": "강력 접착제나 섀시 없이 연결할 수 있습니다", + + "create.ponder.sequenced_gearshift.header": "순서화 전환기를 통한 회전 속도 제어", + "create.ponder.sequenced_gearshift.text_1": "순서화 전환기는 설정한 지시에 따라 회전됩니다.", + "create.ponder.sequenced_gearshift.text_2": "오른쪽 버튼을 누르면 설정 창이 열립니다.", + "create.ponder.sequenced_gearshift.text_3": "레드스톤 신호를 받으면 설정된 지시에 따라 회전하기 시작합니다.", + "create.ponder.sequenced_gearshift.text_4": "완료되면, 다음 레드스톤 신호를 기다립니다.", + "create.ponder.sequenced_gearshift.text_5": "레드스톤 비교기를 사용하면 현재 진행 상황을 알 수 있습니다.", + + "create.ponder.shaft.header": "축을 통한 동력 전달", + "create.ponder.shaft.text_1": "축은 일직선으로 회전을 전달합니다.", + + "create.ponder.shaft_casing.header": "축에 케이스 씌우기", + "create.ponder.shaft_casing.text_1": "황동 케이스나 안산암 케이스로 축을 장식할 수 있습니다.", + + "create.ponder.smart_chute.header": "스마트 슈트을 통한 아이템 필터", + "create.ponder.smart_chute.text_1": "스마트 슈트은 필터 기능이 있는 슈트입니다.", + "create.ponder.smart_chute.text_2": "필터 슬롯으로 아이템을 지정하여 원하는 아이템을 입출력할 수 있습니다.", + "create.ponder.smart_chute.text_3": "스크롤하여 한 번에 내보내는 아이템의 양을 조절합니다.", + "create.ponder.smart_chute.text_4": "레드스톤 신호를 받으면 작동을 멈춥니다.", + + "create.ponder.smart_pipe.header": "스마트 파이프를 통한 액체 필터", + "create.ponder.smart_pipe.text_1": "스마트 파이프는 필터 기능이 있는 파이프입니다.", + "create.ponder.smart_pipe.text_2": "비울 곳에다 설치하면, 어떤 액체를 뽑아낼지 설정할 수 있습니다.", + "create.ponder.smart_pipe.text_3": "필터 슬롯에 원하는 액체가 담긴 용기를 우클릭하면 됩니다.", + "create.ponder.smart_pipe.text_4": "다른 곳에 설치하면, 스마트 파이프는 맞는 액체만 통과시킵니다.", + + "create.ponder.speedometer.header": "속도 계측기를 통한 정보 확인", + "create.ponder.speedometer.text_1": "속도 계측기는 연결된 장치의 속도를 표시합니다.", + "create.ponder.speedometer.text_2": "고글을 장착하면, 세부 정보를 확인할 수 있습니다.", + "create.ponder.speedometer.text_3": "속도 계측기의 측정값에 따라 비교기가 레드스톤 신호를 내보냅니다.", + + "create.ponder.spout_filling.header": "주입기로 아이템에 액체 채우기", + "create.ponder.spout_filling.text_1": "주입기는 아래있는 아이템을 액체를 채웁니다.", + "create.ponder.spout_filling.text_2": "주입기 탱크는 직접 건드릴 수 없습니다.", + "create.ponder.spout_filling.text_3": "대신, 파이프로 액체를 공급할 수는 있습니다.", + "create.ponder.spout_filling.text_4": "주입기 아래 아이템 거치대에 아이템을 놓아, 액체를 채울 수 있습니다.", + "create.ponder.spout_filling.text_5": "아이템이 벨트에 있으면...", + "create.ponder.spout_filling.text_6": "...주입기가 알아서 아이템 이동을 멈추고 가공합니다.", + + "create.ponder.stabilized_bearings.header": "베어링 안정화", + "create.ponder.stabilized_bearings.text_1": "베어링이 움직이는 구조물의 일부분이어도...", + "create.ponder.stabilized_bearings.text_2": "...방향이 유지됩니다.", + "create.ponder.stabilized_bearings.text_3": "베어링에 블록이 부착되어도...", + "create.ponder.stabilized_bearings.text_4": "...부착된 구조물의 방향이 유지됩니다.", + + "create.ponder.sticker.header": "부착기를 통한 블록 부착", + "create.ponder.sticker.text_1": "부착기는 레드스톤으로 제어할 수 있습니다.", + "create.ponder.sticker.text_2": "신호를 받으면, 부착기가 블록을 부착합니다.", + "create.ponder.sticker.text_3": "장치가 이동하면 부착된 블록도 같이 이동합니다.", + "create.ponder.sticker.text_4": "다시 한번 신호를 받으면, 블록이 부착되지 않습니다.", + + "create.ponder.stressometer.header": "피로도 계측기를 통한 동적 정보 확인", + "create.ponder.stressometer.text_1": "피로도 계측기는 연결된 장치의 현재 부하를 표시합니다.", + "create.ponder.stressometer.text_2": "고글을 장착하면, 세부 정보를 확인할 수 있습니다.", + "create.ponder.stressometer.text_3": "피로도 계측기의 측정값에 따라 비교기가 레드스톤 신호를 내보냅니다.", + + "create.ponder.super_glue.header": "강력 접착제로 블록 붙이기", + "create.ponder.super_glue.text_1": "강력 접착제는 두 블록 사이에 사용해 블록을 붙입니다.", + "create.ponder.super_glue.text_2": "장치가 작동할 때, 붙은 블록들은 같이 이동됩니다.", + "create.ponder.super_glue.text_3": "강력 접착제를 다른 손에 들고...", + "create.ponder.super_glue.text_4": "...블록을 설치하면 자동으로 블록을 붙일 수 있습니다.", + "create.ponder.super_glue.text_5": "왼쪽 버튼을 누르면 강력 접착제를 제거할 수 있습니다.", + + "create.ponder.valve_handle.header": "밸브 손잡이로 동력 생산하기", + "create.ponder.valve_handle.text_1": "밸브 손잡이를 사용하면 수동으로 동력을 생성할 수 있습니다.", + "create.ponder.valve_handle.text_2": "오클릭하면 반시계 방향으로 회전합니다.", + "create.ponder.valve_handle.text_3": "전달되는 속도는 상대적으로 낮습니다.", + "create.ponder.valve_handle.text_4": "웅크리고 우클릭하면 시계 방향으로 회전합니다.", + "create.ponder.valve_handle.text_5": "염료로 염색할 수 있습니다.", + + "create.ponder.valve_pipe.header": "밸브로 흐름 조절하기", + "create.ponder.valve_pipe.text_1": "밸브는 파이프 속 액체 흐름을 조절합니다.", + "create.ponder.valve_pipe.text_2": "밸브의 축으로 액체가 통과할 수 있는지 조절합니다.", + "create.ponder.valve_pipe.text_3": "동력을 제공하면 밸브가 열립니다.", + "create.ponder.valve_pipe.text_4": "반대 방향으로 동력을 제공하면 밸브가 닫힙니다.", + + "create.ponder.water_wheel.header": "물레바퀴로 동력 생산하기", + "create.ponder.water_wheel.text_1": "물레바퀴는 물의 흐름으로부터 동력을 끌어옵니다.", + "create.ponder.water_wheel.text_2": "많은 면에 힘이 가해질수록 물레바퀴가 더 빠르게 회전합니다.", + "create.ponder.water_wheel.text_3": "바퀴의 날이 물이 흐르는 방향으로 향하게 된다면...", + "create.ponder.water_wheel.text_4": "...회전 속도가 감소하게 됩니다.", + + "create.ponder.weighted_ejector.header": "투척기 사용하기", + "create.ponder.weighted_ejector.text_1": "투척기를 들고 웅크리고 우클릭하면, 발사 지점을 정할 수 있습니다.", + "create.ponder.weighted_ejector.text_10": "투척기에 놓인 아이템의 양이 설정량에 도달한 경우에만 투척기가 작동합니다.", + "create.ponder.weighted_ejector.text_11": "다른 엔티티가 발사대를 밟으면, 항상 발사대가 작동합니다.", + "create.ponder.weighted_ejector.text_2": "투척기는 지정한 위치에다 물체를 투척합니다.", + "create.ponder.weighted_ejector.text_3": "이 범위의 아무 장소에 투척할 수 있습니다.", + "create.ponder.weighted_ejector.text_4": "옆으로 투척할 수는 없습니다.", + "create.ponder.weighted_ejector.text_5": "투척 지점이 선택되지 않거나 올바르지 않은 경우, 바로 앞에 물체를 투척합니다.", + "create.ponder.weighted_ejector.text_6": "투척하려면 회전력이 필요합니다.", + "create.ponder.weighted_ejector.text_7": "투척기에 아이템을 놓으면 투척기가 작동합니다.", + "create.ponder.weighted_ejector.text_8": "보관함이 투척 지점인 경우에는 보관함에 공간이 생길 때까지 기다립니다.", + "create.ponder.weighted_ejector.text_9": "렌치를 사용하여, 투척에 필요한 아이템의 양을 설정할 수 있습니다.", + + "create.ponder.weighted_ejector_redstone.header": "투척기와 레드스톤", + "create.ponder.weighted_ejector_redstone.text_1": "레드스톤 신호를 받으면, 투척기가 작동하지 않습니다.", + "create.ponder.weighted_ejector_redstone.text_2": "관측기는 투척기가 작동하는 것을 탐지할 수 있습니다.", + + "create.ponder.weighted_ejector_tunnel.header": "투척기로 아이템 분할하기", + "create.ponder.weighted_ejector_tunnel.text_1": "황동 터널과 같이 사용하면 특정 양만큼 아이템을 분할할 수 있습니다.", + "create.ponder.weighted_ejector_tunnel.text_2": "먼저, 황동 터널을 '가까운 곳 선호' 방식으로 변경하여 측면에 아이템을 먼저 출력하게 만드세요.", + "create.ponder.weighted_ejector_tunnel.text_3": "이제, 투척기에 설정량에 따라 아이템을 분할할 수 있습니다.", + "create.ponder.weighted_ejector_tunnel.text_4": "설정량만큼의 아이템이 출력되고...", + "create.ponder.weighted_ejector_tunnel.text_5": "...나머지 아이템은 계속 수송됩니다", + + "create.ponder.windmill_source.header": "풍차 베어링으로 동력 생산하기", + "create.ponder.windmill_source.text_1": "풍차 베어링은 부착된 블록을 회전하게 만듭니다.", + "create.ponder.windmill_source.text_2": "날개 블록이 충분히 부착되어야 풍차의 역할을 합니다.", + "create.ponder.windmill_source.text_3": "우클릭하면 풍차 베어링이 동력을 생성합니다.", + "create.ponder.windmill_source.text_4": "날개 수에 따라 회전 속도가 바뀝니다.", + "create.ponder.windmill_source.text_5": "렌치를 들고 스크롤하면 회전 방향을 바꿀 수 있습니다.", + "create.ponder.windmill_source.text_6": "베어링에 우클릭하면 멈추고, 구조물을 수정할 수 있게 됩니다", + + "create.ponder.windmill_structure.header": "풍차 구조물", + "create.ponder.windmill_structure.text_1": "최소 8개 이상의 날개 블록이 있는 구조물만 풍차로 사용할 수 있습니다.", + "_": "Thank you for translating Create!" } diff --git a/src/main/resources/assets/create/lang/pl_pl.json b/src/main/resources/assets/create/lang/pl_pl.json index 72e6c341d..e3de67996 100644 --- a/src/main/resources/assets/create/lang/pl_pl.json +++ b/src/main/resources/assets/create/lang/pl_pl.json @@ -1732,7 +1732,7 @@ "create.ponder.empty_blaze_burner.text_2": "Ewentualnie, Płomyk może być zabrany prosto z jego Spawnera", "create.ponder.empty_blaze_burner.text_3": "Masz teraz idealne źródło ciepła dla przeróżnych maszyn", "create.ponder.empty_blaze_burner.text_4": "Dla celów dekoracyjnych, puste palniki można też zapalić krzesiwem", - "create.ponder.empty_blaze_burner.text_5": "Nie będzie on dawał jednak ciepła", + "create.ponder.empty_blaze_burner.text_6": "Nie będzie on dawał jednak ciepła", "create.ponder.fan_direction.header": "Przepływ powietrza przez izolowane wiatraki", "create.ponder.fan_direction.text_1": "Izolowane wiatraki używają siły obrotowej, aby wytworzyć przepływ powietrza", diff --git a/src/main/resources/assets/create/lang/ru_ru.json b/src/main/resources/assets/create/lang/ru_ru.json index d88a93c3d..3031f418d 100644 --- a/src/main/resources/assets/create/lang/ru_ru.json +++ b/src/main/resources/assets/create/lang/ru_ru.json @@ -1,5 +1,6 @@ { - + "_": "Missing Localizations: -", + "_": "->------------------------] Game Elements [------------------------<-", "block.create.acacia_window": "Акациевое окно", @@ -26,11 +27,13 @@ "block.create.basin": "Чаша", "block.create.belt": "Конвейер", "block.create.birch_window": "Берёзовое окно", - "block.create.birch_window_pane": "Панель берёзового окна", + "block.create.birch_window_pane": "Панель из берёзового окна", + "block.create.black_nixie_tube": "Чёрный газоразрядный индикатор", "block.create.black_sail": "Чёрный парус", "block.create.black_seat": "Чёрное сиденье", "block.create.black_valve_handle": "Чёрный ручной вентиль", "block.create.blaze_burner": "Горелка Всполоха", + "block.create.blue_nixie_tube": "Синий газоразрядный индикатор", "block.create.blue_sail": "Синий парус", "block.create.blue_seat": "Синее сиденье", "block.create.blue_valve_handle": "Синий ручной вентиль", @@ -40,6 +43,7 @@ "block.create.brass_encased_shaft": "Вал в латунном корпусе", "block.create.brass_funnel": "Латунная воронка", "block.create.brass_tunnel": "Латунный туннель", + "block.create.brown_nixie_tube": "Коричневый газоразрядный индикатор", "block.create.brown_sail": "Коричневый парус", "block.create.brown_seat": "Коричневое сиденье", "block.create.brown_valve_handle": "Коричневый ручной вентиль", @@ -51,12 +55,13 @@ "block.create.chiseled_scoria": "Резной пепел", "block.create.chiseled_weathered_limestone": "Выветренный резной известняк", "block.create.chocolate": "Шоколад", - "block.create.chute": "Желоб", + "block.create.chute": "Жёлоб", "block.create.clockwork_bearing": "Часовой механизм", "block.create.clutch": "Сцепление", "block.create.cogwheel": "Шестерня", - "block.create.content_observer": "Наблюдетель за содержимым", + "block.create.content_observer": "Наблюдатель за содержимым", "block.create.controller_rail": "Контролирующая рельса", + "block.create.copper_backtank": "Медный баллон", "block.create.copper_block": "Медный блок", "block.create.copper_casing": "Медный корпус", "block.create.copper_ore": "Медная руда", @@ -71,8 +76,9 @@ "block.create.crushing_wheel": "Колесо дробления", "block.create.crushing_wheel_controller": "Контроллер колеса дробления", "block.create.cuckoo_clock": "Часы с кукушкой", + "block.create.cyan_nixie_tube": "Бирюзовый газоразрядный индикатор", "block.create.cyan_sail": "Бирюзовый парус", - "block.create.cyan_seat": "Бирюзовое сииденье", + "block.create.cyan_seat": "Бирюзовое сиденье", "block.create.cyan_valve_handle": "Бирюзовый ручной вентиль", "block.create.dark_oak_window": "Окно из тёмного дуба", "block.create.dark_oak_window_pane": "Панель из окна из тёмного дуб", @@ -81,11 +87,11 @@ "block.create.dark_scoria_bricks_slab": "Плита из тёмного пепельного кирпича", "block.create.dark_scoria_bricks_stairs": "Ступени из тёмного пепельного кирпича", "block.create.dark_scoria_bricks_wall": "Стена из тёмного пепельного кирпича", - "block.create.dark_scoria_cobblestone": "Ступени из тёмного пепел-булыжника", - "block.create.dark_scoria_cobblestone_slab": "Плита из тёмного пепел-булыжника", - "block.create.dark_scoria_cobblestone_stairs": "Ступени из тёмного пепел-булыжника", - "block.create.dark_scoria_cobblestone_wall": "Стена из тёмного пепел-булыжника", - "block.create.dark_scoria_pillar": "Колонна из тёмного пепел-булыжника", + "block.create.dark_scoria_cobblestone": "Ступени из тёмного пепельного булыжника", + "block.create.dark_scoria_cobblestone_slab": "Плита из тёмного пепельного булыжника", + "block.create.dark_scoria_cobblestone_stairs": "Ступени из тёмного пепельного булыжника", + "block.create.dark_scoria_cobblestone_wall": "Стена из тёмного пепельного булыжника", + "block.create.dark_scoria_pillar": "Колонна из тёмного пепельного булыжника", "block.create.deployer": "Автономный активатор", "block.create.depot": "Депо", "block.create.diorite_bricks": "Диоритовый кирпич", @@ -163,6 +169,8 @@ "block.create.gabbro_cobblestone_stairs": "Ступени из габбро-булыжника", "block.create.gabbro_cobblestone_wall": "Стена из габбро-булыжника", "block.create.gabbro_pillar": "Габбро колонна", + "block.create.gantry_carriage": "Шасси портального крана", + "block.create.gantry_shaft": "Вал портального крана", "block.create.gearbox": "Коробка передач", "block.create.gearshift": "Реверсивный механизм", "block.create.glass_fluid_pipe": "Стеклянная жидкостная труба", @@ -175,17 +183,20 @@ "block.create.granite_cobblestone_stairs": "Ступени из гранит-булыжника", "block.create.granite_cobblestone_wall": "Стена из гранит-булыжника", "block.create.granite_pillar": "Гранитная колонна", + "block.create.gray_nixie_tube": "Серый газоразрядный индикатор", "block.create.gray_sail": "Серый парус", "block.create.gray_seat": "Серое сиденье", "block.create.gray_valve_handle": "Серый ручной вентиль", + "block.create.green_nixie_tube": "Зелёный газоразрядный индикатор", "block.create.green_sail": "Зелёный парус", "block.create.green_seat": "Зелёное сиденье", "block.create.green_valve_handle": "Зелёный ручной вентиль", "block.create.hand_crank": "Рукоятка", + "block.create.haunted_bell": "Призрачный колокол", "block.create.honey": "Мёд", "block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло", "block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель", - "block.create.hose_pulley": "Шкив с шлангом", + "block.create.hose_pulley": "Шкив со шлангом", "block.create.item_drain": "Предметный осушитель", "block.create.jungle_window": "Окно из тропического дерева", "block.create.jungle_window_pane": "Панель окна из тропического дерева", @@ -199,12 +210,16 @@ "block.create.layered_limestone": "Слоистый известняк", "block.create.layered_scoria": "Слоистый пепел", "block.create.layered_weathered_limestone": "Слоистый выветренный известняк", + "block.create.lectern_controller": "Контроллер кафедры", + "block.create.light_blue_nixie_tube": "Голубой газоразрядный индикатор", "block.create.light_blue_sail": "Голубой парус", "block.create.light_blue_seat": "Голубое сиденье", "block.create.light_blue_valve_handle": "Голубой ручной вентиль", + "block.create.light_gray_nixie_tube": "Светло-серый газоразрядный индикатор", "block.create.light_gray_sail": "Светло-серый парус", "block.create.light_gray_seat": "Светло-серое сиденье", "block.create.light_gray_valve_handle": "Светло-серый ручной вентиль", + "block.create.lime_nixie_tube": "Лаймовый газоразрядный индикатор", "block.create.lime_sail": "Лаймовый парус", "block.create.lime_seat": "Лаймовое сиденье", "block.create.lime_valve_handle": "Лаймовый ручной вентиль", @@ -220,7 +235,8 @@ "block.create.limestone_cobblestone_wall": "Стена из известняк-булыжника", "block.create.limestone_pillar": "Известковая колонна", "block.create.linear_chassis": "Линейное шасси", - "block.create.lit_blaze_burner": "Зажжёная горелка Всполоха", + "block.create.lit_blaze_burner": "Зажжённая горелка Всполоха", + "block.create.magenta_nixie_tube": "Пурпурный газоразрядный индикатор", "block.create.magenta_sail": "Пурпурный парус", "block.create.magenta_seat": "Пурпурное сиденье", "block.create.magenta_valve_handle": "Пурпурный ручной вентиль", @@ -304,6 +320,8 @@ "block.create.paved_weathered_limestone_slab": "Плита из мощёного выветренного известняка", "block.create.paved_weathered_limestone_stairs": "Ступени из мощёного выветренного известняка", "block.create.paved_weathered_limestone_wall": "Стена из мощёного выветренного известняка", + "block.create.peculiar_bell": "Особенный колокол", + "block.create.pink_nixie_tube": "Розовый газоразрядный индикатор", "block.create.pink_sail": "Розовый парус", "block.create.pink_seat": "Розовое сиденье", "block.create.pink_valve_handle": "Розовый ручной вентиль", @@ -316,10 +334,10 @@ "block.create.polished_dolomite_slab": "Плита из полированного доломита", "block.create.polished_dolomite_stairs": "Ступени из полированного доломита", "block.create.polished_dolomite_wall": "Стена из полированного доломита", - "block.create.polished_gabbro": "Полированный габро", - "block.create.polished_gabbro_slab": "Плита из полированного габро", - "block.create.polished_gabbro_stairs": "Ступени из полированного габро", - "block.create.polished_gabbro_wall": "Стена из полированного габро", + "block.create.polished_gabbro": "Полированный габбро", + "block.create.polished_gabbro_slab": "Плита из полированного габбро", + "block.create.polished_gabbro_stairs": "Ступени из полированного габбро", + "block.create.polished_gabbro_wall": "Стена из полированного габбро", "block.create.polished_limestone": "Полированный известняк", "block.create.polished_limestone_slab": "Плита из полированного известняка", "block.create.polished_limestone_stairs": "Ступени из полированного известняка", @@ -334,19 +352,21 @@ "block.create.polished_weathered_limestone_wall": "Стена из полированного выветренного известняка", "block.create.portable_fluid_interface": "Портативный жидкостный интерфейс", "block.create.portable_storage_interface": "Портативный интерфейс хранения", - "block.create.powered_latch": "Механизированная защёлка", - "block.create.powered_toggle_latch": "Механизированная рычаг-защёлка", + "block.create.powered_latch": "Питаемый рычаг", + "block.create.powered_toggle_latch": "Питаемый рычаг-переключатель", "block.create.pulley_magnet": "Магнитный шкив", "block.create.pulse_repeater": "Импульсный повторитель", + "block.create.purple_nixie_tube": "Фиолетовый газоразрядный индикатор", "block.create.purple_sail": "Фиолетовый парус", "block.create.purple_seat": "Фиолетовое сиденье", "block.create.purple_valve_handle": "Фиолетовый ручной вентиль", "block.create.radial_chassis": "Радиальное шасси", + "block.create.red_nixie_tube": "Красный газоразрядный индикатор", "block.create.red_sail": "Красный парус", "block.create.red_seat": "Красное сиденье", "block.create.red_valve_handle": "Красный ручной вентиль", - "block.create.redstone_contact": "Контакт сигнала красного камня", - "block.create.redstone_link": "Беспроводной передатчик сигнала красного камня", + "block.create.redstone_contact": "Контакт редстоун сигнала", + "block.create.redstone_link": "Беспроводной передатчик редстоун сигнала", "block.create.refined_radiance_casing": "Сияющий корпус", "block.create.reinforced_rail": "Усиленные рельсы", "block.create.rope": "Канат", @@ -360,16 +380,16 @@ "block.create.scoria_bricks_slab": "Плита из пепельного кирпича", "block.create.scoria_bricks_stairs": "Ступени из пепельного кирпича", "block.create.scoria_bricks_wall": "Стена из пепельного кирпича", - "block.create.scoria_cobblestone": "Пепел-булыжник", - "block.create.scoria_cobblestone_slab": "Плита из пепел-булыжника", - "block.create.scoria_cobblestone_stairs": "Ступени из пепел-булыжника", - "block.create.scoria_cobblestone_wall": "Стена из пепел-булыжника", + "block.create.scoria_cobblestone": "Пепельный булыжник", + "block.create.scoria_cobblestone_slab": "Плита из пепельного булыжника", + "block.create.scoria_cobblestone_stairs": "Ступени из пепельного булыжника", + "block.create.scoria_cobblestone_wall": "Стена из пепельного булыжника", "block.create.scoria_pillar": "Колонна из пепла", "block.create.secondary_linear_chassis": "Вторичное линейное шасси", "block.create.sequenced_gearshift": "Последовательный переключатель передач", "block.create.shadow_steel_casing": "Теневой корпус", "block.create.shaft": "Вал", - "block.create.smart_chute": "Умный желоб", + "block.create.smart_chute": "Умный жёлоб", "block.create.smart_fluid_pipe": "Умная жидкостная труба", "block.create.speedometer": "Спидометр", "block.create.spout": "Дозатор", @@ -378,7 +398,7 @@ "block.create.sticker": "Блок-липучка", "block.create.sticky_mechanical_piston": "Липкий механический поршень", "block.create.stockpile_switch": "Настраиваемый компаратор", - "block.create.stressometer": "Динамометр", + "block.create.stressometer": "Стрессометр", "block.create.tiled_glass": "Плиточное стекло", "block.create.tiled_glass_pane": "Плиточная стеклянная панель", "block.create.turntable": "Поворотный стол", @@ -398,24 +418,30 @@ "block.create.weathered_limestone_cobblestone_wall": "Стена из известняк-булыжника", "block.create.weathered_limestone_pillar": "Колонна из выветренного известняка", "block.create.weighted_ejector": "Взвешенная катапульта", + "block.create.white_nixie_tube": "Белый газоразрядный индикатор", "block.create.white_sail": "Белый парус", "block.create.white_seat": "Белое сиденье", "block.create.white_valve_handle": "Белый ручной вентиль", "block.create.windmill_bearing": "Подшипник ветряной мельницы", "block.create.wooden_bracket": "Деревянная скоба", + "block.create.yellow_nixie_tube": "Жёлтый газоразрядный индикатор", "block.create.yellow_sail": "Жёлтый парус", "block.create.yellow_seat": "Жёлтое сиденье", "block.create.yellow_valve_handle": "Жёлтый ручной вентиль", "block.create.zinc_block": "Цинковый блок", "block.create.zinc_ore": "Цинковая руда", + "enchantment.create.capacity": "Вместимость", + "enchantment.create.potato_recovery": "Возобновление картофеля", + "entity.create.contraption": "Штуковина", + "entity.create.crafting_blueprint": "Создание чертежа", + "entity.create.gantry_contraption": "Крановая штуковина", + "entity.create.potato_projectile": "Картофельный снаряд", "entity.create.seat": "Сиденье", "entity.create.stationary_contraption": "Стационарная штуковина", "entity.create.super_glue": "Супер-клей", - "fluid.create.chocolate": "Шоколад", - "fluid.create.honey": "Мёд", "fluid.create.milk": "Молоко", "fluid.create.potion": "Зелье", "fluid.create.tea": "Чай Строителя", @@ -431,16 +457,18 @@ "item.create.brass_nugget": "Кусочек латуни", "item.create.brass_sheet": "Латунный лист", "item.create.builders_tea": "Чай Строителя", - "item.create.chest_minecart_contraption": "Сундуко-вагонеточная штуковина", + "item.create.chest_minecart_contraption": "Штуковина грузовой вагонетки", "item.create.chocolate_bucket": "Ведро шоколада", "item.create.chocolate_glazed_berries": "Ягоды в шоколадной глазури", "item.create.chromatic_compound": "Хроматический компаунд", "item.create.cinder_flour": "Незераковая пыль", + "item.create.copper_backtank": "Медный баллон", "item.create.copper_ingot": "Медный слиток", "item.create.copper_nugget": "Кусочек меди", "item.create.copper_sheet": "Медный лист", "item.create.crafter_slot_cover": "Крышка на слот крафтера", - "item.create.crushed_aluminum_ore": "Измельчённая алюминиевая руда", + "item.create.crafting_blueprint": "Создание чертежа", + "item.create.crushed_aluminum_ore": "Дроблёная алюминиевая руда", "item.create.crushed_brass": "Дроблёная латунь", "item.create.crushed_copper_ore": "Дроблёная медная руда", "item.create.crushed_gold_ore": "Дроблёная золотая руда", @@ -450,31 +478,35 @@ "item.create.crushed_osmium_ore": "Дроблёная осмиевая руда", "item.create.crushed_platinum_ore": "Дроблёная платиновая руда", "item.create.crushed_quicksilver_ore": "Дроблёная ртутная руда", - "item.create.crushed_silver_ore": "Дроблёная серебрянная руда", + "item.create.crushed_silver_ore": "Дроблёная серебряная руда", "item.create.crushed_tin_ore": "Дроблёная оловянная руда", "item.create.crushed_uranium_ore": "Дроблёная урановая руда", "item.create.crushed_zinc_ore": "Дроблёная цинковая руда", - "item.create.deforester": "Уничтожитель леса", + "item.create.diving_boots": "Ботинки для дайвинга", + "item.create.diving_helmet": "Шлем для дайвинга", "item.create.dough": "Тесто", "item.create.electron_tube": "Электронная лампа", - "item.create.empty_blaze_burner": "Пустая горелека Всполоха", + "item.create.empty_blaze_burner": "Пустая горелка Всполоха", "item.create.empty_schematic": "Пустая схематика", "item.create.extendo_grip": "Удлинённая рука", "item.create.filter": "Фильтр", - "item.create.furnace_minecart_contraption": "Печно-вагонеточная штуковина", + "item.create.furnace_minecart_contraption": "Штуковина самоходной вагонетки", "item.create.goggles": "Инженерные очки", "item.create.golden_sheet": "Золотой лист", - "item.create.handheld_blockzapper": "Ручная блоковая пушка", "item.create.handheld_worldshaper": "Ручной редактор мира", "item.create.honey_bucket": "Ведро мёда", "item.create.honeyed_apple": "Яблоко в меду", - "item.create.integrated_circuit": "Интегральная схема", + "item.create.incomplete_cogwheel": "Незаконченная шестерня", + "item.create.incomplete_large_cogwheel": "Незаконченная большая шестерня", + "item.create.incomplete_precision_mechanism": "Незаконченный механизм точности", "item.create.iron_sheet": "Железный лист", - "item.create.lapis_sheet": "Лазуритовый лист", + "item.create.linked_controller": "Контроллер связей", "item.create.minecart_contraption": "Вагонеточная штуковина", - "item.create.minecart_coupling": "Связыватель вагонеток", + "item.create.minecart_coupling": "Соединитель вагонеток", "item.create.polished_rose_quartz": "Полированный розовый кварц", + "item.create.potato_cannon": "Картофельная пушка", "item.create.powdered_obsidian": "Порошкообразный обсидиан", + "item.create.precision_mechanism": "Механизм точности", "item.create.propeller": "Пропеллер", "item.create.red_sand_paper": "Красная наждачная бумага", "item.create.refined_radiance": "Изысканное сияние", @@ -502,9 +534,9 @@ "advancement.create.andesite_alloy": "Повторение - мать учения", "advancement.create.andesite_alloy.desc": "Материалы Create имеют странные названия, одно из них - Андезитовый сплав", "advancement.create.its_alive": "Оно живое!", - "advancement.create.its_alive.desc": "Смастерите ваш первый кинетический компонент вращения.", + "advancement.create.its_alive.desc": "Смастерите ваш первый кинетический вращающийся компонент.", "advancement.create.shifting_gears": "Механизм переключения", - "advancement.create.shifting_gears.desc": "Подсоедините большую шестерню к шестерне, что позволит изменить скорость вращения.", + "advancement.create.shifting_gears.desc": "Подсоедините большую шестерню к обычной шестерне для изменения скорости вращения.", "advancement.create.overstressed": "Перегрузка", "advancement.create.overstressed.desc": "Столкнитесь с предельной перегрузкой лицом к лицу.", "advancement.create.belt": "Передайте за проезд!", @@ -520,9 +552,9 @@ "advancement.create.belt_funnel": "Болтающиеся воронки", "advancement.create.belt_funnel.desc": "Поместите воронку боком, сверху конвейера или депо, чтобы создать её специальный тип.", "advancement.create.belt_funnel_kiss": "Механический ужин", - "advancement.create.belt_funnel_kiss.desc": "Заставте две смонтированные на ремнях воронки поцеловаться.", + "advancement.create.belt_funnel_kiss.desc": "Заставьте две смонтированные на ремнях воронки поцеловаться.", "advancement.create.fan": "Механический маг воздуха", - "advancement.create.fan.desc": "Оседлайте поток воздуха от Венитлятора.", + "advancement.create.fan.desc": "Оседлайте поток воздуха от Вентилятора.", "advancement.create.fan_lava": "Геотермальный пространственный нагреватель", "advancement.create.fan_lava.desc": "Попадите в поток воздуха, плавящего вещи.", "advancement.create.fan_water": "Сумасшедшая мойка", @@ -532,19 +564,19 @@ "advancement.create.wrench": "Конфигурировать удобно", "advancement.create.wrench.desc": "Создайте гаечный ключ, чтобы помочь себе в создании изобретений.", "advancement.create.goggles": "Стресс-о-зрение", - "advancement.create.goggles.desc": "Создайте инженерные очки, чтобы получить больше кинетической информации о компонентах.", + "advancement.create.goggles.desc": "Создайте инженерные очки, чтобы получить больше информации о кинетике компонентов.", "advancement.create.speedometer": "Так быстро?", "advancement.create.speedometer.desc": "Поставьте и подключите спидометр. Посмотрите на спидометр через очки, чтобы прочитать точное значение.", "advancement.create.stressometer": "Так сильно?", - "advancement.create.stressometer.desc": "Поставьте и подключите динамометр. Посмотрите на динамометр через очки, чтобы прочитать точное значение.", + "advancement.create.stressometer.desc": "Поставьте и подключите стрессометр. Посмотрите на стрессометр через очки, чтобы прочитать точное значение.", "advancement.create.aesthetics": "Бах! Эстетично!", - "advancement.create.aesthetics.desc": "Разместите скобы на валу, трубе или шестерне.", + "advancement.create.aesthetics.desc": "Разместите скобы на вал, трубу или шестерню.", "advancement.create.reinforced": "Бах! Усилено!", "advancement.create.reinforced.desc": "Разместите подходящий блок корпуса на вал, трубу и конвейер.", - "advancement.create.water_wheel": "Гидравлика", + "advancement.create.water_wheel": "Обузданная гидравлика", "advancement.create.water_wheel.desc": "Поставьте водяное колесо и попытайтесь заставить его вращаться!", "advancement.create.chocolate_wheel": "Вкусная сила", - "advancement.create.chocolate_wheel.desc": "Зпустите водяное колесо с помощью раплавленного шоколада.", + "advancement.create.chocolate_wheel.desc": "Запустите водяное колесо с помощью расплавленного шоколада.", "advancement.create.lava_wheel": "Адское колесо", "advancement.create.lava_wheel.desc": "Это не должно было работать.", "advancement.create.cuckoo": "Уже?", @@ -557,12 +589,12 @@ "advancement.create.maxed_windmill.desc": "Соберите ветряную мельницу максимальной силы.", "advancement.create.andesite_casing": "Андезитовый век", "advancement.create.andesite_casing.desc": "Используйте немного андезитового сплава и дерева для создания корпуса.", - "advancement.create.mechanical_drill": "Стационарные выключатели", + "advancement.create.mechanical_drill": "Стационарные разрушители", "advancement.create.mechanical_drill.desc": "Установите и приведите в действие механическую дрель", "advancement.create.press": "Пресс делает «Бонк!»", "advancement.create.press.desc": "Приведите механический пресс в действие и используйте его для создания пластин.", "advancement.create.polished_rose_quartz": "Розовый алмаз", - "advancement.create.polished_rose_quartz.desc": "Используйте кусок наждачной бумаги, чтобы отполировать розовый кварц, пока он не станет прозрачным.", + "advancement.create.polished_rose_quartz.desc": "Используйте кусок наждачной бумаги, чтобы отполировать розовый кварц, пока он не станет глянцевым.", "advancement.create.electron_tube": "Бип бип", "advancement.create.electron_tube.desc": "Сделайте несколько электронных ламп, пригодных для изготовления менее примитивных машин.", "advancement.create.mechanical_saw": "Стационарная рубка", @@ -575,7 +607,7 @@ "advancement.create.blaze_burner.desc": "Получить Горелку Всполоха", "advancement.create.compact": "Автоматическое уплотнение", "advancement.create.compact.desc": "Используйте пресс и чашу для уплотнения некоторых предметов.", - "advancement.create.brass": "Действительный сплав", + "advancement.create.brass": "Реальный сплав", "advancement.create.brass.desc": "Используйте дроблёную медь и дроблёный цинк, чтобы создать немного латуни.", "advancement.create.brass_casing": "Бронзовый век", "advancement.create.brass_casing.desc": "Используйте только что полученную латунь и немного дерева, чтобы создать более продвинутый корпус.", @@ -591,7 +623,7 @@ "advancement.create.item_drain.desc": "Посмотрите как жидкость выкачивается из предмета, в Предметном осушителе.", "advancement.create.chained_item_drain": "Поехали!", "advancement.create.chained_item_drain.desc": "Наблюдайте за тем как предмет едет через несколько соединённых предметных осушителей.", - "advancement.create.glass_pipe": "Поточный шпион", + "advancement.create.glass_pipe": "Шпион за потоками", "advancement.create.glass_pipe.desc": "Наблюдайте через окно в трубе за тем как распространяется жидкость. Окно появится на трубе при использовании гаечного ключа.", "advancement.create.pipe_collision": "Никогда не скрещивайте потоки!", "advancement.create.pipe_collision.desc": "Наблюдайте за тем как две жидкости встречаются в вашей сети труб.", @@ -604,7 +636,7 @@ "advancement.create.infinite_lava": "Уничтожение ядра", "advancement.create.infinite_lava.desc": "Выкачивайте лаву из бассейна, считающегося бесконечным.", "advancement.create.infinite_chocolate": "Утопая в воображении", - "advancement.create.infinite_chocolate.desc": "Выкачивайте раславленный шоколад из резервуара, считающегося бесконечным.", + "advancement.create.infinite_chocolate.desc": "Выкачивайте расплавленный шоколад из резервуара, считающегося бесконечным.", "advancement.create.crafter": "Автоматизированная сборка", "advancement.create.crafter.desc": "Поставьте и подключите механический крафтер", "advancement.create.clockwork_bearing": "Хитрые часы", @@ -619,18 +651,18 @@ "advancement.create.flywheel.desc": "Успешно соедините двигатель с маховиком.", "advancement.create.overstress_flywheel": "Перенапряжение", "advancement.create.overstress_flywheel.desc": "Подайте слишком большую нагрузку на печной двигатель.", - "advancement.create.integrated_circuit": "Сложные вычисления", - "advancement.create.integrated_circuit.desc": "Создайте Интегральную схему.", + "advancement.create.precision_mechanism": "Сложные любопытства.", + "advancement.create.precision_mechanism.desc": "Создайте механизм точности.", "advancement.create.mechanical_arm": "Золотые руки!", - "advancement.create.mechanical_arm.desc": "Создайте Механическую руку, выбирете входы и выходы, установите в мире и запитайте. Затем смотрите как она делает за вас всю работу.", + "advancement.create.mechanical_arm.desc": "Создайте Механическую руку, выберите входы и выходы, установите в мире и запитайте. Затем смотрите как она делает за вас всю работу.", "advancement.create.musical_arm": "Сбацай что-нибудь!", "advancement.create.musical_arm.desc": "Посмотрите как механическая рука меняет пластинки.", - "advancement.create.arm_many_targets": "Организатор", + "advancement.create.arm_many_targets": "Организа-трон", "advancement.create.arm_many_targets.desc": "Запрограммируйте механическую руку на 10 и больше выходов.", - "advancement.create.arm_blaze_burner": "Поджигатель", + "advancement.create.arm_blaze_burner": "Поджигателе-трон", "advancement.create.arm_blaze_burner.desc": "Запрограммируйте механическую руку на кормление Горелки Всполоха.", "advancement.create.fist_bump": "Брось это, братан!", - "advancement.create.fist_bump.desc": "Сделайте два удара кулаком.", + "advancement.create.fist_bump.desc": "Сделайте два удара кулаками Автономных активаторов.", "advancement.create.crushing_wheel": "Пара гигантов", "advancement.create.crushing_wheel.desc": "Создайте несколько дробящих колес, чтобы более эффективно разрушать больше материалов.", "advancement.create.blaze_cake": "Сахарная лихорадка", @@ -643,17 +675,13 @@ "advancement.create.refined_radiance.desc": "Создайте изысканное сияние, мощное хроматическое вещество.", "advancement.create.chromatic_age": "Хроматический век", "advancement.create.chromatic_age.desc": "Создайте блоки корпуса из света и тьмы.", - "advancement.create.zapper": "Строительство со стилем", - "advancement.create.zapper.desc": "Создайте ручную блоковую пушку, которая поможет вам строить.", - "advancement.create.upgraded_zapper": "Сияющий овердрайв", - "advancement.create.upgraded_zapper.desc": "Создайте и активируйте полностью модернизированную ручную блоковую пушку.", "advancement.create.wand_of_symmetry": "Сияющие зеркала", "advancement.create.wand_of_symmetry.desc": "Создайте жезл симметрии.", - "advancement.create.deforester": "Лучистая рубка", - "advancement.create.deforester.desc": "Создайте уничтожитель леса и попрощайтесь с местным лесом.", - "advancement.create.extendo_grip": "Кипение!", + "advancement.create.extendo_grip": "Бойоиоинг!", "advancement.create.extendo_grip.desc": "Возьмите в руки удлинённую руку", - "advancement.create.dual_extendo_grip": "Окончательное выкипание", + "advancement.create.potato_cannon": "Свомп!", + "advancement.create.potato_cannon.desc": "Победите врага с помощью своей картофельной пушки!", + "advancement.create.dual_extendo_grip": "Время ультимативных пружин", "advancement.create.dual_extendo_grip.desc": "Две удлинённых руки для сверхчеловеческого охвата.", "advancement.create.eob": "Конец бета-версии", "advancement.create.eob.desc": "Ожидайте больше контента здесь в будущем. <3", @@ -665,15 +693,31 @@ "itemGroup.create.palettes": "Create: Декор", "death.attack.create.crush": "%1$s был передроблен", + "death.attack.create.crush.player": "%2$s столкнул %1$s в дробящие колёса", "death.attack.create.fan_fire": "%1$s был сожжен до смерти горячим воздухом", + "death.attack.create.fan_fire.player": "%2$s столкнул %1$s в коптильню", "death.attack.create.fan_lava": "%1$s был сожжен до смерти поклонником лавы", - "death.attack.create.mechanical_drill": "%1$s был пронзен с помощью механической дрели", + "death.attack.create.fan_lava.player": "%2$s столкнул %1$s в плавильню", + "death.attack.create.mechanical_drill": "%1$s был пронзён механической дрелью", + "death.attack.create.mechanical_drill.player": "%2$s толкнул %1$s под механическую дрель", "death.attack.create.mechanical_saw": "%1$s был разрезан пополам механической пилой", + "death.attack.create.mechanical_saw.player": "%2$s толкнул %1$s под механическую пилу", + "death.attack.create.potato_cannon": "%1$s был застрелен картофельной пушкой %2$s", + "death.attack.create.potato_cannon.item": "%1$s был застрелен %2$s при помощи «%3$s»", "death.attack.create.cuckoo_clock_explosion": "%1$s взорвали подделанные часы с кукушкой", + "death.attack.create.cuckoo_clock_explosion.player": "%1$s был взорван подделанными часами с кукушкой", "create.block.deployer.damage_source_name": "автономным активатором", "create.block.cart_assembler.invalid": "Поместите сборщик вагонеток на блок рельс", + "create.menu.return": "Вернуться в меню", + "create.menu.configure": "Настроить...", + "create.menu.ponder_index": "Содержание размышлений", + "create.menu.only_ingame": "Доступно в меню Паузы", + "create.menu.project_page": "Страница проекта", + "create.menu.report_bugs": "Сообщите об ошибке", + "create.menu.support": "Поддержите нас", + "create.recipe.crushing": "Измельчение", "create.recipe.milling": "Помол", "create.recipe.fan_washing": "Массовая промывка", @@ -684,6 +728,7 @@ "create.recipe.fan_blasting.fan": "Вентилятор за текущей лавой", "create.recipe.pressing": "Прессование", "create.recipe.mixing": "Смешивание", + "create.recipe.deploying": "Автономная активация", "create.recipe.automatic_shapeless": "Автоматическая бесформенная сборка", "create.recipe.automatic_brewing": "Автоматическое смешивание", "create.recipe.packing": "Прессование", @@ -692,11 +737,21 @@ "create.recipe.mechanical_crafting": "Механическое создание", "create.recipe.automatic_shaped": "Автоматическая форменная сборка", "create.recipe.block_cutting": "Резка блока", - "create.recipe.blockzapper_upgrade": "Ручная блоковая пушка", + "create.recipe.wood_cutting": "Резка древесины", "create.recipe.sandpaper_polishing": "Полировка наждачной бумагой", "create.recipe.mystery_conversion": "Хроматический метаморфоз", "create.recipe.spout_filling": "Заполнение дозатором", "create.recipe.draining": "Осушение предметов", + "create.recipe.sequenced_assembly": "Последовательная сборка", + "create.recipe.assembly.next": "Следующее: %1$s", + "create.recipe.assembly.step": "Шаг %1$s:", + "create.recipe.assembly.progress": "Прогресс: %1$s/%2$s", + "create.recipe.assembly.pressing": "Обработайте в Прессе", + "create.recipe.assembly.spout_filling_fluid": "Долейте %1$s", + "create.recipe.assembly.deploying_item": "Добавьте %1$s", + "create.recipe.assembly.cutting": "Разрежьте пилой", + "create.recipe.assembly.repeat": "Повторите последовательность %1$s раз", + "create.recipe.assembly.junk": "Случайный мусор", "create.recipe.processing.chance": "%1$s%% шанса", "create.recipe.heat_requirement.none": "Не требует нагрева", "create.recipe.heat_requirement.heated": "Нагрето", @@ -713,7 +768,7 @@ "create.generic.unit.seconds": "секунд", "create.generic.unit.minutes": "минут", "create.generic.unit.rpm": "об./мин.", - "create.generic.unit.stress": "Н*м", + "create.generic.unit.stress": "ен", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "%1$smB", "create.generic.clockwise": "По часовой стрелке", @@ -749,20 +804,16 @@ "create.orientation.alongZ": "Вдоль Z", "create.orientation.alongX": "Вдоль X", - "create.gui.blockzapper.title": "Ручная блоковая пушка", - "create.gui.blockzapper.replaceMode": "Режим замены", - "create.gui.blockzapper.searchDiagonal": "Следовать по диагонали", - "create.gui.blockzapper.searchFuzzy": "Игнорировать границы материала", - "create.gui.blockzapper.range": "Диапазон распространения", - "create.gui.blockzapper.needsUpgradedAmplifier": "Требуется модернизированный усилитель", - "create.gui.blockzapper.patternSection": "Шаблон", - "create.gui.blockzapper.pattern.solid": "Всё", - "create.gui.blockzapper.pattern.checkered": "Шахматная доска", - "create.gui.blockzapper.pattern.inversecheckered": "Перевернутая шахматная доска", - "create.gui.blockzapper.pattern.chance25": "25% крен", - "create.gui.blockzapper.pattern.chance50": "50% крен", - "create.gui.blockzapper.pattern.chance75": "75% крен", "create.gui.terrainzapper.title": "Ручной редактор мира", + "create.gui.terrainzapper.searchDiagonal": "Следование диагоналям", + "create.gui.terrainzapper.searchFuzzy": "Игнорировать границы материала", + "create.gui.terrainzapper.patternSection": "Шаблон", + "create.gui.terrainzapper.pattern.solid": "Сплошной", + "create.gui.terrainzapper.pattern.checkered": "Шахматный порядок", + "create.gui.terrainzapper.pattern.inversecheckered": "Обратный шахматный порядок", + "create.gui.terrainzapper.pattern.chance25": "25% заполнение", + "create.gui.terrainzapper.pattern.chance50": "50% заполнение", + "create.gui.terrainzapper.pattern.chance75": "75% заполнение", "create.gui.terrainzapper.placement": "Размещение", "create.gui.terrainzapper.placement.merged": "Слитый", "create.gui.terrainzapper.placement.attached": "Прикреплённый", @@ -771,6 +822,8 @@ "create.gui.terrainzapper.brush.cuboid": "Куб", "create.gui.terrainzapper.brush.sphere": "Сфера", "create.gui.terrainzapper.brush.cylinder": "Цилиндр", + "create.gui.terrainzapper.brush.surface": "Поверхность", + "create.gui.terrainzapper.brush.cluster": "Скопление", "create.gui.terrainzapper.tool": "Инструмент", "create.gui.terrainzapper.tool.fill": "Заполнить", "create.gui.terrainzapper.tool.place": "Поставить", @@ -780,23 +833,12 @@ "create.gui.terrainzapper.tool.flatten": "Выравнивание", "create.terrainzapper.shiftRightClickToSet": "ПКМ крадучись, чтобы выбрать форму", - - "create.blockzapper.usingBlock": "С помощью: %1$s", - "create.blockzapper.componentUpgrades": "Обновления компонентов:", - "create.blockzapper.component.body": "Корпус", - "create.blockzapper.component.amplifier": "Усилитель", - "create.blockzapper.component.accelerator": "Ускоритель", - "create.blockzapper.component.retriever": "Поисковик", - "create.blockzapper.component.scope": "Объем", - "create.blockzapper.componentTier.none": "Нет", - "create.blockzapper.componentTier.brass": "Латунный", - "create.blockzapper.componentTier.chromatic": "Хроматический", - "create.blockzapper.leftClickToSet": "Щелкните ЛКМ по блоку, чтобы выбрать материал", - "create.blockzapper.empty": "Вне блоков!", + "create.terrainzapper.usingBlock": "Используется: %1$s", + "create.terrainzapper.leftClickToSet": "Левый клик по блоку, что бы использовать материал", "create.minecart_coupling.two_couplings_max": "Вагонетки могут иметь только две связи", "create.minecart_coupling.unloaded": "Кажется, часть вашего поезда в незагруженных чанках", - "create.minecart_coupling.no_loops": "Связыватели не могут образовывать петлю", + "create.minecart_coupling.no_loops": "Соединители не могут образовывать петлю", "create.minecart_coupling.removed": "Убраны все связи между вагонетками", "create.minecart_coupling.too_far": "Вагонетки слишком далеко друг от друга", @@ -823,12 +865,12 @@ "create.logistics.firstFrequency": "Частота #1", "create.logistics.secondFrequency": "Частота #2", "create.logistics.filter.apply": "Фильтр применён к %1$s.", - "create.logistics.filter.apply_click_again": "Фильтр применён к %1$s, кликните еще раз чтобы скопировать количество.", + "create.logistics.filter.apply_click_again": "Фильтр применён к %1$s, кликните еще раз, чтобы скопировать количество.", "create.logistics.filter.apply_count": "Применено извлекаемое количество к фильтру.", "create.gui.goggles.generator_stats": "Статистика генератора:", "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", - "create.gui.goggles.at_current_speed": "На текущей скорости", + "create.gui.goggles.at_current_speed": "При текущей скорости", "create.gui.goggles.pole_length": "Длина поршня", "create.gui.goggles.fluid_container": "Информация о жидкостном контейнере:", "create.gui.goggles.fluid_container.capacity": "Ёмкость: ", @@ -836,17 +878,17 @@ "create.gui.assembly.exception.unmovableBlock": "Несдвигаемый блок (%4$s) на [%1$s,%2$s,%3$s]", "create.gui.assembly.exception.chunkNotLoaded": "Блок на [%1$s,%2$s,%3$s] не был в загруженном чанке", "create.gui.assembly.exception.structureTooLarge": "Штуковина состоит из слишком большого количества Блоков.\nТекущий максимум: %1$s", - "create.gui.assembly.exception.tooManyPistonPoles": "Слишком много Удлинителей прикреплено к этому Поршню.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "Слишком много Удлинителей прикреплено к этому поршню.\nТекущий максимум: %1$s", "create.gui.assembly.exception.noPistonPoles": "Поршню нехватает Удлинителей", "create.gui.assembly.exception.not_enough_sails": "Присоединённая структура не содержит достаточно парусопободных блоков: %1$s\nМинимум из %2$s необходим", "create.gui.gauge.info_header": "Калибровочная информация:", "create.gui.speedometer.title": "Скорость вращения", - "create.gui.stressometer.title": "Сетевой момент", - "create.gui.stressometer.capacity": "Оставшаяся емкость", + "create.gui.stressometer.title": "Нагрузка на сеть", + "create.gui.stressometer.capacity": "Оставшаяся ёмкость", "create.gui.stressometer.overstressed": "Перегрузка", "create.gui.stressometer.no_rotation": "Нет вращения", - "create.gui.contraptions.not_fast_enough": "Похоже, что этот %1$s _не_ вращается с_достаточной_ _скоростью_.", - "create.gui.contraptions.network_overstressed": "Похоже, что эта штуковина _перегружена_. Добавьте больше источников или _замедлите_ _скорость_ компонентов с высоким _влиянием_ на _момент_.", + "create.gui.contraptions.not_fast_enough": "Похоже, что этот %1$s _не_ вращается с _достаточной_ _скоростью_.", + "create.gui.contraptions.network_overstressed": "Похоже, что эта штуковина _перегружена_. Добавьте больше источников или _понизьте_ _скорость_ компонентов, _создающих_ высокую _нагрузку_.", "create.gui.adjustable_crate.title": "Регулируемый ящик", "create.gui.adjustable_crate.storageSpace": "Ёмкость", "create.gui.stockpile_switch.title": "Настраиваемый компаратор", @@ -858,6 +900,7 @@ "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "Повернуть на угол", "create.gui.sequenced_gearshift.instruction.turn_angle": "Повернуть", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Угол", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "Повернуть для движения Поршня/Шкива/Портала", "create.gui.sequenced_gearshift.instruction.turn_distance": "Поршень", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Расстояние", "create.gui.sequenced_gearshift.instruction.delay.descriptive": "Временная задержка", @@ -865,7 +908,7 @@ "create.gui.sequenced_gearshift.instruction.delay.duration": "Длительность", "create.gui.sequenced_gearshift.instruction.end.descriptive": "Конец", "create.gui.sequenced_gearshift.instruction.end": "Конец", - "create.gui.sequenced_gearshift.instruction.await.descriptive": "Ожидать нового Импульса Редстоун Сигнала", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "Ожидать нового Импульса редстоун Сигнала", "create.gui.sequenced_gearshift.instruction.await": "Ожидать", "create.gui.sequenced_gearshift.speed": "Скорость, Направление", "create.gui.sequenced_gearshift.speed.forward": "Скорость ввода, вперед", @@ -890,11 +933,11 @@ "create.schematic.rotation.cw90": "По час. стрелке 90", "create.schematic.rotation.cw180": "По час. стрелке 180", "create.schematic.rotation.cw270": "По час. стрелке 270", - "create.schematic.mirror": "Зеркало", + "create.schematic.mirror": "Отразить", "create.schematic.mirror.none": "Нет", "create.schematic.mirror.frontBack": "Спереди-сзади", "create.schematic.mirror.leftRight": "Влево-вправо", - "create.schematic.tool.deploy": "Развернуть", + "create.schematic.tool.deploy": "Развёртывание", "create.schematic.tool.move": "Подвинуть XZ", "create.schematic.tool.movey": "Подвинуть Y", "create.schematic.tool.rotate": "Вращать", @@ -920,7 +963,7 @@ "create.schematic.tool.print.description.1": "[ПКМ], чтобы подтвердить размещение в текущем местоположении.", "create.schematic.tool.print.description.2": "Этот инструмент предназначен только для творческого режима.", "create.schematic.tool.print.description.3": "", - "create.schematic.tool.flip.description.0": "Переверните схему вдоль выбранного лица.", + "create.schematic.tool.flip.description.0": "Переверните схему вдоль выбранной стороны.", "create.schematic.tool.flip.description.1": "Наведите курсор на схему и [CTRL] + прокрутка, чтобы перевернуть ее.", "create.schematic.tool.flip.description.2": "", "create.schematic.tool.flip.description.3": "", @@ -951,10 +994,10 @@ "create.gui.schematicannon.option.skipMissing": "Пропускать отсутствующие блоки", "create.gui.schematicannon.option.skipTileEntities": "Защитить имущество", "create.gui.schematicannon.slot.gunpowder": "Добавьте порох чтобы запитать пушку", - "create.gui.schematicannon.slot.listPrinter": "Положите книгу чтобы создать список предметов для схематики", + "create.gui.schematicannon.slot.listPrinter": "Положите книгу, чтобы создать список предметов для схематики", "create.gui.schematicannon.slot.schematic": "Положите свою схематику здесь. Убедитесь что она размещена в правильном месте", "create.gui.schematicannon.option.skipMissing.description": "Если пушка не может найти требуемый блок, она будет строить в следующем месте.", - "create.gui.schematicannon.option.skipTileEntities.description": "Пушка не будет заменять блоки хранения данных, такие как сундуки.", + "create.gui.schematicannon.option.skipTileEntities.description": "Пушка не будет заменять блоки хранения, такие как сундуки.", "create.gui.schematicannon.option.dontReplaceSolid.description": "Пушка никогда не заменит целые блоки, только не целые и воздух.", "create.gui.schematicannon.option.replaceWithSolid.description": "Пушка будет заменять целый блок только в случае, если в схеме в этом месте расположен целый блок.", "create.gui.schematicannon.option.replaceWithAny.description": "Пушка будет заменять целые блоки, если в схеме в этом месте есть что-либо.", @@ -1022,6 +1065,11 @@ "create.item_attributes.in_item_group.inverted": "не принадлежит '%1$s'", "create.item_attributes.added_by": "был добавлен %1$s", "create.item_attributes.added_by.inverted": "не был добавлен %1$s", + "create.item_attributes.shulker_level": "шалкер %1$s", + "create.item_attributes.shulker_level.inverted": "шалкер не %1$s", + "create.item_attributes.shulker_level.full": "полный", + "create.item_attributes.shulker_level.empty": "пустой", + "create.item_attributes.shulker_level.partial": "частично заполнен", "create.item_attributes.has_enchant": "зачарован на %1$s", "create.item_attributes.has_enchant.inverted": "не зачарован на %1$s", "create.item_attributes.color": "Покрашено в %1$s", @@ -1033,7 +1081,7 @@ "create.item_attributes.has_name": "имеет нестандартное имя %1$s", "create.item_attributes.has_name.inverted": "не имеет нестандартное имя%1$s", "create.item_attributes.book_author": "подписана %1$s", - "create.item_attributes.book_author.inverted": "неподписана %1$s", + "create.item_attributes.book_author.inverted": "не подписана %1$s", "create.item_attributes.book_copy_original": "оригинал", "create.item_attributes.book_copy_original.inverted": "не оригинал", "create.item_attributes.book_copy_first": "копия первого порядка", @@ -1071,12 +1119,12 @@ "create.tooltip.speedRequirement.none": "Нет", "create.tooltip.speedRequirement.medium": "Умеренная", "create.tooltip.speedRequirement.high": "Быстрая", - "create.tooltip.stressImpact": "Требование к крутящему моменту: %1$s", - "create.tooltip.stressImpact.low": "Низкий", - "create.tooltip.stressImpact.medium": "Средний", - "create.tooltip.stressImpact.high": "Высокий", + "create.tooltip.stressImpact": "Создаваемая нагрузка: %1$s", + "create.tooltip.stressImpact.low": "Низкая", + "create.tooltip.stressImpact.medium": "Средняя", + "create.tooltip.stressImpact.high": "Высокая", "create.tooltip.stressImpact.overstressed": "Перегрузка", - "create.tooltip.capacityProvided": "Ёмкостный крутящий момент: %1$s", + "create.tooltip.capacityProvided": "Допустимая нагрузка: %1$s", "create.tooltip.capacityProvided.low": "Маленький", "create.tooltip.capacityProvided.medium": "Средний", "create.tooltip.capacityProvided.high": "Большой", @@ -1089,34 +1137,55 @@ "create.mechanical_arm.points_outside_range": "%1$s выбранные точки взаимодействия удалены из-за ограничений диапазона.", "create.weighted_ejector.target_set": "Цель выбрана", - "create.weighted_ejector.target_not_valid": "Бросает до близлежащего блока (Неподходящая Цель)", - "create.weighted_ejector.no_target": "Бросает до близлежащего блока (Цель не была Выбрана)", + "create.weighted_ejector.target_not_valid": "Бросает до ближайшего блока (Неподходящая Цель)", + "create.weighted_ejector.no_target": "Бросает до ближайшего блока (Цель не была Выбрана)", "create.weighted_ejector.targeting": "Бросает до [%1$s,%2$s,%3$s]", - "create.weighted_ejector.stack_size": "Размер Бросаемого Стака", + "create.weighted_ejector.stack_size": "Размер бросаемого стака", "create.logistics.when_multiple_outputs_available": "Когда доступно несколько выходов", "create.mechanical_arm.selection_mode.round_robin": "По кругу", "create.mechanical_arm.selection_mode.forced_round_robin": "Принудительно по кругу", - "create.mechanical_arm.selection_mode.prefer_first": "Предпочтительна первичная цель", + "create.mechanical_arm.selection_mode.prefer_first": "Предпочитать первичную цель", "create.tunnel.selection_mode.split": "Разделить", "create.tunnel.selection_mode.forced_split": "Принудительно разделить", "create.tunnel.selection_mode.round_robin": "По кругу", "create.tunnel.selection_mode.forced_round_robin": "Принудительно по кругу", - "create.tunnel.selection_mode.prefer_nearest": "Придпочтительно ближайшее", + "create.tunnel.selection_mode.prefer_nearest": "Предпочтительно ближайшее", "create.tunnel.selection_mode.randomize": "Случайно", "create.tunnel.selection_mode.synchronize": "Синхронизировать входы", - "create.tooltip.chute.header": "Инвормация о желобе", + "create.tooltip.chute.header": "Информация о желобе", "create.tooltip.chute.items_move_down": "Предметы двигаются вниз", "create.tooltip.chute.items_move_up": "Предметы двигаются вверх", - "create.tooltip.chute.no_fans_attached": "Нет подключеных вентиляторов", + "create.tooltip.chute.no_fans_attached": "Нет подключенных вентиляторов", "create.tooltip.chute.fans_push_up": "Вентилятор толкает снизу", "create.tooltip.chute.fans_push_down": "Вентилятор толкает сверху", "create.tooltip.chute.fans_pull_up": "Вентилятор тянет сверху", "create.tooltip.chute.fans_pull_down": "Вентилятор тянет снизу", "create.tooltip.chute.contains": "Содержит: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "В данный момент раздает(выдает):", + "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "ПКМ, чтобы получить", + + "create.linked_controller.bind_mode": "Режим привязки активирован", + "create.linked_controller.press_keybind": "Нажмите %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, чтобы привязать эту частоту к соответствующей клавише", + "create.linked_controller.key_bound": "Частота привязана к %1$s", + "create.linked_controller.frequency_slot_1": "Клавиша: %1$s, Частота #1", + "create.linked_controller.frequency_slot_2": "Клавиша: %1$s, Частота #2", + + "create.crafting_blueprint.crafting_slot": "Слот для ингредиентов", + "create.crafting_blueprint.filter_items_viable": "Продвинутые фильтры предметов применимы", + "create.crafting_blueprint.display_slot": "Отображаемая ячейка", + "create.crafting_blueprint.inferred": "Производные от рецепта", + "create.crafting_blueprint.manually_assigned": "Назначен вручную", + "create.crafting_blueprint.secondary_display_slot": "Дополнительная отображаемая ячейка", + "create.crafting_blueprint.optional": "Опциональна", + + "create.potato_cannon.ammo.attack_damage": "%1$s урона от атаки", + "create.potato_cannon.ammo.reload_ticks": "%1$s тиков перезагрузки", + "create.potato_cannon.ammo.knockback": "%1$s отбрасывания", "create.hint.hose_pulley.title": "Безграничное снабжение", "create.hint.hose_pulley": "Целевой водный резервуар считается бесконечным.", @@ -1144,16 +1213,47 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: используйте /killtps start <Время тика>, чтобы искусственно замедлить тик сервера", "create.command.killTPSCommand.argument.tickTime": "Время тика", - "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", - "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", - "create.subtitle.slime_added": "Намазывание слизи", - "create.subtitle.mechanical_press_activation": "Механический пресс активирован", - "create.subtitle.mechanical_press_item_break": "Лязг металла", - "create.subtitle.blockzapper_place": "Блок запрыгивает на место", - "create.subtitle.blockzapper_confirm": "Утвердительный динь", - "create.subtitle.blockzapper_deny": "Тихий буп", - "create.subtitle.block_funnel_eat": "Воронкообразный чмопс", + "create.contraption.minecart_contraption_too_big": "Эта вагонеточная штуковина кажется слишком большой, чтобы ее можно было поднять", + "create.contraption.minecart_contraption_illegal_pickup": "Мистическая сила связывает эту вагонеточную штуковину с миром", + + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.contraption_disassemble": "Штуковина останавливается", + "create.subtitle.peculiar_bell_use": "Особенный колокол звонит", + "create.subtitle.mixing": "Шум смешивания", + "create.subtitle.mechanical_press_activation_belt": "Механический пресс делает «бонк»", + "create.subtitle.fwoomp": "Картофельная пушка делает «Свомп»", + "create.subtitle.worldshaper_place": "Ручной редактор мира делает «Зап»", + "create.subtitle.crushing_1": "Шум разрушения", + "create.subtitle.depot_slide": "Шелест предметов", + "create.subtitle.saw_activate_stone": "Активируется механическая пила", "create.subtitle.blaze_munch": "Всполох радостно жуёт", + "create.subtitle.funnel_flap": "Занавески воронок хлопают", + "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", + "create.subtitle.haunted_bell_use": "Призрачный колокол звонит", + "create.subtitle.scroll_value": "Щелчки колеса прокрутки", + "create.subtitle.crafter_craft": "Крафтер создаёт", + "create.subtitle.controller_put": "Контроллер стучит", + "create.subtitle.cranking": "Вращается рукоятка", + "create.subtitle.wrench_remove": "Компонент ломается", + "create.subtitle.cogs": "Шестерни грохочут", + "create.subtitle.slime_added": "Намазывание слизи", + "create.subtitle.wrench_rotate": "Использован гаечный ключ", + "create.subtitle.potato_hit": "Овощ врезается", + "create.subtitle.saw_activate_wood": "Активируется механическая пила", + "create.subtitle.haunted_bell_convert": "Призрачный колокол пробуждается", + "create.subtitle.deployer_polish": "Автономный активатор полирует", + "create.subtitle.deny": "Отрицательный «Буп»", + "create.subtitle.controller_click": "Клики контроллера", + "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", + "create.subtitle.copper_armor_equip": "Позвякивание снаряжения для дайвинга", + "create.subtitle.controller_take": "Кафедра опустошается", + "create.subtitle.mechanical_press_activation": "Механический пресс активирован", + "create.subtitle.contraption_assemble": "Штуковина движется", + "create.subtitle.crafter_click": "Крафтер кликает", + "create.subtitle.depot_plop": "Предмет падает", + "create.subtitle.confirm": "Утвердительный «Динь»", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1167,88 +1267,21 @@ "item.create.example_item.tooltip.control1": "When Ctrl pressed", "item.create.example_item.tooltip.action1": "These controls are displayed.", - "block.create.wooden_bracket.tooltip": "WOODEN BRACKET", + "block.create.wooden_bracket.tooltip": "ДЕРЕВЯННАЯ СКОБА", "block.create.wooden_bracket.tooltip.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя уютное деревянное укрепление.", - "block.create.metal_bracket.tooltip": "METAL BRACKET", + "block.create.metal_bracket.tooltip": "МЕТАЛЛИЧЕСКАЯ СКОБА", "block.create.metal_bracket.tooltip.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя прочное индустриальное укрепление.", - "block.create.copper_casing.tooltip": "COPPER CASING", - "block.create.copper_casing.tooltip.summary": "Прочный машинный корпус для разнообразного использования. Безопасно для украшения.", - "block.create.copper_casing.tooltip.condition1": "При использовании на жидкостной трубе", - "block.create.copper_casing.tooltip.behaviour1": "Покрывает _жидкостную трубу_ _корпусом_. Трубы в корпусе _закрепят свои соединения_ и не будут соединятся с другими трубами, расположенными по соседству.", - - "block.create.encased_fluid_pipe.tooltip": "ENCASED FLUID PIPE", - "block.create.encased_fluid_pipe.tooltip.summary": "_Труба_ в _Медном корпусе_.", - - "block.create.seat.tooltip": "SEAT", + "block.create.seat.tooltip": "СИДЕНЬЕ", "block.create.seat.tooltip.summary": "Присядьте и насладитесь поездкой! Привязывает игроков к собранным _устройствам_. Отлично выглядит как простая мебель! Можно окрасить в разные цвета.", "block.create.seat.tooltip.condition1": "ПКМ по сиденью", - "block.create.seat.tooltip.behaviour1": "Сажает игрока на _Сиденье_. Нажмите _кнопку_ _приседания_ чтобы слезть.", + "block.create.seat.tooltip.behaviour1": "Сажает игрока на _Сиденье_. Нажмите _кнопку_ _приседания_ чтобы слезть (Shift по умолчанию).", - "item.create.blaze_cake.tooltip": "BLAZE CAKE", + "item.create.blaze_cake.tooltip": "ТОРТ ВСПОЛОХА", "item.create.blaze_cake.tooltip.summary": "Вкусное угощения для вашей трудяги _Горелки Всполоха_. Зажигает их всех!", - "block.create.fluid_pipe.tooltip": "FLUID PIPE", - "block.create.fluid_pipe.tooltip.summary": "Используется для транспортировки _жидкостей_. Требует _Механическую помпу_ для движения _жидкости_.", - "block.create.fluid_pipe.tooltip.condition1": "Транспортировка жидкости", - "block.create.fluid_pipe.tooltip.behaviour1": "Может соединяться с _жидкостными контейнерами_, такими как _бак_ или _чаша_. Открытые части _трубы_ могут собирать или размещать блоки жидкости в мире. Опасайтесь протечек!", - "block.create.fluid_pipe.tooltip.condition2": "ПКМ _Ключом_", - "block.create.fluid_pipe.tooltip.behaviour2": "Устанавливает окно на трубе если возможно", - - "block.create.hose_pulley.tooltip": "HOSE PULLEY", - "block.create.hose_pulley.tooltip.summary": "Используется для _размещения_ или _удаления_ больших _жидкостных резервуаров_ в мире.", - "block.create.hose_pulley.tooltip.condition1": "Когда управляется кинетически", - "block.create.hose_pulley.tooltip.behaviour1": "_Поднимает_ или _опускает_ шланг, расположение которого определяет максимальную высоту _сбора_ или _размещения_ жидкости.", - "block.create.hose_pulley.tooltip.condition2": "Когда жидкости вытягиваются из шланга", - "block.create.hose_pulley.tooltip.behaviour2": "Начинает _собирать_ блоки жидкости из резервуара, в который опущен шланг. Очень _большие резервуары_ жидкости будут считаться _бесконечными_.", - "block.create.hose_pulley.tooltip.condition3": "Когда жидкости закачиваются в шланг", - "block.create.hose_pulley.tooltip.behaviour3": "Начинает _заполнять_ жидкостью мир, до уровня расположения конца шланга.", - - "block.create.fluid_tank.tooltip": "FLUID TANK", - "block.create.fluid_tank.tooltip.summary": "_Хранит_ ваши любимые _жидкости_. Скалируется в высоту и ширину.", - "block.create.fluid_tank.tooltip.condition1": "Правый клик с гаечным ключом", - "block.create.fluid_tank.tooltip.behaviour1": "Переключает опциональное отображение окна", - - "block.create.creative_fluid_tank.tooltip": "CREATIVE FLUID TANK", - "block.create.creative_fluid_tank.tooltip.summary": "Этот _Жидкостный бак_ позволяет иметь бесконечную репликацию любой жидкости. Скалируется в высоту и ширину.", - "block.create.creative_fluid_tank.tooltip.condition1": "Когда жидкость в баке", - "block.create.creative_fluid_tank.tooltip.behaviour1": "Всё что _извлекает_ из бака, будет снабжаться _бесконечным запасом_ жидкости. Жидкости _закачивающиеся_ в бак будут _удаляться_.", - "block.create.creative_fluid_tank.tooltip.condition2": "Правый клик с гаечным ключом", - "block.create.creative_fluid_tank.tooltip.behaviour2": "Переключает опциональное отображение окна.", - - "block.create.fluid_valve.tooltip": "FLUID VALVE", - "block.create.fluid_valve.tooltip.summary": "Останавливает поток жидкости по трубе.", - "block.create.fluid_valve.tooltip.condition1": "Контролируемый поток", - "block.create.fluid_valve.tooltip.behaviour1": "Приложенная _Вращательная сила_ заставит _клапан_ закрыться, останавливая поток _жидкости_. Измените направление _вращательной силы_, чтобы снова открыть клапан.", - - "block.create.mechanical_pump.tooltip": "MECHANICAL PUMP", - "block.create.mechanical_pump.tooltip.summary": "Принимает _Вращательную силу_ и использует ее для перемещения _жидкости_ вдоль _труб_. Имеет максимальный диапазон действия в обоих направлениях. (По умолчанию 16 блоков)", - "block.create.mechanical_pump.tooltip.condition1": "Поток жидкости", - "block.create.mechanical_pump.tooltip.behaviour1": "Приложенная _вращательная сила_ создает давление, которое заставляет _жидкость_ проходить через сеть _труб_. Измените направление _вращательной силы_, чтобы изменить направление потока _жидкости_.", - "block.create.mechanical_pump.tooltip.control1": "Правый клик с гаечным ключом", - "block.create.mechanical_pump.tooltip.action1": "Изменяет направление _помпы_, меняя направление потока жидкости", - - "block.create.smart_fluid_pipe.tooltip": "SMART FLUID PIPE", - "block.create.smart_fluid_pipe.tooltip.summary": "_Жидкостная труба_ с фильтром. Можно настроить какие _жидкости_ могу пройти.", - "block.create.smart_fluid_pipe.tooltip.condition1": "При закачивании жидкостей внутрь", - "block.create.smart_fluid_pipe.tooltip.behaviour1": "Умные трубы заблокируют поток жидкости, если она не соответствует фильтру.", - "block.create.smart_fluid_pipe.tooltip.condition2": "Когда подключена к жидкостному контейнеру", - "block.create.smart_fluid_pipe.tooltip.behaviour2": "Умные трубы _будут_ создавать _поток_ только той жидкости, что _соответствует_ _фильтру_.", - - "block.create.spout.tooltip": "SPOUT", - "block.create.spout.tooltip.summary": "Форсунка для пополнения предметов, имеющих возможность хранить жидкость.", - "block.create.spout.tooltip.condition1": "Транспортировка жидкости", - "block.create.spout.tooltip.behaviour1": "Когда предмет, _с возможностью содержать жидкость_, такой как _ведро_ или _бутылочка_, размещён под дозатором, дозатор будет пытаться заполнить предмет содержащейся в нём _жидкостью_.", - "block.create.spout.tooltip.condition2": "Автоматизация жидкости", - "block.create.spout.tooltip.behaviour2": "Дозатор расположеный над _конвейером_ или _депо_ будет автоматически взаимодействовать с _предметами, которые могут содержать жидкость_, которые проходят под ним.", - - "block.create.item_drain.tooltip": "ITEM DRAIN", - "block.create.item_drain.tooltip.summary": "Депо с решёткой, которое может выкачивать _жидкость_ из ваших _предметов_", - "block.create.item_drain.tooltip.condition1": "Транспортировка жидкости", - "block.create.item_drain.tooltip.behaviour1": "Когда _предмет с жидкостью_, такой как _ведро_ или _бутылочка_ вставлены с боку, предметный осушитель будет автоматически извлекать жидкость, в свой собственный _бак_. Предмет будет выброшен с противоположной стороны.", - - "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", + "item.create.wand_of_symmetry.tooltip": "ЖЕЗЛ СИММЕТРИИ", "item.create.wand_of_symmetry.tooltip.summary": "Идеально отражает размещаемые блоки по настроенным плоскостям.", "item.create.wand_of_symmetry.tooltip.condition1": "На панели быстрого доступа", "item.create.wand_of_symmetry.tooltip.behaviour1": "Остаётся активным", @@ -1259,16 +1292,7 @@ "item.create.wand_of_symmetry.tooltip.control3": "ПКМ крадучись", "item.create.wand_of_symmetry.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", - "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "Новейшее устройство для размещения или замены блоков на расстоянии.", - "item.create.handheld_blockzapper.tooltip.control1": "ЛКМ на блок", - "item.create.handheld_blockzapper.tooltip.action1": "Устанавливает выбранный блок как материал.", - "item.create.handheld_blockzapper.tooltip.control2": "ПКМ на блок", - "item.create.handheld_blockzapper.tooltip.action2": "_Размещает_ или _Замещает_ блок.", - "item.create.handheld_blockzapper.tooltip.control3": "ПКМ крадучись", - "item.create.handheld_blockzapper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", - - "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip": "РУЧНОЙ РЕДАКТОР МИРА", "item.create.handheld_worldshaper.tooltip.summary": "Удобный инструмент для создания _ландшафтов_ и _рельефа_ _местности_.", "item.create.handheld_worldshaper.tooltip.control1": "ЛКМ на блок", "item.create.handheld_worldshaper.tooltip.action1": "Устанавливает блоки, помещенные инструментом, в целевой блок.", @@ -1277,44 +1301,50 @@ "item.create.handheld_worldshaper.tooltip.control3": "ПКМ крадучись", "item.create.handheld_worldshaper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", - "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", + "item.create.tree_fertilizer.tooltip": "УДОБРЕНИЕ ДЛЯ ДЕРЕВЬЕВ", "item.create.tree_fertilizer.tooltip.summary": "Мощная комбинация минералов подходит для ускорения роста распространенных типов деревьев.", "item.create.tree_fertilizer.tooltip.condition1": "При использовании на саженце", "item.create.tree_fertilizer.tooltip.behaviour1": "Выращивает деревья,_независимо_ от _условий_ _их_ _расположения_", - "item.create.deforester.tooltip": "DEFORESTER", - "item.create.deforester.tooltip.summary": "_Уничтожитель_ _леса_, способен рубить деревья за доли секунды.", - - "item.create.extendo_grip.tooltip": "EXTENDO GRIP", + "item.create.extendo_grip.tooltip": "УДЛИНЕННАЯ РУКА", "item.create.extendo_grip.tooltip.summary": "Бойоиоинг! Значительно _увеличивает_ _досягаемость_ владельца.", "item.create.extendo_grip.tooltip.condition1": "Находясь в другой руке", - "item.create.extendo_grip.tooltip.behaviour1": "Увеличьте _расстояние_ _досягаемости_ предметов, используемых в _главной_ _руке_.", + "item.create.extendo_grip.tooltip.behaviour1": "Увеличивает _расстояние_ _досягаемости_ предметов, используемых в _главной_ _руке_.", + "item.create.extendo_grip.tooltip.condition2": "Когда надет Медный баллон", + "item.create.extendo_grip.tooltip.behaviour2": " _НЕ_ тратится _прочность_. Вместо этого будет тратиться _воздух_ из баллона.", - "item.create.filter.tooltip": "FILTER", + "item.create.potato_cannon.tooltip": "КАРТОФЕЛЬНАЯ ПУШКА", + "item.create.potato_cannon.tooltip.summary": "Свомп! Запускайте выращенные вами овощи в своих врагов. Может питаться от давления воздуха из _Медного_ _баллона_", + "item.create.potato_cannon.tooltip.condition1": "Нажимая ПКМ", + "item.create.potato_cannon.tooltip.behaviour1": "_Выстреливает_ подходящим предметом из вашего _инвентаря_.", + "item.create.potato_cannon.tooltip.condition2": "Когда надет Медный баллон", + "item.create.potato_cannon.tooltip.behaviour2": "_НЕ_ тратится _прочность_. Вместо этого будет тратиться _воздух_ из баллона.", + + "item.create.filter.tooltip": "ФИЛЬТР", "item.create.filter.tooltip.summary": "Управляет_ _выходами_ и входами логистических устройств с _большей_ _точностью_, _сопоставляя_ их со _списком_ _предметов_ или несколькими _вложенными_ _фильтрами_.", "item.create.filter.tooltip.condition1": "Когда в слоте фильтра", "item.create.filter.tooltip.behaviour1": "_Управляет_ потоком предметов в соответствии с его _конфигурацией_.", "item.create.filter.tooltip.condition2": "При ПКМ", "item.create.filter.tooltip.behaviour2": "Открывает _интерфейс_ _конфигурации_.", - "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip": "ФИЛЬТР АТРИБУТОВ", "item.create.attribute_filter.tooltip.summary": "_Управляет_ _выходами_ и _входами_ логистических устройств с _большей_ _точностью_, сопоставляя их с набором _атрибутов_ и _категорий предметов_.", "item.create.attribute_filter.tooltip.condition1": "Когда в слоте фильтра", "item.create.attribute_filter.tooltip.behaviour1": "_Управляет_ потоком предметов в соответствии с его _конфигурацией_.", "item.create.attribute_filter.tooltip.condition2": "ПКМ", "item.create.attribute_filter.tooltip.behaviour2": "Открывает _интерфейс_ _конфигурации_.", - "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", + "item.create.empty_schematic.tooltip": "ПУСТАЯ СХЕМАТИКА", "item.create.empty_schematic.tooltip.summary": "Используется в качестве ингредиента рецепта и для записи в _Схематичный столе_", - "item.create.schematic.tooltip": "SCHEMATIC", + "item.create.schematic.tooltip": "СХЕМАТИКА", "item.create.schematic.tooltip.summary": "Содержит структуру, которая будет позиционироваться и помещаться в мир. Расположите голограмму по своему усмотрению и используйте _схематичную пушку_ для ее построения.", "item.create.schematic.tooltip.condition1": "При удерживании", "item.create.schematic.tooltip.behaviour1": "Может быть позиционирован с помощью инструментов на экране.", "item.create.schematic.tooltip.control1": "ПКМ крадучись", "item.create.schematic.tooltip.action1": "Открывает _интерфейс_ для ввода _точных_ _координат_.", - "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", + "item.create.schematic_and_quill.tooltip": "СХЕМАТИКА И ПЕРО", "item.create.schematic_and_quill.tooltip.summary": "Используется для сохранения структуры в вашем мире в файл .nbt.", "item.create.schematic_and_quill.tooltip.condition1": "Шаг 1", "item.create.schematic_and_quill.tooltip.behaviour1": "Выберите две угловые точки, используя ПКМ.", @@ -1327,110 +1357,138 @@ "item.create.schematic_and_quill.tooltip.control3": "ПКМ крадучись", "item.create.schematic_and_quill.tooltip.action3": "_Сбрасывает_ и _удаляет_ выделение.", - "block.create.schematicannon.tooltip": "SCHEMATICANNON", + "block.create.schematicannon.tooltip": "СХЕМАТИЧНАЯ ПУШКА", "block.create.schematicannon.tooltip.summary": "_Ставит блоки_ для воссоздания _схематики_ в мире. Использует предметы из _соседнего_ _инвентаря_ и _порох_ в качестве _топлива_.", "block.create.schematicannon.tooltip.condition1": "ПКМ", "block.create.schematicannon.tooltip.behaviour1": "Открывает _Интерфейс_", - "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", + "block.create.schematic_table.tooltip": "СХЕМАТИЧНЫЙ СТОЛ", "block.create.schematic_table.tooltip.summary": "Записывает сохраненные схематики в _пустые_ _схематики_.", "block.create.schematic_table.tooltip.condition1": "Когда дана пустая схема", "block.create.schematic_table.tooltip.behaviour1": "Загружает выбранный файл из вашей папки Schematics.", - "item.create.goggles.tooltip": "GOGGLES", + "item.create.goggles.tooltip": "ИНЖЕНЕРНЫЕ ОЧКИ", "item.create.goggles.tooltip.summary": "Очки для улучшения зрения с помощью полезной кинетической информации.", "item.create.goggles.tooltip.condition1": "При ношении", - "item.create.goggles.tooltip.behaviour1": "Показывает _цветные_ _индикаторы_, соответствующие _уровню_ _скорости_ размещённого кинетического компонента, а также воздействию момента и мощности отдельных компонентов.", + "item.create.goggles.tooltip.behaviour1": "Показывает _цветные_ _индикаторы_, соответствующие _уровню_ _скорости_ размещённого кинетического компонента, а также _создаваемой нагрузке_ и _мощности_ отдельных компонентов.", "item.create.goggles.tooltip.condition2": "При взгляде на датчик", - "item.create.goggles.tooltip.behaviour2": "Показывает подробную информацию о скорости или моменте сети, к которой подключён датчик.", + "item.create.goggles.tooltip.behaviour2": "Показывает подробную информацию о скорости или нагрузке сети, к которой подключён датчик.", "item.create.goggles.tooltip.condition3": "При взгляде на жидкостные контейнеры", "item.create.goggles.tooltip.behaviour3": "Показывает детализированную информацию о _Ёмкости_ блока и о хранящейся в нём хранится _Жидкости_.", - "item.create.wrench.tooltip": "WRENCH", + "item.create.wrench.tooltip": "ГАЕЧНЫЙ КЛЮЧ", "item.create.wrench.tooltip.summary": "Полезный _инструмент_ для работы с _кинетическими_ штуковинами. Может использоваться для _поворота_, _демонтажа_ и _настройки_ компонентов.", "item.create.wrench.tooltip.control1": "ПКМ по кинетическому блоку", "item.create.wrench.tooltip.action1": "_Поворачивает_ _компонент_ с которым вы взаимодействуете _к_ _лицу_ или _от_ _лица_.", "item.create.wrench.tooltip.control2": "ПКМ крадучись", "item.create.wrench.tooltip.action2": "Разбирает кинетические компоненты и помещает их обратно в ваш инвентарь.", - "block.create.nozzle.tooltip": "NOZZLE", + "block.create.nozzle.tooltip": "ФОРСУНКА", "block.create.nozzle.tooltip.summary": "Прикрепите к передней части _вентилятора_, чтобы распределить его влияние на сущностей _во_ _всех_ _направлениях_.", - "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip": "ЧАСЫ С КУКУШКОЙ", "block.create.cuckoo_clock.tooltip.summary": "_Прекрасное_ _мастерство_ для _украшения_ пространства и _отслеживания_ _времени_.", "block.create.cuckoo_clock.tooltip.condition1": "При вращении", "block.create.cuckoo_clock.tooltip.behaviour1": "Показывает текущее время и напевает мелодию два раза в день. _Активируется_ _один_ _раз_ в _полдень_ и в _сумерках_, как только _игроки_ _могут_ _спать_.", - "block.create.turntable.tooltip": "TURNTABLE", + "block.create.turntable.tooltip": "ПОВОРОТНЫЙ СТОЛ", "block.create.turntable.tooltip.summary": "Преобразует _силу_ _вращения_ прямиком в морскую болезнь.", - "block.create.portable_fluid_interface.tooltip": "PORTABLE FLUID INTERFACE", - "block.create.portable_fluid_interface.tooltip.summary": "Переносная точка обмена для _перемещения жидкостей_ из или в конструкцию, перемещаемую _поршнем_, _подшипником_, _вагонеткой_ или _лебёдкой_. Два смежных интерфейса должны располагаться _лицом друг_ _к другу_, на расстоянии _1-2 блока друг от друга_.", - "block.create.portable_fluid_interface.tooltip.condition1": "При движении", - "block.create.portable_fluid_interface.tooltip.behaviour1": "Взаимодействует со стационарными _переносными интерфейсами хранения_ для передачи жидкостей в устройство или из него. Трубы, вставленые в _Стационарный интерфейс_, будут напрямую взаимодействовать с резервуарами на устройстве. Конструкция на короткое время остановится для обмена жидкостями.", - "block.create.portable_fluid_interface.tooltip.condition2": "При получении сигнала редстоуна", - "block.create.portable_fluid_interface.tooltip.behaviour2": "Немедленно _разрывает_ текущие соединения.", - - "block.create.stockpile_switch.tooltip": "stockpile_switch", - "block.create.stockpile_switch.tooltip.summary": "Подаёт сигнал красного камня в зависимости от _заполниности_ _прикреплённого_ _ящика_.", + "block.create.stockpile_switch.tooltip": "НАСТРАИВАЕМЫЙ КОМПАРАТОР", + "block.create.stockpile_switch.tooltip.summary": "Подаёт сигнал красного камня в зависимости от _заполненности_ _прикреплённого_ _ящика_.", "block.create.stockpile_switch.tooltip.condition1": "Когда ниже нижнего предела", "block.create.stockpile_switch.tooltip.behaviour1": "Не подаёт _сигнал_ _красного_ _камня_.", - "block.create.content_observer.tooltip": "CONTENT OBSERVER", + "block.create.content_observer.tooltip": "НАБЛЮДАТЕЛЬ ЗА СОДЕРЖИМЫМ", "block.create.content_observer.tooltip.summary": "_Обнаруживает элементы_ внутри _контейнеров_ и _конвейеров_, соответствующие настроенному _фильтру_. Если наблюдаемый инвентарь, ремень или шланг содержит совпадающий элемент, этот компонент излучает сигнал красного камня. Когда наблюдаемая _ воронка передает_ соответствующий предмет, этот компонент испускает _импульс_.", - "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", - "block.create.adjustable_crate.tooltip.summary": "Этот контейнер для хранения позволяет вручную контролировать его емкость. Он может вместить до 16 стэков любого предмета. Поддерживает компараторы.", + "block.create.adjustable_crate.tooltip": "РЕГУЛИРУЕМЫЙ ЯЩИК", + "block.create.adjustable_crate.tooltip.summary": "Этот контейнер для хранения позволяет вручную контролировать его емкость. Он может вместить до 16 стаков любого предмета. Поддерживает компараторы.", "block.create.adjustable_crate.tooltip.condition1": "ПКМ", "block.create.adjustable_crate.tooltip.behaviour1": "Открывает _Интерфейс_.", - "block.create.creative_crate.tooltip": "THE ENDLESS CRATE", + "block.create.creative_crate.tooltip": "ТВОРЧЕСКИЙ ЯЩИК", "block.create.creative_crate.tooltip.summary": "Этот _контейнер_ для _хранения_ позволяющий _бесконечную_ _дублировать_ любой предмет. Поместите рядом со схематичной пушкой, чтобы удалить любые требования к материалу.", "block.create.creative_crate.tooltip.condition1": "Когда предмет в слоте фильтра", "block.create.creative_crate.tooltip.behaviour1": "Все, что извлечено из этого контейнера, обеспечит бесконечную поставку указанного предмета. Предметы, _вставленные_ в этот ящик, будут _аннулированы_.", - "block.create.controller_rail.tooltip": "CONTROLLER RAIL", + "block.create.controller_rail.tooltip": "КОНТРОЛИРУЮЩАЯ РЕЛЬСА", "block.create.controller_rail.tooltip.summary": "_Все-направленные запитанные рельсы_, позволяющие _точную настройку_ _скорости_ вагонеток.", "block.create.controller_rail.tooltip.condition1": "Когда запитано редстоун-сигналом", - "block.create.controller_rail.tooltip.behaviour1": "_Ускоряет_ или _замедляет_ _прошедшие вагонетки_, на велечину зависящую от _силы сигнала_. Распространая сигнал красного камня на соседние контролирующие рельсы. Питание двух контроллирующих рельс с разной мощностью приведет к тому, что дорожки между ними будут интерполировать свой сигнал.", + "block.create.controller_rail.tooltip.behaviour1": "_Ускоряет_ или _замедляет_ _прошедшие вагонетки_, на величину зависящую от _силы сигнала_. Распространяя сигнал красного камня на соседние контролирующие рельсы. Питание двух контролирующих рельс с разной мощностью приведет к тому, что дорожки между ними будут интерполировать свой сигнал.", - "item.create.sand_paper.tooltip": "SAND PAPER", + "item.create.sand_paper.tooltip": "НАЖДАЧНАЯ БУМАГА", "item.create.sand_paper.tooltip.summary": "Грубая бумага, которую можно использовать для _полировки материалов_. Может применяться автоматически с помощью автономного активатора.", "item.create.sand_paper.tooltip.condition1": "Когда используется", "item.create.sand_paper.tooltip.behaviour1": "Полирует предметы во _второй руке_, или лежащие _на полу_, если _смотреть на них_", - "item.create.builders_tea.tooltip": "BUILDERS TEA", + "item.create.builders_tea.tooltip": "ЧАЙ СТРОИТЕЛЯ", "item.create.builders_tea.tooltip.summary": "Идеальный напиток для начала дня. _Мотивирует и насыщает_.", - "item.create.refined_radiance.tooltip": "REFINED RADIANCE", + "item.create.refined_radiance.tooltip": "ИЗЫСКАННОЕ СИЯНИЕ", "item.create.refined_radiance.tooltip.summary": "Хроматический материал, _добытый_ _из_ _поглощенного_ _света_.", + "item.create.refined_radiance.tooltip.condition1": "Работа в процессе", + "item.create.refined_radiance.tooltip.behaviour1": "Использование этого материала будет доступно в следующем обновлении.", - "item.create.shadow_steel.tooltip": "SHADOW STEEL", + "item.create.shadow_steel.tooltip": "ВОЗВРАЩЕНИЕ ПУСТОТЫ", "item.create.shadow_steel.tooltip.summary": "Хроматический материал, _добытый_ _в_ _пустоте_.", + "item.create.shadow_steel.tooltip.condition1": "Работа в процессе", + "item.create.shadow_steel.tooltip.behaviour1": "Использование этого материала будет доступно в следующем обновлении.", - "item.create.minecart_coupling.tooltip": "MINECART COUPLING", + "item.create.linked_controller.tooltip": "ПОДКЛЮЧАЕМЫЙ КОНТРОЛЛЕР", + "item.create.linked_controller.tooltip.summary": "Предоставляет _ручной_ _контроль_ над частотами _Беспроводного передатчика редстоун сигнала_, присвоенные его _шести_ кнопкам.", + "item.create.linked_controller.tooltip.condition1": "ПКМ", + "item.create.linked_controller.tooltip.behaviour1": "Включает контроллер. _Управление_ _движением_ перехвачено, пока он активен.", + "item.create.linked_controller.tooltip.condition2": "ПКМ крадучись", + "item.create.linked_controller.tooltip.behaviour2": "Открывает _интерфейс_ _конфигурации_.", + "item.create.linked_controller.tooltip.condition3": "ПКМ по приемнику сигнала редстоуна", + "item.create.linked_controller.tooltip.behaviour3": "Включает _режим привязки_, нажмите одну из _шести кнопок_, чтобы привязать его к _частоте передатчика_.", + "item.create.linked_controller.tooltip.condition4": "ПКМ по кафедре", + "item.create.linked_controller.tooltip.behaviour4": "Помещает контроллер на кафедру для удобства использования. (ПКМ крадучись, чтобы забрать его)", + + "item.create.diving_helmet.tooltip": "ШЛЕМ ДЛЯ ДАЙВИНГА", + "item.create.diving_helmet.tooltip.summary": "Вместе с _медным_ _баллоном_, позволяет владельцу _дышать _ _под водой_ в течение длительного времени.", + "item.create.diving_helmet.tooltip.condition1": "При ношении", + "item.create.diving_helmet.tooltip.behaviour1": "Даёт эффект _Водного Дыхания_, медленно тратя _воздух_ из баллона.", + + "item.create.copper_backtank.tooltip": "МЕДНЫЙ БАЛЛОН", + "item.create.copper_backtank.tooltip.summary": "_Носимый_ _резервуар_ для транспортировки воздуха под давлением.", + "item.create.copper_backtank.tooltip.condition1": "При ношении", + "item.create.copper_backtank.tooltip.behaviour1": "Обеспечивает подачу _воздуха_ под _давлением_ к оборудованию, которое в этом нуждается.", + "item.create.copper_backtank.tooltip.condition2": "При размещении и питании от кинетической энергии", + "item.create.copper_backtank.tooltip.behaviour2": "Собирает и сжимает воздух со скоростью, зависящей от скорости вращения.", + + "item.create.diving_boots.tooltip": "БОТИНКИ ДЛЯ ДАЙВИНГА", + "item.create.diving_boots.tooltip.summary": "Пара _тяжелых_ _ботинок_, позволяющая лучше передвигаться по океанскому дну.", + "item.create.diving_boots.tooltip.condition1": "При ношении", + "item.create.diving_boots.tooltip.behaviour1": "Владелец _тонет_ _быстрее_ и _не_ может _плавать_. Ботинки дают возможность _ходить_ и _прыгать_ под водой. На владельца также больше не влияют механические ремни (передвижение по конвейеру).", + + "item.create.crafting_blueprint.tooltip": "СОЗДАНИЕ ЧЕРТЕЖА", + "item.create.crafting_blueprint.tooltip.summary": "_Разместив_ на стене, его можно использовать для _определения_ _расположения_ _компонентов_ (блоков) для более простого ручного создания предметов. Каждый слот показывает Рецепт.", + "item.create.crafting_blueprint.condition1": "ПКМ по пустому слоту", + "item.create.crafting_blueprint.behaviour1": "Открывает меню _крафта_, позволяющее _настроить_ _рецепт_ и отображаемые предметы.", + "item.create.crafting_blueprint.condition2": "ПКМ по настроенному слоту", + "item.create.crafting_blueprint.behaviour2": "_Применяет_ _заданный_ _рецепт_ с подходящими ингредиентами, из вашего _инвентаря_. _Shift_, чтобы создать целого до _стака_ предметов..", + + "item.create.minecart_coupling.tooltip": "СОЕДЕНИТЕЛЬ ВАГОНЕТОК", "item.create.minecart_coupling.tooltip.summary": "_Соединяет_ ваши _вагонетки_ или _Перевозочные устройства_ вместе, чтобы создать великолепный поезд.", "item.create.minecart_coupling.tooltip.condition1": "При использовании на вагонетке", "item.create.minecart_coupling.tooltip.behaviour1": "_Соединяет_ две вагонетки вместе, пытаясь держать их на _определенной дистанции_ при движении.", - "create.tooltip.wip": "WIP", - "create.tooltip.workInProgress": "Работа продолжается!", - "create.tooltip.randomWipDescription0": "Пожалуйста держите этот предмет подальше от детей!", - "create.tooltip.randomWipDescription1": "Маленькая панда умирает каждый раз, когда вы используете этот предмет. Каждый. Раз.", - "create.tooltip.randomWipDescription2": "Используйте на свой страх и риск.", - "create.tooltip.randomWipDescription3": "Это не тот предмет, который вы ищете, *шевелит пальцами* пожалуйста, ускорьтесь.", - "create.tooltip.randomWipDescription4": "Этот предмет самоуничтожится через 10 секунд. 10, 9, 8...", - "create.tooltip.randomWipDescription5": "Поверьте мне, это бесполезно.", - "create.tooltip.randomWipDescription6": "Используя этот пункт, вы тем самым соглашаетесь с нашим отказом от ответственности и соглашаетесь с его условиями.", - "create.tooltip.randomWipDescription7": "Этот, возможно, но не для тебя. Как насчет этого?", - "create.tooltip.randomWipDescription8": "Используя его, вы немедленно пожалеете о своем решении.", + "block.create.peculiar_bell.tooltip": "СТРАННЫЙ КОЛОКОЛ", + "block.create.peculiar_bell.tooltip.summary": "Декоративный _латунный колокол_. Установка его прямо над горящем _Огнем душ_ может вызвать побочные эффекты...с", + + "block.create.haunted_bell.tooltip": "ПРИЗРАЧНЫЙ КОЛОКОЛ", + "block.create.haunted_bell.tooltip.summary": "_Проклятый колокол_ населенный потерянными душами Нижнего мира.", + "block.create.haunted_bell.tooltip.condition1": "При ношении или при звоне", + "block.create.haunted_bell.tooltip.behaviour1": "Подсвечивает ближайшие _места без света_ на которых могут появляться _враждебные мобы_..", "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "Удерживайте [%1$s] для Размышления", + "create.ponder.hold_to_ponder": "Удерживайте [%1$s] для размышления", "create.ponder.subject": "Субъект этой сцены", - "create.ponder.pondering": "Размышляем о...", + "create.ponder.pondering": "Размышляем о/об...", "create.ponder.identify_mode": "Режим Идентификации включён.\nУбрать паузу: [%1$s]", "create.ponder.associated": "Связанные статьи", "create.ponder.close": "Закрыть", @@ -1440,40 +1498,46 @@ "create.ponder.replay": "Воспроизвести снова", "create.ponder.think_back": "Подумать о предыдущем", "create.ponder.slow_text": "Удобное чтение", - "create.ponder.shared.movement_anchors": "С помощью Суперклея или Шасси, более крупные структуры могут быть сдивинуты.", + "create.ponder.exit": "Выйти", + "create.ponder.welcome": "Добро пожаловать в размышления", + "create.ponder.categories": "Категории, доступные в Create", + "create.ponder.index_description": "Кликните по одной из иконок, чтобы узнать о связанных с ней предметах и блоках.", + "create.ponder.index_title": "Содержание размышлений", + "create.ponder.shared.movement_anchors": "С помощью суперклея или шасси, более крупные структуры могут быть сдвинуты.", "create.ponder.shared.rpm32": "32 об./мин.", "create.ponder.shared.sneak_and": "Красться +", - "create.ponder.shared.storage_on_contraption": "Присоединённые к Штуковине инвентари будут подбирать вещи автоматически", + "create.ponder.shared.storage_on_contraption": "Присоединённые к штуковине инвентари будут подбирать вещи автоматически", "create.ponder.shared.behaviour_modify_wrench": "Это поведение может быть изменено Ключом", "create.ponder.shared.rpm8": "8 об./мин.", "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm16_source": "Источник: 16 об./мин.", "create.ponder.shared.rpm16": "16 об./мин.", "create.ponder.tag.kinetic_sources": "Кинетические источники", - "create.ponder.tag.kinetic_sources.description": "Компоненты, генерирующие Силу Вращения", + "create.ponder.tag.kinetic_sources.description": "Компоненты, генерирующие силу вращения", + "create.ponder.tag.contraption_actor": "Компоненты штуковин", "create.ponder.tag.contraption_actor.description": "Компоненты, проявляющие особое поведение когда прикреплены к двигающейся штуковине", - "create.ponder.tag.arm_targets": "Цели для Механической Руки", - "create.ponder.tag.arm_targets.description": "Компоненты, которые могут быть выбраны входами или выходами для Механической Руки", - "create.ponder.tag.logistics": "Транспортировка Предметов", + "create.ponder.tag.arm_targets": "Цели для Механической руки", + "create.ponder.tag.arm_targets.description": "Компоненты, которые могут быть выбраны входами или выходами для Механической руки", + "create.ponder.tag.logistics": "Транспортировка предметов", "create.ponder.tag.logistics.description": "Компоненты, помогающие перемещать предметы", - "create.ponder.tag.movement_anchor": "Опоры Движения", + "create.ponder.tag.movement_anchor": "Опоры движения", "create.ponder.tag.movement_anchor.description": "Компоненты, позволяющие создавать двигающиеся штуковины, оживляя прикрепленную структуру разными способами", "create.ponder.tag.creative": "Творческий режим", - "create.ponder.tag.creative.description": "Компоненты обычычно недоступные в Режиме Выживания", + "create.ponder.tag.creative.description": "Компоненты обычно недоступные в Режиме Выживания", "create.ponder.tag.kinetic_relays": "Кинетические блоки", - "create.ponder.tag.kinetic_relays.description": "Компоненты, помогающие передавать Силу Вращения куда-нибудь", - "create.ponder.tag.windmill_sails": "Паруса для Мельничных Подшипников", - "create.ponder.tag.windmill_sails.description": "Блоки, число которых увеличивает силу Мельницы. Каждый из этих блоков имеет одинаковую эффективность в деле.", + "create.ponder.tag.kinetic_relays.description": "Компоненты, помогающие передавать силу вращения куда-нибудь", + "create.ponder.tag.windmill_sails": "Паруса для Подшипников ветряной мельницы", + "create.ponder.tag.windmill_sails.description": "Блоки, число которых увеличивает силу Ветряной мельницы. Каждый из этих блоков имеет одинаковую эффективность в деле.", "create.ponder.tag.contraption_assembly": "Приспособления для присоединения блоков", "create.ponder.tag.contraption_assembly.description": "Инструменты и Компоненты используемые для сборки структур передвигаемых как движущиеся Штуковины", "create.ponder.tag.decoration": "Эстетика", "create.ponder.tag.decoration.description": "Компоненты, чаще всего используемые для декоративных целей", - "create.ponder.tag.kinetic_appliances": "Кинетические Приборы", - "create.ponder.tag.kinetic_appliances.description": "Компоненты, использующие Силу Вращения", - "create.ponder.tag.redstone": "Логические Компоненты", - "create.ponder.tag.redstone.description": "Компоненты, помогающие с конструироваением Редстоун Схем", - "create.ponder.tag.fluids": "Жидкостные Манипуляторы", - "create.ponder.tag.fluids.description": "Компоненты, помогающие перемещать и использовать Жидкости", + "create.ponder.tag.kinetic_appliances": "Кинетические приборы", + "create.ponder.tag.kinetic_appliances.description": "Компоненты, использующие силу вращения", + "create.ponder.tag.redstone": "Логические компоненты", + "create.ponder.tag.redstone.description": "Компоненты, помогающие с конструированием редстоун схем", + "create.ponder.tag.fluids": "Жидкостные манипуляторы", + "create.ponder.tag.fluids.description": "Компоненты, помогающие перемещать и использовать жидкости", "create.ponder.adjustable_pulse_repeater.header": "Управлении сигналами с помощью Регулируемого импульсного повторителя", "create.ponder.adjustable_pulse_repeater.text_1": "Регулируемые импульсные повторители испускают короткий импульс с задержкой", @@ -1487,10 +1551,750 @@ "create.ponder.adjustable_repeater.text_4": "Используя колесо мыши, время зарядки может быть настроено", "create.ponder.adjustable_repeater.text_5": "Настраиваемая задержка может достигать 30 минут", - "create.ponder.analog_lever.header": "Управлении сигналами используя Аналоговый Рычаг", - "create.ponder.analog_lever.text_1": "Аналоговый Рычаг создан как компактный и точный источник Редстоун Сигнала", - "create.ponder.analog_lever.text_2": "ПКМ чтобы увеличить силу выходного сигнала", - "create.ponder.analog_lever.text_3": "ПКМ Крадучись чтобы уменьшить силу выходного сигнала снова", + "create.ponder.analog_lever.header": "Управлении сигналами используя Аналоговый рычаг", + "create.ponder.analog_lever.text_1": "Аналоговый рычаг создан как компактный и точный источник Редстоун сигнала", + "create.ponder.analog_lever.text_2": "ПКМ, чтобы увеличить силу выходного сигнала", + "create.ponder.analog_lever.text_3": "ПКМ крадучись, чтобы уменьшить силу выходного сигнала снова", + + "create.ponder.andesite_tunnel.header": "Использовании Андезитовых туннелей", + "create.ponder.andesite_tunnel.text_1": "Андезитовые туннели могут быть использованы, чтобы накрывать Конвейеры", + "create.ponder.andesite_tunnel.text_2": "Всегда, когда у Андезитового туннеля есть соединения сбоку...", + "create.ponder.andesite_tunnel.text_3": "...он будет отделять ровно один предмет из любых проходящих мимо стаков", + "create.ponder.andesite_tunnel.text_4": "Остаток продолжит свой путь", + + "create.ponder.basin.header": "Обработке предметов в Чаше", + "create.ponder.basin.text_1": "Чаша может хранить предметы и жидкости для обработки", + "create.ponder.basin.text_2": "После обработки, чаши пытаются вывести результат под любой из их сторон", + "create.ponder.basin.text_3": "Когда предоставлен подходящий компонент, у Чаши появится выходящий кран", + "create.ponder.basin.text_4": "Несколько вариантов применимы здесь", + "create.ponder.basin.text_5": "Вывод чаши будет пойман инвентарём ниже", + "create.ponder.basin.text_6": "Без выходящего крана, Чаша будет оставлять предметы, полученные в результате обработки", + "create.ponder.basin.text_7": "Это может быть полезно, если продукт должен быть использован повторно как ингредиент", + "create.ponder.basin.text_8": "Желаемые продукты должны быть в таком случае извлечены из чаши", + "create.ponder.basin.text_9": "Фильтр может быть необходим для избежания извлечения необработанных предметов", + + "create.ponder.bearing_modes.header": "Режимах движения Механического подшипника", + "create.ponder.bearing_modes.text_1": "Когда остановлен, подшипник установит структуру на ближайшем выровненным по сетке блоков углу", + "create.ponder.bearing_modes.text_2": "Он может быть настроен никогда не возвращать структуру в твёрдое состояние, или только возле начального угла", + + "create.ponder.belt_casing.header": "Обрамлении ремней", + "create.ponder.belt_casing.text_1": "Латунный или Андезитовый корпус может быть использован для декорации Механических ремней (конвейера)", + "create.ponder.belt_casing.text_2": "Используйте Ключ, чтобы убрать обрамление", + + "create.ponder.belt_connector.header": "Использовании Механических ремней", + "create.ponder.belt_connector.text_1": "ПКМ по двум валам предметом ремня соединит их вместе в конвейер", + "create.ponder.belt_connector.text_2": "Случайные выделения могут быть отменены нажатием ПКМ Крадучись", + "create.ponder.belt_connector.text_3": "Дополнительные валы могут быть добавлены по всей длине конвейера", + "create.ponder.belt_connector.text_4": "Валы, соединённые через ремни, будут вращаться с той же скоростью и направлением", + "create.ponder.belt_connector.text_5": "Добавленные Валы могут быть убраны Ключом", + "create.ponder.belt_connector.text_6": "Механические ремни могут быть окрашены в эстетических целях", + + "create.ponder.belt_directions.header": "Возможных расположениях Механических ремней", + "create.ponder.belt_directions.text_1": "Ремни не могут соединяться в произвольных направлениях", + "create.ponder.belt_directions.text_2": "1. Они могут соединяться горизонтально", + "create.ponder.belt_directions.text_3": "2. Они могут соединяться по диагонали", + "create.ponder.belt_directions.text_4": "3. Они могут соединяться вертикально", + "create.ponder.belt_directions.text_5": "4. И они могут соединять вертикальные валы горизонтально", + "create.ponder.belt_directions.text_6": "Это все возможные направления. Ремни могут достигать Длины от 2 до 20 блоков", + + "create.ponder.belt_transport.header": "Использовании Механических ремней для логистики", + "create.ponder.belt_transport.text_1": "Двигающиеся ремни будут перемещать Предметы и другие Сущности", + "create.ponder.belt_transport.text_2": "ПКМ пустой рукой, чтобы забрать предметы с ремня", + + "create.ponder.blaze_burner.header": "Кормлении Горелок всполохов", + "create.ponder.blaze_burner.text_1": "Горелки всполохов дают тепло предметам, обрабатывающимся в Чаше", + "create.ponder.blaze_burner.text_2": "Для этого, Всполох должен быть накормлен воспламеняемыми предметами", + "create.ponder.blaze_burner.text_3": "С Тортом всполоха, горелка может достигать еще большего уровня жара", + "create.ponder.blaze_burner.text_4": "Процесс кормления может быть автоматизирован, используя Автономный активатор или Механическую руку", + + "create.ponder.brass_funnel.header": "Латунной Воронке", + "create.ponder.brass_funnel.text_1": "Андезитовая Воронка может извлекать только одиночные предметы", + "create.ponder.brass_funnel.text_2": "Латунная Воронка может извлекать до целого стака", + "create.ponder.brass_funnel.text_3": "Прокрутка на слоте фильтра позволяет точно регулировать размер извлекаемого стака", + "create.ponder.brass_funnel.text_4": "Используя предмет на слоте фильтра ограничит воронку до передачи только совпадающих стаков", + + "create.ponder.brass_tunnel.header": "Использовании Латунных туннелей", + "create.ponder.brass_tunnel.text_1": "Латунные туннели могут быть использованы, чтобы накрывать конвейеры", + "create.ponder.brass_tunnel.text_2": "Латунные туннели имеют слот для фильтра на каждой открытой стороне", + "create.ponder.brass_tunnel.text_3": "Фильтр на входящих соединениях блокирует неподходящие предметы", + "create.ponder.brass_tunnel.text_4": "Фильтр на выходящих соединениях может быть использован для сортировки предметов по типу", + "create.ponder.brass_tunnel.text_5": "Всегда, когда у проходящего предмета есть несколько доступных выходов, режим распределения решит что с ним делать", + "create.ponder.brass_tunnel.text_6": "Латунные туннели на параллельных конвейерах формируют группы", + "create.ponder.brass_tunnel.text_7": "Входящие предметы будут распределены между всеми соединёнными выходами", + "create.ponder.brass_tunnel.text_8": "Для этого предметы также могут быть вложены в блок туннеля напрямую", + + "create.ponder.brass_tunnel_modes.header": "Режимах распределения Латунных туннелей", + "create.ponder.brass_tunnel_modes.text_1": "Используя Ключ, вы можете настроить поведение распределения у Латунного туннеля", + "create.ponder.brass_tunnel_modes.text_10": "«Синхронизировать входы» - уникальная настройка для Латунных туннелей", + "create.ponder.brass_tunnel_modes.text_11": "Предметы могут пройти только если у каждого туннеля в группе есть ожидающий у входа предмет", + "create.ponder.brass_tunnel_modes.text_12": "Это подразумевает, что все конвейеры поставляют предметы с равной скоростью", + "create.ponder.brass_tunnel_modes.text_2": "«Разделить» попытается распределить стак поровну между доступными выходами", + "create.ponder.brass_tunnel_modes.text_3": "Если выход не может принять больше предметов, он будет пропущен", + "create.ponder.brass_tunnel_modes.text_4": "«Принудительно разделить» никогда не пропустит выходы и вместо этого будет ждать пока они не освободятся", + "create.ponder.brass_tunnel_modes.text_5": "«По Кругу» сохраняет цельные стаки и отдаёт их выходам по очереди", + "create.ponder.brass_tunnel_modes.text_6": "Опять же, если выход не может принять больше предметов, он будет пропущен", + "create.ponder.brass_tunnel_modes.text_7": "«Принудительно по кругу» никогда не пропускает выходы", + "create.ponder.brass_tunnel_modes.text_8": "«Предпочтительно ближайшее» приоритизирует ближайшие выходы от места подачи предметов", + "create.ponder.brass_tunnel_modes.text_9": "«Случайно» будет отдавать целые стаки случайно выбранным выходам", + + "create.ponder.cart_assembler.header": "Движении структур при помощи Сборщика вагонеток", + "create.ponder.cart_assembler.text_1": "Активированные Сборщики вагонеток устанавливают прикреплённые структуры к проходящим мимо вагонеткам", + "create.ponder.cart_assembler.text_2": "Без редстоун сигнала они разбирают вагонеточные штуковины обратно в блоки", + "create.ponder.cart_assembler.text_3": "Использование Ключа на вагонетке позволит вам унести Штуковину куда-то ещё", + + "create.ponder.cart_assembler_dual.header": "Сборке Штуковин-экипажей", + "create.ponder.cart_assembler_dual.text_1": "Всегда, когда два Сборщика вагонеток имеют общую прикреплённую структуру...", + "create.ponder.cart_assembler_dual.text_2": "активация любого из них создаст Штуковину-экипаж", + "create.ponder.cart_assembler_dual.text_3": "Эти вагонетки будут вести себя так, будто они соединены Соединителем вагонеток", + + "create.ponder.cart_assembler_modes.header": "Настройках ориентации Вагонеточных штуковин", + "create.ponder.cart_assembler_modes.text_1": "Вагонеточные штуковины будут поворачиваться в сторону движения их вагонеток", + "create.ponder.cart_assembler_modes.text_2": "Стрелкой показано, какая сторона конструкции будет считаться передней", + "create.ponder.cart_assembler_modes.text_3": "Если сборщик настроен на блокировку вращения, то ориентация штуковин никогда не изменится", + + "create.ponder.cart_assembler_rails.header": "Других типах вагонеток и рельс", + "create.ponder.cart_assembler_rails.text_1": "Сборщики вагонеток на обычных рельсах не будут влиять на движение проходящих вагонеток", + "create.ponder.cart_assembler_rails.text_2": "На активных Контролирующих рельсах или Энергорельсах вагонетки будут стоять на месте до тех, пока Сборщик не будет активирован", + "create.ponder.cart_assembler_rails.text_3": "Другие типы вагонеток могут быть использованы как основание", + "create.ponder.cart_assembler_rails.text_4": "Самоходные вагонетки будут поддерживать себя запитанными, используя топливо из присоединённых инвентарей", + + "create.ponder.chain_drive.header": "Передаче силы вращения Цепными приводами", + "create.ponder.chain_drive.text_1": "Цепные приводы передают силу вращения друг другу", + "create.ponder.chain_drive.text_2": "Все валы соединённые таким образом будут вращаться в одном направлении", + "create.ponder.chain_drive.text_3": "Любая часть в ряду может быть повёрнута на 90 градусов", + + "create.ponder.chain_gearshift.header": "Управлении скоростью вращения Регулируемыми цепными механизмами", + "create.ponder.chain_gearshift.text_1": "Неактивные Цепные механизмы ведут себя точно так же, как Цепные приводы", + "create.ponder.chain_gearshift.text_2": "Когда активирован, скорость, передаваемая другим Цепным механизмам в ряду удваивается", + "create.ponder.chain_gearshift.text_3": "Когда активированный Цепной механизм не является источником, его скорость будет снижена вдвое", + "create.ponder.chain_gearshift.text_4": "В обоих случаях Цепные приводы в ряду всегда вращаются с 2x скоростью активированного Цепного механизма", + "create.ponder.chain_gearshift.text_5": "Используя аналоговые сигналы, это умножение может быть настроено более точно между 1 и 2", + "create.ponder.chain_gearshift.text_6": "12 об./мин.", + + "create.ponder.chute.header": "Транспортировке предметов вниз через Желоба", + "create.ponder.chute.text_1": "Желоба могут транспортировать предметы вертикально из и в инвентари", + "create.ponder.chute.text_2": "Используя Ключ, вы можете создать окно", + "create.ponder.chute.text_3": "Установка желобов на стороны других желобов сделает их диагональными", + + "create.ponder.chute_upward.header": "Транспортировке предметов вверх через Желоба", + "create.ponder.chute_upward.text_1": "Используя Вентилятор в корпусе внизу или наверху, Желоб может перемещать предметы вверх", + "create.ponder.chute_upward.text_2": "Осмотр желобов в Инженерных очках открывает информацию о направлении движения", + "create.ponder.chute_upward.text_3": "На «заблокированном» конце предметы должны быть введены/выведены сбоку", + + "create.ponder.clockwork_bearing.header": "Оживлении структур Часовым механизмом", + "create.ponder.clockwork_bearing.text_1": "Часовые механизмы прикрепляются к блокам спереди", + "create.ponder.clockwork_bearing.text_2": "При получении силы вращения структура повернётся в зависимости от текущего часа", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "ПКМ по механизму, чтобы остановить или вновь запустить структуру", + "create.ponder.clockwork_bearing.text_6": "Вторая структура может быть добавлена спереди Часовой стрелки", + "create.ponder.clockwork_bearing.text_7": "Убедитесь, что две структуры не соединены между собой супер-клеем или чем-то схожим", + "create.ponder.clockwork_bearing.text_8": "Вторая структура станет вращаться как Минутная стрелка", + + "create.ponder.clutch.header": "Управлении силой вращения с помощью Сцепления", + "create.ponder.clutch.text_1": "Сцепление передаёт вращение по прямой", + "create.ponder.clutch.text_2": "При активации Редстоуном оно разрывает соединение", + + "create.ponder.cog_speedup.header": "Переключении передач Шестернями", + "create.ponder.cog_speedup.text_1": "Большие и Маленькие шестерни могут соединяться по диагонали", + "create.ponder.cog_speedup.text_2": "Переходя с больших на маленькие шестерни, переданная скорость удвоится", + "create.ponder.cog_speedup.text_3": "Переходя в обратном направлении, переданная скорость сократится вдвое", + + "create.ponder.cogwheel.header": "Передаче силы вращения Шестернями", + "create.ponder.cogwheel.text_1": "Шестерни передают вращение другим соседним шестерням", + "create.ponder.cogwheel.text_2": "Соседние валы соединённые таким образом будут вращаться в противоположных направлениях", + + "create.ponder.creative_fluid_tank.header": "Творческом жидкостном баке", + "create.ponder.creative_fluid_tank.text_1": "Творческий жидкостный бак может использоваться для обеспечения бесконечного запаса жидкости", + "create.ponder.creative_fluid_tank.text_2": "Щелкните ПКМ предметом, содержащим жидкость, чтобы настроить его", + "create.ponder.creative_fluid_tank.text_3": "Сети труб могут бесконечно вытягивать заданную жидкость из резервуара", + "create.ponder.creative_fluid_tank.text_4": "Любые жидкости, закачанные обратно в творческий жидкостный бак, будут уничтожены", + + "create.ponder.creative_motor.header": "Генерации силы вращения творческими моторами", + "create.ponder.creative_motor.text_1": "Творческие моторы - это компактные и настраиваемые источники Силы Вращения", + "create.ponder.creative_motor.text_2": "Прокрутка по задней панели изменяет кол-во об./мин. у вращающегося вала мотора", + + "create.ponder.crushing_wheels.header": "Обработке предметов Колёсами дробления", + "create.ponder.crushing_wheels.text_1": "Пара Колёс дробления может молоть предметы очень эффективно", + "create.ponder.crushing_wheels.text_2": "Сила вращения должна вращать их друг в друга", + "create.ponder.crushing_wheels.text_3": "Предметы брошенные или введённые в них сверху будут обработаны", + "create.ponder.crushing_wheels.text_4": "Предметы также могут быть введены и подобраны автоматическим способом", + + "create.ponder.deployer.header": "Использовании автономного активатора", + "create.ponder.deployer.text_1": "При наличии силы вращения автономный активатор может имитировать действия игрока", + "create.ponder.deployer.text_10": "ПКМ спереди, чтобы дать ему предмет для использования", + "create.ponder.deployer.text_11": "Предметы также могут быть введены автоматически", + "create.ponder.deployer.text_12": "Автономные активаторы имеют слот для фильтра", + "create.ponder.deployer.text_13": "Когда фильтр установлен, Активатор работает только держа подходящий предмет", + "create.ponder.deployer.text_14": "Только предметы подходящие по фильтру могут быть введены...", + "create.ponder.deployer.text_15": "...и только неподходящие предметы будут выведены", + "create.ponder.deployer.text_2": "Он всегда будет взаимодействовать с местом на два блока перед ним", + "create.ponder.deployer.text_3": "Блоки прямо перед ним не будут мешать ему", + "create.ponder.deployer.text_4": "Автономные активаторы умеют:", + "create.ponder.deployer.text_5": "Ставить блоки,", + "create.ponder.deployer.text_6": "Использовать предметы,", + "create.ponder.deployer.text_7": "Активировать блоки,", + "create.ponder.deployer.text_8": "Собирать блоки", + "create.ponder.deployer.text_9": "и Атаковать мобов", + + "create.ponder.deployer_contraption.header": "Использовании автономных активаторов на штуковинах", + "create.ponder.deployer_contraption.text_1": "Всегда, когда автономные активаторы движутся как часть движимой штуковины...", + "create.ponder.deployer_contraption.text_2": "Они активируются на каждом посещённом месте, используя предметы из любых инвентарей на штуковине", + "create.ponder.deployer_contraption.text_3": "Слот для Фильтра может быть использован, чтобы уточнить, какие предметы ему брать", + + "create.ponder.deployer_modes.header": "Режимах автономного активатора", + "create.ponder.deployer_modes.text_1": "По умолчанию, активатор имитирует ПКМ-взаимодейстие", + "create.ponder.deployer_modes.text_2": "Используя Ключ, вы можете установить его на имитацию ЛКМ", + + "create.ponder.deployer_processing.header": "Обработке элементов с помощью автономных активаторов", + "create.ponder.deployer_processing.text_1": "Держа подходящий предмет/инструмент, автономные активаторы могут обрабатывать предметы под собой", + "create.ponder.deployer_processing.text_2": "Принимаемые предметы можно бросить или положить на депо под автономным активатором", + "create.ponder.deployer_processing.text_3": "Когда предметы находятся на конвейере...", + "create.ponder.deployer_processing.text_4": "автономный активатор будет удерживать и обрабатывать их автоматически", + + "create.ponder.deployer_redstone.header": "Управлении автономными активаторами редстоуном", + "create.ponder.deployer_redstone.text_1": "При активации Редстоуном активатор перестанет работать", + "create.ponder.deployer_redstone.text_2": "Перед остановкой, Активатор завершит все начатые действия", + "create.ponder.deployer_redstone.text_3": "Таким образом, инвертированный импульс может быть использован для вызова ровно одного срабатывания", + + "create.ponder.depot.header": "Использовании Депо", + "create.ponder.depot.text_1": "Депо могут служить как «стационарный» элемент конвейера", + "create.ponder.depot.text_2": "ПКМ, что бы самостоятельно положить или забрать предметы с них", + "create.ponder.depot.text_3": "Так же, как Механические ремни, оно может предоставлять предметы для обработки", + "create.ponder.depot.text_4": "...а также поставлять предметы Механическим рукам", + + "create.ponder.empty_blaze_burner.header": "Использовании Пустых горелок всполохов", + "create.ponder.empty_blaze_burner.text_1": "ПКМ по Всполоху с пустой горелкой, чтобы захватить его", + "create.ponder.empty_blaze_burner.text_2": "Также Всполохи могут быть захвачены из спавнера напрямую", + "create.ponder.empty_blaze_burner.text_3": "Теперь у вас есть идеальный источник тепла для ряда машин", + "create.ponder.empty_blaze_burner.text_4": "В эстетических целях, Пустые горелки могут быть зажжены огнивом", + "create.ponder.empty_blaze_burner.text_5": "Пламя можно трансформировать, используя наполненный душой предмет.", + "create.ponder.empty_blaze_burner.text_6": "Однако они не будут подходить для промышленного нагрева", + + "create.ponder.encased_fluid_pipe.header": "Обрамлении Жидкостных труб", + "create.ponder.encased_fluid_pipe.text_1": "Медный корпус можно использовать для украшения декорации труб.", + "create.ponder.encased_fluid_pipe.text_2": "Помимо того, что они скрываются, заключенные в обрамление трубы блокируются в текущем состоянии", + "create.ponder.encased_fluid_pipe.text_3": "Они больше не будут реагировать на добавление или удаление каких-либо соседних блоков", + + "create.ponder.fan_direction.header": "Воздушном потоке Вентиляторов в корпусе", + "create.ponder.fan_direction.text_1": "Вентиляторы в корпусе используют силу вращения для создания Воздушного потока", + "create.ponder.fan_direction.text_2": "Сила и направление потока зависят от подаваемого вращения", + + "create.ponder.fan_processing.header": "Обработке предметов используя Вентиляторы в корпусе", + "create.ponder.fan_processing.text_1": "Проходя через лаву, Воздушный поток становится Горячим", + "create.ponder.fan_processing.text_2": "Предметы в этой области будут переплавлены", + "create.ponder.fan_processing.text_3": "Съедобные предметы брошенные сюда будут сожжены", + "create.ponder.fan_processing.text_4": "Вместо этого, для них должна быть использована установка для Копчения с огнём", + "create.ponder.fan_processing.text_5": "Поток, проходящий через Воду, создаёт Промывающую установку", + "create.ponder.fan_processing.text_6": "Несколько новых вариантов обработки делаются с её помощью", + "create.ponder.fan_processing.text_7": "Скорость вентилятора НЕ влияет на скорость обработки, а только на дальность", + "create.ponder.fan_processing.text_8": "Обработка Вентиляторами может быть применена к предметам на конвейерах или депо", + + "create.ponder.fan_source.header": "Генерации силы вращения Вентиляторами в корпусе", + "create.ponder.fan_source.text_1": "Вентиляторы направленные вниз на источник тепла могут создавать силу вращения", + "create.ponder.fan_source.text_2": "При сигнале редстоуна Вентилятор начнёт отдавать энергию", + + "create.ponder.fluid_pipe_flow.header": "Перемещении жидкостей при помощи медных труб.", + "create.ponder.fluid_pipe_flow.text_1": "Жидкостные трубы могут соединять два или более источников и потребителей жидкости", + "create.ponder.fluid_pipe_flow.text_2": "При помощи гаечного ключа можно создать окно прямому отрезку трубы", + "create.ponder.fluid_pipe_flow.text_3": "Трубы с окнами не будут соединяться ни с какими другими рядом идущими отрезками труб", + "create.ponder.fluid_pipe_flow.text_4": "Приводимые в действие механическими помпами, трубы могут транспортировать жидкости", + "create.ponder.fluid_pipe_flow.text_5": "Сначала жидкость не выкачивается", + "create.ponder.fluid_pipe_flow.text_6": "Как только поток соединит концы, они постепенно перекачают свое содержимое", + "create.ponder.fluid_pipe_flow.text_7": "Таким образом, сами блоки труб никогда «физически» не содержат никакой жидкости", + + "create.ponder.fluid_pipe_interaction.header": "Опустошении и наполнении жидкостных контейнеров", + "create.ponder.fluid_pipe_interaction.text_1": "Концы сети труб могут взаимодействовать с различными блоками", + "create.ponder.fluid_pipe_interaction.text_2": "Любой блок с возможностью хранения жидкости может быть заполнен или опустошен", + "create.ponder.fluid_pipe_interaction.text_3": "Источники прямо перед открытым концом можно откачать...", + "create.ponder.fluid_pipe_interaction.text_4": "...в то время как выливание в незаполненное пространство может создать источники", + "create.ponder.fluid_pipe_interaction.text_5": "Трубы также могут извлекать жидкости непосредственно из нескольких других блоков", + + "create.ponder.fluid_tank_sizes.header": "Размерах жидкостного бака", + "create.ponder.fluid_tank_sizes.text_1": "Жидкостные баки можно объединить для увеличения общей вместимости", + "create.ponder.fluid_tank_sizes.text_2": "Их площадь основания может составлять до 3 блоков в ширину...", + "create.ponder.fluid_tank_sizes.text_3": "...и увеличиваются в высоту более чем на 30 дополнительных уровней", + "create.ponder.fluid_tank_sizes.text_4": "При помощи гаечного ключа можно создать окно на резервуаре", + + "create.ponder.fluid_tank_storage.header": "Хранении жидкостей в жидкостных баках", + "create.ponder.fluid_tank_storage.text_1": "Жидкостные баки можно использовать для хранения большого количества жидкости", + "create.ponder.fluid_tank_storage.text_2": "Трубы могут закачивать и выкачивать жидкости с любой стороны", + "create.ponder.fluid_tank_storage.text_3": "Содержащаяся жидкость может быть измерена с помощью компаратора", + "create.ponder.fluid_tank_storage.text_4": "Однако в режиме выживания жидкость нельзя добавлять или извлекать вручную", + "create.ponder.fluid_tank_storage.text_5": "Вы можете использовать чаши, предметные осушители и дозаторы для опустошения или наполнения содерж. жидкость предметов", + + "create.ponder.flywheel.header": "Генерации силы вращения Маховиком", + "create.ponder.flywheel.text_1": "Маховики необходимы для генерации силы вращения при помощи Печных двигателей", + "create.ponder.flywheel.text_2": "Отдаваемая сила вращения имеет очень значительную устойчивость к нагрузкам", + "create.ponder.flywheel.text_3": "Использование Плавильной печи удвоит эффективность двигателя", + + "create.ponder.funnel_compat.header": "Совместимости Воронок", + "create.ponder.funnel_compat.text_1": "Воронки должны хорошо взаимодействовать с многими компонентами:", + "create.ponder.funnel_compat.text_2": "Вертикальные пилы", + "create.ponder.funnel_compat.text_3": "Депо", + "create.ponder.funnel_compat.text_4": "Предметные осушители", + + "create.ponder.funnel_direction.header": "Направлении передачи", + "create.ponder.funnel_direction.text_1": "Поставленная обычным образом, она забирает предметы из инвентаря", + "create.ponder.funnel_direction.text_2": "Поставленная крадучись, она кладёт предметы в инвентарь", + "create.ponder.funnel_direction.text_3": "Используя Ключ, вы можете изменить направление воронки", + "create.ponder.funnel_direction.text_4": "Те же правила применяются для большинства направлений", + "create.ponder.funnel_direction.text_5": "Воронки на конвейерах будут извлекать/вводить предметы в зависимости от направления их движения", + + "create.ponder.funnel_intro.header": "Использовании Воронок", + "create.ponder.funnel_intro.text_1": "Воронки идеально подходят для перемещения предметов из и в инвентари", + + "create.ponder.funnel_redstone.header": "Редстоун управлении", + "create.ponder.funnel_redstone.text_1": "Редстоун сигнал не даст любой воронке работать", + + "create.ponder.funnel_transfer.header": "Передаче напрямую", + "create.ponder.funnel_transfer.text_1": "Воронки не могут перемещать предметы напрямую между закрытыми инвентарями", + "create.ponder.funnel_transfer.text_2": "Желоба или Умные желоба могут лучше подходить для этих целей", + "create.ponder.funnel_transfer.text_3": "То же касается и горизонтального перемещения. Механический ремень должен здесь помочь", + + "create.ponder.furnace_engine.header": "Генерации силы вращения Печными двигателями", + "create.ponder.furnace_engine.text_1": "Печные двигатели создают силу вращения пока присоединённая к ним печь работает", + "create.ponder.furnace_engine.text_2": "Создаваемая сила вращения имеет очень высокую устойчивость к нагрузкам", + "create.ponder.furnace_engine.text_3": "Использование Плавильной печи удвоит эффективность Двигателя", + + "create.ponder.gantry_carriage.header": "Использовании шасси портального крана", + "create.ponder.gantry_carriage.text_1": "Шасси портального крана могут прикрепляться и двигаться вдоль Вала портального крана", + "create.ponder.gantry_carriage.text_2": "Крановые установки могут двигать присоединённые Блоки", + + "create.ponder.gantry_cascaded.header": "Многоступенчатом портальном кране", + "create.ponder.gantry_cascaded.text_1": "Валы портального крана прикрепляются к шасси без нужды в супер-клее", + "create.ponder.gantry_cascaded.text_2": "То же относится и к шасси на движущихся Валах портального крана", + "create.ponder.gantry_cascaded.text_3": "Таким образом крановая система может покрывать несколько осей движения", + + "create.ponder.gantry_direction.header": "Направлении движения крана", + "create.ponder.gantry_direction.text_1": "Валы портального крана могут иметь два противоположных направления", + "create.ponder.gantry_direction.text_2": "Направление движения шасси зависит от ориентации их валов", + "create.ponder.gantry_direction.text_3": "...а также от направления вращения вала", + "create.ponder.gantry_direction.text_4": "Те же правила относятся к передаваемому вращению", + + "create.ponder.gantry_redstone.header": "Подаче энергии на кран", + "create.ponder.gantry_redstone.text_1": "Активированные редстоуном валы крана перестают двигать шасси", + "create.ponder.gantry_redstone.text_2": "Вместо этого сила вращения передаётся выходному валу шасси", + + "create.ponder.gantry_shaft.header": "Использовании валов портального крана", + "create.ponder.gantry_shaft.text_1": "Валы портального крана составляют основу крановой установки. По ним будут двигаться присоединённые шасси", + "create.ponder.gantry_shaft.text_2": "Крановые установки могут двигать присоединённые Блоки", + + "create.ponder.gearbox.header": "Передаче силы вращения с помощью Коробок передач", + "create.ponder.gearbox.text_1": "Переходы между осями вращения могут быстро стать громоздкими", + "create.ponder.gearbox.text_2": "Коробка Передач - это более компактный эквивалент этой установки", + "create.ponder.gearbox.text_3": "Валы по углам поворачиваются в зеркальных направлениях", + "create.ponder.gearbox.text_4": "Прямые соединения будут реверсированы", + + "create.ponder.gearshift.header": "Управлении силой вращения при помощи Реверсивного механизма", + "create.ponder.gearshift.text_1": "Реверсивные механизмы передают вращение по прямой", + "create.ponder.gearshift.text_2": "При активации редстоуном, они реверсируют передачу", + + "create.ponder.hand_crank.header": "Генерации силы вращения при помощи Рукояток", + "create.ponder.hand_crank.text_1": "Рукоятки могут быть использованы игроками для приложения силы вращения вручную", + "create.ponder.hand_crank.text_2": "Держите ПКМ, чтобы повернуть их против Часовой стрелки", + "create.ponder.hand_crank.text_3": "Их скорость вращения относительно высока", + "create.ponder.hand_crank.text_4": "Держите ПКМ крадучись, чтобы повернуть её по Часовой стрелке", + + "create.ponder.hose_pulley.header": "Наполнении и осушении источников с помощью Шкива со шлангом", + "create.ponder.hose_pulley.text_1": "Шкивы со шлангом можно использовать для заполнения или осушения больших объёмов жидкости.", + "create.ponder.hose_pulley.text_2": "С помощью кинетической энергии можно регулировать длину шланга", + "create.ponder.hose_pulley.text_3": "Шкив сматывается, если обратить вращение", + "create.ponder.hose_pulley.text_4": "С противоположной стороны можно подключать трубы", + "create.ponder.hose_pulley.text_5": "Присоединённые сети труб могут либо подавать жидкость в шланг...", + "create.ponder.hose_pulley.text_6": "...либо вытягивать её, осушая водоем", + "create.ponder.hose_pulley.text_7": "Скорость заполнения и осушения шкивом полностью зависит от пропускной способности жидкостной сети", + + "create.ponder.hose_pulley_infinite.header": "Пассивном заполнении и осушении больших объёмов жидкости", + "create.ponder.hose_pulley_infinite.text_1": "При развертывании Шкива со шлангом в достаточно большой океан...", + "create.ponder.hose_pulley_infinite.text_2": "Он будет предоставлять/поглощать жидкости без влияния на источник", + "create.ponder.hose_pulley_infinite.text_3": "Сети труб могут неограниченно передавать жидкости из/в такие шкивы", + + "create.ponder.hose_pulley_level.header": "Уровне заполнения и осушения Шкива со шлангом", + "create.ponder.hose_pulley_level.text_1": "При полностью убранном рукаве шланга - он не может работать", + "create.ponder.hose_pulley_level.text_2": "Осушение происходит сверху вниз", + "create.ponder.hose_pulley_level.text_3": "Уровень поверхности окажется чуть ниже того места, где заканчивается шланг", + "create.ponder.hose_pulley_level.text_4": "Наполнение происходит снизу вверх", + "create.ponder.hose_pulley_level.text_5": "Заполняемый бассейн не будет наполняться выше уровня конца шланга", + + "create.ponder.item_drain.header": "Опустошении жидкостных резервуаров с помощью предметных осушителей", + "create.ponder.item_drain.text_1": "Предметные осушители могут извлекать жидкости из предметов", + "create.ponder.item_drain.text_2": "Щелкните ПКМ по нему, чтобы перелить в него жидкость из предмета в ваших руках", + "create.ponder.item_drain.text_3": "Когда предметы подаются со стороны...", + "create.ponder.item_drain.text_4": "...они переворачиваются, выливая содержащуюся в них жидкость", + "create.ponder.item_drain.text_5": "Сети труб теперь могут вытягивать жидкость из внутреннего хранилища осушителей", + + "create.ponder.large_cogwheel.header": "Передаче силы вращения при помощи Больших шестерней", + "create.ponder.large_cogwheel.text_1": "Большие шестерни могут соединяться между собой под прямым углом", + "create.ponder.large_cogwheel.text_2": "Это поможет передавать скорость на другие оси вращения", + + "create.ponder.linear_chassis_attachment.header": "Прикреплении блоков при помощи Линейных шасси", + "create.ponder.linear_chassis_attachment.text_1": "Открытые грани Линейных шасси можно сделать Липкими", + "create.ponder.linear_chassis_attachment.text_2": "Кликните ещё раз, чтобы сделать противоположную сторону липкой", + "create.ponder.linear_chassis_attachment.text_3": "ПКМ крадучись, пустой рукой, чтобы убрать слизь", + "create.ponder.linear_chassis_attachment.text_4": "Липкие грани Линейных шасси будут прикреплять ряд блоков перед ним", + "create.ponder.linear_chassis_attachment.text_5": "Используйте Ключ, чтобы настроить радиус для этого шасси", + "create.ponder.linear_chassis_attachment.text_6": "Прокрутка при Удерживании CTRL настраивает радиус всех присоединённых шасси", + "create.ponder.linear_chassis_attachment.text_7": "Прикрепление блоков на другие стороны требует использования Супер-клея", + "create.ponder.linear_chassis_attachment.text_8": "При помощи этих механик, структуры любой формы могут двигаться как Штуковина", + + "create.ponder.linear_chassis_group.header": "Движении Линейных шасси группами", + "create.ponder.linear_chassis_group.text_1": "Линейные шасси соединяются с такими же блоками Шасси рядом с ними", + "create.ponder.linear_chassis_group.text_2": "Когда один блок перемещается Штуковиной, другие двигаются с ним", + "create.ponder.linear_chassis_group.text_3": "Шасси других типов или направленные в другом направлении не будут прикрепляться", + + "create.ponder.mechanical_arm.header": "Настройке Механических рук", + "create.ponder.mechanical_arm.text_1": "Входы и выходы для Механических рук должны быть назначены перед их установкой", + "create.ponder.mechanical_arm.text_2": "ПКМ по инвентарям, держа руку, чтобы назначить их целями", + "create.ponder.mechanical_arm.text_3": "ПКМ ещё раз, для переключения между Входом (Синий) и Выходом (Оранжевый)", + "create.ponder.mechanical_arm.text_4": "ЛКМ по компонентам, чтобы убрать выделение с них", + "create.ponder.mechanical_arm.text_5": "После установки, Механические руки будут нацелены на ранее выбранные блоки", + "create.ponder.mechanical_arm.text_6": "У них может быть неограниченное кол-во входов и выходов в зоне их досягаемости", + "create.ponder.mechanical_arm.text_7": "Однако, не каждый вид Инвентаря может взаимодействовать с ними напрямую", + "create.ponder.mechanical_arm.text_8": "Воронки и Депо могут помочь заполнить этот пробел", + + "create.ponder.mechanical_arm_filtering.header": "Фильтрации выходов Механической руки", + "create.ponder.mechanical_arm_filtering.text_1": "Входы", + "create.ponder.mechanical_arm_filtering.text_2": "Выходы", + "create.ponder.mechanical_arm_filtering.text_3": "Иногда желательно ограничить цели руки фильтром", + "create.ponder.mechanical_arm_filtering.text_4": "Сами Механические руки не имеют возможности фильтрации", + "create.ponder.mechanical_arm_filtering.text_5": "Однако, Латунные воронки как цели сообщают свой фильтр руке", + "create.ponder.mechanical_arm_filtering.text_6": "Рука достаточно умна, чтобы не подбирать предметы, которые она не сможет распределить", + + "create.ponder.mechanical_arm_modes.header": "Режимах распределения Механической руки", + "create.ponder.mechanical_arm_modes.text_1": "Входы", + "create.ponder.mechanical_arm_modes.text_2": "Выходы", + "create.ponder.mechanical_arm_modes.text_3": "Когда рука выбирает между несколькими доступными выходами...", + "create.ponder.mechanical_arm_modes.text_4": "...она сделает выбор исходя из своей настройки", + "create.ponder.mechanical_arm_modes.text_5": "Прокрутка с Ключом позволит вам настроить это", + "create.ponder.mechanical_arm_modes.text_6": "Режим «по Кругу» переключается между всеми доступными выходами по очереди", + "create.ponder.mechanical_arm_modes.text_7": "Если выход не может принять больше предметов, он будет пропущен", + "create.ponder.mechanical_arm_modes.text_8": "«Принудительно по кругу» никогда не пропускает выходы, а ждёт пока они не освободятся", + "create.ponder.mechanical_arm_modes.text_9": "«Предпочитать первичную цель» приоритизирует выходы, выбранные ранее при настройке этой Руки", + + "create.ponder.mechanical_arm_redstone.header": "Управлении Механическими руками редстоуном", + "create.ponder.mechanical_arm_redstone.text_1": "При активации редстоуном, Механические руки перестают работать", + "create.ponder.mechanical_arm_redstone.text_2": "Перед остановкой, они завершат все начатые действия", + "create.ponder.mechanical_arm_redstone.text_3": "Таким образом, инвертированный импульс может использоваться для вызова ровно одного срабатывания", + + "create.ponder.mechanical_bearing.header": "Передвижении структур при помощи Механического подшипника", + "create.ponder.mechanical_bearing.text_1": "Механические подшипники прикрепляют блоки перед ними", + "create.ponder.mechanical_bearing.text_2": "При получении силы вращения, они соберутся во Вращающуюся штуковину", + + "create.ponder.mechanical_crafter.header": "Настройке Механических крафтеров", + "create.ponder.mechanical_crafter.text_1": "Массив из Механических крафтеров можно использовать для автоматизации создания любого рецепта", + "create.ponder.mechanical_crafter.text_2": "Можно настроить пути крафтеров при помощи Ключа", + "create.ponder.mechanical_crafter.text_3": "Для правильной установки все пути должны сходиться в один выход с любой стороны", + "create.ponder.mechanical_crafter.text_4": "Продукты будут помещены в инвентарь у выхода", + "create.ponder.mechanical_crafter.text_5": "Механическим крафтерам нужна сила вращения для работы", + "create.ponder.mechanical_crafter.text_6": "ПКМ спереди, чтобы вставить предметы вручную", + "create.ponder.mechanical_crafter.text_7": "Когда каждый слот на пути содержит предмет, процесс создания начнётся", + "create.ponder.mechanical_crafter.text_8": "Для рецептов, не полностью занимающих крафтер-установку, старт можно спровоцировать Редстоун импульсом", + + "create.ponder.mechanical_crafter_connect.header": "Объединении инвентарей Механических крафтеров", + "create.ponder.mechanical_crafter_connect.text_1": "Предметы можно поместить в крафтеры автоматически", + "create.ponder.mechanical_crafter_connect.text_2": "При помощи ключа сзади крафтеров, их инвентари можно объединить", + "create.ponder.mechanical_crafter_connect.text_3": "Все соединённые крафтеры теперь будут доступны из одного места ввода", + + "create.ponder.mechanical_crafter_covers.header": "Закрытии слотов Механических крафтеров", + "create.ponder.mechanical_crafter_covers.text_1": "Некоторые рецепты требуют дополнительных крафтеров, чтобы закрыть пробелы на пути", + "create.ponder.mechanical_crafter_covers.text_2": "При помощи Крышек на слоты, крафтеры могут играть роль пустых слотов в схеме", + "create.ponder.mechanical_crafter_covers.text_3": "Общие входы созданные ключом сзади также могут быть доступны через закрытые крафтеры", + + "create.ponder.mechanical_drill.header": "Ломании блоков Механической Дрелью", + "create.ponder.mechanical_drill.text_1": "При подаче вращения, Механическая дрель будет ломать блоки перед ней", + "create.ponder.mechanical_drill.text_2": "Скорость добычи зависит от подаваемой скорости", + + "create.ponder.mechanical_drill_contraption.header": "Использовании Механических дрелей на штуковинах", + "create.ponder.mechanical_drill_contraption.text_1": "Когда дрели движутся как часть движимой штуковины...", + "create.ponder.mechanical_drill_contraption.text_2": "...они будут ломать блоки, на которые они натыкаются", + + "create.ponder.mechanical_harvester.header": "Использование Механических комбайнов на штуковинах", + "create.ponder.mechanical_harvester.text_1": "Когда комбайны движутся как часть движимой штуковины...", + "create.ponder.mechanical_harvester.text_2": "Они будут убирать зрелый урожай на своём пути и высаживать его снова", + + "create.ponder.mechanical_mixer.header": "Обработке предметов Механическим миксером", + "create.ponder.mechanical_mixer.text_1": "При помощи Миксера и Чаши можно автоматизировать некоторые рецепты крафта", + "create.ponder.mechanical_mixer.text_2": "Доступные рецепты включают любые бесформенные рецепты крафта плюс ещё немного", + "create.ponder.mechanical_mixer.text_3": "Некоторые из них требуют тепло от Горелки всполоха", + "create.ponder.mechanical_mixer.text_4": "Слот для фильтра можно использовать в случае конфликта двух рецептов", + + "create.ponder.mechanical_piston.header": "Перемещении структур при помощи Механических поршней", + "create.ponder.mechanical_piston.text_1": "Механические поршни могут двигать блоки перед ними", + "create.ponder.mechanical_piston.text_2": "Скорость и Направление движения зависят от исходного вращения", + "create.ponder.mechanical_piston.text_3": "Липкие Механические поршни могут тянуть назад присоединённые блоки", + + "create.ponder.mechanical_piston_modes.header": "Режимах движения Механического поршня", + "create.ponder.mechanical_piston_modes.text_1": "Когда поршень останавливается, сдвинутая структура обратно становится блоками", + "create.ponder.mechanical_piston_modes.text_2": "Можно настроить его так, чтобы структура никогда не становилась блоками или только на начальной позиции", + + "create.ponder.mechanical_plough.header": "Использование Механических плугов на штуковинах", + "create.ponder.mechanical_plough.text_1": "Когда плуги движутся как часть движимой штуковины...", + "create.ponder.mechanical_plough.text_2": "...они будут ломать блоки без твёрдого хитбокса", + "create.ponder.mechanical_plough.text_3": "К тому же, плуги могут создавать пашню", + "create.ponder.mechanical_plough.text_4": "...они также могут толкать сущностей не причиняя им вреда", + + "create.ponder.mechanical_press.header": "Обработке предметов Механическим прессом", + "create.ponder.mechanical_press.text_1": "Механический пресс может обрабатывать предметы под собой", + "create.ponder.mechanical_press.text_2": "Подаваемые предметы должны быть брошены или помещены на Депо под Прессом", + "create.ponder.mechanical_press.text_3": "Когда предметы подаются на конвейере...", + "create.ponder.mechanical_press.text_4": "Пресс будет задерживать и обрабатывать их автоматически", + + "create.ponder.mechanical_press_compacting.header": "Упаковке предметов Механическим прессом", + "create.ponder.mechanical_press_compacting.text_1": "Спрессовывание предметов в Чаше упакует их", + "create.ponder.mechanical_press_compacting.text_2": "Упаковка включает любые заполненные 2x2 или 3x3 рецепты крафта плюс ещё немного", + "create.ponder.mechanical_press_compacting.text_3": "Некоторым рецептам может потребоваться тепло от Горелки всполоха", + "create.ponder.mechanical_press_compacting.text_4": "Слот для фильтра можно использовать в случае конфликта двух рецептов", + + "create.ponder.mechanical_pump_flow.header": "Транспортировке жидкости при помощи Механических помп", + "create.ponder.mechanical_pump_flow.text_1": "Механические помпы направляют поток в присоединённые сети из труб", + "create.ponder.mechanical_pump_flow.text_2": "Когда работает, стрелка указывает направление потока", + "create.ponder.mechanical_pump_flow.text_3": "Часть сети сзади теперь качает жидкости...", + "create.ponder.mechanical_pump_flow.text_4": "...в то время как часть сети спереди передаёт их наружу", + "create.ponder.mechanical_pump_flow.text_5": "Смена направления вращения изменяет направление потока", + "create.ponder.mechanical_pump_flow.text_6": "Используйте гаечный ключ, чтобы изменить направление помпы вручную", + + "create.ponder.mechanical_pump_speed.header": "Производительности механических помп", + "create.ponder.mechanical_pump_speed.text_1": "Независимо от скорости, Механические помпы оказывают влияние на трубы в радиусе 16 блоков", + "create.ponder.mechanical_pump_speed.text_2": "Ускорение подаваемого вращения изменяет скорость распространения потоков...", + "create.ponder.mechanical_pump_speed.text_3": "...также, как и скорость передачи жидкостей", + "create.ponder.mechanical_pump_speed.text_4": "Помпы могут объединять свою производительность в общих сетях труб", + "create.ponder.mechanical_pump_speed.text_5": "Изменение их направления может помочь сонаправить направление их потоков", + + "create.ponder.mechanical_saw_breaker.header": "Резке деревьев Механической пилой", + "create.ponder.mechanical_saw_breaker.text_1": "При подаче вращения, Механическая пила будет пилить деревья прямо перед ней", + "create.ponder.mechanical_saw_breaker.text_2": "Для спиливания дерева полностью пила должна ломать последний блок дерева, соединённый с землёй", + + "create.ponder.mechanical_saw_contraption.header": "Использовании Механических пил на штуковинах", + "create.ponder.mechanical_saw_contraption.text_1": "Когда пилы движутся как часть движимой штуковины...", + "create.ponder.mechanical_saw_contraption.text_2": "...они будут ломать блоки, на которые они натыкаются", + + "create.ponder.mechanical_saw_processing.header": "Обработке предметов на Механической пиле", + "create.ponder.mechanical_saw_processing.text_1": "Направленные вверх Механические пилы могут обрабатывать множество предметов", + "create.ponder.mechanical_saw_processing.text_2": "Обработанные предметы всегда движутся против подаваемого на пилу вращения", + "create.ponder.mechanical_saw_processing.text_3": "Пилы могут работать с Механическими ремнями (конвейером)", + "create.ponder.mechanical_saw_processing.text_4": "Когда из ингредиента можно получить несколько результатов, фильтр может уточнить его", + "create.ponder.mechanical_saw_processing.text_5": "Без фильтра пила будет выбирать все возможные результаты по очереди", + + "create.ponder.millstone.header": "Обработке предметов в Жерновах", + "create.ponder.millstone.text_1": "Жернова обрабатывают предметы перемалывая их", + "create.ponder.millstone.text_2": "Их можно запустить при помощи шестерней с любой стороны", + "create.ponder.millstone.text_3": "Бросьте или внесите предметы сверху", + "create.ponder.millstone.text_4": "После некоторого времени результат можно забрать при помощи ПКМ", + "create.ponder.millstone.text_5": "Продукты также можно вывести автоматически", + + "create.ponder.nixie_tube.header": "Использовании Газоразрядных индикаторов", + "create.ponder.nixie_tube.text_1": "При подаче редстоун сигнала, Газоразрядные индикаторы отобразят его силу.", + "create.ponder.nixie_tube.text_2": "С помощью бирок, отредактированных на наковальне, вы можете отобразить любой текст.", + "create.ponder.nixie_tube.text_3": "Щелкните ПКМ с красителем, чтобы изменить цвет их дисплея", + + "create.ponder.piston_pole.header": "Удлинителях Поршня", + "create.ponder.piston_pole.text_1": "Без присоединённых Удлинителей, Механический поршень не может двигаться", + "create.ponder.piston_pole.text_2": "Длина стержня, добавленного к его задней части, определяет Диапазон выдвижения.", + + "create.ponder.portable_fluid_interface.header": "Портативном жидкостном интерфейсе на штуковинах", + "create.ponder.portable_fluid_interface.text_1": "Жидкостные баки на движущихся штуковинах не могут быть доступны ни каким трубам", + "create.ponder.portable_fluid_interface.text_2": "Этот интерфейс может взаимодействовать с жидкостными баками без необходимости останавливать штуковину", + "create.ponder.portable_fluid_interface.text_3": "Установите второй с промежутком в 1 или 2 блока между ними", + "create.ponder.portable_fluid_interface.text_4": "Они установят соединение, когда встретятся", + "create.ponder.portable_fluid_interface.text_5": "Пока они соединены, стационарный интерфейс будет представлять собой ВСЕ баки на штуковине", + "create.ponder.portable_fluid_interface.text_6": "Теперь можно закачать жидкости...", + "create.ponder.portable_fluid_interface.text_7": "...или выкачать их из штуковины", + "create.ponder.portable_fluid_interface.text_8": "Если на какое-то время прекратится обмен содержимым - штуковина продолжит свой путь", + + "create.ponder.portable_storage_interface.header": "Портативном интерфейсе хранения на штуковинах", + "create.ponder.portable_storage_interface.text_1": "Инвентари на двигающихся штуковинах не могут быть открыты игроками", + "create.ponder.portable_storage_interface.text_2": "Этот компонент может взаимодействовать с хранилищем без необходимости останавливать штуковину", + "create.ponder.portable_storage_interface.text_3": "Установите второй с промежутком в 1 или 2 блока между ними", + "create.ponder.portable_storage_interface.text_4": "Когда они проходят мимо друг друга, они соединятся", + "create.ponder.portable_storage_interface.text_5": "Пока они соединены, стационарный интерфейс будет представлять собой ВСЕ инвентари на штуковине", + "create.ponder.portable_storage_interface.text_6": "Теперь можно положить предметы...", + "create.ponder.portable_storage_interface.text_7": "...или вывести их из штуковины", + "create.ponder.portable_storage_interface.text_8": "Если на какое-то время прекратится обмен предметами - штуковина продолжит свой путь", + + "create.ponder.portable_storage_interface_redstone.header": "Управлении редстоуном", + "create.ponder.portable_storage_interface_redstone.text_1": "Редстоун сигнал предотвратит включение стационарного интерфейса", + + "create.ponder.powered_latch.header": "Управлении сигналами при помощи Питаемого рычага", + "create.ponder.powered_latch.text_1": "Питаемый рычаг - управляемый редстоуном рычаг", + "create.ponder.powered_latch.text_2": "Сигнал сзади включает его", + "create.ponder.powered_latch.text_3": "Сигналы сбоку обратно выключают его", + "create.ponder.powered_latch.text_4": "Питаемые рычаги можно переключать и вручную", + + "create.ponder.powered_toggle_latch.header": "Управлении сигналами при помощи Питаемого рычаг-переключателя", + "create.ponder.powered_toggle_latch.text_1": "Питаемый рычаг-переключатель - управляемый редстоуном рычаг", + "create.ponder.powered_toggle_latch.text_2": "Сигналы сзади переключают его состояние", + "create.ponder.powered_toggle_latch.text_3": "...включают и снова выключают", + "create.ponder.powered_toggle_latch.text_4": "Питаемые рычаги-переключатели также можно переключать вручную", + + "create.ponder.pulse_repeater.header": "Управлении сигналами при помощи Импульсных повторителей", + "create.ponder.pulse_repeater.text_1": "Импульсные повторители укоротят любой редстуон сигнал до одного импульса.", + + "create.ponder.radial_chassis.header": "Присоединении блоков при помощи Радиальных шасси", + "create.ponder.radial_chassis.text_1": "Радиальное шасси соединяются с идентичными блоками шасси в ряд", + "create.ponder.radial_chassis.text_2": "Когда один блок перемещается штуковиной, остальные двигаются с ним", + "create.ponder.radial_chassis.text_3": "Боковые грани Радиального шасси можно сделать липкими", + "create.ponder.radial_chassis.text_4": "Кликните ещё раз, чтобы сделать все остальные грани липкими", + "create.ponder.radial_chassis.text_5": "ПКМ пустой рукой крадучись, чтобы убрать слизь", + "create.ponder.radial_chassis.text_6": "Когда блок находится рядом с липкой гранью...", + "create.ponder.radial_chassis.text_7": "он присоединит все достижимые блоки в пределах радиуса на этом слое", + "create.ponder.radial_chassis.text_8": "При помощи ключа можно указать точный радиус для этого шасси", + "create.ponder.radial_chassis.text_9": "Блоки не достижимые ни одной липкой гранью не прикрепятся", + + "create.ponder.redstone_contact.header": "Контактах редстоун сигнала", + "create.ponder.redstone_contact.text_1": "Контакты редстоун сигнала направленные друг на друга будут излучать редстоун сигнал", + "create.ponder.redstone_contact.text_2": "Также применимо, когда один из них - часть двигающейся штуковины", + + "create.ponder.redstone_link.header": "Использовании Беспроводного передатчика редстоун сигнала", + "create.ponder.redstone_link.text_1": "Беспроводные передатчики редстоун сигнала могут передавать редстоун сигнал без проводов", + "create.ponder.redstone_link.text_2": "ПКМ крадучись, чтобы переключить режим приёмника", + "create.ponder.redstone_link.text_3": "ПКМ ключом сделает то же самое", + "create.ponder.redstone_link.text_4": "Приёмники испускают редстоун сигнал передатчиков в 128 блоках", + "create.ponder.redstone_link.text_5": "Положите предметы в два слота, чтобы указать частоту", + "create.ponder.redstone_link.text_6": "Передатчики только одной частоты могут сообщаться", + + "create.ponder.rope_pulley.header": "Перемещении структур при помощи Лебёдки", + "create.ponder.rope_pulley.text_1": "Лебёдки могут двигать блоки вертикально при подаче вращения", + "create.ponder.rope_pulley.text_2": "Направление и скорость движения зависят от исходного вращения", + + "create.ponder.rope_pulley_attachment.header": "Перемещении Лебёдок как частей штуковины", + "create.ponder.rope_pulley_attachment.text_1": "Когда лебёдки перемещаются штуковиной...", + "create.ponder.rope_pulley_attachment.text_2": "...их присоединённая структура движется с ними", + "create.ponder.rope_pulley_attachment.text_3": "Учитывайте, что лебёдки можно двигать только пока они простаивают", + + "create.ponder.rope_pulley_modes.header": "Режимах движения Лебёдки", + "create.ponder.rope_pulley_modes.text_1": "Когда лебёдка останавливается, сдвинутая структура обратно становится блоками", + "create.ponder.rope_pulley_modes.text_2": "Можно настроить её так, чтобы структура никогда не становилась блоками или только на начальной позиции", + + "create.ponder.rotation_speed_controller.header": "Использовании Регулятора скорости вращения", + "create.ponder.rotation_speed_controller.text_1": "Регуляторы ск. вращения передают вращение от своих осей на Большую шестерню выше них", + "create.ponder.rotation_speed_controller.text_2": "Можно настроить передаваемую скорость при помощи прокрутки по соответствующему месту сбоку", + + "create.ponder.sail.header": "Сборке Мельниц при помощи Парусов", + "create.ponder.sail.text_1": "Паруса - удобные блоки для создания мельниц", + "create.ponder.sail.text_2": "Они будут прикрепляться к блокам и друг к другу без использования суперклея или блоков шасси", + "create.ponder.sail.text_3": "ПКМ красителем, чтобы покрасить их", + "create.ponder.sail.text_4": "ПКМ ножницами, чтобы превратить их снова в раму", + + "create.ponder.sail_frame.header": "Сборке Мельниц при помощи Рам парусов", + "create.ponder.sail_frame.text_1": "Рамы парусов - удобные блоки для создания мельниц", + "create.ponder.sail_frame.text_2": "Они будут прикрепляться к блокам и друг к другу без использования суперклея или блоков шасси", + + "create.ponder.sequenced_gearshift.header": "Управлении скоростью вращения при помощи Последовательного переключателя передач", + "create.ponder.sequenced_gearshift.text_1": "Посл. перекл. передач передают вращение следуя временному списку инструкций", + "create.ponder.sequenced_gearshift.text_2": "ПКМ, чтобы отрыть интерфейс настройки", + "create.ponder.sequenced_gearshift.text_3": "При получении Редстоун сигнала, он начнёт выполнять заданные инструкции", + "create.ponder.sequenced_gearshift.text_4": "По завершению он будет дожидаться следующего Редстоун сигнала и начнёт сначала", + "create.ponder.sequenced_gearshift.text_5": "Редстоун компаратор можно использовать для считывания текущего прогресса", + + "create.ponder.shaft.header": "Передаче вращения при помощи Валов", + "create.ponder.shaft.text_1": "Валы передают вращение по прямой", + + "create.ponder.shaft_casing.header": "Обрамлении Валов", + "create.ponder.shaft_casing.text_1": "Латунный или андезитовый корпус можно использовать для декорации Валов", + + "create.ponder.smart_chute.header": "Фильтрации предметов при помощи Умных желобов", + "create.ponder.smart_chute.text_1": "Умные желоба - вертикальные желоба с дополнительным контролем", + "create.ponder.smart_chute.text_2": "Предметы в слоте фильтра уточняют, что они могут забирать и передавать", + "create.ponder.smart_chute.text_3": "Используйте Колесо Мыши для уточнения размера забираемого стака", + "create.ponder.smart_chute.text_4": "Редстоун сигнал выключает их", + + "create.ponder.smart_pipe.header": "Управлении жидкостным потоком с помощью Умных труб", + "create.ponder.smart_pipe.text_1": "Умные трубы могут помочь управлять потоками по типам жидкостей", + "create.ponder.smart_pipe.text_2": "Размещенные непосредственно у источника, они могут указывать тип извлекаемой жидкости", + "create.ponder.smart_pipe.text_3": "Просто щелкните ПКМ на слоте фильтра с любым предметом, содержащим нужную жидкость", + "create.ponder.smart_pipe.text_4": "И при размещении глубже по сети труб умные трубы будут пропускать только подходящие жидкости.", + + "create.ponder.speedometer.header": "Мониторинге Кинетической информации при помощи Спидометра", + "create.ponder.speedometer.text_1": "Спидометры отображают текущую скорость присоединённых компонентов", + "create.ponder.speedometer.text_2": "При ношении Инженерных очков игрок может получить более полную информацию от прибора", + "create.ponder.speedometer.text_3": "Компараторы могут испускать аналоговый Редстоун сигнал относительно измерений спидометра", + + "create.ponder.spout_filling.header": "Наполнении предметов при помощи дозатора", + "create.ponder.spout_filling.text_1": "Дозатор может заполнять подходящие предметы, расположенные под ним", + "create.ponder.spout_filling.text_2": "К содержимому дозатора невозможно получить доступ вручную.", + "create.ponder.spout_filling.text_3": "Вместо этого можно использовать трубы для подачи в него жидкостей", + "create.ponder.spout_filling.text_4": "Наполняемые предметы могут быть размещены на депо под дозатором", + "create.ponder.spout_filling.text_5": "Когда предметы подаются конвейером...", + "create.ponder.spout_filling.text_6": "Дозатор будет удерживать и обрабатывать их автоматически", + + "create.ponder.stabilized_bearings.header": "Стабилизации Штуковин", + "create.ponder.stabilized_bearings.text_1": "Когда Механические подшипники являются частью двигающейся структуры...", + "create.ponder.stabilized_bearings.text_2": "...они будут пытаться держаться ровно", + "create.ponder.stabilized_bearings.text_3": "Опять же, подшипники присоединяют блоки перед ними", + "create.ponder.stabilized_bearings.text_4": "И в результате целая под-структура будет держаться ровно", + + "create.ponder.sticker.header": "Прикреплении блоков при помощи Липучки", + "create.ponder.sticker.text_1": "Липучки идеально подходят для Редстоун-управляемого присоединения блоков", + "create.ponder.sticker.text_2": "При получении сигнала они переключают своё состояние", + "create.ponder.sticker.text_3": "Если он теперь движется в штуковине, то блок будет двигаться с ним", + "create.ponder.sticker.text_4": "При повторном переключении блок больше не будет прикреплён", + + "create.ponder.stressometer.header": "Мониторинге кинетической информации при помощи Стрессометра", + "create.ponder.stressometer.text_1": "Стрессометр отображает текущую допустимую нагрузку присоединённой кинетической сети", + "create.ponder.stressometer.text_2": "При ношении Инженерных очков игрок может получить более полную информацию от прибора", + "create.ponder.stressometer.text_3": "Компараторы могут испускать аналоговый редстоун сигнал относительно измерений стрессометра", + + "create.ponder.super_glue.header": "Присоединении блоков при помощи Супер-клея", + "create.ponder.super_glue.text_1": "Супер-клей можно использовать между двумя любыми блоками", + "create.ponder.super_glue.text_2": "Скреплённые блоки будут двигаться вместе при сборке в штуковну", + "create.ponder.super_glue.text_3": "Когда вы супер-клей во второй руке...", + "create.ponder.super_glue.text_4": "...добавленные блоки будут сразу приклеены к грани, на которую они были поставлены", + "create.ponder.super_glue.text_5": "Супер-клей можно удалить левым кликом", + + "create.ponder.valve_handle.header": "Генерации силы вращения при помощи Вентилей", + "create.ponder.valve_handle.text_1": "Игроки могут использовать вентили для применения силы вращения вручную", + "create.ponder.valve_handle.text_2": "Держите ПКМ для вращения его против Часовой стрелки", + "create.ponder.valve_handle.text_3": "Передаваемая ими скорость медленная и точная", + "create.ponder.valve_handle.text_4": "Держите ПКМ крадучись для вращения его по Часовой стрелке", + "create.ponder.valve_handle.text_5": "Вентили можно окрашивать в эстетических целях", + + "create.ponder.valve_pipe.header": "Управлении потоком жидкости с помощью вентилей", + "create.ponder.valve_pipe.text_1": "Жидкостные вентили помогают контролировать распространение жидкостей по сетям труб", + "create.ponder.valve_pipe.text_2": "Их входной вал контролирует, разрешена ли подача жидкости в данный момент", + "create.ponder.valve_pipe.text_3": "При вращении в направлении открытия - клапан откроется", + "create.ponder.valve_pipe.text_4": "Его можно снова закрыть, изменив направление входного вращения", + + "create.ponder.water_wheel.header": "Генерации силы вращения при помощи Водяных колёс", + "create.ponder.water_wheel.text_1": "Водяные колёса берут силу соседних потоков воды", + "create.ponder.water_wheel.text_2": "Чем больше сторон запитано, тем быстрее будет вращаться Водяное колесо", + "create.ponder.water_wheel.text_3": "Лопасти колеса должны быть направлены против течения", + "create.ponder.water_wheel.text_4": "Направленная в противоположную сторону, она не будет так же эффективна", + + "create.ponder.weighted_ejector.header": "Использовании Взвешенных катапульт", + "create.ponder.weighted_ejector.text_1": "ПКМ крадучись и держа катапульту, чтобы выбрать место цели", + "create.ponder.weighted_ejector.text_10": "Теперь она ограниченна этим размера стака и будет активироваться только тогда, когда удерживаемый стак достигнет этого количества", + "create.ponder.weighted_ejector.text_11": "Другие сущности, встав на катапульту, будут всегда активировать её", + "create.ponder.weighted_ejector.text_2": "Установленная катапульта будет запускать объекты до отмеченного места", + "create.ponder.weighted_ejector.text_3": "Подходящая цель может быть на любой дистанции и высоте в радиусе", + "create.ponder.weighted_ejector.text_4": "Однако они не могут быть сбоку", + "create.ponder.weighted_ejector.text_5": "Если не было выбрано подходящей цели, она будет целиться в блок перед ней", + "create.ponder.weighted_ejector.text_6": "Предоставьте силу вращения, чтобы зарядить её", + "create.ponder.weighted_ejector.text_7": "Установка предметов на катапульту вызывают её срабатывание", + "create.ponder.weighted_ejector.text_8": "Если инвентарь выбран целью, то катапульта будет ждать, пока в нём не появится место.", + "create.ponder.weighted_ejector.text_9": "При помощи ключа можно настроить необходимый размер стака", + + "create.ponder.weighted_ejector_redstone.header": "Управлении Взвешенными катапультами редстоуном", + "create.ponder.weighted_ejector_redstone.text_1": "При подаче редстоун сигнала катапульты не будут активироваться", + "create.ponder.weighted_ejector_redstone.text_2": "Кроме того, наблюдатели могут определить, когда катапульты срабатывают", + + "create.ponder.weighted_ejector_tunnel.header": "Разделении стаков предметов при помощи Взвешенных катапульт", + "create.ponder.weighted_ejector_tunnel.text_1": "Объединённые с Латунными туннелями, катапульты могут делить стаки предметов по определённому количеству", + "create.ponder.weighted_ejector_tunnel.text_2": "Сперва, настройте Латунный туннель на «Предпочтительно ближайшее», чтобы приоритизировать выход сбоку", + "create.ponder.weighted_ejector_tunnel.text_3": "Размер стака, установленный на катапульте, теперь определяет отделяемое количество", + "create.ponder.weighted_ejector_tunnel.text_4": "Пока новый стак нужного количества лежит на боковом выходе...", + "create.ponder.weighted_ejector_tunnel.text_5": "...остаток продолжит свой путь", + + "create.ponder.windmill_source.header": "Генерации силы вращения при помощи Подшипников ветряной мельницы", + "create.ponder.windmill_source.text_1": "Подшипники ветр. мельницы прикрепляются к блокам перед ними", + "create.ponder.windmill_source.text_2": "Если прикреплено достаточно парусоподобных блоков, он может стать мельницей", + "create.ponder.windmill_source.text_3": "Активированный при помощи ПКМ, Подшипник ветр. мельницы начнёт вырабатывать силу вращения", + "create.ponder.windmill_source.text_4": "Количество парусов определяет скорость вращения", + "create.ponder.windmill_source.text_5": "Используйте ключ, чтобы настроить направление вращения", + "create.ponder.windmill_source.text_6": "ПКМ по подшипнику в любое время, чтобы остановить его и отредактировать структуру", + + "create.ponder.windmill_structure.header": "Штуковинах Мельницах", + "create.ponder.windmill_structure.text_1": "Любая структура может считаться мельницей, пока она содержит как минимум 8 парусоподобных блоков", "_": "Thank you for translating Create!" diff --git a/src/main/resources/assets/create/lang/zh_cn.json b/src/main/resources/assets/create/lang/zh_cn.json index 342ee9146..ce3ae9214 100644 --- a/src/main/resources/assets/create/lang/zh_cn.json +++ b/src/main/resources/assets/create/lang/zh_cn.json @@ -28,10 +28,12 @@ "block.create.belt": "传送带", "block.create.birch_window": "白桦窗户", "block.create.birch_window_pane": "白桦窗户板", + "block.create.black_nixie_tube": "黑色辉光管", "block.create.black_sail": "黑色风帆", "block.create.black_seat": "黑色坐垫", "block.create.black_valve_handle": "黑色阀门手轮", "block.create.blaze_burner": "烈焰人燃烧室", + "block.create.blue_nixie_tube": "蓝色辉光管", "block.create.blue_sail": "蓝色风帆", "block.create.blue_seat": "蓝色坐垫", "block.create.blue_valve_handle": "蓝色阀门手轮", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "黄铜传动杆箱", "block.create.brass_funnel": "黄铜漏斗", "block.create.brass_tunnel": "黄铜隧道", + "block.create.brown_nixie_tube": "棕色辉光管", "block.create.brown_sail": "棕色风帆", "block.create.brown_seat": "棕色坐垫", "block.create.brown_valve_handle": "棕色阀门手轮", @@ -58,6 +61,7 @@ "block.create.cogwheel": "齿轮", "block.create.content_observer": "物品侦测器", "block.create.controller_rail": "控制铁轨", + "block.create.copper_backtank": "铜制背罐", "block.create.copper_block": "铜块", "block.create.copper_casing": "铜机壳", "block.create.copper_ore": "铜矿石", @@ -72,6 +76,7 @@ "block.create.crushing_wheel": "粉碎轮", "block.create.crushing_wheel_controller": "粉碎轮控制器", "block.create.cuckoo_clock": "布谷鸟闹钟", + "block.create.cyan_nixie_tube": "青色辉光管", "block.create.cyan_sail": "青色风帆", "block.create.cyan_seat": "青色坐垫", "block.create.cyan_valve_handle": "青色阀门手轮", @@ -178,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "花岗岩圆石楼梯", "block.create.granite_cobblestone_wall": "花岗岩圆石墙", "block.create.granite_pillar": "竖纹花岗岩", + "block.create.gray_nixie_tube": "灰色辉光管", "block.create.gray_sail": "灰色风帆", "block.create.gray_seat": "灰色坐垫", "block.create.gray_valve_handle": "灰色阀门手轮", + "block.create.green_nixie_tube": "绿色辉光管", "block.create.green_sail": "绿色风帆", "block.create.green_seat": "绿色坐垫", "block.create.green_valve_handle": "绿色阀门手轮", "block.create.hand_crank": "手摇曲柄", + "block.create.haunted_bell": "怪异钟", "block.create.honey": "蜂蜜", "block.create.horizontal_framed_glass": "竖直边框玻璃", "block.create.horizontal_framed_glass_pane": "竖直边框玻璃板", @@ -202,12 +210,16 @@ "block.create.layered_limestone": "层叠石灰岩", "block.create.layered_scoria": "层叠熔渣", "block.create.layered_weathered_limestone": "层叠风化石灰岩", + "block.create.lectern_controller": "遥控器讲台", + "block.create.light_blue_nixie_tube": "淡蓝色辉光管", "block.create.light_blue_sail": "淡蓝色风帆", "block.create.light_blue_seat": "淡蓝色坐垫", "block.create.light_blue_valve_handle": "淡蓝色阀门手轮", + "block.create.light_gray_nixie_tube": "淡灰色辉光管", "block.create.light_gray_sail": "淡灰色风帆", "block.create.light_gray_seat": "淡灰色坐垫", "block.create.light_gray_valve_handle": "淡灰色阀门手轮", + "block.create.lime_nixie_tube": "黄绿色辉光管", "block.create.lime_sail": "黄绿色风帆", "block.create.lime_seat": "黄绿色坐垫", "block.create.lime_valve_handle": "黄绿色阀门手轮", @@ -224,6 +236,7 @@ "block.create.limestone_pillar": "竖纹石灰岩", "block.create.linear_chassis": "机壳底盘", "block.create.lit_blaze_burner": "烈焰人燃烧室(已点燃)", + "block.create.magenta_nixie_tube": "品红色辉光管", "block.create.magenta_sail": "品红色风帆", "block.create.magenta_seat": "品红色坐垫", "block.create.magenta_valve_handle": "品红色阀门手轮", @@ -307,6 +320,8 @@ "block.create.paved_weathered_limestone_slab": "风化石灰岩铺路石台阶", "block.create.paved_weathered_limestone_stairs": "风化石灰岩铺路石楼梯", "block.create.paved_weathered_limestone_wall": "风化石灰岩铺路石墙", + "block.create.peculiar_bell": "奇异钟", + "block.create.pink_nixie_tube": "粉色辉光管", "block.create.pink_sail": "粉红色风帆", "block.create.pink_seat": "粉红色坐垫", "block.create.pink_valve_handle": "粉红色阀门手轮", @@ -341,10 +356,12 @@ "block.create.powered_toggle_latch": "转换锁存器", "block.create.pulley_magnet": "滑轮磁铁", "block.create.pulse_repeater": "脉冲中继器", + "block.create.purple_nixie_tube": "紫色辉光管", "block.create.purple_sail": "紫色风帆", "block.create.purple_seat": "紫色坐垫", "block.create.purple_valve_handle": "紫色阀门手轮", "block.create.radial_chassis": "旋转底盘", + "block.create.red_nixie_tube": "红色辉光管", "block.create.red_sail": "红色风帆", "block.create.red_seat": "红色坐垫", "block.create.red_valve_handle": "红色阀门手轮", @@ -401,25 +418,30 @@ "block.create.weathered_limestone_cobblestone_wall": "风化石灰岩圆石墙", "block.create.weathered_limestone_pillar": "竖纹风化石灰岩", "block.create.weighted_ejector": "弹射置物台", + "block.create.white_nixie_tube": "白色辉光管", "block.create.white_sail": "白色风帆", "block.create.white_seat": "白色坐垫", "block.create.white_valve_handle": "白色阀门手轮", "block.create.windmill_bearing": "风车轴承", "block.create.wooden_bracket": "木质支架", + "block.create.yellow_nixie_tube": "黄色辉光管", "block.create.yellow_sail": "黄色风帆", "block.create.yellow_seat": "黄色坐垫", "block.create.yellow_valve_handle": "黄色阀门手轮", "block.create.zinc_block": "锌块", "block.create.zinc_ore": "锌矿石", + "enchantment.create.capacity": "扩容", + "enchantment.create.potato_recovery": "土豆回收", + "entity.create.contraption": "装置", + "entity.create.crafting_blueprint": "合成蓝图", "entity.create.gantry_contraption": "起重机装置", + "entity.create.potato_projectile": "被发射的土豆", "entity.create.seat": "坐垫", "entity.create.stationary_contraption": "固定装置", "entity.create.super_glue": "强力胶", - "fluid.create.chocolate": "巧克力", - "fluid.create.honey": "蜂蜜", "fluid.create.milk": "牛奶", "fluid.create.potion": "药水", "fluid.create.tea": "茶", @@ -440,10 +462,13 @@ "item.create.chocolate_glazed_berries": "巧克力包层浆果", "item.create.chromatic_compound": "异彩化合物", "item.create.cinder_flour": "下界面粉", + "item.create.copper_backtank": "铜制背罐", "item.create.copper_ingot": "铜锭", "item.create.copper_nugget": "铜粒", "item.create.copper_sheet": "铜板", "item.create.crafter_slot_cover": "合成器盖板", + "item.create.crafting_blueprint": "合成蓝图", + "item.create.creative_cake": "创造烈焰蛋糕", "item.create.crushed_aluminum_ore": "粉碎铝矿石", "item.create.crushed_brass": "粉碎黄铜", "item.create.crushed_copper_ore": "粉碎铜矿石", @@ -458,7 +483,8 @@ "item.create.crushed_tin_ore": "粉碎锡矿石", "item.create.crushed_uranium_ore": "粉碎铀矿石", "item.create.crushed_zinc_ore": "粉碎锌矿石", - "item.create.deforester": "树林毁灭者", + "item.create.diving_boots": "潜水靴", + "item.create.diving_helmet": "潜水头盔", "item.create.dough": "面团", "item.create.electron_tube": "电子管", "item.create.empty_blaze_burner": "空的烈焰人燃烧室", @@ -468,17 +494,20 @@ "item.create.furnace_minecart_contraption": "装配过的动力矿车", "item.create.goggles": "工程师护目镜", "item.create.golden_sheet": "金板", - "item.create.handheld_blockzapper": "手持式方块放置器", "item.create.handheld_worldshaper": "手持式环境塑形器", "item.create.honey_bucket": "蜂蜜桶", "item.create.honeyed_apple": "蜜渍苹果", - "item.create.integrated_circuit": "集成电路板", + "item.create.incomplete_cogwheel": "齿轮(半成品)", + "item.create.incomplete_large_cogwheel": "大齿轮(半成品)", + "item.create.incomplete_precision_mechanism": "精密机构(半成品)", "item.create.iron_sheet": "铁板", - "item.create.lapis_sheet": "青金石板", + "item.create.linked_controller": "无线红石遥控器", "item.create.minecart_contraption": "装配过的矿车", "item.create.minecart_coupling": "矿车连轴器", "item.create.polished_rose_quartz": "磨制玫瑰石英", + "item.create.potato_cannon": "土豆加农炮", "item.create.powdered_obsidian": "黑曜石粉末", + "item.create.precision_mechanism": "精密机构", "item.create.propeller": "扇叶", "item.create.red_sand_paper": "红沙砂纸", "item.create.refined_radiance": "光辉石", @@ -623,8 +652,8 @@ "advancement.create.flywheel.desc": "将引擎成功连接到飞轮。", "advancement.create.overstress_flywheel": "高压", "advancement.create.overstress_flywheel.desc": "过载熔炉引擎。", - "advancement.create.integrated_circuit": "复杂运算", - "advancement.create.integrated_circuit.desc": "组装集成电路。", + "advancement.create.precision_mechanism": "高新技术", + "advancement.create.precision_mechanism.desc": "装配一个精密机构。", "advancement.create.mechanical_arm": "忙碌的手!", "advancement.create.mechanical_arm.desc": "制作机械臂,选择输入和输出,放置并给予它动力,然后看着它为你完成所有工作。", "advancement.create.musical_arm": "没人能在我的 BGM 里打败我!", @@ -647,16 +676,12 @@ "advancement.create.refined_radiance.desc": "制作一个光辉石", "advancement.create.chromatic_age": "异彩纪元", "advancement.create.chromatic_age.desc": "创造出光与影的机壳。", - "advancement.create.zapper": "讲究的建筑师", - "advancement.create.zapper.desc": "制作一个非常方便的手持方块放置器", - "advancement.create.upgraded_zapper": "来自异世界的超频", - "advancement.create.upgraded_zapper.desc": "制作一个完全升级的手持方块放置器", "advancement.create.wand_of_symmetry": "简单的镜面几何学", "advancement.create.wand_of_symmetry.desc": "制作一个对称之杖", - "advancement.create.deforester": "超时空砍伐", - "advancement.create.deforester.desc": "制作一个森林毁灭者,然后跟你后院的树林说再见吧", "advancement.create.extendo_grip": "biu biu biu!", "advancement.create.extendo_grip.desc": "获得一个伸缩机械手", + "advancement.create.potato_cannon": "Fwoomp!", + "advancement.create.potato_cannon.desc": "用土豆加农炮击杀一个生物。", "advancement.create.dual_extendo_grip": "biu——biu——biu——", "advancement.create.dual_extendo_grip.desc": "双持伸缩机械手,超人般的触碰距离。", "advancement.create.eob": "Beta 版结束", @@ -669,15 +694,31 @@ "itemGroup.create.palettes": "机械动力建筑方块", "death.attack.create.crush": "%1$s被压扁了", + "death.attack.create.crush.player": "%1$s被%2$s推进了粉碎机", "death.attack.create.fan_fire": "%1$s试图接受热风的洗礼", + "death.attack.create.fan_fire.player": "%2$s给了%1$s一次热风的洗礼", "death.attack.create.fan_lava": "%1$s在接受热风的洗礼中浴火焚身", + "death.attack.create.fan_lava.player": "%1$s被%2$s火化了", "death.attack.create.mechanical_drill": "%1$s被钻头钻的坏掉了", + "death.attack.create.mechanical_drill.player": "%1$s因为%2$s和钻头来了一次亲密接触", "death.attack.create.mechanical_saw": "%1$s被圆锯切成了两截", + "death.attack.create.mechanical_saw.player": "%1$s被%2$s按在圆锯上切碎了", + "death.attack.create.potato_cannon": "%1$s被%2$s的土豆糊了一脸", + "death.attack.create.potato_cannon.item": "%1$s被%2$s用%3$s射死了", "death.attack.create.cuckoo_clock_explosion": "%1$s被布谷鸟钟炸得粉身碎骨", + "death.attack.create.cuckoo_clock_explosion.player": "%1$s被布谷鸟钟炸得粉身碎骨", "create.block.deployer.damage_source_name": "二五仔机械手", "create.block.cart_assembler.invalid": "请将矿车装配器放置在铁轨上", + "create.menu.return": "返回上一级菜单", + "create.menu.configure": "配置...", + "create.menu.ponder_index": "思索内容清单", + "create.menu.only_ingame": "仅在游戏内暂停菜单中可用", + "create.menu.project_page": "在CurseForge上查看", + "create.menu.report_bugs": "报告Create的漏洞", + "create.menu.support": "支持我们", + "create.recipe.crushing": "粉碎", "create.recipe.milling": "研磨", "create.recipe.fan_washing": "批量洗涤", @@ -688,6 +729,7 @@ "create.recipe.fan_blasting.fan": "在熔岩后放置鼓风机", "create.recipe.pressing": "金属压片", "create.recipe.mixing": "混合搅拌", + "create.recipe.deploying": "自动使用", "create.recipe.automatic_shapeless": "自动搅拌", "create.recipe.automatic_brewing": "自动酿造", "create.recipe.packing": "压块塑形", @@ -697,12 +739,21 @@ "create.recipe.automatic_shaped": "自动合成", "create.recipe.block_cutting": "方块切割", "create.recipe.wood_cutting": "木材切割", - "create.recipe.blockzapper_upgrade": "手持式方块放置器", "create.recipe.sandpaper_polishing": "砂纸打磨", "create.recipe.mystery_conversion": "神秘转化", "create.recipe.spout_filling": "注液", "create.recipe.draining": "分液", - "create.recipe.processing.chance":"%1$s%%概率", + "create.recipe.sequenced_assembly": "流水线装配", + "create.recipe.assembly.next": "下一步:%1$s", + "create.recipe.assembly.step": "第%1$s步:", + "create.recipe.assembly.progress": "组装进度:%1$s/%2$s", + "create.recipe.assembly.pressing": "用辊压机辊压", + "create.recipe.assembly.spout_filling_fluid": "注入%1$s", + "create.recipe.assembly.deploying_item": "安装%1$s", + "create.recipe.assembly.cutting": "用动力锯切割", + "create.recipe.assembly.repeat": "该序列需要重复%1$s次", + "create.recipe.assembly.junk": "随机废料", + "create.recipe.processing.chance": "%1$s%%概率", "create.recipe.heat_requirement.none": "无需加热", "create.recipe.heat_requirement.heated": "加热", "create.recipe.heat_requirement.superheated": "超级加热", @@ -720,7 +771,7 @@ "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", - "create.generic.unit.millibuckets":"%1$smB", + "create.generic.unit.millibuckets": "%1$smB", "create.generic.clockwise": "顺时针方向", "create.generic.counter_clockwise": "逆时针方向", @@ -754,20 +805,16 @@ "create.orientation.alongZ": "以z轴对齐", "create.orientation.alongX": "以x轴对齐", - "create.gui.blockzapper.title": "手持式方块放置机", - "create.gui.blockzapper.replaceMode": "替换模式", - "create.gui.blockzapper.searchDiagonal": "对角线延伸", - "create.gui.blockzapper.searchFuzzy": "忽视种类分界", - "create.gui.blockzapper.range": "延伸范围", - "create.gui.blockzapper.needsUpgradedAmplifier": "需要升级范围扩大器", - "create.gui.blockzapper.patternSection": "模式", - "create.gui.blockzapper.pattern.solid": "实心", - "create.gui.blockzapper.pattern.checkered": "棋盘", - "create.gui.blockzapper.pattern.inversecheckered": "反转棋盘", - "create.gui.blockzapper.pattern.chance25": "25% ", - "create.gui.blockzapper.pattern.chance50": "50% ", - "create.gui.blockzapper.pattern.chance75": "75% ", "create.gui.terrainzapper.title": "手持式环境塑形器", + "create.gui.terrainzapper.searchDiagonal": "对角线延伸", + "create.gui.terrainzapper.searchFuzzy": "模糊模式(忽略材料分界)", + "create.gui.terrainzapper.patternSection": "样式", + "create.gui.terrainzapper.pattern.solid": "填满", + "create.gui.terrainzapper.pattern.checkered": "棋盘格", + "create.gui.terrainzapper.pattern.inversecheckered": "反转棋盘格", + "create.gui.terrainzapper.pattern.chance25": "随机填充25%", + "create.gui.terrainzapper.pattern.chance50": "随机填充50%", + "create.gui.terrainzapper.pattern.chance75": "随机填充75%", "create.gui.terrainzapper.placement": "放置模式", "create.gui.terrainzapper.placement.merged": "结合", "create.gui.terrainzapper.placement.attached": "依附", @@ -776,6 +823,8 @@ "create.gui.terrainzapper.brush.cuboid": "矩形体", "create.gui.terrainzapper.brush.sphere": "球体", "create.gui.terrainzapper.brush.cylinder": "圆柱体", + "create.gui.terrainzapper.brush.surface": "连接的面", + "create.gui.terrainzapper.brush.cluster": "连接的立体区域", "create.gui.terrainzapper.tool": "填充类型", "create.gui.terrainzapper.tool.fill": "填充", "create.gui.terrainzapper.tool.place": "复写", @@ -785,19 +834,8 @@ "create.gui.terrainzapper.tool.flatten": "平整", "create.terrainzapper.shiftRightClickToSet": "Shift+鼠标右击以设置塑形类型", - - "create.blockzapper.usingBlock": "使用:%1$s", - "create.blockzapper.componentUpgrades": "组件升级:", - "create.blockzapper.component.body": "放置器机体", - "create.blockzapper.component.amplifier": "范围扩大器", - "create.blockzapper.component.accelerator": "射击加速器", - "create.blockzapper.component.retriever": "物品回捡器", - "create.blockzapper.component.scope": "距离观察镜", - "create.blockzapper.componentTier.none": "无", - "create.blockzapper.componentTier.brass": "黄铜", - "create.blockzapper.componentTier.chromatic": "异彩化合物", - "create.blockzapper.leftClickToSet": "左击方块将其设定为放置方块", - "create.blockzapper.empty": "方块不足!", + "create.terrainzapper.usingBlock": "填充材料:%1$s", + "create.terrainzapper.leftClickToSet": "鼠标左击一个方块以设置填充材料", "create.minecart_coupling.two_couplings_max": "矿车无法被连接两个以上的矿车连轴器", "create.minecart_coupling.unloaded": "有一部分火车存在于未加载区块中", @@ -844,7 +882,6 @@ "create.gui.assembly.exception.tooManyPistonPoles": "活塞加装的活塞杆数量过多。\n配置中的最大数量限制为:%1$s", "create.gui.assembly.exception.noPistonPoles": "活塞缺失部分活塞杆", "create.gui.assembly.exception.not_enough_sails": "相接的结构所包含的类风帆方块的数量不足。%1$s\n最低需要 %2$s 个方块", - "create.gui.goggles.base_value": "应力基础值", "create.gui.gauge.info_header": "仪表信息:", "create.gui.speedometer.title": "旋转速度", "create.gui.stressometer.title": "网络应力", @@ -871,8 +908,6 @@ "create.gui.sequenced_gearshift.instruction.delay": "延迟", "create.gui.sequenced_gearshift.instruction.delay.duration": "时长", "create.gui.sequenced_gearshift.instruction.end.descriptive": "结束", - "create.gui.sequenced_gearshift.instruction.wait": "等待", - "create.gui.sequenced_gearshift.instruction.wait.duration": "间隔", "create.gui.sequenced_gearshift.instruction.end": "停止", "create.gui.sequenced_gearshift.instruction.await.descriptive": "等待新的红石脉冲", "create.gui.sequenced_gearshift.instruction.await": "等待", @@ -892,7 +927,7 @@ "create.schematicAndQuill.fallbackName": "我的蓝图", "create.schematicAndQuill.saved": "另存为%1$s", - "create.schematic.invalid":"[!] 无效的项目", + "create.schematic.invalid": "[!] 无效的项目", "create.schematic.position": "位置", "create.schematic.rotation": "旋转", "create.schematic.rotation.none": "无", @@ -915,24 +950,24 @@ "create.schematic.tool.deploy.description.3": "按住Ctrl鼠标滚动更改距离。", "create.schematic.tool.move.description.0": "水平移动蓝图", "create.schematic.tool.move.description.1": "选定蓝图,然后按住Ctrl鼠标滚动移动。", - "create.schematic.tool.move.description.2":"", - "create.schematic.tool.move.description.3":"", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", "create.schematic.tool.movey.description.0": "垂直移动蓝图", "create.schematic.tool.movey.description.1": "按住Ctrl鼠标滚动上下移动", - "create.schematic.tool.movey.description.2":"", - "create.schematic.tool.movey.description.3":"", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", "create.schematic.tool.rotate.description.0": "围绕蓝图中心旋转蓝图。", "create.schematic.tool.rotate.description.1": "按住Ctrl鼠标滚动旋转90度", - "create.schematic.tool.rotate.description.2":"", - "create.schematic.tool.rotate.description.3":"", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", "create.schematic.tool.print.description.0": "立即将结构放置在世界上", "create.schematic.tool.print.description.1": "右击确认当前位置。", "create.schematic.tool.print.description.2": "该工具仅适用于创造模式。", - "create.schematic.tool.print.description.3":"", + "create.schematic.tool.print.description.3": "", "create.schematic.tool.flip.description.0": "沿你选择的面翻转蓝图。", "create.schematic.tool.flip.description.1": "指向蓝图,然后按住Ctrl鼠标滚动将其翻转。", - "create.schematic.tool.flip.description.2":"", - "create.schematic.tool.flip.description.3":"", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", "create.schematics.synchronizing": "正在同步..", "create.schematics.uploadTooLarge": "你的蓝图太大", @@ -1031,6 +1066,11 @@ "create.item_attributes.in_item_group.inverted": "不属于%1$s", "create.item_attributes.added_by": "由%1$s添加", "create.item_attributes.added_by.inverted": "不是由%1$s添加", + "create.item_attributes.shulker_level": "潜影盒是%1$s的", + "create.item_attributes.shulker_level.inverted": "潜影盒不是%1$s的", + "create.item_attributes.shulker_level.full": "满", + "create.item_attributes.shulker_level.empty": "空", + "create.item_attributes.shulker_level.partial": "半满", "create.item_attributes.has_enchant": "有附魔效果%1$s", "create.item_attributes.has_enchant.inverted": "没有附魔效果%1$s", "create.item_attributes.color": "染色为%1$s", @@ -1074,8 +1114,6 @@ "create.tooltip.holdForDescription": "按住 [%1$s] 可查看概要", "create.tooltip.holdForControls": "按住 [%1$s] 可查看控制方法", - "create.tooltip.holdKey": "按住 [%1$s]", - "create.tooltip.holdKeyOrKey": "按住 [%1$s] 或 [%2$s]", "create.tooltip.keyShift": "Shift", "create.tooltip.keyCtrl": "Ctrl", "create.tooltip.speedRequirement": "需求转速:%1$s", @@ -1091,14 +1129,13 @@ "create.tooltip.capacityProvided.low": "小", "create.tooltip.capacityProvided.medium": "中", "create.tooltip.capacityProvided.high": "大", - "create.tooltip.capacityProvided.asGenerator":"(作为应力发生器)", "create.tooltip.generationSpeed": "产生于%1$s %2$s", "create.tooltip.analogStrength": "模拟信号强度:%1$s/15", "create.mechanical_arm.extract_from": "从%1$s中拿取物品", "create.mechanical_arm.deposit_to": "向%1$s存储物品", "create.mechanical_arm.summary": "动力臂当前有%1$s个输入,%2$s个输出。", - "create.mechanical_arm.points_outside_range":"由于距离限制,选定的交互点%1$s已被移除。", + "create.mechanical_arm.points_outside_range": "由于距离限制,选定的交互点%1$s已被移除。", "create.weighted_ejector.target_set": "目标已选取", "create.weighted_ejector.target_not_valid": "弹射至临近方块(目标无效)", @@ -1121,23 +1158,40 @@ "create.tunnel.selection_mode.synchronize": "同步输入", "create.tooltip.chute.header": "溜槽信息", - "create.tooltip.chute.items_move_down": "物品下行", - "create.tooltip.chute.items_move_up": "物品上行", - "create.tooltip.chute.no_fans_attached": "未安装鼓风机", - "create.tooltip.chute.fans_push_up": "鼓风机从下方进行推动", - "create.tooltip.chute.fans_push_down": "鼓风机从上方进行推动", - "create.tooltip.chute.fans_pull_up": "鼓风机从上方进行吸引", + "create.tooltip.chute.items_move_down": "物品下行", + "create.tooltip.chute.items_move_up": "物品上行", + "create.tooltip.chute.no_fans_attached": "未安装鼓风机", + "create.tooltip.chute.fans_push_up": "鼓风机从下方进行推动", + "create.tooltip.chute.fans_push_down": "鼓风机从上方进行推动", + "create.tooltip.chute.fans_pull_up": "鼓风机从上方进行吸引", "create.tooltip.chute.fans_pull_down": "鼓风机从下方进行吸引", "create.tooltip.chute.contains": "内含物品:%1$s x%2$s", - + "create.tooltip.brass_tunnel.contains": "等待分配的物品:", + "create.tooltip.brass_tunnel.contains_entry": "> %2$s个%1$s", + "create.tooltip.brass_tunnel.retrieve": "鼠标右击取出", + + "create.linked_controller.bind_mode": "绑定模式激活", + "create.linked_controller.press_keybind": "按%1$s,%2$s,%3$s,%4$s,%5$s或%6$s选择要将该频率绑定到哪个按键。", + "create.linked_controller.key_bound": "该频率已绑定到%1$s", + "create.linked_controller.frequency_slot_1": "按键:%1$s,频道 #1", + "create.linked_controller.frequency_slot_2": "按键:%1$s,频道 #2", + + "create.crafting_blueprint.crafting_slot": "合成材料格", + "create.crafting_blueprint.filter_items_viable": "可以使用过滤器", + "create.crafting_blueprint.display_slot": "展示的图标", + "create.crafting_blueprint.inferred": "已根据合成配方自动设定", + "create.crafting_blueprint.manually_assigned": "手动设定", + "create.crafting_blueprint.secondary_display_slot": "展示的图标角标", + "create.crafting_blueprint.optional": "可选", + + "create.potato_cannon.ammo.attack_damage": "%1$s 攻击伤害", + "create.potato_cannon.ammo.reload_ticks": "%1$s 装弹时间(Ticks)", + "create.potato_cannon.ammo.knockback": "%1$s 击退", + "create.hint.hose_pulley.title": "无限供应", "create.hint.hose_pulley": "目标液体对象被视为无限量的。", "create.hint.mechanical_arm_no_targets.title": "没有目标", "create.hint.mechanical_arm_no_targets": "看起来这个_动力臂_没有被分配给任何_目标_。在手持机械臂的同时,右击选取传送带、置物台、漏斗或其他设备来设置目标。", - "create.hint.horizontal_funnel.title": "水平漏斗", - "create.hint.horizontal_funnel": "无法_直接_在两个物品栏间移动物品。请使用传送带或者置物台来从物品栏中提取物品。", - "create.hint.upward_funnel.title": "漏斗向上", - "create.hint.upward_funnel": "只可以传送由_动力臂_,鼓风机驱动的_溜槽_或者被投掷的物品。请试着做一些溜槽来垂直运输物品。", "create.hint.empty_bearing.title": "更新轴承", "create.hint.empty_bearing": "_空手右击_轴承来_激活_你新建造的结构。", "create.hint.full_deployer.title": "机械手物品溢出", @@ -1161,17 +1215,46 @@ "create.command.killTPSCommand.argument.tickTime": "tickTime", "create.contraption.minecart_contraption_too_big": "这一矿车装置似乎太大了,无法变为拾捡状态", + "create.contraption.minecart_contraption_illegal_pickup": "神秘的力量阻止你拾取这个矿车装置。", - "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", - "create.subtitle.schematicannon_finish": "蓝图加农炮:叮", - "create.subtitle.slime_added": "粘液:挤碎声", - "create.subtitle.mechanical_press_activation": "辊压机:工作中", - "create.subtitle.mechanical_press_item_break": "金属碰撞", - "create.subtitle.blockzapper_place": "放置方块", - "create.subtitle.blockzapper_confirm": "选择方块", - "create.subtitle.blockzapper_deny": "放置失败", - "create.subtitle.block_funnel_eat": "漏斗:吞食", + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.contraption_disassemble": "结构:停止移动", + "create.subtitle.peculiar_bell_use": "奇异钟:鸣响", + "create.subtitle.mixing": "搅拌器:搅拌声", + "create.subtitle.mechanical_press_activation_belt": "辊压机:撞击传送带", + "create.subtitle.fwoomp": "土豆加农炮:发射", + "create.subtitle.worldshaper_place": "环境塑型器:放置方块", + "create.subtitle.crushing_1": "磨碎声", + "create.subtitle.depot_slide": "物品:滑入", + "create.subtitle.saw_activate_stone": "动力锯:切割", "create.subtitle.blaze_munch": "烈焰人:咀嚼", + "create.subtitle.funnel_flap": "漏斗:垂帘碰撞", + "create.subtitle.schematicannon_finish": "蓝图加农炮:叮", + "create.subtitle.haunted_bell_use": "怪异钟:鸣响", + "create.subtitle.scroll_value": "拨码输入:咔哒", + "create.subtitle.crafter_craft": "动力合成器:合成中", + "create.subtitle.controller_put": "遥控器:放进讲台", + "create.subtitle.cranking": "手摇曲柄:转动", + "create.subtitle.wrench_remove": "部件:被破坏", + "create.subtitle.cogs": "齿轮:嘎吱作响", + "create.subtitle.slime_added": "粘液:挤碎声", + "create.subtitle.wrench_rotate": "扳手:拧动", + "create.subtitle.potato_hit": "土豆:击中", + "create.subtitle.saw_activate_wood": "动力锯:切割", + "create.subtitle.haunted_bell_convert": "奇异钟:转化", + "create.subtitle.deployer_polish": "机械手:打磨物品", + "create.subtitle.deny": "提示声:出错", + "create.subtitle.controller_click": "遥控器:按下按钮", + "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", + "create.subtitle.copper_armor_equip": "潜水装备:铿锵", + "create.subtitle.controller_take": "讲台:取走物品", + "create.subtitle.mechanical_press_activation": "辊压机:工作中", + "create.subtitle.contraption_assemble": "结构:开始移动", + "create.subtitle.crafter_click": "动力合成器:咔哒声", + "create.subtitle.depot_plop": "物品:着地", + "create.subtitle.confirm": "提示声:接受", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1185,161 +1268,20 @@ "item.create.example_item.tooltip.control1": "When Ctrl pressed", "item.create.example_item.tooltip.action1": "These controls are displayed.", - "block.create.andesite_encased_shaft.tooltip": "安山传动杆箱", - "block.create.andesite_encased_shaft.tooltip.summary": "_创造模式_才可获得这一物品。用_安山机壳_包裹放置在_世界中_的传动杆即可获得,机壳不会被消耗。", - - "block.create.brass_encased_shaft.tooltip": "黄铜传动杆箱", - "block.create.brass_encased_shaft.tooltip.summary": "_创造模式_才可获得这一物品。用_黄铜机壳_包裹放置在_世界中_的传动杆即可获得,机壳不会被消耗。", - "block.create.wooden_bracket.tooltip": "木质支架", "block.create.wooden_bracket.tooltip.summary": "用这种给人温馨感的木质支架_装饰_你的_传动杆_,_齿轮_和_管道_吧。", "block.create.metal_bracket.tooltip": "金属支架", "block.create.metal_bracket.tooltip.summary": "用这种工业风格的金属支架_装饰_你的_传动杆_,_齿轮_和_管道_吧。", - "block.create.andesite_casing.tooltip": "安山机壳", - "block.create.andesite_casing.tooltip.summary": "具有多种用途的简单机壳,可用于加固并装饰_传动杆_,_传送带_", - - "block.create.andesite_funnel.tooltip": "安山漏斗", - "block.create.andesite_funnel.tooltip.summary": "一种常用的传输设备,配合各种物流结构传输物品,可由_红石信号_控制。", - "block.create.andesite_funnel.tooltip.condition1": "一般行为", - "block.create.andesite_funnel.tooltip.behaviour1": "开口的面会吸收面前一格内的_掉落物_,并_传输_到它与吸收位置的方向相反的_容器_里。", - "block.create.andesite_funnel.tooltip.condition2": "当装配在传送带、置物台等类似的组件上时", - "block.create.andesite_funnel.tooltip.behaviour2": "会在此组件上_收集_或_放置_物品,并将其背后的物品栏视为缓存,向其中_放入_或从其中_抽出_物品,无论何时,只要该漏斗面朝特定的方向,你都可以通过扳手来翻转它的面朝方向。", - "block.create.andesite_funnel.tooltip.condition3": "当被垂直放置于两个容器之间时", - "block.create.andesite_funnel.tooltip.behaviour3": "仅向下垂直传输物品,类似一个没有缓冲槽的漏斗。", - - "block.create.andesite_tunnel.tooltip": "安山隧道", - "block.create.andesite_tunnel.tooltip.summary": "这种美观大方且兼具保护能力的遮掩物专为_传送带_而设计。_安山隧道_可以从主传送带上的一堆物品中抽取出一个物品,并将该物品放置到侧面的传送带或者置物台上。", - "block.create.andesite_tunnel.tooltip.control1": "扳手右击侧面时", - "block.create.andesite_tunnel.tooltip.action1": "如果传送带隧道串联的数量达到三个或以上,可在位于中间的隧道侧面上开启关闭百叶窗。", - - "block.create.brass_funnel.tooltip": "黄铜漏斗", - "block.create.brass_funnel.tooltip.summary": "一种常用的传输设备,配合各种物流结构传输物品,可由_红石信号_控制,并附带_过滤槽_。", - "block.create.brass_funnel.tooltip.condition1": "一般行为", - "block.create.brass_funnel.tooltip.behaviour1": "开口的面会吸收面前一格内的_掉落物_,并_传输_到它与吸收位置的方向相反的_容器_里。", - "block.create.brass_funnel.tooltip.condition2": "当装配在传送带、置物台等类似的组件上时", - "block.create.brass_funnel.tooltip.behaviour2": "会在此组件上_收集_或_放置_物品,并将其背后的物品栏视为缓存,向其中_放入_或从其中_抽出_物品,无论何时,只要该漏斗面朝特定的方向,你都可以通过扳手来翻转它的面朝方向。", - "block.create.brass_funnel.tooltip.condition3": "垂直放置于两个容器之间时", - "block.create.brass_funnel.tooltip.behaviour3": "向下垂直传输物品,类似一个没有缓冲槽的漏斗。", - - "block.create.brass_tunnel.tooltip": "黄铜隧道", - "block.create.brass_tunnel.tooltip.summary": "这种美观大方且兼具保护能力的遮掩物专为_传送带_而设计。不仅如此,_黄铜隧道_还带有物品_过滤_以及_分流_的配置选项。", - "block.create.brass_tunnel.tooltip.condition1": "当它们并排放置时", - "block.create.brass_tunnel.tooltip.behaviour1": "紧挨着的_黄铜隧道_可以让传送带路线上穿过的物品_重定向_到与其并排的传送带路线上。", - "block.create.brass_tunnel.tooltip.condition2": "过滤", - "block.create.brass_tunnel.tooltip.behaviour2": "_黄铜隧道_的_输入_方向和_输出_方向都带有过滤插槽。如果进入的物品不满足隧道输出端的过滤条件,则该物品会从并排的其他隧道出口传出。", - "block.create.brass_tunnel.tooltip.condition3": "分配", - "block.create.brass_tunnel.tooltip.behaviour3": "_黄铜隧道_可以为并排的传送带路线提供多个物品分配的方案。", - "block.create.brass_tunnel.tooltip.control1": "扳手右击侧面时", - "block.create.brass_tunnel.tooltip.action1": "如果传送带隧道串联的数量达到三个或以上,可在位于中间的隧道侧面上开启关闭百叶窗。", - "block.create.brass_tunnel.tooltip.control2": "手持扳手在隧道顶部滚动鼠标滚轮", - "block.create.brass_tunnel.tooltip.action2": "更改_隧道_的分配模式。", - - "block.create.copper_casing.tooltip": "铜机壳", - "block.create.copper_casing.tooltip.summary": "具有多种用途的坚固机壳,可用于装饰。", - "block.create.copper_casing.tooltip.condition1": "在流体管道上使用时", - "block.create.copper_casing.tooltip.behaviour1": "将管道包裹进机壳,加壳的管道会与临近的管道区分开来,防止它们自动连接到一起。", - - "block.create.encased_fluid_pipe.tooltip": "流体管道箱", - "block.create.encased_fluid_pipe.tooltip.summary": "用铜机壳加固后的流体管道。", - - "block.create.copper_valve_handle.tooltip": "铜阀门手轮", - "block.create.copper_valve_handle.tooltip.summary": "精确的动力来源,需要玩家手动操作。注意不要让自己太累!", - "block.create.copper_valve_handle.tooltip.condition1": "右击使用时", - "block.create.copper_valve_handle.tooltip.behaviour1": "为连接的设备提供动力。潜行状态下反向旋转。", - "block.create.seat.tooltip": "坐垫", "block.create.seat.tooltip.summary": "坐下来享受旅程吧!坐垫将会把玩家固定在一个移动装置上。也可以用来作为居家装饰,毕竟他有许多颜色。", "block.create.seat.tooltip.condition1": "右击坐垫", "block.create.seat.tooltip.behaviour1": "会使得玩家坐在_坐垫_上,L-Shift可离开_坐垫_。", - "block.create.chute.tooltip": "溜槽", - "block.create.chute.tooltip.summary": "用于_收集_并_垂直_或_对角_进行物品_传输_。可以从_容器_中抽取也可向_容器_输入。它的侧面可以被_漏斗_、_侧装漏斗_等传输设备交互", - "block.create.chute.tooltip.condition1": "当被上方的鼓风机通风时", - "block.create.chute.tooltip.behaviour1": "由_鼓风机_驱动的_溜槽_可由下向上传输_物品_,可以从_置物台_或者_传送带_上吸取物品。", - - "block.create.depot.tooltip": "置物台", - "block.create.depot.tooltip.summary": "一个方便的放置物品的地方。它为多台机器提供了一个交互点", - "block.create.depot.tooltip.condition1": "右击置物台", - "block.create.depot.tooltip.behaviour1": "可以在_置物台_放置或取出物品。可以与_传送带_交互的方块或装置也可以与_置物台_交互。", - "item.create.blaze_cake.tooltip": "烈焰蛋糕", "item.create.blaze_cake.tooltip.summary": "为辛勤劳作的_烈焰人_精心准备的美味。让他们兴奋起来吧!", - "item.create.empty_blaze_burner.tooltip": "空的烈焰人燃烧室", - "item.create.empty_blaze_burner.tooltip.summary": "你火热的朋友的一个小小的铁质的家。我相信你会好好利用他们的!", - "item.create.empty_blaze_burner.tooltip.condition1": "当对着烈焰人或烈焰人刷怪笼使用时", - "item.create.empty_blaze_burner.tooltip.behaviour1": "将烈焰人_捕获_至物品中", - - "block.create.fluid_pipe.tooltip": "流体管道", - "block.create.fluid_pipe.tooltip.summary": "用于传输_流体_。需要一个_动力泵_来提供压强。", - "block.create.fluid_pipe.tooltip.condition1": "转移流体", - "block.create.fluid_pipe.tooltip.behaviour1": "可以与_流体容器_如_储罐_或_工作盆_相连_。裸露的_管道_末端也可以排放或抽取流体。注意别漏水了!", - "block.create.fluid_pipe.tooltip.control1": "使用扳手右击", - "block.create.fluid_pipe.tooltip.action1": "如果可能的话,在管道侧面开启/关闭窗口。", - - "block.create.hose_pulley.tooltip": "软管滑轮", - "block.create.hose_pulley.tooltip.summary": "用于在_世界_中放置或排放大量的液体。", - "block.create.hose_pulley.tooltip.condition1": "接入动力时", - "block.create.hose_pulley.tooltip.behaviour1": "升高或降低软管,软管的位置决定了抽取或填充液体的高度。", - "block.create.hose_pulley.tooltip.condition2": "当软管滑轮抽取流体时", - "block.create.hose_pulley.tooltip.behaviour2": "开始从软管末端将其从中取出_流体方块_。巨大的流体湖将被认定是_无限_的", - "block.create.hose_pulley.tooltip.condition3": "当流体从软管滑轮中排出时", - "block.create.hose_pulley.tooltip.behaviour3": "开始向世界填充流体,直到达到_软管末端_的高度。", - - "block.create.fluid_tank.tooltip": "流体储罐", - "block.create.fluid_tank.tooltip.summary": "_存储_任意_流体_,根据整体结构的宽和高决定其储存容量", - "block.create.fluid_tank.tooltip.condition1": "使用扳手右击", - "block.create.fluid_tank.tooltip.behaviour1": "打开或关闭窗户", - - "block.create.creative_fluid_tank.tooltip": "创造流体储罐", - "block.create.creative_fluid_tank.tooltip.summary": "此流体储罐能够_无限的复制_任何流体,根据整体结构的宽和高决定其储存容量", - "block.create.creative_fluid_tank.tooltip.condition1": "罐中装有流体时", - "block.create.creative_fluid_tank.tooltip.behaviour1": "任意的_流体提取设备_能够从中提取无穷无尽的指定流体,流体的导入功能同时也会无效。", - "block.create.creative_fluid_tank.tooltip.condition2": "使用扳手右击", - "block.create.creative_fluid_tank.tooltip.behaviour2": "打开或关闭窗户", - - "block.create.fluid_valve.tooltip": "流体阀门", - "block.create.fluid_valve.tooltip.summary": "阻止流体沿管道向前流动。", - "block.create.fluid_valve.tooltip.condition1": "控制流量", - "block.create.fluid_valve.tooltip.behaviour1": "施加的_旋转力_将迫使阀门关闭,从而阻止流体流动。_逆转旋转方向_以重新打开阀门。", - - "block.create.mechanical_pump.tooltip": "动力泵", - "block.create.mechanical_pump.tooltip.summary": "_接入动力_,能迫使流体_沿管道指定方向移动_。在两个方向上都有_最大的作用范围_。(默认为16个方块距离)", - "block.create.mechanical_pump.tooltip.condition1": "流体流向", - "block.create.mechanical_pump.tooltip.behaviour1": "_接入动力_后会产生压力,迫使流体通过管道。_反转动力_的方向以切换流体_流向_。", - "block.create.mechanical_pump.tooltip.control1": "扳手右击时", - "block.create.mechanical_pump.tooltip.action1": "反转泵的方向,从而改变默认的流体流向", - - "block.create.smart_fluid_pipe.tooltip": "智能流体管道", - "block.create.smart_fluid_pipe.tooltip.summary": "带有过滤器的_流体管道_。可以指定其只流通特定的_流体_。", - "block.create.smart_fluid_pipe.tooltip.condition1": "当流体进入时", - "block.create.smart_fluid_pipe.tooltip.behaviour1": "进入的流体与_过滤器_不匹配时,智能管道将_阻止_其通过。", - "block.create.smart_fluid_pipe.tooltip.condition2": "与流体容器相邻时", - "block.create.smart_fluid_pipe.tooltip.behaviour2": "_智能管道_会开始从_相邻的任何容器_中抽取与其过滤器匹配的流体。", - - "block.create.spout.tooltip": "注液器", - "block.create.spout.tooltip.summary": "一种用于_装罐_的机器。", - "block.create.spout.tooltip.condition1": "流体传输", - "block.create.spout.tooltip.behaviour1": "当下方放置类似_玻璃瓶_,_桶_这样的流体容器物品时,注液器会试图将自身存储的液体注入到下方的_流体容器物品_中。", - "block.create.spout.tooltip.condition2": "流体自动化", - "block.create.spout.tooltip.behaviour2": "注液器位于_传送带_或者_置物台_上方时,将自动为流水线上的_流体容器物品_进行_注液_。", - - "block.create.item_drain.tooltip": "分液池", - "block.create.item_drain.tooltip.summary": "一种用于_抽空流体容器物品_的置物台", - "block.create.item_drain.tooltip.condition1": "流体传输", - "block.create.item_drain.tooltip.behaviour1": "当从侧面导入诸如_桶_或_瓶子_之类的_流体容器物品_时,_分液池_将尝试将物品内的液体倒入其_自身的液体物品栏_中。空的_流体容器物品_将被弹出至_另一侧_。", - - "block.create.mechanical_arm.tooltip": "动力臂", - "block.create.mechanical_arm.tooltip.summary": "移动_物品_的高级装置", - "block.create.mechanical_arm.tooltip.condition1": "转移物品", - "block.create.mechanical_arm.tooltip.behaviour1": "可以从任意_可够到的设备_中拿取或放置物品,比如说_传送带_,_置物台_,_漏斗_以及_动力合成器_。", - "block.create.mechanical_arm.tooltip.control1": "手持时", - "block.create.mechanical_arm.tooltip.action1": "右击一个_可使用的容器_来将其设置为_动力臂_的_输入端_。右键双击将其设置为_动力臂_的_输出端_。", - "block.create.mechanical_arm.tooltip.control2": "手持扳手滚动滚轮", - "block.create.mechanical_arm.tooltip.action2": "调整_动力臂_输出物品时的调度模式。", - "item.create.wand_of_symmetry.tooltip": "对称之杖", "item.create.wand_of_symmetry.tooltip.summary": "完美地镜面复制工作区域内的方块到另一边", "item.create.wand_of_symmetry.tooltip.condition1": "当在快捷栏时", @@ -1351,15 +1293,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "当潜行右击时", "item.create.wand_of_symmetry.tooltip.action3": "打开_配置界面_。", - "item.create.handheld_blockzapper.tooltip": "手持式方块放置器", - "item.create.handheld_blockzapper.tooltip.summary": "新颖的小工具,可以远距离放置或更换方块。", - "item.create.handheld_blockzapper.tooltip.control1": "当左击方块时", - "item.create.handheld_blockzapper.tooltip.action1": "将工具放置的方块设置为该方块。", - "item.create.handheld_blockzapper.tooltip.control2": "当右击方块时", - "item.create.handheld_blockzapper.tooltip.action2": "_放置_或_替换_目标方块。", - "item.create.handheld_blockzapper.tooltip.control3": "当潜行右击时", - "item.create.handheld_blockzapper.tooltip.action3": "打开_配置界面_。", - "item.create.handheld_worldshaper.tooltip": "手持式环境塑形器", "item.create.handheld_worldshaper.tooltip.summary": "_创造_大陆和山脉的手持工具", "item.create.handheld_worldshaper.tooltip.control1": "当左击方块时", @@ -1374,13 +1307,19 @@ "item.create.tree_fertilizer.tooltip.condition1": "在树苗上使用时", "item.create.tree_fertilizer.tooltip.behaviour1": "使得该树_无视_它的_生长空间条件_,立刻长大。", - "item.create.deforester.tooltip": "树林毁灭者", - "item.create.deforester.tooltip.summary": "一把_光辉四溢的斧子_,能够瞬间砍倒一棵树", - "item.create.extendo_grip.tooltip": "伸缩机械手", "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_触碰距离_。", "item.create.extendo_grip.tooltip.condition1": "放置于副手栏时", "item.create.extendo_grip.tooltip.behaviour1": "增加_主手_所使用物品的_接触距离_。", + "item.create.extendo_grip.tooltip.condition2": "当装备铜制背罐时", + "item.create.extendo_grip.tooltip.behaviour2": "使用罐中_气压_来_抵消_伸缩机械手的_耐久_损耗。", + + "item.create.potato_cannon.tooltip": "土豆加农炮", + "item.create.potato_cannon.tooltip.summary": "噗!把你亲手栽培的蔬菜砸向你的敌人。可以使用_铜制背罐_供能。", + "item.create.potato_cannon.tooltip.condition1": "当右击时", + "item.create.potato_cannon.tooltip.behaviour1": "_发射_你_物品栏_中任一可做弹药的物品。", + "item.create.potato_cannon.tooltip.condition2": "当装备铜制背罐时", + "item.create.potato_cannon.tooltip.behaviour2": "使用罐中_气压_来_抵消_土豆加农炮的_耐久_损耗。", "item.create.filter.tooltip": "过滤器", "item.create.filter.tooltip.summary": "可用于_精确_控制物流设备的_输出_以及_输入_,使得通过的物品流与_一组_物品或者数个_相嵌套的过滤器_相匹配。", @@ -1421,56 +1360,14 @@ "block.create.schematicannon.tooltip": "蓝图加农炮", "block.create.schematicannon.tooltip.summary": "发射方块,重新构建已在世界中部署的_蓝图_,会使用相邻箱子中的物品进行填充,_火药_作为燃料。", - "block.create.schematicannon.tooltip.control1": "当右击时", - "block.create.schematicannon.tooltip.action1": "打开_界面_", + "block.create.schematicannon.tooltip.condition1": "当右击时", + "block.create.schematicannon.tooltip.behaviour1": "打开_配置面板_。", "block.create.schematic_table.tooltip": "蓝图桌", "block.create.schematic_table.tooltip.summary": "将保存的蓝图图写入_空白蓝图_", "block.create.schematic_table.tooltip.condition1": "放入空白蓝图时", "block.create.schematic_table.tooltip.behaviour1": "可从 Schematics 文件夹中上传所选文件。", - "block.create.shaft.tooltip": "传动杆", - "block.create.shaft.tooltip.summary": "将_旋转_进行直线传递。", - - "block.create.cogwheel.tooltip": "齿轮", - "block.create.cogwheel.tooltip.summary": "将_旋转_进行直线传递,或者传递旋转到临近的_齿轮_上", - - "block.create.large_cogwheel.tooltip": "大齿轮", - "block.create.large_cogwheel.tooltip.summary": "大号齿轮传动结构,连接到_齿轮_时改变其_转速_。", - - "block.create.encased_shaft.tooltip": "传动杆箱", - "block.create.encased_shaft.tooltip.summary": "将_旋转_进行直线传递,适合用于需要穿墙传递旋转的情景。", - - "block.create.gearbox.tooltip": "十字齿轮箱", - "block.create.gearbox.tooltip.summary": "将_旋转转送_到_四个方向上_,同时反转直线方向上的旋转方向。", - - "block.create.gearshift.tooltip": "反转齿轮箱", - "block.create.gearshift.tooltip.summary": "用于反转传动杆_旋转方向_的开关。", - "block.create.gearshift.tooltip.condition1": "当提供红石信号时", - "block.create.gearshift.tooltip.behaviour1": "_更改_旋转方向。", - - "block.create.clutch.tooltip": "离合器", - "block.create.clutch.tooltip.summary": "可用于控制与其相连的传动杆的转动/停转。", - "block.create.clutch.tooltip.condition1": "当提供红石信号时", - "block.create.clutch.tooltip.behaviour1": "_停止_另一侧的旋转。", - - "block.create.encased_chain_drive.tooltip": "链式传动箱", - "block.create.encased_chain_drive.tooltip.summary": "将动能_传递_给直线上或侧面相贴的_链式传动箱_,相邻的链式传动箱会结合在一起,前提是接触面没有传动杆. 它们的朝向不必一致。", - "block.create.encased_chain_drive.tooltip.condition1": "互相连接时", - "block.create.encased_chain_drive.tooltip.behaviour1": "_链式传动箱组_中的_链式传动箱_将以相同的速度旋转。", - - "block.create.adjustable_chain_gearshift.tooltip": "可调节链式传动箱", - "block.create.adjustable_chain_gearshift.tooltip.summary": "将动能_传递_给直线上或侧面相贴的_链式传动箱_,向其通入_红石信号_,可以控制它与其它链式传动箱相接的是何种大小的齿轮。", - "block.create.adjustable_chain_gearshift.tooltip.condition1": "红石控制", - "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "没有红石信号时,_链式传动箱组_中的_链式传动箱_将以相同的速度旋转。通入满值红石信号时,_链式传动箱组_中除自身以外的_链式传动箱_将以两倍的速度旋转。介于两者之间的任何结果都将使其速度提高1-2倍。", - - "item.create.belt_connector.tooltip": "传送带", - "item.create.belt_connector.tooltip.summary": "用_传送带_连接两个或多个_传动杆_,连接的传动杆将具有完全相同的转速和方向。传送带可以_传输实体_和_物品_。", - "item.create.belt_connector.tooltip.control1": "当右击传动杆时", - "item.create.belt_connector.tooltip.action1": "选择传动杆作为传送带的传输点,选定的两个传动杆都必须相互_垂直_,_水平_或_对角平齐_。", - "item.create.belt_connector.tooltip.control2": "当潜行右击时", - "item.create.belt_connector.tooltip.action2": "_重置_传送带的第一个选定位置", - "item.create.goggles.tooltip": "工程师护目镜", "item.create.goggles.tooltip.summary": "一副可以扩增显示_动力学信息_的实用眼镜。", "item.create.goggles.tooltip.condition1": "当装备时", @@ -1487,29 +1384,9 @@ "item.create.wrench.tooltip.control2": "当潜行右击时", "item.create.wrench.tooltip.action2": "会_拆除动力组件_并将其移动到你的背包中。", - "block.create.creative_motor.tooltip": "创造马达", - "block.create.creative_motor.tooltip.summary": "可以配置的_动力_来源", - - "block.create.water_wheel.tooltip": "水车", - "block.create.water_wheel.tooltip.summary": "从相邻的_流动水_中获得_动力_。", - - "block.create.encased_fan.tooltip": "鼓风机", - "block.create.encased_fan.tooltip.summary": "有多种用途,主要可以将_动力_和_风力_进行互相转换。", - "block.create.encased_fan.tooltip.condition1": "当被红石信号激活后", - "block.create.encased_fan.tooltip.behaviour1": "可将鼓风机下方的_热能_(火、熔岩等)转化成_动能_,需要将鼓风机面朝下方摆放。", - "block.create.encased_fan.tooltip.condition2": "接入动力时", - "block.create.encased_fan.tooltip.behaviour2": "根据旋转方向_推动_或者_吸引_实体,强度和速度取决于给予的动力。", - "block.create.encased_fan.tooltip.condition3": "当对着特定方块吹风时", - "block.create.encased_fan.tooltip.behaviour3": "微量的_液体_以及_火焰_会被吹入气流中,这种气流可以用于_处理物品_。", - "block.create.nozzle.tooltip": "分散网", "block.create.nozzle.tooltip.summary": "依附在鼓风机上,能够将鼓风机的效果分散到_各个方向_。", - "block.create.hand_crank.tooltip": "手摇曲柄", - "block.create.hand_crank.tooltip.summary": "一种简单的动力源,需要_人工转动_,注意不要让自己太累!", - "block.create.hand_crank.tooltip.condition1": "当使用时", - "block.create.hand_crank.tooltip.behaviour1": "向依附的结构提供_动力_,_潜行_时将会提供_反向_的旋转力", - "block.create.cuckoo_clock.tooltip": "布谷鸟闹钟", "block.create.cuckoo_clock.tooltip.summary": "精致的工艺品,能够记录时间", "block.create.cuckoo_clock.tooltip.condition1": "接入动力时", @@ -1518,194 +1395,6 @@ "block.create.turntable.tooltip": "转盘", "block.create.turntable.tooltip.summary": "让旋转力给你带来一场刺激的旋转风车体验。", - "block.create.millstone.tooltip": "石磨", - "block.create.millstone.tooltip.summary": "一个能_研磨物品_的动能装置,可以被临近的_齿轮_供能,或者可以在底部用传动杆供能,成品必须被提取出石磨", - "block.create.millstone.tooltip.condition1": "当接入动力时", - "block.create.millstone.tooltip.behaviour1": "开始根据_研磨配方_来处理被放入的物品,物品可以从侧面和上面放入。", - "block.create.millstone.tooltip.condition2": "当右击时", - "block.create.millstone.tooltip.behaviour2": "手动取出研磨后的产物。", - - "block.create.crushing_wheel.tooltip": "粉碎轮", - "block.create.crushing_wheel.tooltip.summary": "一对能够_粉碎一切_的粉碎轮。向两个粉碎轮提供_向内_且_相反的转速_后开始工作", - "block.create.crushing_wheel.tooltip.condition1": "当两个粉碎轮一起运作时", - "block.create.crushing_wheel.tooltip.behaviour1": "_粉碎物品_并获得相应产物(建议配合jei查看)", - - "block.create.mechanical_press.tooltip": "动力辊压机", - "block.create.mechanical_press.tooltip.summary": "一个强力的活塞式机器,用于压制其下方的物品。", - "block.create.mechanical_press.tooltip.condition1": "当提供红石信号时", - "block.create.mechanical_press.tooltip.behaviour1": "_压制_其下方的物品。", - "block.create.mechanical_press.tooltip.condition2": "在传送带上方时", - "block.create.mechanical_press.tooltip.behaviour2": "_自动压缩_经过传送带的物品。", - "block.create.mechanical_press.tooltip.condition3": "在工作盆上方时", - "block.create.mechanical_press.tooltip.behaviour3": "开始_压缩_配方中允许压缩的物品。", - - "block.create.basin.tooltip": "工作盆", - "block.create.basin.tooltip.summary": "一种方便的_物品容器_,常常与_辊压机_和_搅拌机_配合使用,可以被_红石比较器_检测。其上自带有一个过滤槽,你可以指定该工作盆用于制作何种产物。", - "block.create.basin.tooltip.condition1": "自动输出", - "block.create.basin.tooltip.behaviour1": "当有开放式物品栏(例如传送带,其他的工作盆,置物台等)位于工作盆的一侧下方时,它们将自动接收在工作盆中产出的任何物品/流体并输出。这对自动化很有帮助。", - - "block.create.blaze_burner.tooltip": "烈焰人燃烧室", - "block.create.blaze_burner.tooltip.summary": "一个用于加热_工作盆_的设备,由烈焰人来驱动。", - "block.create.blaze_burner.tooltip.condition1": "放置于工作盆下方时", - "block.create.blaze_burner.tooltip.behaviour1": "为工作盆配方_提供热量_。", - "block.create.blaze_burner.tooltip.condition2": "对烈焰人燃烧室使用可燃物时", - "block.create.blaze_burner.tooltip.behaviour2": "_消耗_可燃物,并根据该物品在_熔炉中的燃烧时间_来延长_烈焰加热器的燃烧时间_,使用_烈焰蛋糕_投喂将提供_更高的温度_。", - - "block.create.reinforced_rail.tooltip": "强化铁轨", - "block.create.reinforced_rail.tooltip.summary": "牢固稳定的铁轨,下方不需要_方块支撑_。", - - "block.create.mechanical_mixer.tooltip": "动力搅拌器", - "block.create.mechanical_mixer.tooltip.summary": "这种动力搅拌器提供了一些可自动合成的,多原料无序合成的配方。它需要稳定且足够快的转速,并且下方需要放置_工作盆_(中间需要一格高)。", - "block.create.mechanical_mixer.tooltip.condition1": "当位于工作盆上方", - "block.create.mechanical_mixer.tooltip.behaviour1": "一旦盆内含有了所有必要的原料,搅拌器就会开始搅拌。若想要屏蔽掉那些不需要的配方,你可以在盆上添加过滤,或者在必要原料齐全之前停止向搅拌器供应动力。", - - "block.create.mechanical_crafter.tooltip": "动力合成器", - "block.create.mechanical_crafter.tooltip.summary": "这种动力组装装置可以_自动化_任何_有序合成_配方。根据想要合成的物品的_合成表尺寸_来摆放_相应数量_的动力合成器,并且用扳手调整物品在合成器里的_传动方向_以让他们收束在一起合成并输出", - "block.create.mechanical_crafter.tooltip.condition1": "接入动力时", - "block.create.mechanical_crafter.tooltip.behaviour1": "当机器中_所有_的物品槽都有物品时,将会启动所有的合成器进行工作。", - "block.create.mechanical_crafter.tooltip.condition2": "通入红石脉冲", - "block.create.mechanical_crafter.tooltip.behaviour2": "强制启动当前网格中所有给定的_材料_的_合成_", - "block.create.mechanical_crafter.tooltip.control1": "当在机器前方使用扳手时", - "block.create.mechanical_crafter.tooltip.action1": "将会改变物品移动的方向。要合成一个物品,所有原料必须被_移动到一起_,并且在阵列的_外缘_被弹出机器", - "block.create.mechanical_crafter.tooltip.control2": "当侧方或者后方使用扳手时", - "block.create.mechanical_crafter.tooltip.action2": "连接相邻的合成器的物品栏,这样_相同_的物品就会自动进入所有相互连接的合成器", - - "block.create.furnace_engine.tooltip": "熔炉引擎", - "block.create.furnace_engine.tooltip.summary": "一种强力的_旋转动能_的来源,但是需要_正在工作_的_熔炉_才能正常运作。", - "block.create.furnace_engine.tooltip.condition1": "当连接到正在燃烧的熔炉", - "block.create.furnace_engine.tooltip.behaviour1": "将会带动_相连_的_飞轮_(需要间隔一格),用高炉速度更快。", - - "block.create.flywheel.tooltip": "飞轮", - "block.create.flywheel.tooltip.summary": "一种大型的金属轮,能将_熔炉引擎_提供的动能稳定化输出,需要与_熔炉引擎_间隔一个方块。", - "block.create.flywheel.tooltip.condition1": "当连接正在输出的熔炉引擎", - "block.create.flywheel.tooltip.behaviour1": "将会提供相应的_旋转动能_。", - - "block.create.portable_storage_interface.tooltip": "移动存储接口", - "block.create.portable_storage_interface.tooltip.summary": "为动力活塞、装配矿车、旋转轴承、滑轮_等运动结构_设计的_物流接口_,_运动结构_和_固定结构_之间的物品交换站,两个接口会面时将_自动对接_,且必须彼此隔开 1-2 个方块。", - "block.create.portable_storage_interface.tooltip.condition1": "装配在运动结构上时", - "block.create.portable_storage_interface.tooltip.behaviour1": "移动到能够满足与_固定结构_上的_移动式存储接口_对接的条件后,运动结构会_短暂地停下_,开始对接,并直接与_运动结构上的_存储容器_交互,进行物品的_输入输出_。", - "block.create.portable_storage_interface.tooltip.condition2": "通入红石信号时时", - "block.create.portable_storage_interface.tooltip.behaviour2": "立即断开任何处于激活状态的连接。", - - "block.create.portable_fluid_interface.tooltip": "移动流体接口", - "block.create.portable_fluid_interface.tooltip.summary": "为动力活塞、装配矿车、旋转轴承、滑轮_等运动结构_设计的_流体接口_,_运动结构_和_固定结构_之间的流体交换站,两个接口会面时将_自动对接_,且必须彼此隔开 1-2 个方块。", - "block.create.portable_fluid_interface.tooltip.condition1": "装配在运动结构上时", - "block.create.portable_fluid_interface.tooltip.behaviour1": "移动到能够满足与_固定结构_上的_移动式流体接口_对接的条件后,运动结构会_短暂地停下_,开始对接,并直接与_运动结构_上的_流体储罐_交互,进行流体的_导入导出_。", - "block.create.portable_fluid_interface.tooltip.condition2": "通入红石信号时时", - "block.create.portable_fluid_interface.tooltip.behaviour2": "立即断开任何处于激活状态的连接。", - - "block.create.rotation_speed_controller.tooltip": "转速控制器", - "block.create.rotation_speed_controller.tooltip.summary": "一个可以变换所连接齿轮旋转速度的元件", - "block.create.rotation_speed_controller.tooltip.condition1": "接入大齿轮时", - "block.create.rotation_speed_controller.tooltip.behaviour1": "通过_鼠标滚轮_调整接入动力的_转速_,传递给连接的_大齿轮_,连接的大齿轮需要放置在其上方。", - - "block.create.mechanical_piston.tooltip": "动力活塞", - "block.create.mechanical_piston.tooltip.summary": "活塞的高级版本,使用_旋转动能_精确地移动其前方的方块,背面可放置活塞杆延长活塞范围,没有活塞杆将不会工作,使用_底盘_或者_粘液块_可以移动多行方块。", - "block.create.mechanical_piston.tooltip.condition1": "推拉活塞时", - "block.create.mechanical_piston.tooltip.behaviour1": "活塞的_速度_和_方向_与所接受_转速_的_大小_以及_方向_相关。", - - "block.create.piston_extension_pole.tooltip": "活塞杆", - "block.create.piston_extension_pole.tooltip.summary": "用于增加_动力活塞_的移动范围", - "block.create.piston_extension_pole.tooltip.condition1": "当连接到动力活塞时", - "block.create.piston_extension_pole.tooltip.behaviour1": "活塞的移动范围将扩大", - - "block.create.mechanical_bearing.tooltip": "动力轴承", - "block.create.mechanical_bearing.tooltip.summary": "使用旋转力旋转_大型结构_。", - "block.create.mechanical_bearing.tooltip.condition1": "接入动力时", - "block.create.mechanical_bearing.tooltip.behaviour1": "开始使相接的方块旋转。使用_机壳底盘_,_粘液球_或者_强力胶_将方块连接在一起,可以使得动力轴承带动更多的方块。", - - "block.create.windmill_bearing.tooltip": "风车轴承", - "block.create.windmill_bearing.tooltip.summary": "借助_风的力量_创造_动力_。设计你的独特风车,让其肆意旋转吧!", - "block.create.windmill_bearing.tooltip.condition1": "右击时", - "block.create.windmill_bearing.tooltip.behaviour1": "启动轴承,提供由其_附加结构_的旋转产生的动力。结构必须包括合适的_风帆_或_羊毛_。使用_机壳底盘_,_粘液块_或_强力胶_可以带动更多方块旋转。", - - "block.create.sail_frame.tooltip": "风帆框架", - "block.create.sail_frame.tooltip.summary": "实用的建筑方块,而将其安装于_风车轴承_上并组成特定结构时,它又能产出动力学能量。", - - "block.create.white_sail.tooltip": "风帆", - "block.create.white_sail.tooltip.summary": "可用于_组装风车_的结构方块,不俗的动力来源,有多种颜色。", - "block.create.white_sail.tooltip.condition1": "使用染料右击时", - "block.create.white_sail.tooltip.behaviour1": "改变颜色。", - - "block.create.clockwork_bearing.tooltip": "时钟轴承", - "block.create.clockwork_bearing.tooltip.summary": "一种高级的机械轴承,可以根据当前游戏内时间旋转两个不同的指针", - "block.create.clockwork_bearing.tooltip.condition1": "接入动力时", - "block.create.clockwork_bearing.tooltip.behaviour1": "旋转第一个连接的结构作为时针,第二个连接的结构作为分针", - - "block.create.sequenced_gearshift.tooltip": "可编程齿轮箱", - "block.create.sequenced_gearshift.tooltip.summary": "一种可编程的组件,可以根据内部的指令设计旋转的_方向_,_速度_,以及_距离_。此组件可以有效配合活塞和轴承等使用。最高可让其按_顺序_执行_ 5 条指令_。在高转速时工作精度可能会下降。", - "block.create.sequenced_gearshift.tooltip.condition1": "当通入红石信号时", - "block.create.sequenced_gearshift.tooltip.behaviour1": "在接入动能的情况下,执行指令。", - "block.create.sequenced_gearshift.tooltip.condition2": "当右击时", - "block.create.sequenced_gearshift.tooltip.behaviour2": "将打开_配置界面_", - - "block.create.cart_assembler.tooltip": "矿车装配站", - "block.create.cart_assembler.tooltip.summary": "当放置于铁轨上时,将会_装配_或者_卸载_穿越它的矿车运动结构。按下 [Ctrl] 可以查阅它在不同轨道上的行为。", - "block.create.cart_assembler.tooltip.condition1": "单个矿车结构", - "block.create.cart_assembler.tooltip.behaviour1": "只有_单个_矿车装置,整个结构在旋转时会以这_单个_矿车为基点。使用_扳手_可以指定结构的_旋转行为_。", - "block.create.cart_assembler.tooltip.condition2": "连接矿车结构", - "block.create.cart_assembler.tooltip.behaviour2": "由_一整个结构所相连_的两个矿车装置,这_两个矿车_会被这_架设于它们之间的结构连接起来。这一结构的行为类似于_矿车联轴器_。", - "block.create.cart_assembler.tooltip.control1": "放置于轨道上时", - "block.create.cart_assembler.tooltip.action1": "通入红石信号时_装配_经过的矿车,未激活时_卸载_经过的矿车。", - "block.create.cart_assembler.tooltip.control2": "放置于充能铁轨上时", - "block.create.cart_assembler.tooltip.action2": "通入红石信号时_装配_并加速矿车,未激活时_卸载_并停住经过的矿车。", - "block.create.cart_assembler.tooltip.control3": "放置在探测铁轨上时", - "block.create.cart_assembler.tooltip.action3": "_装配未装配_过的矿车,_卸载装配_过的矿车。", - "block.create.cart_assembler.tooltip.control4": "放置在激活铁轨上时", - "block.create.cart_assembler.tooltip.action4": "通入红石信号时_卸载_矿车。", - - "block.create.rope_pulley.tooltip": "绳索滑轮", - "block.create.rope_pulley.tooltip.summary": "带动与其相接的_方块_以及_垂直方向上的结构_。你可以利用使用_底盘_、_粘液球_或_强力胶_来移动更多的方块。", - "block.create.rope_pulley.tooltip.condition1": "接入动力时", - "block.create.rope_pulley.tooltip.behaviour1": "根据输入的转速的大小以及方向,移动链接的结构。", - - "block.create.linear_chassis.tooltip": "机壳底盘", - "block.create.linear_chassis.tooltip.summary": "一种可配置的基础方块,用于连接运动结构。", - "block.create.linear_chassis.tooltip.condition1": "被移动时", - "block.create.linear_chassis.tooltip.behaviour1": "_带动_所有_相接的底盘_,以及上方一定范围内的柱形方块进行同方向移动。上方的方块想要被_带动_,底盘上面的面必须是_有黏性的_。(详参 Ctrl)", - "block.create.linear_chassis.tooltip.condition2": "手持扳手查看时", - "block.create.linear_chassis.tooltip.behaviour2": "配置可连接方块的_范围_。按住 _Ctrl_ 可以同时配置相连的其他底盘。", - "block.create.linear_chassis.tooltip.control1": "当用粘液球右击时", - "block.create.linear_chassis.tooltip.action1": "使得被使用面具有_黏性_。当移动时,无论具体的移动方向如何,底盘都会_带动_与该面相接的方块。", - - "block.create.secondary_linear_chassis.tooltip": "机壳底盘2号", - "block.create.secondary_linear_chassis.tooltip.summary": "第二种_机壳底盘_,不会与第一种机壳底盘互相连接。", - - "block.create.radial_chassis.tooltip": "旋转底盘", - "block.create.radial_chassis.tooltip.summary": "一种可配置的基础方块,用于连接运动结构。", - "block.create.radial_chassis.tooltip.condition1": "当被旋转时", - "block.create.radial_chassis.tooltip.behaviour1": "_带动_所有_附着于它_的,位于_其上方成柱形_的方块。侧面所附着的方块必需在一定的范围内且附着的面必须是有黏性的,方可被带动。(详参 Ctrl)", - "block.create.radial_chassis.tooltip.condition2": "手持扳手查看时", - "block.create.radial_chassis.tooltip.behaviour2": "配置可连接方块的_范围_。按住_Ctrl_可以同时配置相连的其他底盘。", - "block.create.radial_chassis.tooltip.control1": "当用粘液球右击时", - "block.create.radial_chassis.tooltip.action1": "使旋转底盘的这一面_具有黏性_。所有该方向上与其相连的方块会与其_一同移动_。", - - "block.create.mechanical_drill.tooltip": "动力钻头", - "block.create.mechanical_drill.tooltip.summary": "用于_破坏方块_的装置,可以被_动力活塞_和_动力轴承_等移动设备带动", - "block.create.mechanical_drill.tooltip.condition1": "当接入动力时", - "block.create.mechanical_drill.tooltip.behaviour1": "_原地_破坏正前方的方块,且_伤害_在一定范围内生物及玩家。", - "block.create.mechanical_drill.tooltip.condition2": "当移动时", - "block.create.mechanical_drill.tooltip.behaviour2": "横向或纵向沿路破坏其所_碰到_的方块。", - - "block.create.mechanical_harvester.tooltip": "动力收割机", - "block.create.mechanical_harvester.tooltip.summary": "适用于中型作物自动化的收割机,可以被_动力活塞_和_动力轴承_等带动。", - "block.create.mechanical_harvester.tooltip.condition1": "当移动时", - "block.create.mechanical_harvester.tooltip.behaviour1": "当收割机移动至_成熟作物_时,_收割_作物并将作物变为初始生长状态。", - - "block.create.mechanical_plough.tooltip": "动力犁", - "block.create.mechanical_plough.tooltip.summary": "犁是一个非常有用的多功能方块,它可以被_动力活塞_和_动力轴承_等带动", - "block.create.mechanical_plough.tooltip.condition1": "当移动时", - "block.create.mechanical_plough.tooltip.behaviour1": "可以打掉无碰撞体积的一些_附着方块_,比如火把和雪等。可以在不伤害实体的情况下移动它们。能像_锄头_一样翻土耕田。", - - "block.create.mechanical_saw.tooltip": "动力锯", - "block.create.mechanical_saw.tooltip.summary": "可以用于_砍树_,也可以用于_切割方块_,可以被_动力活塞_和_动力轴承_等带动", - "block.create.mechanical_saw.tooltip.condition1": "当向上放置时", - "block.create.mechanical_saw.tooltip.behaviour1": "对掉落或放置在其上方的方块应用_板材切割_以及_石材切割配方_。当可能出现多种产物时,它会进行循环输出,除非使用_过滤器_指定其输出产物。", - "block.create.mechanical_saw.tooltip.condition2": "当水平放置时", - "block.create.mechanical_saw.tooltip.behaviour2": "可以破坏其面前的_原木_。如果这些原木支撑着_一整颗树_,这棵_树_会被锯子_砍倒_。", - "block.create.mechanical_saw.tooltip.condition3": "当移动时", - "block.create.mechanical_saw.tooltip.behaviour3": "将会_砍倒_碰撞到的树。", - "block.create.stockpile_switch.tooltip": "存量转换器", "block.create.stockpile_switch.tooltip.summary": "根据连接的容器中_储存物品_的数量切换红石信号强度。自带有过滤槽,与_比较器_不同的是,你可以配置_存量转换器_信号反转的_阈值_。", "block.create.stockpile_switch.tooltip.condition1": "当右击时", @@ -1714,126 +1403,93 @@ "block.create.content_observer.tooltip": "物品侦测器", "block.create.content_observer.tooltip.summary": "检测_容器_和_传送带_中过滤器匹配的物品。当在_物品栏_,_传送带_或者_溜槽所容物_中侦测到匹配的物品时,此组件将发出_红石信号_。当观察到的漏斗_转移匹配的物品_时,此组件将发出_红石脉冲_。", - "block.create.redstone_link.tooltip": "无线红石信号终端", - "block.create.redstone_link.tooltip.summary": "无线红石信号终端,可以使用_任何物品_编辑终端_频道_。虽然距离挺远,但是终归是有限的。", - "block.create.redstone_link.tooltip.condition1": "当启用时", - "block.create.redstone_link.tooltip.behaviour1": "接收相同_频道_提供的_红石信号_。", - "block.create.redstone_link.tooltip.control1": "当手持方块右击方块时", - "block.create.redstone_link.tooltip.action1": "手持_任意物品_为其设置_频道_,可以使用两种物品组合设置_频道_。", - "block.create.redstone_link.tooltip.control2": "当潜行右击时", - "block.create.redstone_link.tooltip.action2": "在_发射模式_和_接收模式_之间切换。", - - "block.create.nixie_tube.tooltip": "辉光管", - "block.create.nixie_tube.tooltip.summary": "一个精致,且有红石能量激活的_数值_和_文本_显示器。", - "block.create.nixie_tube.tooltip.condition1": "通入红石信号时时", - "block.create.nixie_tube.tooltip.behaviour1": "直观的显示当前_红石信号_的强度", - "block.create.nixie_tube.tooltip.condition2": "被命名牌命名时", - "block.create.nixie_tube.tooltip.behaviour2": "在_沿直线排列_多个辉光管上显示_命名牌内容_。", - - "block.create.redstone_contact.tooltip": "接触式红石信号发生器", - "block.create.redstone_contact.tooltip.summary": "一种用于高级红石装置的设备。只能两两工作。可以被_动力活塞_和_动力轴承_等控制类机器带动。", - "block.create.redstone_contact.tooltip.condition1": "当正对面放置也放置相互朝向的接触信号发生器时", - "block.create.redstone_contact.tooltip.behaviour1": "发出_红石信号_。", - "block.create.redstone_contact.tooltip.condition2": "当移动时", - "block.create.redstone_contact.tooltip.behaviour2": "会使所有与其接触的发生器发出红石信号。", - "block.create.adjustable_crate.tooltip": "可调节板条箱", "block.create.adjustable_crate.tooltip.summary": "该箱子支持玩家对其容量进行调整,最大可以容纳_16组_物品。支持_红石比较器_。", - "block.create.adjustable_crate.tooltip.control1": "当右击时", - "block.create.adjustable_crate.tooltip.action1": "打开箱子", + "block.create.adjustable_crate.tooltip.condition1": "当右击时", + "block.create.adjustable_crate.tooltip.behaviour1": "打开_配置面板_。", "block.create.creative_crate.tooltip": "创造板条箱", "block.create.creative_crate.tooltip.summary": "这种_储存容器_可以无限地复制任何物品。它还可以移除附近的_蓝图加农炮_的材料需求。", "block.create.creative_crate.tooltip.condition1": "当标记了物品时", "block.create.creative_crate.tooltip.behaviour1": "任何从容器中_提取_的物品都是_无限量的_,而任何_放置_到容器中的物品都会被_送入虚空_", - "block.create.deployer.tooltip": "机械手", - "block.create.deployer.tooltip.summary": "_攻击_,_使用_,以及_激活_。这个机器会竭尽所能地_模仿_一个_玩家_的行为。它可以将物品从其自身的_物品栏_中_拿取_出来,或者将物品_存入_其中。", - "block.create.deployer.tooltip.condition1": "接入动能时", - "block.create.deployer.tooltip.behaviour1": "机械手可伸长_两个方块_的距离,取出_缓存区_的物品并使用。", - "block.create.deployer.tooltip.condition2": "当使用扳手右击时", - "block.create.deployer.tooltip.behaviour2": "启用拳头模式,在拳头模式之下,机械手将会试图使用手中的物品_破坏方块_,或者_攻击实体_。", - "block.create.deployer.tooltip.condition3": "配有过滤器时", - "block.create.deployer.tooltip.behaviour3": "只有在机械手手持的物品与_过滤器_物品相_匹配_时才会激活。不匹配的物品无法被其持有;匹配且持有在机械手上的物品无法被提取。", - - "block.create.brass_casing.tooltip": "黄铜机壳", - "block.create.brass_casing.tooltip.summary": "一种坚固的机壳,有多种用途。可以用来包装_传动杆_以及_传送带_。", - - "block.create.pulse_repeater.tooltip": "脉冲中继器", - "block.create.pulse_repeater.tooltip.summary": "一个简单的电路元件,将通过的红石信号变为 1 tick。", - - "block.create.adjustable_repeater.tooltip": "可调节中继器", - "block.create.adjustable_repeater.tooltip.summary": "高级中继器,最大可设置 30 分钟延迟。", - - "block.create.adjustable_pulse_repeater.tooltip": "可调节脉冲中继器", - "block.create.adjustable_pulse_repeater.tooltip.summary": "一种单次 1 tick 的红石脉冲器,可以调节延时至30 min。", - - "block.create.analog_lever.tooltip": "模拟拉杆", - "block.create.analog_lever.tooltip.summary": "一种可以调节任意信号强度的推杆。", - - "block.create.powered_toggle_latch.tooltip": "转换锁存器", - "block.create.powered_toggle_latch.tooltip.summary": "一种拉杆,在红石电路中可以用作转换锁存器。", - - "block.create.powered_latch.tooltip": "锁存器", - "block.create.powered_latch.tooltip.summary": "一种拉杆,在红石电路中用作锁存器,从后方输入将会启用这个拉杆,从侧边输入将会重置这个拉杆。", + "item.create.creative_cake.tooltip": "创造烈焰蛋糕", + "item.create.creative_cake.tooltip.summary": "为辛勤劳作的_烈焰人_精心准备的特别的美味。烈焰人吃了这个以后将_再也不需要燃料_。", + "item.create.creative_cake.tooltip.condition1": "对烈焰人燃烧室右击使用时", + "item.create.creative_cake.tooltip.behaviour1": "_固定_烈焰人燃烧室当前的燃料量。再次右击可以在不同燃料量之间_切换_。", "block.create.controller_rail.tooltip": "控制铁轨", "block.create.controller_rail.tooltip.summary": "一种_汇流的,受红石信号影响的_铁轨,可以_较好地控制_经过矿车的_移动速度_。", "block.create.controller_rail.tooltip.condition1": "通入红石信号时时", "block.create.controller_rail.tooltip.behaviour1": "根据信号强度_加速_或_减速_经过的矿车。还会将红石信号传递到相邻的控制铁轨。向两个控制铁轨通入不同等级的红石信号,两者中间的轨道会受到以此为区间的连续等级的红石信号的激活。", - "block.create.speedometer.tooltip": "速度表", - "block.create.speedometer.tooltip.summary": "测量并展示连接网络的_旋转速度_,支持使用_红石比较器_。", - "block.create.speedometer.tooltip.condition1": "接入动力时", - "block.create.speedometer.tooltip.behaviour1": "将会用颜色展示速度的大小,_绿色_为慢速、_蓝色_为中速、_紫色_为快速。一些动力组件需要足够的速度等级方能正常工作。", - - "block.create.stressometer.tooltip": "应力表", - "block.create.stressometer.tooltip.summary": "测量并展示连接网络的_应力值_,支持使用_红石比较器_。", - "block.create.stressometer.tooltip.condition1": "接入动力时", - "block.create.stressometer.tooltip.behaviour1": "将会用颜色展示承受的应力。如果_网络过载_则会瘫痪,必须_减少使用机器_或者_增加动力源_。", - "item.create.sand_paper.tooltip": "砂纸", "item.create.sand_paper.tooltip.summary": "用来_打磨_物品的砂纸,可以用_机械手_来实现自动化。", "item.create.sand_paper.tooltip.condition1": "使用时", "item.create.sand_paper.tooltip.behaviour1": "打磨_副手_上或者_准心所指_的物品。", - "item.create.super_glue.tooltip": "强力胶", - "item.create.super_glue.tooltip.summary": "让两个方块互相_粘在一起_,他们将再也无法分开了。", - "item.create.super_glue.tooltip.condition1": "右击使用时", - "item.create.super_glue.tooltip.behaviour1": "有强力胶的方块的_那一面_会变得有黏性。和此面相邻的方块在被_动力活塞_或者_动力轴承_等方块驱动的时候会被一同带动", - "item.create.super_glue.tooltip.condition2": "在副手上时", - "item.create.super_glue.tooltip.behaviour2": "主手放置的方块会被_直接_粘在所放置的方块上", - "item.create.builders_tea.tooltip": "建造工茶饮", "item.create.builders_tea.tooltip.summary": "饮下这杯完美茶饮,开启神清气爽的一天。可以回复_饥饿值_并获得_急迫_效果。", "item.create.refined_radiance.tooltip": "光辉石", "item.create.refined_radiance.tooltip.summary": "一种用_光辉_锻造的化合物材料。", + "item.create.refined_radiance.tooltip.condition1": "尚未完工", + "item.create.refined_radiance.tooltip.behaviour1": "该材料在未来可能会有更多的用途。", "item.create.shadow_steel.tooltip": "暗影钢", "item.create.shadow_steel.tooltip.summary": "一种用_虚空_锻造的化合物材料。", + "item.create.shadow_steel.tooltip.condition1": "尚未完工", + "item.create.shadow_steel.tooltip.behaviour1": "该材料在未来可能会有更多的用途。", + + "item.create.linked_controller.tooltip": "无线红石遥控器", + "item.create.linked_controller.tooltip.summary": "提供_六个_可以绑定_无线红石_频道的按钮,用于_遥控_附近的_无线红石信号终端_。", + "item.create.linked_controller.tooltip.condition1": "右击时", + "item.create.linked_controller.tooltip.behaviour1": "_拿起_或_放下_遥控器。拿起遥控器时,_移动_按键将被用来_操作遥控器_而不是移动玩家。", + "item.create.linked_controller.tooltip.condition2": "潜行右击时", + "item.create.linked_controller.tooltip.behaviour2": "打开手动_配置界面_。", + "item.create.linked_controller.tooltip.condition3": "右击无线红石信号终端时", + "item.create.linked_controller.tooltip.behaviour3": "启用_配对模式_,按_六个按键_中的一个来配对_无线红石信号终端_的_频率_。", + "item.create.linked_controller.tooltip.condition4": "右击讲台时", + "item.create.linked_controller.tooltip.behaviour4": "将遥控器放在讲台上以便使用。(潜行右击来取回遥控器。)", + + "item.create.diving_helmet.tooltip": "潜水头盔", + "item.create.diving_helmet.tooltip.summary": "与_铜制背罐_配合使用,为穿戴者提供在_水下_行动一段时间所需的_空气_。", + "item.create.diving_helmet.tooltip.condition1": "戴在头上时", + "item.create.diving_helmet.tooltip.behaviour1": "提供_水下呼吸_效果。缓慢消耗背罐中的_压缩空气_。", + + "item.create.copper_backtank.tooltip": "铜制背罐", + "item.create.copper_backtank.tooltip.summary": "一个可以_背在背上_的_铜罐_,用于携带一定量的压缩空气。", + "item.create.copper_backtank.tooltip.condition1": "背在背上时", + "item.create.copper_backtank.tooltip.behaviour1": "为其他需要_压缩空气_的装备提供所需的空气。", + "item.create.copper_backtank.tooltip.condition2": "当放下并接入动力时", + "item.create.copper_backtank.tooltip.behaviour2": "基于转速从周围环境中_收集_并_加压空气_。", + + "item.create.diving_boots.tooltip": "潜水靴", + "item.create.diving_boots.tooltip.summary": "一双_沉重的靴子_,让穿戴者可以更方便的探索海底。", + "item.create.diving_boots.tooltip.condition1": "穿在脚上时", + "item.create.diving_boots.tooltip.behaviour1": "穿戴者_下沉更快_并_无法游泳_。穿戴者可以在水下_行走_和_跳跃_。穿戴者不会被_传送带_移走。", + + "item.create.crafting_blueprint.tooltip": "合成蓝图", + "item.create.crafting_blueprint.tooltip.summary": "_放在_墙上。设置特定的_原料排布_以便更快地手搓物品。每个格子都可以设定一个配方。", + "item.create.crafting_blueprint.condition1": "当右击空的格子时", + "item.create.crafting_blueprint.behaviour1": "打开一个_配方设置界面_,用于_设置_一个_合成配方_以及设置显示的图标。", + "item.create.crafting_blueprint.condition2": "当右击设置好的格子时", + "item.create.crafting_blueprint.behaviour2": "使用_物品栏_中的物品制作_设置的配方_。_潜行_以一次合成_一组_。", "item.create.minecart_coupling.tooltip": "矿车连轴器", "item.create.minecart_coupling.tooltip.summary": "将多个_矿车_或运输结构链接在一起,构成雄伟的火车。", "item.create.minecart_coupling.tooltip.condition1": "作用与矿车时", "item.create.minecart_coupling.tooltip.behaviour1": "将两个矿车耦合在一起,在移动时将它们保持_恒定的距离_。", - "item.create.crafter_slot_cover.tooltip": "合成器盖板", - "item.create.crafter_slot_cover.tooltip.summary": "用来标记_动力合成器_以不放入物品。在制造与桶类似的斜向合成表时非常有用。", + "block.create.peculiar_bell.tooltip": "奇异钟", + "block.create.peculiar_bell.tooltip.summary": "装饰用的_黄铜质钟_。放在_灵魂火_的正上方可能会产生意料之外的后果……", + + "block.create.haunted_bell.tooltip": "怪异钟", + "block.create.haunted_bell.tooltip.summary": "_被诅咒_的钟,其中充满了来自下界的迷失的灵魂。", + "block.create.haunted_bell.tooltip.condition1": "当手持或鸣响时", + "block.create.haunted_bell.tooltip.behaviour1": "标识出附近可能生成_敌对生物_的_黑暗_的地方。", - "create.tooltip.wip": "WIP", - "create.tooltip.workInProgress": "这东西还没有做完!", - "create.tooltip.randomWipDescription0": "别把这玩意给熊孩子", - "create.tooltip.randomWipDescription1": "每次你使用这个东西,都会让一只无辜的熊猫丢掉性命,每!一!次!", - "create.tooltip.randomWipDescription2": "使用后果自负", - "create.tooltip.randomWipDescription3": "(摇手指)这可不是你在找的物品,走开吧", - "create.tooltip.randomWipDescription4": "自爆模式已启动,10,9,8..。", - "create.tooltip.randomWipDescription5": "相信我,你现在已经没有回头路了。", - "create.tooltip.randomWipDescription6": "如果你使用这个东西,那么本作者与它造成的任何后果没有责任。", - "create.tooltip.randomWipDescription7": "这玩意不是给你用的,换个吧", - "create.tooltip.randomWipDescription8": "试试就逝世。", - "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "按住 [%1$s] 开始思索", @@ -1848,41 +1504,46 @@ "create.ponder.replay": "重放", "create.ponder.think_back": "回想", "create.ponder.slow_text": "舒适阅读", - "create.ponder.shared.movement_anchors": "有了底盘和强力胶,移动起大型结构轻轻松松。", - "create.ponder.shared.rpm32": "32 RPM", - "create.ponder.shared.sneak_and": "潜行 +", - "create.ponder.shared.storage_on_contraption": "与装置相接的存储空间,会自动将装置遇到的掉落物拾取到空间内。", + "create.ponder.exit": "退出", + "create.ponder.welcome": "欢迎来到思索项目列表", + "create.ponder.categories": "机械动力中包含的条目", + "create.ponder.index_description": "点击一个图标来查看相关的物品和方块。", + "create.ponder.index_title": "思索项目列表", + "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "可以用扳手调整它的行为。", + "create.ponder.shared.storage_on_contraption": "与装置相接的存储空间,会自动将装置遇到的掉落物拾取到空间内。", + "create.ponder.shared.sneak_and": "潜行 +", "create.ponder.shared.rpm8": "8 RPM", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "动力源:16 R", - "create.ponder.shared.rpm16": "16 RPM", - "create.ponder.tag.kinetic_sources": "动力源", - "create.ponder.tag.kinetic_sources.description": "能够发生动力的组件。", - "create.ponder.tag.contraption_actor": "装置执行组件", - "create.ponder.tag.contraption_actor.description": "能在移动的装置上执行特殊功能的组件", - "create.ponder.tag.arm_targets": "机械臂的工作目标", - "create.ponder.tag.arm_targets.description": "该组件可做为机械臂的输入或者输出点。", - "create.ponder.tag.logistics": "物品运输", - "create.ponder.tag.logistics.description": "该组件可以协助物品运输", - "create.ponder.tag.movement_anchor": "运动源泉", - "create.ponder.tag.movement_anchor.description": "有了它,运动装置才得以可能,它可以以数种方式使相接的结构运动起来。", - "create.ponder.tag.creative": "创造模式", - "create.ponder.tag.creative.description": "总有些东西是生存模式得不到的。", - "create.ponder.tag.kinetic_relays": "动力方块", - "create.ponder.tag.kinetic_relays.description": "用于传递旋转力的组件。", - "create.ponder.tag.windmill_sails": "风车轴承的帆", - "create.ponder.tag.windmill_sails.description": "在进行风车组装时会被算入风车旋转力的方块,这些方块的效能都是一样的。", - "create.ponder.tag.contraption_assembly": "方块连接物件", - "create.ponder.tag.contraption_assembly.description": "将各个组件连接以便同时运动的物件", - "create.ponder.tag.decoration": "装饰", - "create.ponder.tag.decoration.description": "装饰是这些组件的常见用法。", - "create.ponder.tag.kinetic_appliances": "动力设备", - "create.ponder.tag.kinetic_appliances.description": "这些组件可以利用旋转力进行工作。", + "create.ponder.shared.movement_anchors": "有了底盘和强力胶,移动起大型结构轻轻松松。", "create.ponder.tag.redstone": "逻辑组件", "create.ponder.tag.redstone.description": "这些组件会在红石工程中发挥大用处。", + "create.ponder.tag.contraption_assembly": "方块连接物件", + "create.ponder.tag.contraption_assembly.description": "将各个组件连接以便同时运动的物件", "create.ponder.tag.fluids": "流体操纵器械", "create.ponder.tag.fluids.description": "这些组件可以用于传递流体,以及利用流体进行工作。", + "create.ponder.tag.decoration": "装饰", + "create.ponder.tag.decoration.description": "装饰是这些组件的常见用法。", + "create.ponder.tag.windmill_sails": "风车轴承的帆", + "create.ponder.tag.windmill_sails.description": "在进行风车组装时会被算入风车旋转力的方块,这些方块的效能都是一样的。", + "create.ponder.tag.arm_targets": "机械臂的工作目标", + "create.ponder.tag.arm_targets.description": "该组件可做为机械臂的输入或者输出点。", + "create.ponder.tag.kinetic_appliances": "动力设备", + "create.ponder.tag.kinetic_appliances.description": "这些组件可以利用旋转力进行工作。", + "create.ponder.tag.kinetic_sources": "动力源", + "create.ponder.tag.kinetic_sources.description": "能够发生动力的组件。", + "create.ponder.tag.movement_anchor": "运动源泉", + "create.ponder.tag.movement_anchor.description": "有了它,运动装置才得以可能,它可以以数种方式使相接的结构运动起来。", + "create.ponder.tag.kinetic_relays": "动力方块", + "create.ponder.tag.kinetic_relays.description": "用于传递旋转力的组件。", + "create.ponder.tag.contraption_actor": "装置执行组件", + "create.ponder.tag.contraption_actor.description": "能在移动的装置上执行特殊功能的组件", + "create.ponder.tag.creative": "创造模式", + "create.ponder.tag.creative.description": "总有些东西是生存模式得不到的。", + "create.ponder.tag.logistics": "物品运输", + "create.ponder.tag.logistics.description": "该组件可以协助物品运输", "create.ponder.adjustable_pulse_repeater.header": "使用可调节脉冲中继器控制信号发送", "create.ponder.adjustable_pulse_repeater.text_1": "可调节脉冲中继器在一段延时之后会发出一道短时脉冲", @@ -1994,7 +1655,8 @@ "create.ponder.cart_assembler_modes.header": "矿车装置的方向设定", "create.ponder.cart_assembler_modes.text_1": "矿车装置会随着矿车的运动而发生转向", - "create.ponder.cart_assembler_modes.text_2": "如果装配结构的方向锁定了,那么结构的方向将不再改变", + "create.ponder.cart_assembler_modes.text_2": "矿车装置上的箭头表明了哪一侧是“前面”", + "create.ponder.cart_assembler_modes.text_3": "如果装配结构的方向锁定了,那么结构的方向将不再改变", "create.ponder.cart_assembler_rails.header": "另外几种矿车以及铁轨", "create.ponder.cart_assembler_rails.text_1": "放置在普通轨道上的矿车装配站并不会影响路过矿车装置的运动", @@ -2048,6 +1710,12 @@ "create.ponder.cogwheel.text_1": "齿轮会将动力传递至临近的齿轮", "create.ponder.cogwheel.text_2": "以此方式连接的齿轮,旋转方向相反", + "create.ponder.creative_fluid_tank.header": "创造流体储罐", + "create.ponder.creative_fluid_tank.text_1": "创造流体储罐可以提供无限数量的流体", + "create.ponder.creative_fluid_tank.text_2": "使用一个含有流体的容器右击它来设置它提供的流体", + "create.ponder.creative_fluid_tank.text_3": "流体管道可以从中无限提取设置的流体", + "create.ponder.creative_fluid_tank.text_4": "任何被输入创造流体储罐的液体都将被销毁", + "create.ponder.creative_motor.header": "使用创造马达发生旋转", "create.ponder.creative_motor.text_1": "创造马达不仅能够手动调配输出旋转力,而且体积相当小巧", "create.ponder.creative_motor.text_2": "对其背侧面板滚动滑轮,可以改变马达的输出旋转转速", @@ -2084,6 +1752,12 @@ "create.ponder.deployer_modes.text_1": "在默认情况下,机械手模仿玩家的右击交互", "create.ponder.deployer_modes.text_2": "使用扳手可以将模式调整为模仿玩家的左击交互", + "create.ponder.deployer_processing.header": "使用机械手处理物品", + "create.ponder.deployer_processing.text_1": "当机械手持有合适的物品时,它可以自动处理下方的物品", + "create.ponder.deployer_processing.text_2": "物品可以被丢在机械手下方,或放在置物台上", + "create.ponder.deployer_processing.text_3": "当传送带上的物品经过机械手下方时...", + "create.ponder.deployer_processing.text_4": "...机械手会使物品停下,然后处理这个物品", + "create.ponder.deployer_redstone.header": "使用红石控制机械手", "create.ponder.deployer_redstone.text_1": "当被红石充能时,机械手会停止工作", "create.ponder.deployer_redstone.text_2": "在停止工作前,机械手会完成当前正在进行的工作周期", @@ -2100,7 +1774,13 @@ "create.ponder.empty_blaze_burner.text_2": "或者,也可以通过右击烈焰人刷怪笼来填充激活烈焰人燃烧室", "create.ponder.empty_blaze_burner.text_3": "这样,你便有了一个可供部分机器加工的热源", "create.ponder.empty_blaze_burner.text_4": "如果是为了美观,空的烈焰人燃烧室也可以被打火石点燃", - "create.ponder.empty_blaze_burner.text_5": "但是,这样的热源不足以给机器提加工供足够的热量", + "create.ponder.empty_blaze_burner.text_5": "使用包含灵魂的物品可以将火焰变为灵魂火", + "create.ponder.empty_blaze_burner.text_6": "但是,这样的热源不足以给机器提加工供足够的热量", + + "create.ponder.encased_fluid_pipe.header": "遮掩流体管道", + "create.ponder.encased_fluid_pipe.text_1": "铜机壳可以用于装饰流体管道", + "create.ponder.encased_fluid_pipe.text_2": "除了遮掩流体管道之外,装有铜机壳的流体管道将不会改变其连接状态", + "create.ponder.encased_fluid_pipe.text_3": "它将不会对旁边新增加或移除的管道做出反应", "create.ponder.fan_direction.header": "鼓风机的气流", "create.ponder.fan_direction.text_1": "鼓风机使用旋转力来制造气流", @@ -2120,6 +1800,35 @@ "create.ponder.fan_source.text_1": "如鼓风机的扇叶向下朝着热源放置,鼓风机可以借此产生旋转力", "create.ponder.fan_source.text_2": "当鼓风机接受红石信号后,它便会向外供给旋转力", + "create.ponder.fluid_pipe_flow.header": "使用管道运输流体", + "create.ponder.fluid_pipe_flow.text_1": "流体管道可以用于连接两个或多个流体容器", + "create.ponder.fluid_pipe_flow.text_2": "使用扳手为直的管道增加观察窗", + "create.ponder.fluid_pipe_flow.text_3": "带有观察窗的管道不会建立侧向连接", + "create.ponder.fluid_pipe_flow.text_4": "通过使用动力泵,流体管道可以传输流体", + "create.ponder.fluid_pipe_flow.text_5": "一开始,流体不会真正被消耗", + "create.ponder.fluid_pipe_flow.text_6": "当管道内的液体流彻底联通之后,流体才会开始逐渐从一个容器中转移到另一个", + "create.ponder.fluid_pipe_flow.text_7": "这意味着流体管道本身并不真正存储任何流体", + + "create.ponder.fluid_pipe_interaction.header": "抽取和填充流体容器", + "create.ponder.fluid_pipe_interaction.text_1": "流体管道的末端可以与许多种容器连接", + "create.ponder.fluid_pipe_interaction.text_2": "任何可以容纳流体的容器都可以被填充或从中抽取", + "create.ponder.fluid_pipe_interaction.text_3": "开放的管道口可以吸走流体源块...", + "create.ponder.fluid_pipe_interaction.text_4": "...或者将流体源排放出来", + "create.ponder.fluid_pipe_interaction.text_5": "管道也可以从许多其他方块中直接抽取流体", + + "create.ponder.fluid_tank_sizes.header": "流体储罐的大小", + "create.ponder.fluid_tank_sizes.text_1": "多格流体储罐可以被放置在一起来提供更大的容量", + "create.ponder.fluid_tank_sizes.text_2": "流体储罐最大可以有3x3的横截面...", + "create.ponder.fluid_tank_sizes.text_3": "...并且可以有超过30格高", + "create.ponder.fluid_tank_sizes.text_4": "使用扳手可以打开或关闭观察窗", + + "create.ponder.fluid_tank_storage.header": "使用流体储罐存储流体", + "create.ponder.fluid_tank_storage.text_1": "流体储罐可以存储大量的流体", + "create.ponder.fluid_tank_storage.text_2": "流体管道可以从任何一面将流体输入/输出流体储罐", + "create.ponder.fluid_tank_storage.text_3": "使用比较器可以检测储罐中的流体储量", + "create.ponder.fluid_tank_storage.text_4": "在生存模式中,无法直接用容器将流体装入或取出储罐", + "create.ponder.fluid_tank_storage.text_5": "要装满/倒空流体容器,可以使用工作盆,分液池或注液器。", + "create.ponder.flywheel.header": "使用飞轮来产生旋转力", "create.ponder.flywheel.text_1": "飞轮和熔炉引擎必须配套使用,方可产生旋转力", "create.ponder.flywheel.text_2": "如此产生的旋转力具有非常大的应力值", @@ -2193,6 +1902,34 @@ "create.ponder.hand_crank.text_3": "它产生的转速相对较高", "create.ponder.hand_crank.text_4": "潜行长按右键可以顺时针旋转它", + "create.ponder.hose_pulley.header": "使用软管滑轮抽取或排放流体", + "create.ponder.hose_pulley.text_1": "软管滑轮可以用于方便的抽取或填满一个较大区域中的流体", + "create.ponder.hose_pulley.text_2": "通过输入动力可以调节软管末端的高度", + "create.ponder.hose_pulley.text_3": "翻转动力输入的方向可以收起软管", + "create.ponder.hose_pulley.text_4": "管道可以连接在另一侧", + "create.ponder.hose_pulley.text_5": "连接的管道可以将流体输入软管滑轮以在下方放置流体源...", + "create.ponder.hose_pulley.text_6": "...或者提供吸力来抽取世界中的流体", + "create.ponder.hose_pulley.text_7": "软管滑轮的抽取/排放速度取决于连接管道中流体的流速", + + "create.ponder.hose_pulley_infinite.header": "从大型水体中抽取或向其排放", + "create.ponder.hose_pulley_infinite.text_1": "当软管被放进足够大的水体中时...", + "create.ponder.hose_pulley_infinite.text_2": "...它在抽取或排放液体时将不会影响流体源", + "create.ponder.hose_pulley_infinite.text_3": "可以从这些软管滑轮中无限的抽取或向其排放流体", + + "create.ponder.hose_pulley_level.header": "软管滑轮的排水/抽水机制", + "create.ponder.hose_pulley_level.text_1": "当软管彻底收回时,软管滑轮无法工作。", + "create.ponder.hose_pulley_level.text_2": "流体会由上至下被抽取", + "create.ponder.hose_pulley_level.text_3": "流体表面最终将会被抽取到刚好低于软管开口", + "create.ponder.hose_pulley_level.text_4": "流体将会由下至上被填充", + "create.ponder.hose_pulley_level.text_5": "流体最多只能被填充至软管开口所在的高度", + + "create.ponder.item_drain.header": "使用分液池提取物品中的流体", + "create.ponder.item_drain.text_1": "分液池可以提取容器中的流体", + "create.ponder.item_drain.text_2": "右键点击可以将手持的容器中的流体倒入分液池", + "create.ponder.item_drain.text_3": "当物品从侧面输入时...", + "create.ponder.item_drain.text_4": "...物品将会经过分液池顶部,并在过程中将其包含的液体排入分液池", + "create.ponder.item_drain.text_5": "流体管到可以从分液池中抽取液体", + "create.ponder.large_cogwheel.header": "使用大齿轮传递旋转力", "create.ponder.large_cogwheel.text_1": "大齿轮可以以特定的角度相互连接", "create.ponder.large_cogwheel.text_2": "可以利用大齿轮变更旋转轴向", @@ -2303,18 +2040,33 @@ "create.ponder.mechanical_plough.text_3": "此外,动力犁可以耕地", "create.ponder.mechanical_plough.text_4": "...它也可以在不伤害实体的情况下推动它们", - "create.ponder.mechanical_press.header": "使用动力辊轧机处理物品", - "create.ponder.mechanical_press.text_1": "动力辊轧机可以处理位于其下方的物品", + "create.ponder.mechanical_press.header": "使用动力辊压机处理物品", + "create.ponder.mechanical_press.text_1": "动力辊压机可以处理位于其下方的物品", "create.ponder.mechanical_press.text_2": "在其下方丢入物品,或者将物品放在置物台上,都算作有效的物品输入", - "create.ponder.mechanical_press.text_3": "若物品被输入时正位于传送带上...", - "create.ponder.mechanical_press.text_4": "辊轧机会使物品停下,然后自动处理这一物品", + "create.ponder.mechanical_press.text_3": "当传送带上的物品经过辊压机下方时....", + "create.ponder.mechanical_press.text_4": "辊压机会使物品停下,然后自动处理这一物品", - "create.ponder.mechanical_press_compacting.header": "使用动力辊轧机压缩物品", + "create.ponder.mechanical_press_compacting.header": "使用动力辊压机压缩物品", "create.ponder.mechanical_press_compacting.text_1": "对放置于工作盆内的物品进行辊轧,可以将这些物品压缩在一起", "create.ponder.mechanical_press_compacting.text_2": "压缩意指任何同种物品填满了 2x2 或者 3x3 网格的配方,以及一些额外的配方", "create.ponder.mechanical_press_compacting.text_3": "一些配方可能需要烈焰人燃烧室提供热量", "create.ponder.mechanical_press_compacting.text_4": "过滤槽可用于解决两个配方相互冲突的情况", + "create.ponder.mechanical_pump_flow.header": "使用动力泵传输流体", + "create.ponder.mechanical_pump_flow.text_1": "动力泵可以控制管道中的液体流向", + "create.ponder.mechanical_pump_flow.text_2": "当接入动力时,其上的箭头指示液体流向", + "create.ponder.mechanical_pump_flow.text_3": "后方的管道中将会产生吸力...", + "create.ponder.mechanical_pump_flow.text_4": "...而液体将被输入前方的管道", + "create.ponder.mechanical_pump_flow.text_5": "反转动力方向将会改变液体流向", + "create.ponder.mechanical_pump_flow.text_6": "使用扳手可以手动改变动力泵的朝向", + + "create.ponder.mechanical_pump_speed.header": "动力泵的传输机制", + "create.ponder.mechanical_pump_speed.text_1": "动力泵的压力最多沿管线传递16格,与输入动力无关", + "create.ponder.mechanical_pump_speed.text_2": "输入动力将会影响压力改变速度...", + "create.ponder.mechanical_pump_speed.text_3": "...以及流体的传输速度", + "create.ponder.mechanical_pump_speed.text_4": "多个并联动力泵的传输量可以叠加", + "create.ponder.mechanical_pump_speed.text_5": "交替摆放动力泵可以方便的控制液体流动", + "create.ponder.mechanical_saw_breaker.header": "使用动力锯伐木", "create.ponder.mechanical_saw_breaker.text_1": "向其通入旋转力后,动力锯可以直接砍伐掉它面前的树木", "create.ponder.mechanical_saw_breaker.text_2": "想要一次性砍掉整棵树,锯子必须破坏掉树与地面连接的最后一个方块", @@ -2326,7 +2078,7 @@ "create.ponder.mechanical_saw_processing.header": "使用动力锯处理物品", "create.ponder.mechanical_saw_processing.text_1": "面向朝上的动力锯可以将物品处理为其变种", "create.ponder.mechanical_saw_processing.text_2": "处理过后的物品的弹出方向始终与通入锯中的旋转转向相反", - "create.ponder.mechanical_saw_processing.text_3": "锯子可以", + "create.ponder.mechanical_saw_processing.text_3": "锯子可以配合其两侧的传送带输入输出", "create.ponder.mechanical_saw_processing.text_4": "若输入原料有多种可能产物,你可以用动力锯上的过滤槽指定只产出某种产物", "create.ponder.mechanical_saw_processing.text_5": "若没有使用过滤槽,动力锯会在各产物中按顺序循环输出", @@ -2339,21 +2091,32 @@ "create.ponder.nixie_tube.header": "使用辉光管", "create.ponder.nixie_tube.text_1": "通入红石信号后,辉光管会显示出红石信号的强度", - "create.ponder.nixie_tube.text_2": "使用命名牌在铁砧上为其命名,可以自定义它的显示文本", + "create.ponder.nixie_tube.text_2": "在其上右键使用更改过名称的命名牌,可以自定义它的显示文本", + "create.ponder.nixie_tube.text_3": "使用染料右键以更改辉光管的显示颜色", "create.ponder.piston_pole.header": "活塞延长杆", "create.ponder.piston_pole.text_1": "若无相接的延长杆,动力活塞无法移动其他方块", "create.ponder.piston_pole.text_2": "在其背面安装的延长杆长度,决定了活塞的推动范围", + "create.ponder.portable_fluid_interface.header": "装置流体交换", + "create.ponder.portable_fluid_interface.text_1": "管道无法与运动装置内的流体储罐直接交互", + "create.ponder.portable_fluid_interface.text_2": "这一组件可以在不停止装置的情况下与装置内的流体存储进行交互", + "create.ponder.portable_fluid_interface.text_3": "放置第二个接口时,记得要与装置接口相隔 1 格或者 2 格的距离", + "create.ponder.portable_fluid_interface.text_4": "当它们彼此经过时,它们会连接在一起", + "create.ponder.portable_fluid_interface.text_5": "连接状态下,固定侧接口便会作为整个装置的流体存储代理", + "create.ponder.portable_fluid_interface.text_6": "流体可被泵入到装置内....", + "create.ponder.portable_fluid_interface.text_7": "...或是从装置中抽取出来", + "create.ponder.portable_fluid_interface.text_8": "如果一小段时间内没有流体交换,接口将会断开连接,然后装置重新开始运动", + "create.ponder.portable_storage_interface.header": "装置存储交换", "create.ponder.portable_storage_interface.text_1": "玩家无法与运动装置内的存储空间进行交互", "create.ponder.portable_storage_interface.text_2": "这一组件可以在不停止装置的情况下与装置内的存储空间进行交互", "create.ponder.portable_storage_interface.text_3": "放置第二个接口时,记得要与装置接口相隔 1 格或者 2 格的距离", "create.ponder.portable_storage_interface.text_4": "当它们彼此经过时,它们会连接在一起", "create.ponder.portable_storage_interface.text_5": "连接状态下,固定侧接口便会作为整个装置的存储空间代理", - "create.ponder.portable_storage_interface.text_6": "物品会被输入到装置内...", + "create.ponder.portable_storage_interface.text_6": "物品可被输入到装置内...", "create.ponder.portable_storage_interface.text_7": "...或是从装置中提取出来", - "create.ponder.portable_storage_interface.text_8": "物品交换完毕后,装置仍然会停留在原地一小会,然后才会继续前行", + "create.ponder.portable_storage_interface.text_8": "如果一小段时间内没有物品交换,接口将会断开连接,然后装置重新开始运动", "create.ponder.portable_storage_interface_redstone.header": "红石控制", "create.ponder.portable_storage_interface_redstone.text_1": "通入红石信号可以阻止固定侧接口的连接行为", @@ -2442,11 +2205,25 @@ "create.ponder.smart_chute.text_3": "使用鼠标滚轮可以指定被过滤的物品数量", "create.ponder.smart_chute.text_4": "通入红石信号,智能溜槽将会完全暂停工作", + "create.ponder.smart_pipe.header": "使用智能流体管道控制液体流动", + "create.ponder.smart_pipe.text_1": "智能流体管道可以限制通过它的流体种类", + "create.ponder.smart_pipe.text_2": "当紧邻流体源放置时,管道只会抽取设置的流体种类", + "create.ponder.smart_pipe.text_3": "使用任何包含流体的容器右键过滤槽来标记过滤的流体", + "create.ponder.smart_pipe.text_4": "当放在管线中时,只有匹配过滤器的流体才能流入它后方的管道", + "create.ponder.speedometer.header": "使用速度表来监测转速", "create.ponder.speedometer.text_1": "速度表能显示相接组件的转速", "create.ponder.speedometer.text_2": "当佩戴工程师护目镜时,可以看到仪表所显示的更详细的数据", "create.ponder.speedometer.text_3": "红石比较器可以根据速度表的数值输出不同强弱的红石信号", + "create.ponder.spout_filling.header": "使用注液器填充物品", + "create.ponder.spout_filling.text_1": "注液器可以将流体装入下方经过的,可以接受该流体的物品", + "create.ponder.spout_filling.text_2": "注液器的流体存储无法直接手动交互", + "create.ponder.spout_filling.text_3": "使用管线可以将流体输入注液器", + "create.ponder.spout_filling.text_4": "要被处理的物品可以被放置在其下方的置物台上", + "create.ponder.spout_filling.text_5": "当传送带上的物品经过注液器下方时...", + "create.ponder.spout_filling.text_6": "注液器会使物品停下,然后自动处理这一物品", + "create.ponder.stabilized_bearings.header": "装置固定朝向", "create.ponder.stabilized_bearings.text_1": "当动力轴承在结构被带动时...", "create.ponder.stabilized_bearings.text_2": "...它会确保它转盘的垂直朝向不变", @@ -2478,6 +2255,12 @@ "create.ponder.valve_handle.text_4": "潜行右击可使它顺时针旋转", "create.ponder.valve_handle.text_5": "可以通过染色来美化阀门手轮", + "create.ponder.valve_pipe.header": "使用阀门管道控制液体流", + "create.ponder.valve_pipe.text_1": "阀门管道可以控制管道网中液体的去处", + "create.ponder.valve_pipe.text_2": "通过其上的传动杆输入动力可以控制它的开关", + "create.ponder.valve_pipe.text_3": "提供旋转向‘打开’方向的力会打开阀门,使得流体可以通过", + "create.ponder.valve_pipe.text_4": "提供另一方向的旋转力可以关闭阀门,阻止流体通过", + "create.ponder.water_wheel.header": "使用水车产生旋转力", "create.ponder.water_wheel.text_1": "水车利用临近的水流来进行应力发生", "create.ponder.water_wheel.text_2": "水车接触水流的面越多,它的转速越高", @@ -2519,7 +2302,6 @@ "create.ponder.windmill_structure.header": "风车装置", "create.ponder.windmill_structure.text_1": "任何有至少 8 个风帆方块的结构,都被视为一个有效的风车", - "_": "Thank you for translating Create!" } diff --git a/src/main/resources/assets/create/lang/zh_tw.json b/src/main/resources/assets/create/lang/zh_tw.json index 45c124d4c..70b74b490 100644 --- a/src/main/resources/assets/create/lang/zh_tw.json +++ b/src/main/resources/assets/create/lang/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "for create 0.3.1c", + "_": "for create 0.3.2a", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,10 +28,12 @@ "block.create.belt": "輸送帶", "block.create.birch_window": "白樺木窗戶", "block.create.birch_window_pane": "白樺木窗戶片", + "block.create.black_nixie_tube": "黑色真空管", "block.create.black_sail": "黑色風帆", "block.create.black_seat": "黑色坐墊", "block.create.black_valve_handle": "黑色閥門開關", "block.create.blaze_burner": "烈焰使者動力爐", + "block.create.blue_nixie_tube": "藍色真空管", "block.create.blue_sail": "藍色風帆", "block.create.blue_seat": "藍色坐墊", "block.create.blue_valve_handle": "藍色閥門開關", @@ -41,6 +43,7 @@ "block.create.brass_encased_shaft": "黃銅傳動軸箱", "block.create.brass_funnel": "黃銅漏斗", "block.create.brass_tunnel": "黃銅物品隧道", + "block.create.brown_nixie_tube": "棕色真空管", "block.create.brown_sail": "棕色風帆", "block.create.brown_seat": "棕色坐墊", "block.create.brown_valve_handle": "棕色閥門開關", @@ -58,6 +61,7 @@ "block.create.cogwheel": "齒輪", "block.create.content_observer": "物品偵測器", "block.create.controller_rail": "控制鐵軌", + "block.create.copper_backtank": "銅製後背包", "block.create.copper_block": "銅磚", "block.create.copper_casing": "銅機殼", "block.create.copper_ore": "銅礦石", @@ -72,6 +76,7 @@ "block.create.crushing_wheel": "粉碎輪", "block.create.crushing_wheel_controller": "粉碎輪控制器", "block.create.cuckoo_clock": "布穀鳥鐘", + "block.create.cyan_nixie_tube": "青色真空管", "block.create.cyan_sail": "藍綠色風帆", "block.create.cyan_seat": "藍綠色坐墊", "block.create.cyan_valve_handle": "藍綠色閥門開關", @@ -178,13 +183,16 @@ "block.create.granite_cobblestone_stairs": "碎花崗岩樓梯", "block.create.granite_cobblestone_wall": "碎花崗岩牆", "block.create.granite_pillar": "豎紋花崗岩", + "block.create.gray_nixie_tube": "灰色真空管", "block.create.gray_sail": "灰色風帆", "block.create.gray_seat": "灰色坐墊", "block.create.gray_valve_handle": "灰色閥門開關", + "block.create.green_nixie_tube": "綠色真空管", "block.create.green_sail": "綠色風帆", "block.create.green_seat": "綠色坐墊", "block.create.green_valve_handle": "綠色閥門開關", "block.create.hand_crank": "手搖把手", + "block.create.haunted_bell": "靈魂鐘", "block.create.honey": "蜂蜜", "block.create.horizontal_framed_glass": "豎直邊框玻璃", "block.create.horizontal_framed_glass_pane": "豎直邊框玻璃片", @@ -202,12 +210,16 @@ "block.create.layered_limestone": "疊層石灰岩", "block.create.layered_scoria": "疊層火成岩", "block.create.layered_weathered_limestone": "疊層風化石灰岩", + "block.create.lectern_controller": "講台遙控器", + "block.create.light_blue_nixie_tube": "亮藍色真空管", "block.create.light_blue_sail": "淡藍色風帆", "block.create.light_blue_seat": "淡藍色坐墊", "block.create.light_blue_valve_handle": "淡藍色閥門開關", + "block.create.light_gray_nixie_tube": "亮灰色真空管", "block.create.light_gray_sail": "淡灰色風帆", "block.create.light_gray_seat": "淡灰色坐墊", "block.create.light_gray_valve_handle": "淡灰色閥門開關", + "block.create.lime_nixie_tube": "淺綠色真空管", "block.create.lime_sail": "黃綠色風帆", "block.create.lime_seat": "黃綠色坐墊", "block.create.lime_valve_handle": "黃綠色閥門開關", @@ -224,6 +236,7 @@ "block.create.limestone_pillar": "豎紋石灰岩", "block.create.linear_chassis": "機殼底盤", "block.create.lit_blaze_burner": "烈焰使者動力爐(已啟動)", + "block.create.magenta_nixie_tube": "洋紅色真空管", "block.create.magenta_sail": "洋紅色風帆", "block.create.magenta_seat": "洋紅色坐墊", "block.create.magenta_valve_handle": "洋紅色閥門開關", @@ -307,6 +320,8 @@ "block.create.paved_weathered_limestone_slab": "風化石灰岩鋪路石半磚", "block.create.paved_weathered_limestone_stairs": "風化石灰岩鋪路石樓梯", "block.create.paved_weathered_limestone_wall": "風化石灰岩鋪路石牆", + "block.create.peculiar_bell": "黃銅鐘", + "block.create.pink_nixie_tube": "粉紅色真空管", "block.create.pink_sail": "粉紅色風帆", "block.create.pink_seat": "粉紅色坐墊", "block.create.pink_valve_handle": "粉紅色閥門開關", @@ -341,10 +356,12 @@ "block.create.powered_toggle_latch": "T型正反器", "block.create.pulley_magnet": "滑輪磁鐵", "block.create.pulse_repeater": "脈衝中繼器", + "block.create.purple_nixie_tube": "紫色真空管", "block.create.purple_sail": "紫色風帆", "block.create.purple_seat": "紫色坐墊", "block.create.purple_valve_handle": "紫色閥門開關", "block.create.radial_chassis": "旋轉底盤", + "block.create.red_nixie_tube": "紅色真空管", "block.create.red_sail": "紅色風帆", "block.create.red_seat": "紅色坐墊", "block.create.red_valve_handle": "紅色閥門開關", @@ -401,19 +418,26 @@ "block.create.weathered_limestone_cobblestone_wall": "碎風化石灰岩牆", "block.create.weathered_limestone_pillar": "豎紋風化石灰岩", "block.create.weighted_ejector": "物品彈射器", + "block.create.white_nixie_tube": "白色真空管", "block.create.white_sail": "白色風帆", "block.create.white_seat": "白色坐墊", "block.create.white_valve_handle": "白色閥門開關", "block.create.windmill_bearing": "風車軸承", "block.create.wooden_bracket": "木製支架", + "block.create.yellow_nixie_tube": "黃色真空管", "block.create.yellow_sail": "黃色風帆", "block.create.yellow_seat": "黃色坐墊", "block.create.yellow_valve_handle": "黃色閥門開關", "block.create.zinc_block": "鋅磚", "block.create.zinc_ore": "鋅礦石", + "enchantment.create.capacity": "容量", + "enchantment.create.potato_recovery": "馬鈴薯恢復", + "entity.create.contraption": "結構", + "entity.create.crafting_blueprint": "合成藍圖", "entity.create.gantry_contraption": "門式結構", + "entity.create.potato_projectile": "馬鈴薯彈藥", "entity.create.seat": "坐墊", "entity.create.stationary_contraption": "固定結構", "entity.create.super_glue": "強力膠", @@ -438,10 +462,12 @@ "item.create.chocolate_glazed_berries": "巧克力甜莓", "item.create.chromatic_compound": "異彩化合物", "item.create.cinder_flour": "地獄麵粉", + "item.create.copper_backtank": "銅製後背包", "item.create.copper_ingot": "銅錠", "item.create.copper_nugget": "銅粒", "item.create.copper_sheet": "銅板", "item.create.crafter_slot_cover": "合成器蓋板", + "item.create.crafting_blueprint": "合成藍圖", "item.create.crushed_aluminum_ore": "碎狀鋁礦石", "item.create.crushed_brass": "碎狀黃銅", "item.create.crushed_copper_ore": "碎狀銅礦石", @@ -456,7 +482,8 @@ "item.create.crushed_tin_ore": "碎狀錫礦石", "item.create.crushed_uranium_ore": "碎狀鈾礦石", "item.create.crushed_zinc_ore": "碎狀鋅礦石", - "item.create.deforester": "連根拔樹斧", + "item.create.diving_boots": "潛水鞋", + "item.create.diving_helmet": "潛水頭盔", "item.create.dough": "麵團", "item.create.electron_tube": "真空管", "item.create.empty_blaze_burner": "空的烈焰使者動力爐", @@ -466,17 +493,20 @@ "item.create.furnace_minecart_contraption": "裝配過的機械礦車", "item.create.goggles": "MR護目鏡", "item.create.golden_sheet": "金板", - "item.create.handheld_blockzapper": "方塊放置器", "item.create.handheld_worldshaper": "地形雕塑器", "item.create.honey_bucket": "蜂蜜桶", "item.create.honeyed_apple": "蜂蜜蘋果", - "item.create.integrated_circuit": "IC板", + "item.create.incomplete_cogwheel": "未完成的小齒輪", + "item.create.incomplete_large_cogwheel": "未完成的大齒輪", + "item.create.incomplete_precision_mechanism": "未完成的精確控制器", "item.create.iron_sheet": "鐵板", - "item.create.lapis_sheet": "青金石板", + "item.create.linked_controller": "遙控器", "item.create.minecart_contraption": "裝修過的礦車", "item.create.minecart_coupling": "礦車連結器", "item.create.polished_rose_quartz": "磨製玫瑰石英", + "item.create.potato_cannon": "馬鈴薯大砲", "item.create.powdered_obsidian": "黑曜石粉末", + "item.create.precision_mechanism": " 精確控制器", "item.create.propeller": "扇葉", "item.create.red_sand_paper": "紅砂紙", "item.create.refined_radiance": "光輝石", @@ -621,8 +651,8 @@ "advancement.create.flywheel.desc": "將引擎成功連接到飛輪。", "advancement.create.overstress_flywheel": "壓力過大", "advancement.create.overstress_flywheel.desc": "超載熔爐引擎。", - "advancement.create.integrated_circuit": "複雜的運算", - "advancement.create.integrated_circuit.desc": "合成IC板。", + "advancement.create.precision_mechanism": "複雜的好奇心", + "advancement.create.precision_mechanism.desc": "組裝一個精確控制器", "advancement.create.mechanical_arm": "忙碌的手!", "advancement.create.mechanical_arm.desc": "製作機械手臂,選擇輸入和輸出,放置並給它動能; 然後看著它完成所有你交代的工作。", "advancement.create.musical_arm": "沒人能在我的BGM裡打敗我!", @@ -645,16 +675,12 @@ "advancement.create.refined_radiance.desc": "製作光輝石", "advancement.create.chromatic_age": "繽紛時代", "advancement.create.chromatic_age.desc": "創造出光與影的機殼。", - "advancement.create.zapper": "專業的建築師", - "advancement.create.zapper.desc": "製作一個非常方便的方塊放置器", - "advancement.create.upgraded_zapper": "來自異世界的超頻", - "advancement.create.upgraded_zapper.desc": "製作一個完全升級的方塊放置器", "advancement.create.wand_of_symmetry": "簡單的鏡面幾何學", "advancement.create.wand_of_symmetry.desc": "製作一個對稱杖", - "advancement.create.deforester": "超時空砍伐", - "advancement.create.deforester.desc": "製作一個連根拔樹斧,然後跟你後院的樹林道別吧", "advancement.create.extendo_grip": "piu piu piu!", "advancement.create.extendo_grip.desc": "拿到一個伸縮機械手", + "advancement.create.potato_cannon": "噗~碰", + "advancement.create.potato_cannon.desc": "用馬鈴薯大砲擊殺一隻怪物", "advancement.create.dual_extendo_grip": "piu——piu——piu——", "advancement.create.dual_extendo_grip.desc": "雙持伸縮機械手進一步加長觸碰距離", "advancement.create.eob": "Beta版結束", @@ -667,15 +693,30 @@ "itemGroup.create.palettes": "動力機械建築與裝飾方塊", "death.attack.create.crush": "%1$s被壓扁了", + "death.attack.create.crush.player": "%1$s 被 %2$s 打包丟進粉碎輪", "death.attack.create.fan_fire": "%1$s想接受熱風的洗禮", + "death.attack.create.fan_fire.player": "%1$s 被 %2$s 推入火坑", "death.attack.create.fan_lava": "%1$s想接受熱風的洗禮但走火入魔", + "death.attack.create.fan_lava.player": "%1$s 被 %2$s 推進岩漿", "death.attack.create.mechanical_drill": "%1$s被鑽頭鑽爆腦袋", + "death.attack.create.mechanical_drill.player": "%1$s 被 %2$s 當成礦物放在鑽頭前面而死", "death.attack.create.mechanical_saw": "%1$s被鋸切成了兩半", + "death.attack.create.mechanical_saw.player": "%1$s 被 %2$s 鋸掉了", + "death.attack.create.potato_cannon": "%1$s 被 %2$s 的馬鈴薯大砲餵飽了", + "death.attack.create.potato_cannon.item": "%1$s 被 %2$s 用馬鈴薯大砲塞了滿肚子 %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s 被布穀鳥鐘炸得粉身碎骨", + "death.attack.create.cuckoo_clock_explosion.player": "%1$s 被布穀鳥鐘炸得粉身碎骨", "create.block.deployer.damage_source_name": "機械手", "create.block.cart_assembler.invalid": "將您的礦車裝修站放在鐵軌上", + "create.menu.return": "回到選單", + "create.menu.configure": "設定", + "create.menu.ponder_index": "示範目錄", + "create.menu.project_page": "專案頁面", + "create.menu.report_bugs": "回報問題", + "create.menu.support": "支持我們", + "create.recipe.crushing": "粉碎", "create.recipe.milling": "研磨", "create.recipe.fan_washing": "批次洗滌", @@ -695,11 +736,19 @@ "create.recipe.automatic_shaped": "自動合成", "create.recipe.block_cutting": "方塊切割", "create.recipe.wood_cutting": "木材切割", - "create.recipe.blockzapper_upgrade": "方塊放置器升級", "create.recipe.sandpaper_polishing": "砂紙打磨", "create.recipe.mystery_conversion": "神秘轉化", "create.recipe.spout_filling": "注液", "create.recipe.draining": "分液", + "create.recipe.sequenced_assembly": "排序中的步驟", + "create.recipe.assembly.next": "下一步:%1$s", + "create.recipe.assembly.step": "步驟 %1$s:", + "create.recipe.assembly.progress": "進度:%1$s/%2$s", + "create.recipe.assembly.spout_filling_fluid": "注入:%1$s", + "create.recipe.assembly.deploying_item": "使用:%1$s", + "create.recipe.assembly.cutting": "用鋸子切", + "create.recipe.assembly.repeat": "重複 %1$s 次", + "create.recipe.assembly.junk": "有機率得到垃圾", "create.recipe.processing.chance": "%1$s%%概率", "create.recipe.heat_requirement.none": "不需要加熱", "create.recipe.heat_requirement.heated": "普通加熱", @@ -752,20 +801,15 @@ "create.orientation.alongZ": "以z軸對齊", "create.orientation.alongX": "以x軸對齊", - "create.gui.blockzapper.title": "方塊放置機", - "create.gui.blockzapper.replaceMode": "替換模式", - "create.gui.blockzapper.searchDiagonal": "對角線延伸", - "create.gui.blockzapper.searchFuzzy": "忽視種類分界", - "create.gui.blockzapper.range": "延伸範圍", - "create.gui.blockzapper.needsUpgradedAmplifier": "需要升級範圍擴大器", - "create.gui.blockzapper.patternSection": "模式", - "create.gui.blockzapper.pattern.solid": "實心", - "create.gui.blockzapper.pattern.checkered": "棋盤", - "create.gui.blockzapper.pattern.inversecheckered": "反轉棋盤", - "create.gui.blockzapper.pattern.chance25": "25% ", - "create.gui.blockzapper.pattern.chance50": "50% ", - "create.gui.blockzapper.pattern.chance75": "75% ", "create.gui.terrainzapper.title": "地形雕塑器", + "create.gui.terrainzapper.searchDiagonal": "跟隨對角線", + "create.gui.terrainzapper.searchFuzzy": "忽略材質邊界", + "create.gui.terrainzapper.pattern.solid": "填滿", + "create.gui.terrainzapper.pattern.checkered": "棋盤狀", + "create.gui.terrainzapper.pattern.inversecheckered": "反轉棋盤狀", + "create.gui.terrainzapper.pattern.chance25": "隨機填滿 25% 的面積", + "create.gui.terrainzapper.pattern.chance50": "隨機填滿 50% 的面積", + "create.gui.terrainzapper.pattern.chance75": "隨機填滿 75% 的面積", "create.gui.terrainzapper.placement": "放置模式", "create.gui.terrainzapper.placement.merged": "結合", "create.gui.terrainzapper.placement.attached": "依附", @@ -774,6 +818,8 @@ "create.gui.terrainzapper.brush.cuboid": "矩形體", "create.gui.terrainzapper.brush.sphere": "球體", "create.gui.terrainzapper.brush.cylinder": "圓柱體", + "create.gui.terrainzapper.brush.surface": "表面", + "create.gui.terrainzapper.brush.cluster": "群組", "create.gui.terrainzapper.tool": "填充類型", "create.gui.terrainzapper.tool.fill": "填充", "create.gui.terrainzapper.tool.place": "覆寫", @@ -783,19 +829,8 @@ "create.gui.terrainzapper.tool.flatten": "平整", "create.terrainzapper.shiftRightClickToSet": "Shift+滑鼠右鍵 以設定雕塑類型", - - "create.blockzapper.usingBlock": "使用:%1$s", - "create.blockzapper.componentUpgrades": "零件升級:", - "create.blockzapper.component.body": "放置器機體", - "create.blockzapper.component.amplifier": "範圍擴大器", - "create.blockzapper.component.accelerator": "射擊加速器", - "create.blockzapper.component.retriever": "物品撿回器", - "create.blockzapper.component.scope": "距離觀察鏡", - "create.blockzapper.componentTier.none": "無", - "create.blockzapper.componentTier.brass": "黃銅", - "create.blockzapper.componentTier.chromatic": "異彩化合物", - "create.blockzapper.leftClickToSet": "左鍵點擊方塊以設定方塊種類", - "create.blockzapper.empty": "方塊不足!", + "create.terrainzapper.usingBlock": "使用:%1$s", + "create.terrainzapper.leftClickToSet": "左鍵點擊方塊可以設定材質", "create.minecart_coupling.two_couplings_max": "礦車無法被連接兩個以上的礦車連結器", "create.minecart_coupling.unloaded": "有一部份礦車存在於未讀取區塊中", @@ -1026,6 +1061,11 @@ "create.item_attributes.in_item_group.inverted": "不屬於%1$s", "create.item_attributes.added_by": "由%1$s添加", "create.item_attributes.added_by.inverted": "不是由%1$s添加", + "create.item_attributes.shulker_level": "界伏盒是 %1$s", + "create.item_attributes.shulker_level.inverted": "界伏盒不是 %1$s", + "create.item_attributes.shulker_level.full": "滿的", + "create.item_attributes.shulker_level.empty": "空的", + "create.item_attributes.shulker_level.partial": "有裝東西但沒滿", "create.item_attributes.has_enchant": "有附魔效果%1$s", "create.item_attributes.has_enchant.inverted": "沒有附魔效果%1$s", "create.item_attributes.color": "已被染色成 %1$s", @@ -1121,6 +1161,26 @@ "create.tooltip.chute.fans_pull_up": "鼓風機從下方進行吸引", "create.tooltip.chute.fans_pull_down": "鼓風機從上方進行吸引", "create.tooltip.chute.contains": "物品: %1$s x%2$s", + "create.tooltip.brass_tunnel.contains": "正在處理", + "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", + "create.tooltip.brass_tunnel.retrieve": "右鍵取回", + + "create.linked_controller.bind_mode": "綁定模式", + "create.linked_controller.press_keybind": "按 %1$s, %2$s, %3$s, %4$s, %5$s 或 %6$s 來綁定這個頻率到對應按鍵上", + "create.linked_controller.key_bound": "頻率綁定到 %1$s 鍵", + "create.linked_controller.frequency_slot_1": "按鍵:%1$s 頻道 #1", + "create.linked_controller.frequency_slot_2": "按鍵:%1$s 頻道 #2", + + "create.crafting_blueprint.crafting_slot": "材料格", + "create.crafting_blueprint.display_slot": "顯示格", + "create.crafting_blueprint.inferred": "根據配方推論", + "create.crafting_blueprint.manually_assigned": "手動設定", + "create.crafting_blueprint.secondary_display_slot": "次要顯示格", + "create.crafting_blueprint.optional": "可選的", + + "create.potato_cannon.ammo.attack_damage": "%1$s 攻擊傷害", + "create.potato_cannon.ammo.reload_ticks": "%1$s 攻擊速度", + "create.potato_cannon.ammo.knockback": "%1$s 擊退", "create.hint.hose_pulley.title": "無限供應", "create.hint.hose_pulley": "目標液體為無限供應", @@ -1149,19 +1209,41 @@ "create.command.killTPSCommand.argument.tickTime": "tickTime", "create.contraption.minecart_contraption_too_big": "這個礦車結構太大了而無法撿取", + "create.contraption.minecart_contraption_illegal_pickup": "一股神秘的力量將這個礦車結構與世界綁在一起", "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", - "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", - "create.subtitle.slime_added": "黏液擠壓", + "create.subtitle.contraption_disassemble": "結構停止", + "create.subtitle.peculiar_bell_use": "黃銅鐘聲", + "create.subtitle.mixing": "攪拌機噪音", "create.subtitle.mechanical_press_activation_belt": "液壓機工作", - "create.subtitle.mechanical_press_activation": "液壓機工作", - "create.subtitle.blockzapper_deny": "放置失敗", - "create.subtitle.blockzapper_confirm": "選擇方塊", - "create.subtitle.blockzapper_place": "放置方塊", + "create.subtitle.fwoomp": "馬鈴薯大砲發射", + "create.subtitle.worldshaper_place": "地形塑造器發射聲", + "create.subtitle.crushing_1": "粉碎機咀嚼聲", + "create.subtitle.depot_slide": "物品滑動聲", + "create.subtitle.saw_activate_stone": "機械鋸子聲", "create.subtitle.blaze_munch": "烈焰使者開心地吃著", + "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", + "create.subtitle.haunted_bell_use": "靈魂鐘敲響", + "create.subtitle.scroll_value": "滾動輸入聲", + "create.subtitle.crafter_craft": "機械合成器合成聲", + "create.subtitle.controller_put": "遙控器放置聲", + "create.subtitle.cranking": "手搖把手轉動聲", + "create.subtitle.wrench_remove": "零件移除聲", + "create.subtitle.cogs": "齒輪隆隆聲", + "create.subtitle.slime_added": "黏液擠壓", + "create.subtitle.potato_hit": "食物撞擊聲", + "create.subtitle.saw_activate_wood": "機械鋸子運作聲", + "create.subtitle.haunted_bell_convert": "靈魂鐘轉化聲", + "create.subtitle.deployer_polish": "機械手拋光聲", + "create.subtitle.controller_click": "遙控器按鍵聲", + "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", + "create.subtitle.copper_armor_equip": "潛水裝裝備聲", + "create.subtitle.controller_take": "拿下遙控器", + "create.subtitle.mechanical_press_activation": "液壓機工作", + "create.subtitle.contraption_assemble": "結構移動", + "create.subtitle.crafter_click": "機械合成器工作聲", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1181,14 +1263,6 @@ "block.create.metal_bracket.tooltip": "金屬支架", "block.create.metal_bracket.tooltip.summary": "用來裝飾_傳動軸_,_齒輪_和_管道_。", - "block.create.copper_casing.tooltip": "銅製機殼", - "block.create.copper_casing.tooltip.summary": "具備多種用途的堅固機殼,也可用於裝飾。", - "block.create.copper_casing.tooltip.condition1": "對液體管道使用時", - "block.create.copper_casing.tooltip.behaviour1": "會把管道裝入機殼,裝進機殼的管道會與其他管道分開,以免它們自動相連。", - - "block.create.encased_fluid_pipe.tooltip": "液體管道箱", - "block.create.encased_fluid_pipe.tooltip.summary": "用銅機殼加固后的液體管道。", - "block.create.seat.tooltip": "坐墊", "block.create.seat.tooltip.summary": "坐下來享受旅程吧!坐墊將會把玩家固定在一個移動裝置上。也可以用來作為居家裝飾,畢竟他有許多顏色。", "block.create.seat.tooltip.condition1": "對坐墊右鍵", @@ -1197,65 +1271,6 @@ "item.create.blaze_cake.tooltip": "熔岩蛋糕", "item.create.blaze_cake.tooltip.summary": "對辛苦的_烈焰使者_的美味款待。讓他們興奮起來吧!", - "block.create.fluid_pipe.tooltip": "液體管道", - "block.create.fluid_pipe.tooltip.summary": "用來傳輸_液體_。需要一個_機械泵_來提供壓強。", - "block.create.fluid_pipe.tooltip.condition1": "轉移液體", - "block.create.fluid_pipe.tooltip.behaviour1": "可以與_液體容器_如_儲存罐_或_作業盆_相連_。裸露的_管道_末端也可以排放或抽取液體。注意別漏水了!", - "block.create.fluid_pipe.tooltip.condition2": "使用扳手對其右鍵時", - "block.create.fluid_pipe.tooltip.behaviour2": "在狀況許可的情況下在管道上安裝透明窗", - - "block.create.hose_pulley.tooltip": "軟管滑輪", - "block.create.hose_pulley.tooltip.summary": "用來在_世界_中放置或排放大量的液體。", - "block.create.hose_pulley.tooltip.condition1": "接入機械時", - "block.create.hose_pulley.tooltip.behaviour1": "升高或降低軟管,軟管的位置決定了抽取或填充液體的高度。", - "block.create.hose_pulley.tooltip.condition2": "當軟管滑輪抽取液體時", - "block.create.hose_pulley.tooltip.behaviour2": "開始從軟管末端將其從中取出_液體方塊_。巨大的液體湖將被認定是_無限_的", - "block.create.hose_pulley.tooltip.condition3": "當液體從軟管滑輪中排出時", - "block.create.hose_pulley.tooltip.behaviour3": "開始向世界填充液體,直到達到_軟管末端_的高度。", - - "block.create.fluid_tank.tooltip": "液體儲存罐", - "block.create.fluid_tank.tooltip.summary": "_儲存_任意_液體_", - "block.create.fluid_tank.tooltip.condition1": "使用扳手右鍵", - "block.create.fluid_tank.tooltip.behaviour1": "改變可選窗口", - - "block.create.creative_fluid_tank.tooltip": "創造液體儲存罐", - "block.create.creative_fluid_tank.tooltip.summary": "此液體儲存罐能夠_無限的復制_任何液體。", - "block.create.creative_fluid_tank.tooltip.condition1": "罐中裝有液體時", - "block.create.creative_fluid_tank.tooltip.behaviour1": "任意的_液體提取設備_能夠從中提取無窮無盡的指定液體,液體的導入功能同時也會無效。", - "block.create.creative_fluid_tank.tooltip.condition2": "扳手右擊時", - "block.create.creative_fluid_tank.tooltip.behaviour2": "打開關閉窗戶", - - "block.create.fluid_valve.tooltip": "液體閥門", - "block.create.fluid_valve.tooltip.summary": "阻止液體沿管道向前流動。", - "block.create.fluid_valve.tooltip.condition1": "控制流量", - "block.create.fluid_valve.tooltip.behaviour1": "施加的_動能_將迫使閥門關閉,從而阻止液體流動。_逆轉旋轉方向_以重新打開閥門。", - - "block.create.mechanical_pump.tooltip": "機械泵", - "block.create.mechanical_pump.tooltip.summary": "_接入機械_,能迫使液體_沿管道指定方向移動_。在兩個方向上都有_最大的作用範圍_。(默認為16個方塊距離)", - "block.create.mechanical_pump.tooltip.condition1": "液體流向", - "block.create.mechanical_pump.tooltip.behaviour1": "_接入機械_后會產生壓力,迫使液體通過管道。_反轉機械_的方向以切換液體_流向_。", - "block.create.mechanical_pump.tooltip.control1": "扳手右鍵時", - "block.create.mechanical_pump.tooltip.action1": "反轉泵的方向,從而改變默認的液體流向", - - "block.create.smart_fluid_pipe.tooltip": "智慧液體管道", - "block.create.smart_fluid_pipe.tooltip.summary": "帶有過濾器的_液體管道_。可以指定通過哪個_液體_。", - "block.create.smart_fluid_pipe.tooltip.condition1": "當液體進入時", - "block.create.smart_fluid_pipe.tooltip.behaviour1": "進入的液體與_過濾器_不匹配時,智慧管道將_阻止_其通過。", - "block.create.smart_fluid_pipe.tooltip.condition2": "與_液體容器相鄰_時", - "block.create.smart_fluid_pipe.tooltip.behaviour2": "從_任何容器_開始流動的_智慧管道_只會抽取與其過濾器匹配的液體。", - - "block.create.spout.tooltip": "注液器", - "block.create.spout.tooltip.summary": "一種用來_裝罐_的機器。", - "block.create.spout.tooltip.condition1": "液體傳輸", - "block.create.spout.tooltip.behaviour1": "當下方放置類似_玻璃瓶_,_桶_這樣的液體容器物品時,注液器將試圖將自身儲存的液體注入到下方的_液體容器物品_中。", - "block.create.spout.tooltip.condition2": "液體自動化", - "block.create.spout.tooltip.behaviour2": "注液器位於_輸送帶_或者_置物臺_上方時,將自動為流水線上的_液體容器物品_進行_注入_。", - - "block.create.item_drain.tooltip": "分液池", - "block.create.item_drain.tooltip.summary": "一種用來_抽空液體容器物品_的置物臺", - "block.create.item_drain.tooltip.condition1": "液體傳輸", - "block.create.item_drain.tooltip.behaviour1": "當從側面導入諸如_桶_或_瓶子_之類的_液體容器物品_時,_分液池_將嘗試將其倒入其_自身的液體庫存_中。空的_液體容器物品_將被彈出至_另一側_。", - "item.create.wand_of_symmetry.tooltip": "對稱杖", "item.create.wand_of_symmetry.tooltip.summary": "完美地鏡面復制工作區域內的方塊放置於破壞", "item.create.wand_of_symmetry.tooltip.condition1": "當在熱鍵欄時", @@ -1267,15 +1282,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "當潛行右鍵時", "item.create.wand_of_symmetry.tooltip.action3": "打開_gui介面_", - "item.create.handheld_blockzapper.tooltip": "方塊放置器", - "item.create.handheld_blockzapper.tooltip.summary": "新穎的小工具,可以遠距離放置或更換方塊。", - "item.create.handheld_blockzapper.tooltip.control1": "當左鍵方塊時", - "item.create.handheld_blockzapper.tooltip.action1": "設定放置此方塊。", - "item.create.handheld_blockzapper.tooltip.control2": "當右鍵方塊時", - "item.create.handheld_blockzapper.tooltip.action2": "_放置_或_替換_目標方塊。", - "item.create.handheld_blockzapper.tooltip.control3": "當潛行右鍵時", - "item.create.handheld_blockzapper.tooltip.action3": "打開_gui介面_", - "item.create.handheld_worldshaper.tooltip": "環境塑形器", "item.create.handheld_worldshaper.tooltip.summary": "_大面積_更改地形的手持工具", "item.create.handheld_worldshaper.tooltip.control1": "當左鍵方塊時", @@ -1290,13 +1296,19 @@ "item.create.tree_fertilizer.tooltip.condition1": "在樹苗上使用時", "item.create.tree_fertilizer.tooltip.behaviour1": "無論_生長時間_多少,直接長大", - "item.create.deforester.tooltip": "連根拔樹斧", - "item.create.deforester.tooltip.summary": "_連根拔樹斧_,從最根砍樹時,能夠瞬間連根拔起一棵樹", - "item.create.extendo_grip.tooltip": "伸縮機械手", "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_觸碰距離_。", "item.create.extendo_grip.tooltip.condition1": "放置於副手欄時", "item.create.extendo_grip.tooltip.behaviour1": "大幅增加_主手_的觸碰距離,與_主手_的伸縮機械手攜同使用,可進一步增加_觸碰距離_。", + "item.create.extendo_grip.tooltip.condition2": "當裝備銅製後背包時", + "item.create.extendo_grip.tooltip.behaviour2": "_不會消耗耐久_ 但是會抽取銅製後背包裡的_壓縮空氣_", + + "item.create.potato_cannon.tooltip": "馬鈴薯大砲", + "item.create.potato_cannon.tooltip.summary": "噗~碰!用你種的蔬菜來攻擊敵人。可以用_銅製後背包_的壓縮空氣驅動", + "item.create.potato_cannon.tooltip.condition1": "當點擊右鍵時", + "item.create.potato_cannon.tooltip.behaviour1": "從_物品欄_中_發射_一顆彈藥", + "item.create.potato_cannon.tooltip.condition2": "當裝備銅製後背包時", + "item.create.potato_cannon.tooltip.behaviour2": "_不會消耗耐久_ 但是會抽取銅製後背包裡的_壓縮空氣_", "item.create.filter.tooltip": "過濾器", "item.create.filter.tooltip.summary": "將物品更精確地進行_篩選分類_,可以同時_篩選_多個物品或者將已標記的_過濾器_放在另一個_過濾器_里_嵌套_使用。", @@ -1372,13 +1384,6 @@ "block.create.turntable.tooltip": "轉盤", "block.create.turntable.tooltip.summary": "讓旋轉機械給你帶來一場刺激的旋轉風車體驗。", - "block.create.portable_fluid_interface.tooltip": "移動液體接口", - "block.create.portable_fluid_interface.tooltip.summary": "為機械活塞、裝配礦車、旋轉軸承、滑輪_等移動結構_設計的_液體接口_,_移動結構_和_固定結構_之間的液體交換站,兩個會面的接口必須彼此面對且彼此隔開1-2個方塊。", - "block.create.portable_fluid_interface.tooltip.condition1": "裝配在移動結構上時", - "block.create.portable_fluid_interface.tooltip.behaviour1": "移動到能夠滿足與_固定結構_上的_移動式液體接口_對接的條件后,移動結構會_短暫地停下_,開始對接,並直接與_移動結構上的_液體儲存罐_交互,進行液體的_導入導出_。", - "block.create.portable_fluid_interface.tooltip.condition2": "被紅石激活時", - "block.create.portable_fluid_interface.tooltip.behaviour2": "立即終止任何活動的連接。", - "block.create.stockpile_switch.tooltip": "存量偵測器", "block.create.stockpile_switch.tooltip.summary": "根據連接的容器_儲存空間_的占用情況切換紅石訊號強度。", "block.create.stockpile_switch.tooltip.condition1": "低於_下線_或高於_上線_時", @@ -1412,42 +1417,82 @@ "item.create.refined_radiance.tooltip": "光輝石", "item.create.refined_radiance.tooltip.summary": "一種用_光輝_鍛造的化合物材料。", + "item.create.refined_radiance.tooltip.condition1": "工作進度", + "item.create.refined_radiance.tooltip.behaviour1": "在未來的更新中會更新更多用途", "item.create.shadow_steel.tooltip": "暗影鋼", "item.create.shadow_steel.tooltip.summary": "一種用_虛空_鍛造的化合物材料。", + "item.create.shadow_steel.tooltip.condition1": "工作進度", + "item.create.shadow_steel.tooltip.behaviour1": "在未來的更新中會更新更多用途", + + "item.create.linked_controller.tooltip": "遙控器", + "item.create.linked_controller.tooltip.summary": "提供_六個_連接到相對應_按鍵_的_無線紅石訊號機_ _手持的控制_", + "item.create.linked_controller.tooltip.condition1": "點擊右鍵時", + "item.create.linked_controller.tooltip.behaviour1": "_切換_遙控器,當遙控器啟動時你會失去_移動控制_", + "item.create.linked_controller.tooltip.condition2": "當右鍵時", + "item.create.linked_controller.tooltip.behaviour2": "打開_設定面板_", + "item.create.linked_controller.tooltip.condition3": "當對無線紅石訊號機點右鍵時", + "item.create.linked_controller.tooltip.behaviour3": "開啟_綁定模式_。按_六個控制鍵_的其中一個來綁定_頻率_到遙控器上", + "item.create.linked_controller.tooltip.condition4": "當對講台按右鍵時", + "item.create.linked_controller.tooltip.behaviour4": "把遙控器放到講台上,可以更方便的控制它。(蹲下右鍵取回)", + + "item.create.diving_helmet.tooltip": "潛水頭盔", + "item.create.diving_helmet.tooltip.summary": "和_銅製後背包_一起裝備時可以延長在_水下呼吸_的時間", + "item.create.diving_helmet.tooltip.condition1": "當裝備時", + "item.create.diving_helmet.tooltip.behaviour1": "提昇_水下呼吸效果_,會緩慢的抽取銅製後背包中的_壓縮空氣_", + + "item.create.copper_backtank.tooltip": "銅製後背包", + "item.create.copper_backtank.tooltip.summary": "可裝備的氣罐,用來攜帶壓縮空氣", + "item.create.copper_backtank.tooltip.condition1": "當裝備時", + "item.create.copper_backtank.tooltip.behaviour1": "提供_壓縮空氣_給需要的裝備", + "item.create.copper_backtank.tooltip.condition2": "當放置時,由轉動來補充驅動", + "item.create.copper_backtank.tooltip.behaviour2": "旋轉的速度決定收集_壓縮空氣_的速率", + + "item.create.diving_boots.tooltip": "潛水鞋", + "item.create.diving_boots.tooltip.summary": "一雙_沈重的鞋子_,提供更好的水下移動", + "item.create.diving_boots.tooltip.condition1": "當裝備時", + "item.create.diving_boots.tooltip.behaviour1": "你可以在水下走得更快而且可以跳躍,但是不能游泳。穿著者不會被輸送帶移動。", + + "item.create.crafting_blueprint.tooltip": "合成藍圖", + "item.create.crafting_blueprint.tooltip.summary": "可以被放置在牆上、地上和天花板。指定一個合成配方,你可以更快速的合成物品。每一格代表一個合成配方", + "item.create.crafting_blueprint.condition1": "右鍵點擊空格", + "item.create.crafting_blueprint.behaviour1": "打開_合成界面_讓你_指定配方_和要顯示的物品", + "item.create.crafting_blueprint.condition2": "右鍵點擊編輯過的格子", + "item.create.crafting_blueprint.behaviour2": "根據_物品欄_內的物品_使用_這個_配方_合成。_蹲下_點擊可以一次合成_一組_的物品", "item.create.minecart_coupling.tooltip": "礦車連軸器", "item.create.minecart_coupling.tooltip.summary": "將多個_礦車_或運輸結構鏈接在一起,構成雄偉的火車。", "item.create.minecart_coupling.tooltip.condition1": "作用與礦車時", "item.create.minecart_coupling.tooltip.behaviour1": "將兩個礦車耦合在一起,在移動時將它們保持_恒定的距離_。", - "create.tooltip.wip": "半成品", - "create.tooltip.workInProgress": "尚在製作中!", - "create.tooltip.randomWipDescription0": "禁止將此物品給屁孩。", - "create.tooltip.randomWipDescription1": "每~一~次~你使用此物品時,就會使一隻小熊貓死亡。", - "create.tooltip.randomWipDescription2": "使用此物品請自負後果。", - "create.tooltip.randomWipDescription3": "快走開,這不是你要找的東西(搖手指", - "create.tooltip.randomWipDescription4": "啟動自爆模式,10、9、8...。", - "create.tooltip.randomWipDescription5": "你已經沒有退路了。", - "create.tooltip.randomWipDescription6": "作者我將不負任何你使用此物所造成的責任。", - "create.tooltip.randomWipDescription7": "這東西不是給你用的,再找找吧!", - "create.tooltip.randomWipDescription8": "用了就死定了。", + "block.create.peculiar_bell.tooltip": "黃銅鐘", + "block.create.peculiar_bell.tooltip.summary": "一個裝飾性的_鐘_,放在_靈魂火_正上方會有意想不到的副作用", + + "block.create.haunted_bell.tooltip": "靈魂鐘", + "block.create.haunted_bell.tooltip.summary": "一個受到地獄亡魂_詛咒的鐘_", + "block.create.haunted_bell.tooltip.condition1": "當拿者或是被敲響時", + "block.create.haunted_bell.tooltip.behaviour1": "標示附近_不夠亮_、會生成_敵對生物_的地方", "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "按住 [%1$s] 來思考此物品", + "create.ponder.hold_to_ponder": "按住 [%1$s] 來查看此物品的教學", "create.ponder.subject": "本場景的主題", - "create.ponder.pondering": "思考有關於...", + "create.ponder.pondering": "有關於...", "create.ponder.identify_mode": "暫停模式已啟動\n按 [%1$s] 來取消暫停模式", "create.ponder.associated": "相關物品", "create.ponder.close": "關閉", "create.ponder.identify": "暫停", "create.ponder.next": "下個場景", "create.ponder.previous": "上個場景", - "create.ponder.replay": "重放", + "create.ponder.replay": "重播", "create.ponder.think_back": "返回", - "create.ponder.slow_text": "降低文字顯示速度", + "create.ponder.slow_text": "放慢文字顯示速度", + "create.ponder.exit": "離開", + "create.ponder.welcome": "歡迎來到教學", + "create.ponder.categories": "Create 中的分類", + "create.ponder.index_description": "點擊其中一個圖像查看和他相關的物品以及方塊", + "create.ponder.index_title": "教學首頁", "create.ponder.shared.movement_anchors": "有了機殼底盤和強力膠就可以移動大型結構", "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.sneak_and": "潛行 +", @@ -1459,14 +1504,14 @@ "create.ponder.shared.rpm16": "16 RPM", "create.ponder.tag.kinetic_sources": "動能產生裝置", "create.ponder.tag.kinetic_sources.description": "該裝置能夠產生動能", - "create.ponder.tag.contraption_actor": "Contraption Actors", - "create.ponder.tag.contraption_actor.description": "Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.contraption_actor": "特殊方塊", + "create.ponder.tag.contraption_actor.description": "附加到移動裝置上時表現出特殊行為的方塊", "create.ponder.tag.arm_targets": "機械手臂的目標物", "create.ponder.tag.arm_targets.description": "該裝置可作為機械手臂的工作目標", "create.ponder.tag.logistics": "傳輸物品", "create.ponder.tag.logistics.description": "該裝置用於物品的傳輸", - "create.ponder.tag.movement_anchor": "Movement Anchors", - "create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.movement_anchor": "運動錨點", + "create.ponder.tag.movement_anchor.description": "允許建立移動裝置的元件,以各種方式為連接的結構設置動畫", "create.ponder.tag.creative": "創造模式", "create.ponder.tag.creative.description": "該裝置無法在生存模式中獲得", "create.ponder.tag.kinetic_relays": "動能傳遞方塊", @@ -1595,6 +1640,7 @@ "create.ponder.cart_assembler_modes.header": "礦車結構的方向設定", "create.ponder.cart_assembler_modes.text_1": "礦車結構會隨著礦車方向改變", "create.ponder.cart_assembler_modes.text_2": "如果在裝修站鎖定其方向,則結構方向不會隨礦車方向改變", + "create.ponder.cart_assembler_modes.text_3": "如果在裝修站鎖定其方向,則結構方向不會隨礦車方向改變", "create.ponder.cart_assembler_rails.header": "其他種類的礦車和鐵軌", "create.ponder.cart_assembler_rails.text_1": "放在普通鐵軌上的礦車裝修站不會影響礦車的動作", @@ -1635,402 +1681,496 @@ "create.ponder.clockwork_bearing.text_7": "你必須確保時針分針結構間未被使用強力膠之類的相連零件", "create.ponder.clockwork_bearing.text_8": "分針結構此時將正常運作", - "create.ponder.clutch.header": "使用離合器控制動能", - "create.ponder.clutch.text_1": "離合器能將動能直線傳遞", - "create.ponder.clutch.text_2": "當離合器被啟動,離合器會中斷動能傳遞", + "create.ponder.clutch.header": "使用離合器控制動能", + "create.ponder.clutch.text_1": "離合器能將動能直線傳遞", + "create.ponder.clutch.text_2": "當離合器被啟動,離合器會中斷動能傳遞", - "create.ponder.cog_speedup.header": "使用大小齒輪來變速", - "create.ponder.cog_speedup.text_1": "大齒輪與小齒輪可以斜向傳遞動能", - "create.ponder.cog_speedup.text_2": "從大齒輪傳遞動能至小齒輪時,轉速加倍", - "create.ponder.cog_speedup.text_3": "從小齒輪傳遞動能至大齒輪時,轉速減半", - - "create.ponder.cogwheel.header": "使用齒輪來傳遞動能", - "create.ponder.cogwheel.text_1": "齒輪會將動力傳遞至臨近的齒輪", - "create.ponder.cogwheel.text_2": "以此方式連接的齒輪,旋轉方向相反", + "create.ponder.cog_speedup.header": "使用大小齒輪來變速", + "create.ponder.cog_speedup.text_1": "大齒輪與小齒輪可以斜向傳遞動能", + "create.ponder.cog_speedup.text_2": "從大齒輪傳遞動能至小齒輪時,轉速加倍", + "create.ponder.cog_speedup.text_3": "從小齒輪傳遞動能至大齒輪時,轉速減半", - "create.ponder.creative_motor.header": "使用創造馬達產生動能", - "create.ponder.creative_motor.text_1": "創造馬達不僅能夠手動設定輸出動能,而且體積相當小巧", - "create.ponder.creative_motor.text_2": "對其背後面板滾動滾輪,可以改變馬達的轉速", + "create.ponder.cogwheel.header": "使用齒輪來傳遞動能", + "create.ponder.cogwheel.text_1": "齒輪會將動力傳遞至臨近的齒輪", + "create.ponder.cogwheel.text_2": "以此方式連接的齒輪,旋轉方向相反", - "create.ponder.crushing_wheels.header": "使用粉碎輪處理物品", - "create.ponder.crushing_wheels.text_1": "一對粉碎輪,磨物快又準", - "create.ponder.crushing_wheels.text_2": "接入的動能必須使這兩個輪子契合轉動", - "create.ponder.crushing_wheels.text_3": "扔入或者放入的物品都會被粉碎處理", - "create.ponder.crushing_wheels.text_4": "你也可以使用自動化進行物品的輸入以及撿取", + "create.ponder.creative_fluid_tank.header": "創造液體除存罐", + "create.ponder.creative_fluid_tank.text_1": "創造液體除存罐可以提供無限的液體", + "create.ponder.creative_fluid_tank.text_2": "拿著一個液體物品點擊可以設定它", + "create.ponder.creative_fluid_tank.text_3": "現在管線網路可以無限制的從它抽取液體", + "create.ponder.creative_fluid_tank.text_4": "任何被抽進創造液體除存罐的液體都會消失", - "create.ponder.deployer.header": "使用機械手", - "create.ponder.deployer.text_1": "在機械手獲得動能後能夠模仿玩家的各種行為", - "create.ponder.deployer.text_10": "對機械手手部右鍵,即可將手上的物品給它使用", - "create.ponder.deployer.text_11": "物品也可以自動化輸入到機械手內", - "create.ponder.deployer.text_12": "機械手附帶一個過濾格", - "create.ponder.deployer.text_13": "當設定了過濾後,只有當它的手中物品與過濾格相符時,它才會工作", - "create.ponder.deployer.text_14": "只有與過濾格相符的物品才可輸入...", - "create.ponder.deployer.text_15": "...不符的物品可被取出來", - "create.ponder.deployer.text_2": "它只會與它正前方兩格處的位置進行互動", - "create.ponder.deployer.text_3": "放在在它面前的方塊不會阻攔它的工作", - "create.ponder.deployer.text_4": "機械手可以:", - "create.ponder.deployer.text_5": "放置方塊", - "create.ponder.deployer.text_6": "使用物品", - "create.ponder.deployer.text_7": "啟動方塊", - "create.ponder.deployer.text_8": "採收方塊", - "create.ponder.deployer.text_9": "以及攻擊生物", + "create.ponder.creative_motor.header": "使用創造馬達產生動能", + "create.ponder.creative_motor.text_1": "創造馬達不僅能夠手動設定輸出動能,而且體積相當小巧", + "create.ponder.creative_motor.text_2": "對其背後面板滾動滾輪,可以改變馬達的轉速", - "create.ponder.deployer_contraption.header": "在裝置上使用機械手", - "create.ponder.deployer_contraption.text_1": "當機械手在移動的結構上時...", - "create.ponder.deployer_contraption.text_2": "機械手會對每一個經過的方塊使用裝置中任意容器內的物品", - "create.ponder.deployer_contraption.text_3": "可以透過過濾格來指定其從存儲空間中抽取的物品", + "create.ponder.crushing_wheels.header": "使用粉碎輪處理物品", + "create.ponder.crushing_wheels.text_1": "一對粉碎輪,磨物快又準", + "create.ponder.crushing_wheels.text_2": "接入的動能必須使這兩個輪子契合轉動", + "create.ponder.crushing_wheels.text_3": "扔入或者放入的物品都會被粉碎處理", + "create.ponder.crushing_wheels.text_4": "你也可以使用自動化進行物品的輸入以及撿取", - "create.ponder.deployer_modes.header": "機械手的工作模式", - "create.ponder.deployer_modes.text_1": "在設設情況下,機械手模仿玩家的右鍵", - "create.ponder.deployer_modes.text_2": "使用扳手可以將模式調整為模仿玩家的左鍵", + "create.ponder.deployer.header": "使用機械手", + "create.ponder.deployer.text_1": "在機械手獲得動能後能夠模仿玩家的各種行為", + "create.ponder.deployer.text_10": "對機械手手部右鍵,即可將手上的物品給它使用", + "create.ponder.deployer.text_11": "物品也可以自動化輸入到機械手內", + "create.ponder.deployer.text_12": "機械手附帶一個過濾格", + "create.ponder.deployer.text_13": "當設定了過濾後,只有當它的手中物品與過濾格相符時,它才會工作", + "create.ponder.deployer.text_14": "只有與過濾格相符的物品才可輸入...", + "create.ponder.deployer.text_15": "...不符的物品可被取出來", + "create.ponder.deployer.text_2": "它只會與它正前方兩格處的位置進行互動", + "create.ponder.deployer.text_3": "放在在它面前的方塊不會阻攔它的工作", + "create.ponder.deployer.text_4": "機械手可以:", + "create.ponder.deployer.text_5": "放置方塊", + "create.ponder.deployer.text_6": "使用物品", + "create.ponder.deployer.text_7": "啟動方塊", + "create.ponder.deployer.text_8": "採收方塊", + "create.ponder.deployer.text_9": "以及攻擊生物", - "create.ponder.deployer_redstone.header": "使用紅石控制機械手", - "create.ponder.deployer_redstone.text_1": "當機械手收到紅時訊號時會停止工作", - "create.ponder.deployer_redstone.text_2": "在停止工作前,機械手會完成目前手頭上的工作", - "create.ponder.deployer_redstone.text_3": "因此,輸入脈衝訊號可以使其每次只進行一個週期的工作", - - "_": "m", - - "create.ponder.depot.header": "使用置物台", - "create.ponder.depot.text_1": "置物台可以被當成一個“靜止的”傳送帶原件使用", - "create.ponder.depot.text_2": "右擊可以手動放置或取下物品", - "create.ponder.depot.text_3": "與傳送帶一樣,它也可以將其內的物品轉送到其他設備中進行加工...", - "create.ponder.depot.text_4": "...同時物品也可以被機械手存取", + "create.ponder.deployer_contraption.header": "在裝置上使用機械手", + "create.ponder.deployer_contraption.text_1": "當機械手在移動的結構上時...", + "create.ponder.deployer_contraption.text_2": "機械手會對每一個經過的方塊使用裝置中任意容器內的物品", + "create.ponder.deployer_contraption.text_3": "可以透過過濾格來指定其從存儲空間中抽取的物品", + + "create.ponder.deployer_modes.header": "機械手的工作模式", + "create.ponder.deployer_modes.text_1": "在設設情況下,機械手模仿玩家的右鍵", + "create.ponder.deployer_modes.text_2": "使用扳手可以將模式調整為模仿玩家的左鍵", + + "create.ponder.deployer_processing.header": "用機器手處理物品", + "create.ponder.deployer_processing.text_1": "拿著適當物品的機器手可以處理下面的物品", + "create.ponder.deployer_processing.text_2": "待處理的物品可以是掉落狀態或是被放在置物台上", + "create.ponder.deployer_processing.text_3": "當物品被放在輸送帶上時...", + "create.ponder.deployer_processing.text_4": "機器手會抓住他並且自動處理", + + "create.ponder.deployer_redstone.header": "使用紅石控制機械手", + "create.ponder.deployer_redstone.text_1": "當機械手收到紅時訊號時會停止工作", + "create.ponder.deployer_redstone.text_2": "在停止工作前,機械手會完成目前手頭上的工作", + "create.ponder.deployer_redstone.text_3": "因此,輸入脈衝訊號可以使其每次只進行一個週期的工作", + + "create.ponder.depot.header": "使用置物台", + "create.ponder.depot.text_1": "置物台可以被當成一個“靜止的”傳送帶原件使用", + "create.ponder.depot.text_2": "右擊可以手動放置或取下物品", + "create.ponder.depot.text_3": "與傳送帶一樣,它也可以將其內的物品轉送到其他設備中進行加工...", + "create.ponder.depot.text_4": "...同時物品也可以被機械手存取", + + "create.ponder.empty_blaze_burner.header": "使用空的烈焰人燃燒室", + "create.ponder.empty_blaze_burner.text_1": "手持空的烈焰人燃燒室右擊烈焰人來抓取烈焰人", + "create.ponder.empty_blaze_burner.text_2": "或者,也可以透過右擊烈焰人刷怪籠來填充啟動烈焰人燃燒室", + "create.ponder.empty_blaze_burner.text_3": "這樣,你便有了一個可供部分機器加工的熱源", + "create.ponder.empty_blaze_burner.text_4": "如果是為了美觀,空的烈焰人燃燒室也可以被打火石點燃", + "create.ponder.empty_blaze_burner.text_5": "可以放入靈魂物品將火焰轉化成靈魂火", + "create.ponder.empty_blaze_burner.text_6": "但是,這樣的熱源不足以給機器提加工供足夠的熱量", - "create.ponder.empty_blaze_burner.header": "使用空的烈焰人燃燒室", - "create.ponder.empty_blaze_burner.text_1": "手持空的烈焰人燃燒室右擊烈焰人來抓取烈焰人", - "create.ponder.empty_blaze_burner.text_2": "或者,也可以透過右擊烈焰人刷怪籠來填充啟動烈焰人燃燒室", - "create.ponder.empty_blaze_burner.text_3": "這樣,你便有了一個可供部分機器加工的熱源", - "create.ponder.empty_blaze_burner.text_4": "如果是為了美觀,空的烈焰人燃燒室也可以被打火石點燃", - "create.ponder.empty_blaze_burner.text_5": "但是,這樣的熱源不足以給機器提加工供足夠的熱量", - "create.ponder.fan_direction.header": "鼓風機的氣流", - "create.ponder.fan_direction.text_1": "鼓風機使用動能來製造氣流", - "create.ponder.fan_direction.text_2": "流速以及方向由所接收動能的強弱以及方向而定", - + "create.ponder.fan_direction.text_1": "鼓風機使用動能來製造氣流", + "create.ponder.fan_direction.text_2": "流速以及方向由所接收動能的強弱以及方向而定", + "create.ponder.fan_processing.header": "使用鼓風機加工物品", - "create.ponder.fan_processing.text_1": "當氣流吹過熔岩時,氣流會被加熱", - "create.ponder.fan_processing.text_2": "熱氣流中的物品會被冶煉", - "create.ponder.fan_processing.text_3": "但在氣流中的食物會被直接燒成灰", - "create.ponder.fan_processing.text_4": "而想要烹飪食物,必須要透過吹過火焰的氣流來煙燻食物", - "create.ponder.fan_processing.text_5": "當氣流吹過水後,便可用於洗滌物品", - "create.ponder.fan_processing.text_6": "這種加工方法可以做到不少有趣的事情", - "create.ponder.fan_processing.text_7": "鼓風機的轉速對加工的速度沒有影響,只影響氣流的吹拂距離", - "create.ponder.fan_processing.text_8": "而那些放置在置物台或者傳送帶上的物品,鼓風機也是可以處理的", - + "create.ponder.fan_processing.text_1": "當氣流吹過熔岩時,氣流會被加熱", + "create.ponder.fan_processing.text_2": "熱氣流中的物品會被冶煉", + "create.ponder.fan_processing.text_3": "但在氣流中的食物會被直接燒成灰", + "create.ponder.fan_processing.text_4": "而想要烹飪食物,必須要透過吹過火焰的氣流來煙燻食物", + "create.ponder.fan_processing.text_5": "當氣流吹過水後,便可用於洗滌物品", + "create.ponder.fan_processing.text_6": "這種加工方法可以做到不少有趣的事情", + "create.ponder.fan_processing.text_7": "鼓風機的轉速對加工的速度沒有影響,只影響氣流的吹拂距離", + "create.ponder.fan_processing.text_8": "而那些放置在置物台或者傳送帶上的物品,鼓風機也是可以處理的", + "create.ponder.fan_source.header": "使用鼓風機來產生動能", - "create.ponder.fan_source.text_1": "如鼓風機的扇葉向下朝著熱源放置,鼓風機可以藉此產生動能", - "create.ponder.fan_source.text_2": "當鼓風機接受紅石訊號後,它便會向外供給動能", - + "create.ponder.fan_source.text_1": "如鼓風機的扇葉向下朝著熱源放置,鼓風機可以藉此產生動能", + "create.ponder.fan_source.text_2": "當鼓風機接受紅石訊號後,它便會向外供給動能", + + "create.ponder.fluid_pipe_flow.header": "始用銅製管道來移動液體", + "create.ponder.fluid_pipe_flow.text_1": "液體管可以連接兩個或更多的液體來源與目標", + "create.ponder.fluid_pipe_flow.text_2": "使用扳手可以在一段直管線上開窗戶", + "create.ponder.fluid_pipe_flow.text_3": "有窗戶的管線側面不會連接到其他管線", + "create.ponder.fluid_pipe_flow.text_4": "機械幫浦可以讓管線運輸液體", + "create.ponder.fluid_pipe_flow.text_5": "一開始不會有液體被抽出來", + "create.ponder.fluid_pipe_flow.text_6": "直到兩端被連接起來,才會有液體被抽過去", + "create.ponder.fluid_pipe_flow.text_7": "因此,管線裡不會『物理上的』含有液體", + + "create.ponder.fluid_pipe_interaction.header": "抽取並填滿液體罐", + "create.ponder.fluid_pipe_interaction.text_1": "管線網路的終端可以和很多東西互動", + "create.ponder.fluid_pipe_interaction.text_2": "任何有意體容量的方塊都可以被抽取和填滿", + "create.ponder.fluid_pipe_interaction.text_3": "在開放端口前的液體源方塊可以被抽走", + "create.ponder.fluid_pipe_interaction.text_4": "當液體被排放出來時會產生新的液體源方塊", + "create.ponder.fluid_pipe_interaction.text_5": "管線也可以直接從其他方塊中抽取流體", + + "create.ponder.fluid_tank_sizes.header": "液體罐的尺寸", + "create.ponder.fluid_tank_sizes.text_1": "可以組合液體罐以增加總容量", + "create.ponder.fluid_tank_sizes.text_2": "底部最多可以是 3x3 的正方形 ......", + "create.ponder.fluid_tank_sizes.text_3": "...... 最多可以堆疊 30 層", + "create.ponder.fluid_tank_sizes.text_4": "扳手可以用來開關窗戶", + + "create.ponder.fluid_tank_storage.header": "在液體罐中儲存液體", + "create.ponder.fluid_tank_storage.text_1": "液體罐中可儲存大量的液體", + "create.ponder.fluid_tank_storage.text_2": "管線體網路可以從任何一邊抽取或是輸入液體", + "create.ponder.fluid_tank_storage.text_3": "紅石比較器可以輸出液體容量", + "create.ponder.fluid_tank_storage.text_4": "但是,在生存模式你不能直接存入、取出液體", + "create.ponder.fluid_tank_storage.text_5": "你可以用作業盆、分液池或液體灌注器和管線網路互動", + "create.ponder.flywheel.header": "使用飛輪來產生動能", - "create.ponder.flywheel.text_1": "飛輪和熔爐引擎必須配套使用,方可產生動能", - "create.ponder.flywheel.text_2": "如此產生的動能具有非常大的應力值", - "create.ponder.flywheel.text_3": "使用高爐會使得引擎的效率翻倍", - + "create.ponder.flywheel.text_1": "飛輪和熔爐引擎必須配套使用,方可產生動能", + "create.ponder.flywheel.text_2": "如此產生的動能具有非常大的應力值", + "create.ponder.flywheel.text_3": "使用高爐會使得引擎的效率翻倍", + "create.ponder.funnel_compat.header": "漏斗的相容性", - "create.ponder.funnel_compat.text_1": "漏斗可以與一些其他組件互動", - "create.ponder.funnel_compat.text_2": "動力鋸", - "create.ponder.funnel_compat.text_3": "置物台", - "create.ponder.funnel_compat.text_4": "分液池", - + "create.ponder.funnel_compat.text_1": "漏斗可以與一些其他組件互動", + "create.ponder.funnel_compat.text_2": "動力鋸", + "create.ponder.funnel_compat.text_3": "置物台", + "create.ponder.funnel_compat.text_4": "分液池", + "create.ponder.funnel_direction.header": "物流方向", - "create.ponder.funnel_direction.text_1": "直接放置時,漏斗會將物品從容器中取出", - "create.ponder.funnel_direction.text_2": "潛行時放置時,漏斗會將物品置入容器中", - "create.ponder.funnel_direction.text_3": "使用扳手可以改變漏斗的存/取模式", - "create.ponder.funnel_direction.text_4": "對大多數朝向放置的漏斗都具有此特性", - "create.ponder.funnel_direction.text_5": "在傳送帶末端放置的漏斗會根據傳送帶的傳動方向存/取物品", - + "create.ponder.funnel_direction.text_1": "直接放置時,漏斗會將物品從容器中取出", + "create.ponder.funnel_direction.text_2": "潛行時放置時,漏斗會將物品置入容器中", + "create.ponder.funnel_direction.text_3": "使用扳手可以改變漏斗的存/取模式", + "create.ponder.funnel_direction.text_4": "對大多數朝向放置的漏斗都具有此特性", + "create.ponder.funnel_direction.text_5": "在傳送帶末端放置的漏斗會根據傳送帶的傳動方向存/取物品", + "create.ponder.funnel_intro.header": "使用漏斗", - "create.ponder.funnel_intro.text_1": "用漏斗來存取物品欄內的物品,可謂又快又好", - + "create.ponder.funnel_intro.text_1": "用漏斗來存取物品欄內的物品,可謂又快又好", + "create.ponder.funnel_redstone.header": "紅石訊號控制", - "create.ponder.funnel_redstone.text_1": "紅石訊號會使漏斗停止工作", - + "create.ponder.funnel_redstone.text_1": "紅石訊號會使漏斗停止工作", + "create.ponder.funnel_transfer.header": "直接運輸", - "create.ponder.funnel_transfer.text_1": "漏斗無法將物品傳輸到非開放式的物品欄中", - "create.ponder.funnel_transfer.text_2": "溜槽和智慧溜槽更適用於這樣的場景", - "create.ponder.funnel_transfer.text_3": "水平傳輸也是如此,也許傳送帶更方便快捷", - + "create.ponder.funnel_transfer.text_1": "漏斗無法將物品傳輸到非開放式的物品欄中", + "create.ponder.funnel_transfer.text_2": "溜槽和智慧溜槽更適用於這樣的場景", + "create.ponder.funnel_transfer.text_3": "水平傳輸也是如此,也許傳送帶更方便快捷", + "create.ponder.furnace_engine.header": "使用熔爐引擎生產動能", - "create.ponder.furnace_engine.text_1": "熔爐引擎會在與其相連熔爐工作時生產動能", - "create.ponder.furnace_engine.text_2": "如此產生的動能具有非常大的應力值", - "create.ponder.furnace_engine.text_3": "使用高爐會使得引擎的效率翻倍", - + "create.ponder.furnace_engine.text_1": "熔爐引擎會在與其相連熔爐工作時生產動能", + "create.ponder.furnace_engine.text_2": "如此產生的動能具有非常大的應力值", + "create.ponder.furnace_engine.text_3": "使用高爐會使得引擎的效率翻倍", + "create.ponder.gantry_carriage.header": "使用起重機取物器", - "create.ponder.gantry_carriage.text_1": "起重機取物器可以被放置在起重機杆上,並且可以沿著起重機杆運動", - "create.ponder.gantry_carriage.text_2": "起重機可以移動其黏附的方塊", - + "create.ponder.gantry_carriage.text_1": "起重機取物器可以被放置在起重機杆上,並且可以沿著起重機杆運動", + "create.ponder.gantry_carriage.text_2": "起重機可以移動其黏附的方塊", + "create.ponder.gantry_cascaded.header": "串聯起重機", - "create.ponder.gantry_cascaded.text_1": "無需強力膠,取物器便可與起重機杆相連", - "create.ponder.gantry_cascaded.text_2": "即使是在移動的起重機杆上也是如此", - "create.ponder.gantry_cascaded.text_3": "因此,起重機系統可以串聯起來,如此可以影響到多軸向的運動", - + "create.ponder.gantry_cascaded.text_1": "無需強力膠,取物器便可與起重機杆相連", + "create.ponder.gantry_cascaded.text_2": "即使是在移動的起重機杆上也是如此", + "create.ponder.gantry_cascaded.text_3": "因此,起重機系統可以串聯起來,如此可以影響到多軸向的運動", + "create.ponder.gantry_direction.header": "起重機移動方向", - "create.ponder.gantry_direction.text_1": "起重機杆可以有相反的方向", - "create.ponder.gantry_direction.text_2": "取物器的移動方向取決於起重機杆的方向", - "create.ponder.gantry_direction.text_3": "......以及起重機杆的旋轉方向", - "create.ponder.gantry_direction.text_4": "在旋轉傳遞中,此規則同樣適用", - + "create.ponder.gantry_direction.text_1": "起重機杆可以有相反的方向", + "create.ponder.gantry_direction.text_2": "取物器的移動方向取決於起重機杆的方向", + "create.ponder.gantry_direction.text_3": "......以及起重機杆的旋轉方向", + "create.ponder.gantry_direction.text_4": "在旋轉傳遞中,此規則同樣適用", + "create.ponder.gantry_redstone.header": "起重機的力傳遞", - "create.ponder.gantry_redstone.text_1": "被紅石訊號啟動的起重機,將不會移動其上的取物器", - "create.ponder.gantry_redstone.text_2": "作為替代,杆上的動能會傳遞到取物器的輸出杆上", - + "create.ponder.gantry_redstone.text_1": "被紅石訊號啟動的起重機,將不會移動其上的取物器", + "create.ponder.gantry_redstone.text_2": "作為替代,杆上的動能會傳遞到取物器的輸出杆上", + "create.ponder.gantry_shaft.header": "使用起重機杆", - "create.ponder.gantry_shaft.text_1": "起重機杆組成了起重機結構的基礎。與其相接的載物器可以沿著杆進行移動。", - "create.ponder.gantry_shaft.text_2": "起重機結構可以移動與其相接的方塊。", - + "create.ponder.gantry_shaft.text_1": "起重機杆組成了起重機結構的基礎。與其相接的載物器可以沿著杆進行移動。", + "create.ponder.gantry_shaft.text_2": "起重機結構可以移動與其相接的方塊。", + "create.ponder.gearbox.header": "使用十字齒輪箱傳遞動能", - "create.ponder.gearbox.text_1": "更改旋轉軸,很容易使得整個旋轉體系變得臃腫不堪", - "create.ponder.gearbox.text_2": "十字齒輪箱則是替代方案,它的體積更為小巧緊", - "create.ponder.gearbox.text_3": "側邊連接的傳動桿,旋轉方向與輸入端一致", - "create.ponder.gearbox.text_4": "直線連接的傳動桿,旋轉方向會被反轉", - + "create.ponder.gearbox.text_1": "更改旋轉軸,很容易使得整個旋轉體系變得臃腫不堪", + "create.ponder.gearbox.text_2": "十字齒輪箱則是替代方案,它的體積更為小巧緊", + "create.ponder.gearbox.text_3": "側邊連接的傳動桿,旋轉方向與輸入端一致", + "create.ponder.gearbox.text_4": "直線連接的傳動桿,旋轉方向會被反轉", + "create.ponder.gearshift.header": "使用反轉齒輪箱控制動能", - "create.ponder.gearshift.text_1": "反轉齒輪箱可以直線傳輸旋轉", - "create.ponder.gearshift.text_2": "通入紅石訊號後,輸出端的旋轉方向會被反轉", - + "create.ponder.gearshift.text_1": "反轉齒輪箱可以直線傳輸旋轉", + "create.ponder.gearshift.text_2": "通入紅石訊號後,輸出端的旋轉方向會被反轉", + "create.ponder.hand_crank.header": "使用手搖把手產生動能", - "create.ponder.hand_crank.text_1": "玩家可以使用手搖把手來手動產生動能", - "create.ponder.hand_crank.text_2": "按住右鍵可以逆時針旋轉它", - "create.ponder.hand_crank.text_3": "它產生的轉速相對較高", - "create.ponder.hand_crank.text_4": "潛行長按右鍵可以順時針旋轉它", - + "create.ponder.hand_crank.text_1": "玩家可以使用手搖把手來手動產生動能", + "create.ponder.hand_crank.text_2": "按住右鍵可以逆時針旋轉它", + "create.ponder.hand_crank.text_3": "它產生的轉速相對較高", + "create.ponder.hand_crank.text_4": "潛行長按右鍵可以順時針旋轉它", + + "create.ponder.hose_pulley.header": "使用軟管滑輪抽取、填滿液體", + "create.ponder.hose_pulley.text_1": "軟管滑輪可以用來抽取、填滿大量的液體", + "create.ponder.hose_pulley.text_2": "你可以透過輸入轉動來控制軟管的高度", + "create.ponder.hose_pulley.text_3": "反轉時可以收回軟管", + "create.ponder.hose_pulley.text_4": "另一邊可以連接管線", + "create.ponder.hose_pulley.text_5": "相連的管線網路可以提供液體 ......", + "create.ponder.hose_pulley.text_6": "...... 或是從池子裡抽取液體", + "create.ponder.hose_pulley.text_7": "抽取或填滿的速度取決於管線系統的吞吐量", + + "create.ponder.hose_pulley_infinite.header": "被動填充和排放大量液體", + "create.ponder.hose_pulley_infinite.text_1": "將軟管滑輪接觸到足夠大的海洋中時 ......", + "create.ponder.hose_pulley_infinite.text_2": "海洋會被視為無限液體源", + "create.ponder.hose_pulley_infinite.text_3": "管線網路可以無限的抽取、排放液體到海洋中而不影響海洋", + + "create.ponder.hose_pulley_level.header": "軟管滑輪抽取、填滿水平面", + "create.ponder.hose_pulley_level.text_1": "完全縮回時,軟管滑輪無法操作", + "create.ponder.hose_pulley_level.text_2": "抽取工作將由上而下進行", + "create.ponder.hose_pulley_level.text_3": "水平面將停在軟管末端的正下方", + "create.ponder.hose_pulley_level.text_4": "而填充工作將由下而上進行將由上而下進行", + "create.ponder.hose_pulley_level.text_5": "水平面不會超過軟管末端", + + "create.ponder.item_drain.header": "使用分液池清空液體容器", + "create.ponder.item_drain.text_1": "分液池可以從液體容器中清空抽取液體", + "create.ponder.item_drain.text_2": "點擊右鍵可以把你手上的液體倒進去", + "create.ponder.item_drain.text_3": "當從旁邊輸入物品 ......", + "create.ponder.item_drain.text_4": "...... 他會從上方滑過,並清空裡面的液體", + "create.ponder.item_drain.text_5": "現在液體網路可以抽取分液池中的液體了", + "create.ponder.large_cogwheel.header": "使用大齒輪傳遞動能", - "create.ponder.large_cogwheel.text_1": "大齒輪可以以特定的角度相互連接", - "create.ponder.large_cogwheel.text_2": "可以利用大齒輪變更旋轉軸向", - + "create.ponder.large_cogwheel.text_1": "大齒輪可以以特定的角度相互連接", + "create.ponder.large_cogwheel.text_2": "可以利用大齒輪變更旋轉軸向", + "create.ponder.linear_chassis_attachment.header": "使用機殼底盤黏合方塊", - "create.ponder.linear_chassis_attachment.text_1": "它的開放面可以變為黏性面", - "create.ponder.linear_chassis_attachment.text_2": "再次點擊黏性面,可以將它的相反面也變得具有黏性", - "create.ponder.linear_chassis_attachment.text_3": "空手潛行右擊可以移除此面的黏性物", - "create.ponder.linear_chassis_attachment.text_4": "黏性面可以將此面前方的一長條方塊黏住", - "create.ponder.linear_chassis_attachment.text_5": "使用扳手可以精確控制底盤的影響範圍", - "create.ponder.linear_chassis_attachment.text_6": "按住 Ctrl 滑動滾輪,你可以一次性調節所有底盤的影響範圍", - "create.ponder.linear_chassis_attachment.text_7": "若想讓底盤的其他面也能黏方塊,你需要用到強力膠", - "create.ponder.linear_chassis_attachment.text_8": "利用這些機制,任何形狀的機制都可以像裝置那樣移動", - + "create.ponder.linear_chassis_attachment.text_1": "它的開放面可以變為黏性面", + "create.ponder.linear_chassis_attachment.text_2": "再次點擊黏性面,可以將它的相反面也變得具有黏性", + "create.ponder.linear_chassis_attachment.text_3": "空手潛行右擊可以移除此面的黏性物", + "create.ponder.linear_chassis_attachment.text_4": "黏性面可以將此面前方的一長條方塊黏住", + "create.ponder.linear_chassis_attachment.text_5": "使用扳手可以精確控制底盤的影響範圍", + "create.ponder.linear_chassis_attachment.text_6": "按住 Ctrl 滑動滾輪,你可以一次性調節所有底盤的影響範圍", + "create.ponder.linear_chassis_attachment.text_7": "若想讓底盤的其他面也能黏方塊,你需要用到強力膠", + "create.ponder.linear_chassis_attachment.text_8": "利用這些機制,任何形狀的機制都可以像裝置那樣移動", + "create.ponder.linear_chassis_group.header": "成組移動機殼底盤", - "create.ponder.linear_chassis_group.text_1": "相鄰的機殼底盤可以相互連接在一起", - "create.ponder.linear_chassis_group.text_2": "其中的一個底盤若被移動,其餘的底盤也會跟著移動", - "create.ponder.linear_chassis_group.text_3": "不同種類的底盤,或者是朝向不一致的底盤,將不會相連", - + "create.ponder.linear_chassis_group.text_1": "相鄰的機殼底盤可以相互連接在一起", + "create.ponder.linear_chassis_group.text_2": "其中的一個底盤若被移動,其餘的底盤也會跟著移動", + "create.ponder.linear_chassis_group.text_3": "不同種類的底盤,或者是朝向不一致的底盤,將不會相連", + "create.ponder.mechanical_arm.header": "設定動力臂", - "create.ponder.mechanical_arm.text_1": "你得在放置動力臂之前就設定好它的輸入以及輸出端", - "create.ponder.mechanical_arm.text_2": "手持動力臂右擊某個存儲空間,可以將其指定為目標", - "create.ponder.mechanical_arm.text_3": "再次右擊可以將其在輸入端(藍色)以及輸出端(橙色)之間切換", - "create.ponder.mechanical_arm.text_4": "左擊此組件可以移除選擇", - "create.ponder.mechanical_arm.text_5": "將動力臂放下來後,它會將此前選擇的方塊作為目標", - "create.ponder.mechanical_arm.text_6": "在有效範圍內,機械手臂可以有任意數量的輸出以及輸入端", - "create.ponder.mechanical_arm.text_7": "然而,並不是所有的存儲空間可以被直接互動", - "create.ponder.mechanical_arm.text_8": "在此情況下,漏斗和置物台可以解決此問題", - + "create.ponder.mechanical_arm.text_1": "你得在放置動力臂之前就設定好它的輸入以及輸出端", + "create.ponder.mechanical_arm.text_2": "手持動力臂右擊某個存儲空間,可以將其指定為目標", + "create.ponder.mechanical_arm.text_3": "再次右擊可以將其在輸入端(藍色)以及輸出端(橙色)之間切換", + "create.ponder.mechanical_arm.text_4": "左擊此組件可以移除選擇", + "create.ponder.mechanical_arm.text_5": "將動力臂放下來後,它會將此前選擇的方塊作為目標", + "create.ponder.mechanical_arm.text_6": "在有效範圍內,機械手臂可以有任意數量的輸出以及輸入端", + "create.ponder.mechanical_arm.text_7": "然而,並不是所有的存儲空間可以被直接互動", + "create.ponder.mechanical_arm.text_8": "在此情況下,漏斗和置物台可以解決此問題", + "create.ponder.mechanical_arm_filtering.header": "過濾動力臂的輸出端", - "create.ponder.mechanical_arm_filtering.text_1": "輸入", - "create.ponder.mechanical_arm_filtering.text_2": "輸出", - "create.ponder.mechanical_arm_filtering.text_3": "有時,你會想著利用某種過濾限煞車力臂的目標", - "create.ponder.mechanical_arm_filtering.text_4": "動力臂自身並不提供任何過濾選項", - "create.ponder.mechanical_arm_filtering.text_5": "然而,若將黃銅漏斗作為目標,則漏斗的過濾槽則可以應用至動力臂上", - "create.ponder.mechanical_arm_filtering.text_6": "動力臂足夠智慧,它不會去拿取那些它無法分配的物品", - + "create.ponder.mechanical_arm_filtering.text_1": "輸入", + "create.ponder.mechanical_arm_filtering.text_2": "輸出", + "create.ponder.mechanical_arm_filtering.text_3": "有時,你會想著利用某種過濾限煞車力臂的目標", + "create.ponder.mechanical_arm_filtering.text_4": "動力臂自身並不提供任何過濾選項", + "create.ponder.mechanical_arm_filtering.text_5": "然而,若將黃銅漏斗作為目標,則漏斗的過濾槽則可以應用至動力臂上", + "create.ponder.mechanical_arm_filtering.text_6": "動力臂足夠智慧,它不會去拿取那些它無法分配的物品", + "create.ponder.mechanical_arm_modes.header": "動力臂的分配模式", - "create.ponder.mechanical_arm_modes.text_1": "輸入", - "create.ponder.mechanical_arm_modes.text_2": "輸出", - "create.ponder.mechanical_arm_modes.text_3": "若動力臂必須在數個有效的輸出端之間作出選擇...", - "create.ponder.mechanical_arm_modes.text_4": "...它會依照自己的設定選擇特定的行為", - "create.ponder.mechanical_arm_modes.text_5": "手持扳手對其滑動滾輪,可以改變其設定", - "create.ponder.mechanical_arm_modes.text_6": "輪詢調度模式很好理解,即循環輸出至所有有效的輸出端", - "create.ponder.mechanical_arm_modes.text_7": "如果某個輸出端無法容納更多物品,則它會被跳過", - "create.ponder.mechanical_arm_modes.text_8": "強制輪詢調度不會跳過任何輸出端,動力臂會一直等待,直到輸出端有空位容納物品輸入", - "create.ponder.mechanical_arm_modes.text_9": "最近優先模式會使得動力臂先將物品輸出至更早被選擇的輸出端", - + "create.ponder.mechanical_arm_modes.text_1": "輸入", + "create.ponder.mechanical_arm_modes.text_2": "輸出", + "create.ponder.mechanical_arm_modes.text_3": "若動力臂必須在數個有效的輸出端之間作出選擇...", + "create.ponder.mechanical_arm_modes.text_4": "...它會依照自己的設定選擇特定的行為", + "create.ponder.mechanical_arm_modes.text_5": "手持扳手對其滑動滾輪,可以改變其設定", + "create.ponder.mechanical_arm_modes.text_6": "輪詢調度模式很好理解,即循環輸出至所有有效的輸出端", + "create.ponder.mechanical_arm_modes.text_7": "如果某個輸出端無法容納更多物品,則它會被跳過", + "create.ponder.mechanical_arm_modes.text_8": "強制輪詢調度不會跳過任何輸出端,動力臂會一直等待,直到輸出端有空位容納物品輸入", + "create.ponder.mechanical_arm_modes.text_9": "最近優先模式會使得動力臂先將物品輸出至更早被選擇的輸出端", + "create.ponder.mechanical_arm_redstone.header": "利用紅石訊號控制動力臂", - "create.ponder.mechanical_arm_redstone.text_1": "通入紅石訊號後,動力臂會停止工作", - "create.ponder.mechanical_arm_redstone.text_2": "在停止工作前,它會完成目前正在進行的工作週期", - "create.ponder.mechanical_arm_redstone.text_3": "因此,通入單次負紅石脈衝可以精確控制動力臂,使其每次只進行單個週期的工作", - + "create.ponder.mechanical_arm_redstone.text_1": "通入紅石訊號後,動力臂會停止工作", + "create.ponder.mechanical_arm_redstone.text_2": "在停止工作前,它會完成目前正在進行的工作週期", + "create.ponder.mechanical_arm_redstone.text_3": "因此,通入單次負紅石脈衝可以精確控制動力臂,使其每次只進行單個週期的工作", + "create.ponder.mechanical_bearing.header": "使用動力軸承移動結構", - "create.ponder.mechanical_bearing.text_1": "動力軸承會與其前方的方塊黏合在一起", - "create.ponder.mechanical_bearing.text_2": "接收到動能後,它會將這一黏合結構組裝為旋轉裝置", - + "create.ponder.mechanical_bearing.text_1": "動力軸承會與其前方的方塊黏合在一起", + "create.ponder.mechanical_bearing.text_2": "接收到動能後,它會將這一黏合結構組裝為旋轉裝置", + "create.ponder.mechanical_crafter.header": "設置動力合成器", - "create.ponder.mechanical_crafter.text_1": "動力合成器陣列可用於自動化任何合成配方的製作", - "create.ponder.mechanical_crafter.text_2": "使用扳手可以調控合成器的合成通路", - "create.ponder.mechanical_crafter.text_3": "所有的合成通路必須匯集到任意一側的一個出口,整套合成器方可算是設置正確", - "create.ponder.mechanical_crafter.text_4": "輸出產物會被放入位於出口的存儲空間中", - "create.ponder.mechanical_crafter.text_5": "動力合成器的運轉需要動能的供應", - "create.ponder.mechanical_crafter.text_6": "右擊合成器正面,可以手動放入物品", - "create.ponder.mechanical_crafter.text_7": "一旦合成通路上的所有合成槽位都有了物品,合成就會開始", - "create.ponder.mechanical_crafter.text_8": "而對於那些沒有完全占滿所有合成器槽位的配方,你可以通入紅石訊號強制開啟合成", - + "create.ponder.mechanical_crafter.text_1": "動力合成器陣列可用於自動化任何合成配方的製作", + "create.ponder.mechanical_crafter.text_2": "使用扳手可以調控合成器的合成通路", + "create.ponder.mechanical_crafter.text_3": "所有的合成通路必須匯集到任意一側的一個出口,整套合成器方可算是設置正確", + "create.ponder.mechanical_crafter.text_4": "輸出產物會被放入位於出口的存儲空間中", + "create.ponder.mechanical_crafter.text_5": "動力合成器的運轉需要動能的供應", + "create.ponder.mechanical_crafter.text_6": "右擊合成器正面,可以手動放入物品", + "create.ponder.mechanical_crafter.text_7": "一旦合成通路上的所有合成槽位都有了物品,合成就會開始", + "create.ponder.mechanical_crafter.text_8": "而對於那些沒有完全占滿所有合成器槽位的配方,你可以通入紅石訊號強制開啟合成", + "create.ponder.mechanical_crafter_connect.header": "為合成器連接物品欄", - "create.ponder.mechanical_crafter_connect.text_1": "合成器可以自動接受向其輸入的物品", - "create.ponder.mechanical_crafter_connect.text_2": "對其背面使用扳手,可以連接合成器", - "create.ponder.mechanical_crafter_connect.text_3": "所有相連的合成器可以訪問同一個位置的輸入", - + "create.ponder.mechanical_crafter_connect.text_1": "合成器可以自動接受向其輸入的物品", + "create.ponder.mechanical_crafter_connect.text_2": "對其背面使用扳手,可以連接合成器", + "create.ponder.mechanical_crafter_connect.text_3": "所有相連的合成器可以訪問同一個位置的輸入", + "create.ponder.mechanical_crafter_covers.header": "蓋住動力合成器的合成槽", - "create.ponder.mechanical_crafter_covers.text_1": "有些配方需要額外的合成器,來補足合成通路上的間隙", - "create.ponder.mechanical_crafter_covers.text_2": "使用合成槽蓋板,合成器會在合成進行時的行為就如同一個空的合成槽位", - "create.ponder.mechanical_crafter_covers.text_3": "被蓋住的合成器並不會阻斷共享輸入端的影響", - + "create.ponder.mechanical_crafter_covers.text_1": "有些配方需要額外的合成器,來補足合成通路上的間隙", + "create.ponder.mechanical_crafter_covers.text_2": "使用合成槽蓋板,合成器會在合成進行時的行為就如同一個空的合成槽位", + "create.ponder.mechanical_crafter_covers.text_3": "被蓋住的合成器並不會阻斷共享輸入端的影響", + "create.ponder.mechanical_drill.header": "使用機械鑽頭破壞方塊", - "create.ponder.mechanical_drill.text_1": "當向其通入動能後,機械鑽頭會破壞它面前的方塊", - "create.ponder.mechanical_drill.text_2": "它的挖掘速度取決於通入的動能轉速", - + "create.ponder.mechanical_drill.text_1": "當向其通入動能後,機械鑽頭會破壞它面前的方塊", + "create.ponder.mechanical_drill.text_2": "它的挖掘速度取決於通入的動能轉速", + "create.ponder.mechanical_drill_contraption.header": "在裝置中使用機械鑽頭", - "create.ponder.mechanical_drill_contraption.text_1": "在運動裝置中使用機械鑽頭時...", - "create.ponder.mechanical_drill_contraption.text_2": "...它會破壞掉它撞上的方塊", - + "create.ponder.mechanical_drill_contraption.text_1": "在運動裝置中使用機械鑽頭時...", + "create.ponder.mechanical_drill_contraption.text_2": "...它會破壞掉它撞上的方塊", + "create.ponder.mechanical_harvester.header": "在裝置中使用動力收割機", - "create.ponder.mechanical_harvester.text_1": "在運動裝置中使用動力收割機時...", - "create.ponder.mechanical_harvester.text_2": "它會採收其路徑上的作物,並重設這些作物的生長進度", - + "create.ponder.mechanical_harvester.text_1": "在運動裝置中使用動力收割機時...", + "create.ponder.mechanical_harvester.text_2": "它會採收其路徑上的作物,並重設這些作物的生長進度", + "create.ponder.mechanical_mixer.header": "使用動力攪拌器處理物品", - "create.ponder.mechanical_mixer.text_1": "使用攪拌器和工作盆,你可以自動化某些合成配方", - "create.ponder.mechanical_mixer.text_2": "有效配方包括各種無序合成配方,以及一些額外的配方", - "create.ponder.mechanical_mixer.text_3": "一些配方可能需要使用烈焰人燃燒室提供熱量", - "create.ponder.mechanical_mixer.text_4": "過濾槽可用於解決兩個配方相互衝突的情況", - + "create.ponder.mechanical_mixer.text_1": "使用攪拌器和工作盆,你可以自動化某些合成配方", + "create.ponder.mechanical_mixer.text_2": "有效配方包括各種無序合成配方,以及一些額外的配方", + "create.ponder.mechanical_mixer.text_3": "一些配方可能需要使用烈焰人燃燒室提供熱量", + "create.ponder.mechanical_mixer.text_4": "過濾槽可用於解決兩個配方相互衝突的情況", + "create.ponder.mechanical_piston.header": "使用動力活塞移動結構", - "create.ponder.mechanical_piston.text_1": "動力活塞可以移動它前方的方塊", - "create.ponder.mechanical_piston.text_2": "移動速度和方向取決於通入活塞的動能", - "create.ponder.mechanical_piston.text_3": "黏性動力活塞可以將相接的方塊拉回來", - + "create.ponder.mechanical_piston.text_1": "動力活塞可以移動它前方的方塊", + "create.ponder.mechanical_piston.text_2": "移動速度和方向取決於通入活塞的動能", + "create.ponder.mechanical_piston.text_3": "黏性動力活塞可以將相接的方塊拉回來", + "create.ponder.mechanical_piston_modes.header": "動力活塞的移動模式", - "create.ponder.mechanical_piston_modes.text_1": "一旦活塞停下,被移動的結構就會回退到方塊狀態", - "create.ponder.mechanical_piston_modes.text_2": "你也可以將其設定為從不方塊化,或者只在起始位置方塊化", - + "create.ponder.mechanical_piston_modes.text_1": "一旦活塞停下,被移動的結構就會回退到方塊狀態", + "create.ponder.mechanical_piston_modes.text_2": "你也可以將其設定為從不方塊化,或者只在起始位置方塊化", + "create.ponder.mechanical_plough.header": "在裝置中使用動力犁", - "create.ponder.mechanical_plough.text_1": "在運動裝置中使用動力犁時...", - "create.ponder.mechanical_plough.text_2": "...它會破壞掉那些不具有固體碰撞箱的方塊", - "create.ponder.mechanical_plough.text_3": "此外,動力犁可以耕地", - "create.ponder.mechanical_plough.text_4": "...它也可以在不傷害實體的情況下推動它們", - + "create.ponder.mechanical_plough.text_1": "在運動裝置中使用動力犁時...", + "create.ponder.mechanical_plough.text_2": "...它會破壞掉那些不具有固體碰撞箱的方塊", + "create.ponder.mechanical_plough.text_3": "此外,動力犁可以耕地", + "create.ponder.mechanical_plough.text_4": "...它也可以在不傷害實體的情況下推動它們", + "create.ponder.mechanical_press.header": "使用機械液壓機處理物品", - "create.ponder.mechanical_press.text_1": "機械液壓機可以處理位於其下方的物品", - "create.ponder.mechanical_press.text_2": "在其下方丟入物品,或者將物品放在置物台上,都算作有效的物品輸入", - "create.ponder.mechanical_press.text_3": "若物品被輸入時正位於傳送帶上...", - "create.ponder.mechanical_press.text_4": "輥軋機會使物品停下,然後自動處理這一物品", - + "create.ponder.mechanical_press.text_1": "機械液壓機可以處理位於其下方的物品", + "create.ponder.mechanical_press.text_2": "在其下方丟入物品,或者將物品放在置物台上,都算作有效的物品輸入", + "create.ponder.mechanical_press.text_3": "若物品被輸入時正位於傳送帶上...", + "create.ponder.mechanical_press.text_4": "輥軋機會使物品停下,然後自動處理這一物品", + "create.ponder.mechanical_press_compacting.header": "使用機械液壓機壓縮物品", - "create.ponder.mechanical_press_compacting.text_1": "對放置於工作盆內的物品進行輥軋,可以將這些物品壓縮在一起", - "create.ponder.mechanical_press_compacting.text_2": "壓縮意指任何同種物品填滿了 2x2 或者 3x3 網格的配方,以及一些額外的配方", - "create.ponder.mechanical_press_compacting.text_3": "一些配方可能需要烈焰人燃燒室提供熱量", - "create.ponder.mechanical_press_compacting.text_4": "過濾槽可用於解決兩個配方相互衝突的情況", - + "create.ponder.mechanical_press_compacting.text_1": "對放置於工作盆內的物品進行輥軋,可以將這些物品壓縮在一起", + "create.ponder.mechanical_press_compacting.text_2": "壓縮意指任何同種物品填滿了 2x2 或者 3x3 網格的配方,以及一些額外的配方", + "create.ponder.mechanical_press_compacting.text_3": "一些配方可能需要烈焰人燃燒室提供熱量", + "create.ponder.mechanical_press_compacting.text_4": "過濾槽可用於解決兩個配方相互衝突的情況", + + "create.ponder.mechanical_pump_flow.header": "使用機械幫浦抽運送液體", + "create.ponder.mechanical_pump_flow.text_1": "機械幫浦為與其連接的管線提供動力", + "create.ponder.mechanical_pump_flow.text_2": "轉動時,箭頭指向液體的方向", + "create.ponder.mechanical_pump_flow.text_3": "在他後面的網路現在可以抽取液體 ......", + "create.ponder.mechanical_pump_flow.text_4": "...... 當前面的網絡向外傳輸時", + "create.ponder.mechanical_pump_flow.text_5": "反轉輸入的動力可以反轉液體的方向", + "create.ponder.mechanical_pump_flow.text_6": "扳手可以手動調整方向", + + "create.ponder.mechanical_pump_speed.header": "機械幫浦的吞吐量", + "create.ponder.mechanical_pump_speed.text_1": "無論轉速如何,機械幫浦都只能影響相連的 16 個方塊以內的管線", + "create.ponder.mechanical_pump_speed.text_2": "加快旋轉速度會改變液動傳播的速度 ......", + "create.ponder.mechanical_pump_speed.text_3": "...... 以及流體轉移的速度", + "create.ponder.mechanical_pump_speed.text_4": "在同一個管線網路中機械幫浦可以結合他們的吞吐量", + "create.ponder.mechanical_pump_speed.text_5": "改變它們的方向可以對齊它們的流動方向", + "create.ponder.mechanical_saw_breaker.header": "使用動力鋸伐木", - "create.ponder.mechanical_saw_breaker.text_1": "向其通入動能後,動力鋸可以直接砍伐掉它面前的樹木", - "create.ponder.mechanical_saw_breaker.text_2": "想要一次性砍掉整棵樹,鋸子必須破壞掉樹與地面連接的最後一個方塊", - + "create.ponder.mechanical_saw_breaker.text_1": "向其通入動能後,動力鋸可以直接砍伐掉它面前的樹木", + "create.ponder.mechanical_saw_breaker.text_2": "想要一次性砍掉整棵樹,鋸子必須破壞掉樹與地面連接的最後一個方塊", + "create.ponder.mechanical_saw_contraption.header": "在裝置中使用動力鋸", - "create.ponder.mechanical_saw_contraption.text_1": "若在運動裝置中使用動力鋸...", - "create.ponder.mechanical_saw_contraption.text_2": "...它會將撞到它的樹木破壞掉", - + "create.ponder.mechanical_saw_contraption.text_1": "若在運動裝置中使用動力鋸...", + "create.ponder.mechanical_saw_contraption.text_2": "...它會將撞到它的樹木破壞掉", + "create.ponder.mechanical_saw_processing.header": "使用動力鋸處理物品", - "create.ponder.mechanical_saw_processing.text_1": "面向朝上的動力鋸可以將物品處理為其變種", - "create.ponder.mechanical_saw_processing.text_2": "處理過後的物品的彈出方向始終與通入鋸中的旋轉轉向相反", - "create.ponder.mechanical_saw_processing.text_3": "鋸子可以", - "create.ponder.mechanical_saw_processing.text_4": "若輸入原料有多種可能產物,你可以用動力鋸上的過濾槽指定只產出某種產物", - "create.ponder.mechanical_saw_processing.text_5": "若沒有使用過濾槽,動力鋸會在各產物中按順序循環輸出", - + "create.ponder.mechanical_saw_processing.text_1": "面向朝上的動力鋸可以將物品處理為其變種", + "create.ponder.mechanical_saw_processing.text_2": "處理過後的物品的彈出方向始終與通入鋸中的旋轉轉向相反", + "create.ponder.mechanical_saw_processing.text_3": "鋸子可以", + "create.ponder.mechanical_saw_processing.text_4": "若輸入原料有多種可能產物,你可以用動力鋸上的過濾槽指定只產出某種產物", + "create.ponder.mechanical_saw_processing.text_5": "若沒有使用過濾槽,動力鋸會在各產物中按順序循環輸出", + "create.ponder.millstone.header": "使用石磨處理物品", - "create.ponder.millstone.text_1": "石磨會對輸入的物品進行磨製", - "create.ponder.millstone.text_2": "在其側邊使用齒輪與其相耦合,方可為其通入動力", - "create.ponder.millstone.text_3": "頂部可以丟入或者塞入物品", - "create.ponder.millstone.text_4": "一段時間過後,右擊石磨可以拿出其中的產物", - "create.ponder.millstone.text_5": "產物的提取也是可以自動化的", - + "create.ponder.millstone.text_1": "石磨會對輸入的物品進行磨製", + "create.ponder.millstone.text_2": "在其側邊使用齒輪與其相耦合,方可為其通入動力", + "create.ponder.millstone.text_3": "頂部可以丟入或者塞入物品", + "create.ponder.millstone.text_4": "一段時間過後,右擊石磨可以拿出其中的產物", + "create.ponder.millstone.text_5": "產物的提取也是可以自動化的", + "create.ponder.nixie_tube.header": "使用真空管顯示器", - "create.ponder.nixie_tube.text_1": "通入紅石訊號後,真空管顯示器會顯示出紅石訊號的強度", - "create.ponder.nixie_tube.text_2": "使用命名牌在鐵砧上為其命名,可以自訂它的顯示文本", - + "create.ponder.nixie_tube.text_1": "通入紅石訊號後,真空管顯示器會顯示出紅石訊號的強度", + "create.ponder.nixie_tube.text_2": "使用命名牌在鐵砧上為其命名,可以自訂它的顯示文本", + "create.ponder.nixie_tube.text_3": "使用染料右鍵點擊可以上色", + "create.ponder.piston_pole.header": "活塞延長杆", - "create.ponder.piston_pole.text_1": "若無相接的延長杆,動力活塞無法移動其他方塊", - "create.ponder.piston_pole.text_2": "在其背面安裝的延長杆長度,決定了活塞的推動範圍", - + "create.ponder.piston_pole.text_1": "若無相接的延長杆,動力活塞無法移動其他方塊", + "create.ponder.piston_pole.text_2": "在其背面安裝的延長杆長度,決定了活塞的推動範圍", + + "create.ponder.portable_fluid_interface.header": "移動式液體口", + "create.ponder.portable_fluid_interface.text_1": "任何管道線都無法與移動裝置上的液體罐連接", + "create.ponder.portable_fluid_interface.text_2": "該元件可以與液體罐相互作用,而無需停止裝置", + "create.ponder.portable_fluid_interface.text_3": "放置第二個,中間間隔 1 或 2 個方塊", + "create.ponder.portable_fluid_interface.text_4": "每當他們擦身而過時,他們就會建立聯繫", + "create.ponder.portable_fluid_interface.text_5": "啟用時,移動式液體口將代表裝置上的『所有』水箱", + "create.ponder.portable_fluid_interface.text_6": "現在可以輸入液體 ......", + "create.ponder.portable_fluid_interface.text_7": "...... 或從裝置中抽取", + "create.ponder.portable_fluid_interface.text_8": "一段時間沒有液體交換後,裝置將繼續前進", + "create.ponder.portable_storage_interface.header": "裝置存儲交換", - "create.ponder.portable_storage_interface.text_1": "玩家無法與運動裝置內的存儲空間進行互動", - "create.ponder.portable_storage_interface.text_2": "這一組件可以在不停止裝置的情況下與裝置內的存儲空間進行互動", - "create.ponder.portable_storage_interface.text_3": "放置第二個介面時,記得要與裝置介面相隔 1 格或者 2 格的距離", - "create.ponder.portable_storage_interface.text_4": "當它們彼此經過時,它們會連接在一起", - "create.ponder.portable_storage_interface.text_5": "連接狀態下,固定側介面便會作為整個裝置的存儲空間代理", - "create.ponder.portable_storage_interface.text_6": "物品會被輸入到裝置內...", - "create.ponder.portable_storage_interface.text_7": "...或是從裝置中提取出來", - "create.ponder.portable_storage_interface.text_8": "物品交換完畢後,裝置仍然會停留在原地一小會,然後才會繼續前行", - + "create.ponder.portable_storage_interface.text_1": "玩家無法與運動裝置內的存儲空間進行互動", + "create.ponder.portable_storage_interface.text_2": "這一組件可以在不停止裝置的情況下與裝置內的存儲空間進行互動", + "create.ponder.portable_storage_interface.text_3": "放置第二個介面時,記得要與裝置介面相隔 1 格或者 2 格的距離", + "create.ponder.portable_storage_interface.text_4": "當它們彼此經過時,它們會連接在一起", + "create.ponder.portable_storage_interface.text_5": "連接狀態下,固定側介面便會作為整個裝置的存儲空間代理", + "create.ponder.portable_storage_interface.text_6": "物品會被輸入到裝置內...", + "create.ponder.portable_storage_interface.text_7": "...或是從裝置中提取出來", + "create.ponder.portable_storage_interface.text_8": "物品交換完畢後,裝置仍然會停留在原地一小會,然後才會繼續前行", + "create.ponder.portable_storage_interface_redstone.header": "紅石控制", - "create.ponder.portable_storage_interface_redstone.text_1": "通入紅石訊號可以阻止固定側介面的連接行為", - + "create.ponder.portable_storage_interface_redstone.text_1": "通入紅石訊號可以阻止固定側介面的連接行為", + "create.ponder.powered_latch.header": "使用閂鎖器控制訊號", - "create.ponder.powered_latch.text_1": "閂鎖器是一種可以用紅石訊號控制的拉杆", - "create.ponder.powered_latch.text_2": "後方輸入的訊號會將其設為開啟狀態", - "create.ponder.powered_latch.text_3": "側邊輸入的訊號會將其設為關閉狀態", - "create.ponder.powered_latch.text_4": "你也可以手動切換其狀態", - + "create.ponder.powered_latch.text_1": "閂鎖器是一種可以用紅石訊號控制的拉杆", + "create.ponder.powered_latch.text_2": "後方輸入的訊號會將其設為開啟狀態", + "create.ponder.powered_latch.text_3": "側邊輸入的訊號會將其設為關閉狀態", + "create.ponder.powered_latch.text_4": "你也可以手動切換其狀態", + "create.ponder.powered_toggle_latch.header": "使用T型正反器控制訊號", - "create.ponder.powered_toggle_latch.text_1": "T型正反器是一種可以用紅石訊號控制的拉杆", - "create.ponder.powered_toggle_latch.text_2": "後方訊號輸入可以改變它的狀態", - "create.ponder.powered_toggle_latch.text_3": "...開啟或者是關閉", - "create.ponder.powered_toggle_latch.text_4": "你也可以手動切換其狀態", - + "create.ponder.powered_toggle_latch.text_1": "T型正反器是一種可以用紅石訊號控制的拉杆", + "create.ponder.powered_toggle_latch.text_2": "後方訊號輸入可以改變它的狀態", + "create.ponder.powered_toggle_latch.text_3": "...開啟或者是關閉", + "create.ponder.powered_toggle_latch.text_4": "你也可以手動切換其狀態", + "create.ponder.pulse_repeater.header": "使用脈衝中繼器控制訊號", - "create.ponder.pulse_repeater.text_1": "脈衝中繼器會將所有通入的紅石訊號縮減為一次脈衝", - + "create.ponder.pulse_repeater.text_1": "脈衝中繼器會將所有通入的紅石訊號縮減為一次脈衝", + "create.ponder.radial_chassis.header": "使用旋轉底盤黏著方塊", - "create.ponder.radial_chassis.text_1": "同一行上的旋轉底盤會相互連接在一起", - "create.ponder.radial_chassis.text_2": "當其中的一個底盤被裝置帶動時,其餘的底盤也會被帶動", - "create.ponder.radial_chassis.text_3": "底盤的側邊可以變為黏性面", - "create.ponder.radial_chassis.text_4": "再次點擊黏性面,可以讓其所有面都變得帶黏性", - "create.ponder.radial_chassis.text_5": "空手潛行右擊可以移除其上的黏性物", - "create.ponder.radial_chassis.text_6": "若有物品與底盤的黏性面相接觸...", - "create.ponder.radial_chassis.text_7": "...底盤便會與同層且位於半徑內的所有可及方塊黏著在一起", - "create.ponder.radial_chassis.text_8": "使用扳手可以精確指定底盤的影響範圍", - "create.ponder.radial_chassis.text_9": "黏性面一側的不可及方塊不會被黏著", - + "create.ponder.radial_chassis.text_1": "同一行上的旋轉底盤會相互連接在一起", + "create.ponder.radial_chassis.text_2": "當其中的一個底盤被裝置帶動時,其餘的底盤也會被帶動", + "create.ponder.radial_chassis.text_3": "底盤的側邊可以變為黏性面", + "create.ponder.radial_chassis.text_4": "再次點擊黏性面,可以讓其所有面都變得帶黏性", + "create.ponder.radial_chassis.text_5": "空手潛行右擊可以移除其上的黏性物", + "create.ponder.radial_chassis.text_6": "若有物品與底盤的黏性面相接觸...", + "create.ponder.radial_chassis.text_7": "...底盤便會與同層且位於半徑內的所有可及方塊黏著在一起", + "create.ponder.radial_chassis.text_8": "使用扳手可以精確指定底盤的影響範圍", + "create.ponder.radial_chassis.text_9": "黏性面一側的不可及方塊不會被黏著", + "create.ponder.redstone_contact.header": "接觸式紅石訊號發生器", - "create.ponder.redstone_contact.text_1": "當兩個接觸式紅石訊號發生器面對面時,它們會發出紅石訊號", - "create.ponder.redstone_contact.text_2": "並且,若有一方位於運動裝置上,此特性也能正常生效", - + "create.ponder.redstone_contact.text_1": "當兩個接觸式紅石訊號發生器面對面時,它們會發出紅石訊號", + "create.ponder.redstone_contact.text_2": "並且,若有一方位於運動裝置上,此特性也能正常生效", + "create.ponder.redstone_link.header": "使用無線紅石訊號機", - "create.ponder.redstone_link.text_1": "無線紅石訊號機可以無線傳輸紅石訊號", - "create.ponder.redstone_link.text_2": "潛行右擊可以改變其接收模式", - "create.ponder.redstone_link.text_3": "手持扳手右擊也可以", - "create.ponder.redstone_link.text_4": "接收端會發出由傳輸端發來的訊號,有效距離為 128 格", - "create.ponder.redstone_link.text_5": "在它們所帶的槽位中放上物品,可以為它們指定頻道", - "create.ponder.redstone_link.text_6": "只有頻道相互匹配的機方可互通", - + "create.ponder.redstone_link.text_1": "無線紅石訊號機可以無線傳輸紅石訊號", + "create.ponder.redstone_link.text_2": "潛行右擊可以改變其接收模式", + "create.ponder.redstone_link.text_3": "手持扳手右擊也可以", + "create.ponder.redstone_link.text_4": "接收端會發出由傳輸端發來的訊號,有效距離為 128 格", + "create.ponder.redstone_link.text_5": "在它們所帶的槽位中放上物品,可以為它們指定頻道", + "create.ponder.redstone_link.text_6": "只有頻道相互匹配的機方可互通", + "create.ponder.rope_pulley.header": "使用繩索滑輪移動結構", - "create.ponder.rope_pulley.text_1": "繩索滑輪在接受動能時可以垂直移動方塊結構", - "create.ponder.rope_pulley.text_2": "移動的方向及速度取決於提供的轉速", - + "create.ponder.rope_pulley.text_1": "繩索滑輪在接受動能時可以垂直移動方塊結構", + "create.ponder.rope_pulley.text_2": "移動的方向及速度取決於提供的轉速", + "create.ponder.rope_pulley_attachment.header": "繩索滑輪與裝置一同運動", - "create.ponder.rope_pulley_attachment.text_1": "當繩索滑輪本身在裝置中被帶動時...", - "create.ponder.rope_pulley_attachment.text_2": "...它附著在滑輪上的結構會被滑輪拉著一同移動", - "create.ponder.rope_pulley_attachment.text_3": "注意,只有繩索滑輪停止工作時才能被移動", - + "create.ponder.rope_pulley_attachment.text_1": "當繩索滑輪本身在裝置中被帶動時...", + "create.ponder.rope_pulley_attachment.text_2": "...它附著在滑輪上的結構會被滑輪拉著一同移動", + "create.ponder.rope_pulley_attachment.text_3": "注意,只有繩索滑輪停止工作時才能被移動", + "create.ponder.rope_pulley_modes.header": "繩索滑輪的運動模式", - "create.ponder.rope_pulley_modes.text_1": "當繩索滑輪停止運動時,它所附屬的移動結構便會方塊化", - "create.ponder.rope_pulley_modes.text_2": "你可以調整整個結構永不方塊化,或者僅在結構的初始位置方塊化", - + "create.ponder.rope_pulley_modes.text_1": "當繩索滑輪停止運動時,它所附屬的移動結構便會方塊化", + "create.ponder.rope_pulley_modes.text_2": "你可以調整整個結構永不方塊化,或者僅在結構的初始位置方塊化", + "create.ponder.rotation_speed_controller.header": "使用轉速控制器", - "create.ponder.rotation_speed_controller.text_1": "轉速控制器將動能從其轉軸傳遞至它上方的大齒輪", - "create.ponder.rotation_speed_controller.text_2": "在其側面滾動滑鼠滾輪,可以調節輸出轉速", - + "create.ponder.rotation_speed_controller.text_1": "轉速控制器將動能從其轉軸傳遞至它上方的大齒輪", + "create.ponder.rotation_speed_controller.text_2": "在其側面滾動滑鼠滾輪,可以調節輸出轉速", + "create.ponder.sail.header": "使用風帆來組裝風車", - "create.ponder.sail.text_1": "風帆是製作風車的趁手材料", - "create.ponder.sail.text_2": "無需強力膠等黏附手段,它們便可自行互相連結", - "create.ponder.sail.text_3": "手持染料右擊可對其染色", - "create.ponder.sail.text_4": "手持剪刀右擊可剪除帆布,使其變迴風帆框架", - + "create.ponder.sail.text_1": "風帆是製作風車的趁手材料", + "create.ponder.sail.text_2": "無需強力膠等黏附手段,它們便可自行互相連結", + "create.ponder.sail.text_3": "手持染料右擊可對其染色", + "create.ponder.sail.text_4": "手持剪刀右擊可剪除帆布,使其變迴風帆框架", + "create.ponder.sail_frame.header": "使用風帆框架來組裝風車", - "create.ponder.sail_frame.text_1": "風帆框架是製作風車的趁手材料", - "create.ponder.sail_frame.text_2": "無需強力膠等黏附手段,它們便可自行互相連結", - + "create.ponder.sail_frame.text_1": "風帆框架是製作風車的趁手材料", + "create.ponder.sail_frame.text_2": "無需強力膠等黏附手段,它們便可自行互相連結", + "create.ponder.sequenced_gearshift.header": "使用可編程齒輪箱來控制轉速", - "create.ponder.sequenced_gearshift.text_1": "可編程齒輪箱能夠根據玩家設置的預設時序表來傳遞旋轉", - "create.ponder.sequenced_gearshift.text_2": "對其右擊可以打開設置面板", - "create.ponder.sequenced_gearshift.text_3": "接受紅石訊號時,它會開始執行其內部已設定好的時序指令表", - "create.ponder.sequenced_gearshift.text_4": "當完成時序指令表後,它會進入待機狀態,再次接受紅石訊號後,它才會再次執行時序指令表內容", - "create.ponder.sequenced_gearshift.text_5": "紅石比較器可以讀取目前時序指令表完成進度", + "create.ponder.sequenced_gearshift.text_1": "可編程齒輪箱能夠根據玩家設置的預設時序表來傳遞旋轉", + "create.ponder.sequenced_gearshift.text_2": "對其右擊可以打開設置面板", + "create.ponder.sequenced_gearshift.text_3": "接受紅石訊號時,它會開始執行其內部已設定好的時序指令表", + "create.ponder.sequenced_gearshift.text_4": "當完成時序指令表後,它會進入待機狀態,再次接受紅石訊號後,它才會再次執行時序指令表內容", + "create.ponder.sequenced_gearshift.text_5": "紅石比較器可以讀取目前時序指令表完成進度", "create.ponder.shaft.header": "使用傳動軸來傳送動能", "create.ponder.shaft.text_1": "傳動軸可以直線傳送動能", @@ -2040,20 +2180,34 @@ "create.ponder.smart_chute.header": "使用智慧滑道來過濾物品", "create.ponder.smart_chute.text_1": "智慧滑道是一種可以被控制的滑道", - "create.ponder.smart_chute.text_2": "當在其過濾槽內指定了物品後,溜槽只會傳輸這一指定標記的物品", - "create.ponder.smart_chute.text_3": "使用滑鼠滾輪可以指定被過濾的物品數量", - "create.ponder.smart_chute.text_4": "通入紅石訊號,智慧溜槽將會完全暫停工作", - + "create.ponder.smart_chute.text_2": "當在其過濾槽內指定了物品後,溜槽只會傳輸這一指定標記的物品", + "create.ponder.smart_chute.text_3": "使用滑鼠滾輪可以指定被過濾的物品數量", + "create.ponder.smart_chute.text_4": "通入紅石訊號,智慧溜槽將會完全暫停工作", + + "create.ponder.smart_pipe.header": "使用智慧液體管道控制液體", + "create.ponder.smart_pipe.text_1": "智慧液體管道可以按照液體類型控制液體流", + "create.ponder.smart_pipe.text_2": "當直接放置在源頭時,他們可以指定要提取的液體類型", + "create.ponder.smart_pipe.text_3": "只需用包含所需液體的任何項目右鍵點擊其過濾槽", + "create.ponder.smart_pipe.text_4": "在管網裡時,智慧液體管道只會讓匹配的液體經過", + "create.ponder.speedometer.header": "使用速度計來監測轉速", - "create.ponder.speedometer.text_1": "速度計能顯示相接組件的轉速", - "create.ponder.speedometer.text_2": "當佩戴MR護目鏡時,可以看到儀表所顯示的更詳細的數據", - "create.ponder.speedometer.text_3": "紅石比較器可以根據速度計的數值輸出不同強弱的紅石訊號", - + "create.ponder.speedometer.text_1": "速度計能顯示相接組件的轉速", + "create.ponder.speedometer.text_2": "當佩戴MR護目鏡時,可以看到儀表所顯示的更詳細的數據", + "create.ponder.speedometer.text_3": "紅石比較器可以根據速度計的數值輸出不同強弱的紅石訊號", + + "create.ponder.spout_filling.header": "使用液體灌注器填充物品", + "create.ponder.spout_filling.text_1": "液體灌注器可以填充下方的液體容器", + "create.ponder.spout_filling.text_2": "無法手動接觸液體灌注器中的液體", + "create.ponder.spout_filling.text_3": "管道可用於為其提供液體", + "create.ponder.spout_filling.text_4": "輸入物品可以是掉落狀態或是被放在置物台上", + "create.ponder.spout_filling.text_5": "當物品放在輸送帶上時 ......", + "create.ponder.spout_filling.text_6": "液體灌注器會停下他並且自動填滿", + "create.ponder.stabilized_bearings.header": "裝置固定朝向", - "create.ponder.stabilized_bearings.text_1": "當動力軸承在結構被帶動時...", - "create.ponder.stabilized_bearings.text_2": "...它會確保它轉盤的垂直朝向不變", - "create.ponder.stabilized_bearings.text_3": "跟預設的一樣,動力軸承會黏著它前方的方塊", - "create.ponder.stabilized_bearings.text_4": "這種情況下,它所黏著的子結構的垂直朝向也不會改變", + "create.ponder.stabilized_bearings.text_1": "當動力軸承在結構被帶動時...", + "create.ponder.stabilized_bearings.text_2": "...它會確保它轉盤的垂直朝向不變", + "create.ponder.stabilized_bearings.text_3": "跟預設的一樣,動力軸承會黏著它前方的方塊", + "create.ponder.stabilized_bearings.text_4": "這種情況下,它所黏著的子結構的垂直朝向也不會改變", "create.ponder.sticker.header": "使用方塊黏著器來黏取方塊", "create.ponder.sticker.text_1": "方塊黏著器是一個很棒的裝置,他受控於紅石訊號", @@ -2061,53 +2215,60 @@ "create.ponder.sticker.text_3": "如果此時方塊黏著器被移動,被黏到的方塊會跟著移動", "create.ponder.sticker.text_4": "再次接收到訊號後,黏著器會放下它面前的方塊", - "create.ponder.stressometer.header": "使用動能錶來監測應力", - "create.ponder.stressometer.text_1": "動能錶能顯示目前動能網路內的應力訊息", - "create.ponder.stressometer.text_2": "當佩戴MR護目鏡時,可以看到儀表所顯示的更詳細的數據", - "create.ponder.stressometer.text_3": "紅石比較器可以根據動能錶的數值輸出不同強弱的紅石訊號", - + "create.ponder.stressometer.header": "使用動能錶來監測應力", + "create.ponder.stressometer.text_1": "動能錶能顯示目前動能網路內的應力訊息", + "create.ponder.stressometer.text_2": "當佩戴MR護目鏡時,可以看到儀表所顯示的更詳細的數據", + "create.ponder.stressometer.text_3": "紅石比較器可以根據動能錶的數值輸出不同強弱的紅石訊號", + "create.ponder.super_glue.header": "使用強力膠來黏附方塊", - "create.ponder.super_glue.text_1": "強力膠可以在任意兩個方塊間使用", - "create.ponder.super_glue.text_2": "當被黏合的方塊被組裝為裝置時,他們會一起運動", - "create.ponder.super_glue.text_3": "當強力膠在副手時...", - "create.ponder.super_glue.text_4": "...新放置的方塊會自動被黏附在所放置方塊的面上", - "create.ponder.super_glue.text_5": "左擊可以清除強力膠", - + "create.ponder.super_glue.text_1": "強力膠可以在任意兩個方塊間使用", + "create.ponder.super_glue.text_2": "當被黏合的方塊被組裝為裝置時,他們會一起運動", + "create.ponder.super_glue.text_3": "當強力膠在副手時...", + "create.ponder.super_glue.text_4": "...新放置的方塊會自動被黏附在所放置方塊的面上", + "create.ponder.super_glue.text_5": "左擊可以清除強力膠", + "create.ponder.valve_handle.header": "使用閥門手輪產生動能", - "create.ponder.valve_handle.text_1": "玩家可以手動使用閥門手輪來產生動能", - "create.ponder.valve_handle.text_2": "右擊可使它逆時針旋轉", - "create.ponder.valve_handle.text_3": "它的轉速慢而精確", - "create.ponder.valve_handle.text_4": "潛行右擊可使它順時針旋轉", - "create.ponder.valve_handle.text_5": "可以透過染色來美化閥門手輪", - + "create.ponder.valve_handle.text_1": "玩家可以手動使用閥門手輪來產生動能", + "create.ponder.valve_handle.text_2": "右擊可使它逆時針旋轉", + "create.ponder.valve_handle.text_3": "它的轉速慢而精確", + "create.ponder.valve_handle.text_4": "潛行右擊可使它順時針旋轉", + "create.ponder.valve_handle.text_5": "可以透過染色來美化閥門手輪", + + "create.ponder.valve_pipe.header": "使用液體閥門控制液體流量", + "create.ponder.valve_pipe.text_1": "閥門管道有助於控制通過管線網路傳播的液體", + "create.ponder.valve_pipe.text_2": "用轉動輸入控制現在是否允許液體通過", + "create.ponder.valve_pipe.text_3": "打開方向旋轉,液體閥門將會打開", + "create.ponder.valve_pipe.text_4": "反方向的旋轉會關閉閥門", + "create.ponder.water_wheel.header": "使用水車產生動能", - "create.ponder.water_wheel.text_1": "水車利用臨近的水流來進行應力發生", - "create.ponder.water_wheel.text_2": "水車接觸水流的麵越多,它的轉速越高", - "create.ponder.water_wheel.text_3": "水車葉片應逆著水流方向擺放", - "create.ponder.water_wheel.text_4": "如果順著水流擺放,它的效率則會降低", - + "create.ponder.water_wheel.text_1": "水車利用臨近的水流來進行應力發生", + "create.ponder.water_wheel.text_2": "水車接觸水流的麵越多,它的轉速越高", + "create.ponder.water_wheel.text_3": "水車葉片應逆著水流方向擺放", + "create.ponder.water_wheel.text_4": "如果順著水流擺放,它的效率則會降低", + "create.ponder.weighted_ejector.header": "使用彈射置物台", - "create.ponder.weighted_ejector.text_1": "手持彈射置物台時,潛行時右擊可以設置彈射目標位置", - "create.ponder.weighted_ejector.text_10": "現在,只有等被放置的物品數量等於所設定數量時,彈射置物台才會彈射物品", - "create.ponder.weighted_ejector.text_11": "當其他實體站在彈射置物台上時會被直接彈射", - "create.ponder.weighted_ejector.text_2": "現在,放置下的彈射置物台會將物品彈射至目標位置", - "create.ponder.weighted_ejector.text_3": "限制範圍內的任意距離和高度均可作為有效目標地點", - "create.ponder.weighted_ejector.text_4": "但是,目標位置與置物台的連線,必須垂直於置物台的側面", - "create.ponder.weighted_ejector.text_5": "如果沒有設置有效目標位置,彈射置物台會直接將其前方一格設為默認目標位置", - "create.ponder.weighted_ejector.text_6": "提供動能可為其蓄力", - "create.ponder.weighted_ejector.text_7": "蓄力完畢後,放置在它上方的物品會被立刻彈射出去", - "create.ponder.weighted_ejector.text_8": "如果目標為容器,則彈射置物台會等待容器有位置後再彈射物品", - "create.ponder.weighted_ejector.text_9": "使用扳手可以調整彈射所要求的物品數量", - + "create.ponder.weighted_ejector.text_1": "手持彈射置物台時,潛行時右擊可以設置彈射目標位置", + "create.ponder.weighted_ejector.text_10": "現在,只有等被放置的物品數量等於所設定數量時,彈射置物台才會彈射物品", + "create.ponder.weighted_ejector.text_11": "當其他實體站在彈射置物台上時會被直接彈射", + "create.ponder.weighted_ejector.text_2": "現在,放置下的彈射置物台會將物品彈射至目標位置", + "create.ponder.weighted_ejector.text_3": "限制範圍內的任意距離和高度均可作為有效目標地點", + "create.ponder.weighted_ejector.text_4": "但是,目標位置與置物台的連線,必須垂直於置物台的側面", + "create.ponder.weighted_ejector.text_5": "如果沒有設置有效目標位置,彈射置物台會直接將其前方一格設為默認目標位置", + "create.ponder.weighted_ejector.text_6": "提供動能可為其蓄力", + "create.ponder.weighted_ejector.text_7": "蓄力完畢後,放置在它上方的物品會被立刻彈射出去", + "create.ponder.weighted_ejector.text_8": "如果目標為容器,則彈射置物台會等待容器有位置後再彈射物品", + "create.ponder.weighted_ejector.text_9": "使用扳手可以調整彈射所要求的物品數量", + "create.ponder.weighted_ejector_redstone.header": "使用紅石控制彈射置物台", - "create.ponder.weighted_ejector_redstone.text_1": "當被紅石充能時,彈射置物台停止工作", - "create.ponder.weighted_ejector_redstone.text_2": "此外,置物台彈射的瞬間可以被偵測器偵測", - "create.ponder.weighted_ejector_tunnel.header": "使用彈射置物台來分流物品", - "create.ponder.weighted_ejector_tunnel.text_1": "與黃銅隧道搭配使用時,彈射置物台可以將物品以特定數量進行分流", - "create.ponder.weighted_ejector_tunnel.text_2": "首先,將黃銅隧道調整為“最近優先”模式,從而讓它優先側面輸出", - "create.ponder.weighted_ejector_tunnel.text_3": "置物台上所設置的物品數量則為被分流出去的物品數量", - "create.ponder.weighted_ejector_tunnel.text_4": "當所設置的物品數量被分流出去後...", - "create.ponder.weighted_ejector_tunnel.text_5": "...剩餘的物品則會繼續前進", + "create.ponder.weighted_ejector_redstone.text_1": "當被紅石充能時,彈射置物台停止工作", + "create.ponder.weighted_ejector_redstone.text_2": "此外,置物台彈射的瞬間可以被偵測器偵測", + + "create.ponder.weighted_ejector_tunnel.header": "使用彈射置物台來分流物品", + "create.ponder.weighted_ejector_tunnel.text_1": "與黃銅隧道搭配使用時,彈射置物台可以將物品以特定數量進行分流", + "create.ponder.weighted_ejector_tunnel.text_2": "首先,將黃銅隧道調整為“最近優先”模式,從而讓它優先側面輸出", + "create.ponder.weighted_ejector_tunnel.text_3": "置物台上所設置的物品數量則為被分流出去的物品數量", + "create.ponder.weighted_ejector_tunnel.text_4": "當所設置的物品數量被分流出去後...", + "create.ponder.weighted_ejector_tunnel.text_5": "...剩餘的物品則會繼續前進", "create.ponder.windmill_source.header": "使用風車軸承產生動能", "create.ponder.windmill_source.text_1": "風車軸承會黏著它面前的方塊結構", @@ -2122,4 +2283,4 @@ "_": "Thank you for translating Create!" -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/block/bell_base/block_ceiling.json b/src/main/resources/assets/create/models/block/bell_base/block_ceiling.json new file mode 100644 index 000000000..33e494968 --- /dev/null +++ b/src/main/resources/assets/create/models/block/bell_base/block_ceiling.json @@ -0,0 +1,34 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/bell_frame_side", + "particle": "create:block/bell" + }, + "elements": [ + { + "from": [0, 5, 5], + "to": [2, 16, 11], + "faces": { + "north": {"uv": [14, 5, 12, 16], "texture": "#2"}, + "east": {"uv": [12, 5, 6, 16], "texture": "#2"}, + "south": {"uv": [14, 5, 16, 16], "texture": "#2"}, + "west": {"uv": [0, 5, 6, 16], "texture": "#2"}, + "up": {"uv": [6, 0, 0, 2], "rotation": 270, "texture": "#2"}, + "down": {"uv": [12, 2, 6, 0], "rotation": 90, "texture": "#2"} + } + }, + { + "from": [14, 5, 5], + "to": [16, 16, 11], + "faces": { + "north": {"uv": [14, 5, 16, 16], "texture": "#2"}, + "east": {"uv": [0, 5, 6, 16], "texture": "#2"}, + "south": {"uv": [14, 5, 12, 16], "texture": "#2"}, + "west": {"uv": [12, 5, 6, 16], "texture": "#2"}, + "up": {"uv": [6, 0, 0, 2], "rotation": 90, "texture": "#2"}, + "down": {"uv": [12, 2, 6, 0], "rotation": 270, "texture": "#2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/bell_base/block_double_wall.json b/src/main/resources/assets/create/models/block/bell_base/block_double_wall.json new file mode 100644 index 000000000..1e0510948 --- /dev/null +++ b/src/main/resources/assets/create/models/block/bell_base/block_double_wall.json @@ -0,0 +1,40 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "1": "create:block/bell_frame_side", + "particle": "create:block/bell" + }, + "elements": [ + { + "from": [5, 5, 0], + "to": [11, 11, 2], + "faces": { + "north": {"uv": [0, 10, 6, 16], "texture": "#1"}, + "east": {"uv": [14, 5, 12, 11], "texture": "#1"}, + "south": {"uv": [12, 10, 6, 16], "texture": "#1"}, + "west": {"uv": [14, 5, 16, 11], "texture": "#1"}, + "up": {"uv": [6, 0, 0, 2], "texture": "#1"}, + "down": {"uv": [12, 0, 6, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [5, 5, 14], + "to": [11, 11, 16], + "faces": { + "north": {"uv": [12, 10, 6, 16], "texture": "#1"}, + "east": {"uv": [14, 5, 16, 11], "texture": "#1"}, + "south": {"uv": [0, 10, 6, 16], "texture": "#1"}, + "west": {"uv": [14, 5, 12, 11], "texture": "#1"}, + "up": {"uv": [6, 0, 0, 2], "rotation": 180, "texture": "#1"}, + "down": {"uv": [12, 0, 6, 2], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "Frame", + "origin": [8, 8, 8], + "color": 0, + "children": [] + }, 0, 1] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/bell_base/block_floor.json b/src/main/resources/assets/create/models/block/bell_base/block_floor.json new file mode 100644 index 000000000..9714a848e --- /dev/null +++ b/src/main/resources/assets/create/models/block/bell_base/block_floor.json @@ -0,0 +1,34 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/bell_frame", + "particle": "create:block/bell" + }, + "elements": [ + { + "from": [0, 0, 5], + "to": [2, 11, 11], + "faces": { + "north": {"uv": [14, 5, 12, 16], "texture": "#2"}, + "east": {"uv": [12, 5, 6, 16], "texture": "#2"}, + "south": {"uv": [14, 5, 16, 16], "texture": "#2"}, + "west": {"uv": [0, 5, 6, 16], "texture": "#2"}, + "up": {"uv": [6, 0, 0, 2], "rotation": 270, "texture": "#2"}, + "down": {"uv": [12, 2, 6, 0], "rotation": 90, "texture": "#2"} + } + }, + { + "from": [14, 0, 5], + "to": [16, 11, 11], + "faces": { + "north": {"uv": [14, 5, 16, 16], "texture": "#2"}, + "east": {"uv": [0, 5, 6, 16], "texture": "#2"}, + "south": {"uv": [14, 5, 12, 16], "texture": "#2"}, + "west": {"uv": [12, 5, 6, 16], "texture": "#2"}, + "up": {"uv": [6, 0, 0, 2], "rotation": 90, "texture": "#2"}, + "down": {"uv": [12, 2, 6, 0], "rotation": 270, "texture": "#2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/bell_base/block_single_wall.json b/src/main/resources/assets/create/models/block/bell_base/block_single_wall.json new file mode 100644 index 000000000..bccf3bff3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/bell_base/block_single_wall.json @@ -0,0 +1,28 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "1": "create:block/bell_frame_side", + "particle": "create:block/bell" + }, + "elements": [ + { + "from": [5, 5, 0], + "to": [11, 11, 2], + "faces": { + "north": {"uv": [0, 10, 6, 16], "texture": "#1"}, + "east": {"uv": [14, 5, 12, 11], "texture": "#1"}, + "south": {"uv": [12, 10, 6, 16], "texture": "#1"}, + "west": {"uv": [14, 5, 16, 11], "texture": "#1"}, + "up": {"uv": [6, 0, 0, 2], "texture": "#1"}, + "down": {"uv": [12, 0, 6, 2], "rotation": 180, "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "Frame", + "origin": [8, 8, 8], + "color": 0, + "children": [] + }, 0] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/blaze_burner/block_with_soul_fire.json b/src/main/resources/assets/create/models/block/blaze_burner/block_with_soul_fire.json new file mode 100644 index 000000000..acddfcbd3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/blaze_burner/block_with_soul_fire.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/blaze_burner/block_with_fire", + "textures": { + "fire": "block/soul_campfire_fire" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/cursed_bell/bell.json b/src/main/resources/assets/create/models/block/cursed_bell/bell.json deleted file mode 100644 index 161de430f..000000000 --- a/src/main/resources/assets/create/models/block/cursed_bell/bell.json +++ /dev/null @@ -1,436 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "0": "create:block/bell_anim", - "particle": "create:block/bell" - }, - "elements": [ - { - "from": [ - 14, - 7, - 7 - ], - "to": [ - 16, - 9, - 9 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 8, - 8, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 10.5, - 6, - 9.5, - 7 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 9.5, - 7, - 10.5, - 8 - ], - "rotation": 90, - "texture": "#0" - }, - "south": { - "uv": [ - 9.5, - 6, - 10.5, - 7 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 10, - 7, - 10.5, - 7.5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 9.5, - 5, - 10.5, - 6 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 9.5, - 7, - 10.5, - 8 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 7, - 7 - ], - "to": [ - 2, - 9, - 9 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 8, - 8, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 9.5, - 6, - 10.5, - 7 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 10, - 7, - 10.5, - 7.5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 10.5, - 6, - 9.5, - 7 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 9.5, - 7, - 10.5, - 8 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 9.5, - 5, - 10.5, - 6 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 9.5, - 7, - 10.5, - 8 - ], - "rotation": 180, - "texture": "#0" - } - } - }, - { - "from": [ - 3, - 0, - 3 - ], - "to": [ - 13, - 2, - 13 - ], - "faces": { - "north": { - "uv": [ - 0, - 15, - 5, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 15, - 5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 15, - 5, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 15, - 5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 10, - 5, - 15 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 5, - 10, - 10, - 15 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4, - 2, - 4 - ], - "to": [ - 12, - 11, - 12 - ], - "faces": { - "north": { - "uv": [ - 8, - 0, - 12, - 4.5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 8, - 0, - 12, - 4.5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 8, - 0, - 12, - 4.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 8, - 0, - 12, - 4.5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 12, - 0, - 16, - 4 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 7, - 11, - 7 - ], - "to": [ - 9, - 15, - 9 - ], - "faces": { - "north": { - "uv": [ - 8, - 6, - 9, - 8 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 8, - 6, - 9, - 8 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 8, - 6, - 9, - 8 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 8, - 6, - 9, - 8 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 8, - 5, - 9, - 6 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 0, - 8 - ], - "to": [ - 16, - 16, - 9 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 8, - 8, - 8.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 8, - 8 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 0, - 7 - ], - "to": [ - 16, - 16, - 8 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 8, - 8, - 8.5 - ] - }, - "faces": { - "south": { - "uv": [ - 0, - 0, - 8, - 8 - ], - "texture": "#0" - } - } - } - ], - "groups": [ - { - "name": "Bell", - "origin": [ - 8, - 8, - 8 - ], - "children": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6 - ] - } - ] -} diff --git a/src/main/resources/assets/create/models/block/cursed_bell/block_ceiling.json b/src/main/resources/assets/create/models/block/cursed_bell/block_ceiling.json deleted file mode 100644 index 67da4ac5d..000000000 --- a/src/main/resources/assets/create/models/block/cursed_bell/block_ceiling.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/bell_frame_side", - "2": "create:block/bell_frame", - "particle": "create:block/bell" - }, - "elements": [ - { - "from": [0.1, 0, 0], - "to": [15.9, 16, 16], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, - "west": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, - "up": {"uv": [0, 0, 15.8, 16], "texture": "#2"} - } - }, - { - "from": [15.9, 0, 0], - "to": [0.1, 16, 16], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, - "west": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#2"} - } - } - ], - "groups": [ - { - "name": "Frame", - "origin": [8, 8, 8], - "children": [0, 1] - } - ] -} diff --git a/src/main/resources/assets/create/models/block/cursed_bell/block_double_wall.json b/src/main/resources/assets/create/models/block/cursed_bell/block_double_wall.json deleted file mode 100644 index 52a9e266d..000000000 --- a/src/main/resources/assets/create/models/block/cursed_bell/block_double_wall.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/bell_frame_side", - "particle": "create:block/bell" - }, - "elements": [ - { - "from": [0.1, 0, 0], - "to": [15.9, 16, 16], - "faces": { - "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "north": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - }, - { - "from": [15.9, 0, 0], - "to": [0.1, 16, 16], - "faces": { - "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "north": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - } - ], - "groups": [ - { - "name": "Frame", - "origin": [8, 8, 8], - "children": [0, 1] - } - ] -} diff --git a/src/main/resources/assets/create/models/block/cursed_bell/block_floor.json b/src/main/resources/assets/create/models/block/cursed_bell/block_floor.json deleted file mode 100644 index 396f9e4e7..000000000 --- a/src/main/resources/assets/create/models/block/cursed_bell/block_floor.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/bell_frame_side", - "2": "create:block/bell_frame", - "particle": "create:block/bell" - }, - "elements": [ - { - "from": [0.1, 0, 0], - "to": [15.9, 16, 16], - "faces": { - "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "west": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "down": {"uv": [0, 0, 15.8, 16], "texture": "#2"} - } - }, - { - "from": [15.9, 0, 0], - "to": [0.1, 16, 16], - "faces": { - "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "west": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#2"} - } - } - ], - "groups": [ - { - "name": "Frame", - "origin": [8, 8, 8], - "children": [0, 1] - } - ] -} diff --git a/src/main/resources/assets/create/models/block/cursed_bell/block_single_wall.json b/src/main/resources/assets/create/models/block/cursed_bell/block_single_wall.json deleted file mode 100644 index 7bee57b84..000000000 --- a/src/main/resources/assets/create/models/block/cursed_bell/block_single_wall.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/bell_frame_side", - "particle": "create:block/bell" - }, - "elements": [ - { - "from": [0.1, 0, 0], - "to": [15.9, 16, 16], - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - }, - { - "from": [15.9, 0, 0], - "to": [0.1, 16, 16], - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - } - ], - "groups": [ - { - "name": "Frame", - "origin": [8, 8, 8], - "children": [0, 1] - } - ] -} diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/item.json b/src/main/resources/assets/create/models/block/fluid_pipe/item.json index 3860db36a..c68b548bd 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/item.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/item.json @@ -66,5 +66,11 @@ "down": {"uv": [6, 5, 11, 6], "texture": "#1"} } } - ] + ], + "display": { + "fixed": { + "rotation": [0, 90, 0], + "scale": [0.5, 0.5, 0.5] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/cursed_bell/item.json b/src/main/resources/assets/create/models/block/haunted_bell.json similarity index 56% rename from src/main/resources/assets/create/models/block/cursed_bell/item.json rename to src/main/resources/assets/create/models/block/haunted_bell.json index 2c1c2327c..7acde1c60 100644 --- a/src/main/resources/assets/create/models/block/cursed_bell/item.json +++ b/src/main/resources/assets/create/models/block/haunted_bell.json @@ -2,39 +2,39 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/bell_anim", - "particle": "create:block/bell" + "0": "create:block/bell_anim" }, "elements": [ { - "from": [14, 7, 7], - "to": [16, 9, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [12.99, 6.99, 6.99], + "to": [16.01, 9.01, 9.01], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 8, 8]}, "faces": { - "north": {"uv": [10.5, 6, 9.5, 7], "texture": "#0"}, - "east": {"uv": [9.5, 7, 10.5, 8], "rotation": 90, "texture": "#0"}, - "south": {"uv": [9.5, 6, 10.5, 7], "texture": "#0"}, + "north": {"uv": [11, 6, 9.5, 7], "texture": "#0"}, + "east": {"uv": [11, 7, 12, 8], "texture": "#0"}, + "south": {"uv": [9.5, 6, 11, 7], "texture": "#0"}, "west": {"uv": [10, 7, 10.5, 7.5], "texture": "#0"}, - "up": {"uv": [9.5, 5, 10.5, 6], "texture": "#0"}, - "down": {"uv": [9.5, 7, 10.5, 8], "texture": "#0"} + "up": {"uv": [9.5, 5, 11, 6], "texture": "#0"}, + "down": {"uv": [9.5, 7, 11, 8], "texture": "#0"} } }, { - "from": [0, 7, 7], - "to": [2, 9, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [-0.01, 6.99, 6.99], + "to": [3.01, 9.01, 9.01], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 8]}, "faces": { - "north": {"uv": [9.5, 6, 10.5, 7], "texture": "#0"}, + "north": {"uv": [9.5, 6, 11, 7], "texture": "#0"}, "east": {"uv": [10, 7, 10.5, 7.5], "texture": "#0"}, - "south": {"uv": [10.5, 6, 9.5, 7], "texture": "#0"}, - "west": {"uv": [9.5, 7, 10.5, 8], "rotation": 90, "texture": "#0"}, - "up": {"uv": [9.5, 5, 10.5, 6], "rotation": 180, "texture": "#0"}, - "down": {"uv": [9.5, 7, 10.5, 8], "rotation": 180, "texture": "#0"} + "south": {"uv": [11, 6, 9.5, 7], "texture": "#0"}, + "west": {"uv": [11, 7, 12, 8], "texture": "#0"}, + "up": {"uv": [9.5, 5, 11, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9.5, 7, 11, 8], "rotation": 180, "texture": "#0"} } }, { - "from": [3, 0, 3], - "to": [13, 2, 13], + "from": [3, 1, 3], + "to": [13, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "north": {"uv": [0, 15, 5, 16], "texture": "#0"}, "east": {"uv": [0, 15, 5, 16], "texture": "#0"}, @@ -45,19 +45,21 @@ } }, { - "from": [4, 2, 4], - "to": [12, 11, 12], + "from": [4, 3, 4], + "to": [12, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "north": {"uv": [8, 0, 12, 4.5], "texture": "#0"}, - "east": {"uv": [8, 0, 12, 4.5], "texture": "#0"}, + "east": {"uv": [12, 4, 16, 8.5], "texture": "#0"}, "south": {"uv": [8, 0, 12, 4.5], "texture": "#0"}, - "west": {"uv": [8, 0, 12, 4.5], "texture": "#0"}, + "west": {"uv": [12, 4, 16, 8.5], "texture": "#0"}, "up": {"uv": [12, 0, 16, 4], "texture": "#0"} } }, { "from": [7, 11, 7], "to": [9, 15, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "north": {"uv": [8, 6, 9, 8], "texture": "#0"}, "east": {"uv": [8, 6, 9, 8], "texture": "#0"}, @@ -87,7 +89,8 @@ { "name": "Bell", "origin": [8, 8, 8], + "color": 0, "children": [0, 1, 2, 3, 4, 5, 6] } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_mixer/item.json b/src/main/resources/assets/create/models/block/mechanical_mixer/item.json index d53ce5844..0c912b445 100644 --- a/src/main/resources/assets/create/models/block/mechanical_mixer/item.json +++ b/src/main/resources/assets/create/models/block/mechanical_mixer/item.json @@ -9,7 +9,8 @@ "6": "create:block/mixer_head", "11": "create:block/mechanical_press_top", "1_2": "create:block/cogwheel", - "mechanical_press_pole": "create:block/mechanical_press_pole" + "mechanical_press_pole": "create:block/mechanical_press_pole", + "particle": "create:block/andesite_casing" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/peculiar_bell/item.json b/src/main/resources/assets/create/models/block/peculiar_bell.json similarity index 69% rename from src/main/resources/assets/create/models/block/peculiar_bell/item.json rename to src/main/resources/assets/create/models/block/peculiar_bell.json index f79362efc..1c828adf2 100644 --- a/src/main/resources/assets/create/models/block/peculiar_bell/item.json +++ b/src/main/resources/assets/create/models/block/peculiar_bell.json @@ -1,40 +1,40 @@ { "credit": "Made with Blockbench", - "parent": "block/block", + "parent": "block/block", "textures": { "0": "create:block/bell", "particle": "create:block/bell" }, "elements": [ { - "from": [14, 7, 7], - "to": [16, 9, 9], + "from": [12.99, 6.99, 6.99], + "to": [16.01, 9.01, 9.01], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [10.5, 6, 9.5, 7], "texture": "#0"}, - "east": {"uv": [9.5, 7, 10.5, 8], "rotation": 90, "texture": "#0"}, - "south": {"uv": [9.5, 6, 10.5, 7], "texture": "#0"}, + "north": {"uv": [11, 6, 9.5, 7], "texture": "#0"}, + "east": {"uv": [11, 7, 12, 8], "texture": "#0"}, + "south": {"uv": [9.5, 6, 11, 7], "texture": "#0"}, "west": {"uv": [10, 7, 10.5, 7.5], "texture": "#0"}, - "up": {"uv": [9.5, 5, 10.5, 6], "texture": "#0"}, - "down": {"uv": [9.5, 7, 10.5, 8], "texture": "#0"} + "up": {"uv": [9.5, 5, 11, 6], "texture": "#0"}, + "down": {"uv": [9.5, 7, 11, 8], "texture": "#0"} } }, { - "from": [0, 7, 7], - "to": [2, 9, 9], + "from": [-0.01, 6.99, 6.99], + "to": [3.01, 9.01, 9.01], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9.5, 6, 10.5, 7], "texture": "#0"}, + "north": {"uv": [9.5, 6, 11, 7], "texture": "#0"}, "east": {"uv": [10, 7, 10.5, 7.5], "texture": "#0"}, - "south": {"uv": [10.5, 6, 9.5, 7], "texture": "#0"}, - "west": {"uv": [9.5, 7, 10.5, 8], "rotation": 90, "texture": "#0"}, - "up": {"uv": [9.5, 5, 10.5, 6], "rotation": 180, "texture": "#0"}, - "down": {"uv": [9.5, 7, 10.5, 8], "rotation": 180, "texture": "#0"} + "south": {"uv": [11, 6, 9.5, 7], "texture": "#0"}, + "west": {"uv": [11, 7, 12, 8], "texture": "#0"}, + "up": {"uv": [9.5, 5, 11, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9.5, 7, 11, 8], "rotation": 180, "texture": "#0"} } }, { - "from": [3, 0, 3], - "to": [13, 2, 13], + "from": [3, 1, 3], + "to": [13, 3, 13], "faces": { "north": {"uv": [0, 15, 5, 16], "texture": "#0"}, "east": {"uv": [0, 15, 5, 16], "texture": "#0"}, @@ -45,8 +45,8 @@ } }, { - "from": [4, 2, 4], - "to": [12, 11, 12], + "from": [4, 3, 4], + "to": [12, 12, 12], "faces": { "north": {"uv": [8, 0, 12, 4.5], "texture": "#0"}, "east": {"uv": [8, 0, 12, 4.5], "texture": "#0"}, @@ -87,7 +87,8 @@ { "name": "Bell", "origin": [8, 8, 8], + "color": 0, "children": [0, 1, 2, 3, 4, 5, 6] } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/peculiar_bell/bell.json b/src/main/resources/assets/create/models/block/peculiar_bell/bell.json deleted file mode 100644 index d6e26bbc3..000000000 --- a/src/main/resources/assets/create/models/block/peculiar_bell/bell.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "0": "create:block/bell", - "particle": "create:block/bell" - }, - "elements": [ - { - "from": [14, 7, 7], - "to": [16, 9, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [10.5, 6, 9.5, 7], "texture": "#0"}, - "east": {"uv": [9.5, 7, 10.5, 8], "rotation": 90, "texture": "#0"}, - "south": {"uv": [9.5, 6, 10.5, 7], "texture": "#0"}, - "west": {"uv": [10, 7, 10.5, 7.5], "texture": "#0"}, - "up": {"uv": [9.5, 5, 10.5, 6], "texture": "#0"}, - "down": {"uv": [9.5, 7, 10.5, 8], "texture": "#0"} - } - }, - { - "from": [0, 7, 7], - "to": [2, 9, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [9.5, 6, 10.5, 7], "texture": "#0"}, - "east": {"uv": [10, 7, 10.5, 7.5], "texture": "#0"}, - "south": {"uv": [10.5, 6, 9.5, 7], "texture": "#0"}, - "west": {"uv": [9.5, 7, 10.5, 8], "rotation": 90, "texture": "#0"}, - "up": {"uv": [9.5, 5, 10.5, 6], "rotation": 180, "texture": "#0"}, - "down": {"uv": [9.5, 7, 10.5, 8], "rotation": 180, "texture": "#0"} - } - }, - { - "from": [3, 0, 3], - "to": [13, 2, 13], - "faces": { - "north": {"uv": [0, 15, 5, 16], "texture": "#0"}, - "east": {"uv": [0, 15, 5, 16], "texture": "#0"}, - "south": {"uv": [0, 15, 5, 16], "texture": "#0"}, - "west": {"uv": [0, 15, 5, 16], "texture": "#0"}, - "up": {"uv": [0, 10, 5, 15], "texture": "#0"}, - "down": {"uv": [5, 10, 10, 15], "texture": "#0"} - } - }, - { - "from": [4, 2, 4], - "to": [12, 11, 12], - "faces": { - "north": {"uv": [8, 0, 12, 4.5], "texture": "#0"}, - "east": {"uv": [8, 0, 12, 4.5], "texture": "#0"}, - "south": {"uv": [8, 0, 12, 4.5], "texture": "#0"}, - "west": {"uv": [8, 0, 12, 4.5], "texture": "#0"}, - "up": {"uv": [12, 0, 16, 4], "texture": "#0"} - } - }, - { - "from": [7, 11, 7], - "to": [9, 15, 9], - "faces": { - "north": {"uv": [8, 6, 9, 8], "texture": "#0"}, - "east": {"uv": [8, 6, 9, 8], "texture": "#0"}, - "south": {"uv": [8, 6, 9, 8], "texture": "#0"}, - "west": {"uv": [8, 6, 9, 8], "texture": "#0"}, - "up": {"uv": [8, 5, 9, 6], "texture": "#0"} - } - }, - { - "from": [0, 0, 8], - "to": [16, 16, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8.5]}, - "faces": { - "north": {"uv": [0, 0, 8, 8], "texture": "#0"} - } - }, - { - "from": [0, 0, 7], - "to": [16, 16, 8], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8.5]}, - "faces": { - "south": {"uv": [0, 0, 8, 8], "texture": "#0"} - } - } - ], - "groups": [ - { - "name": "Bell", - "origin": [8, 8, 8], - "children": [0, 1, 2, 3, 4, 5, 6] - } - ] -} diff --git a/src/main/resources/assets/create/models/block/peculiar_bell/block_ceiling.json b/src/main/resources/assets/create/models/block/peculiar_bell/block_ceiling.json deleted file mode 100644 index 2616af7a7..000000000 --- a/src/main/resources/assets/create/models/block/peculiar_bell/block_ceiling.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/bell_frame_side", - "2": "create:block/bell_frame", - "particle": "create:block/bell" - }, - "elements": [ - { - "from": [0.1, 0, 0], - "to": [15.9, 16, 16], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, - "west": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, - "up": {"uv": [0, 0, 15.8, 16], "texture": "#2"} - } - }, - { - "from": [15.9, 0, 0], - "to": [0.1, 16, 16], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, - "west": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#2"} - } - } - ], - "groups": [ - { - "name": "Frame", - "origin": [8, 8, 8], - "children": [0, 1] - } - ] -} diff --git a/src/main/resources/assets/create/models/block/peculiar_bell/block_double_wall.json b/src/main/resources/assets/create/models/block/peculiar_bell/block_double_wall.json deleted file mode 100644 index 52a9e266d..000000000 --- a/src/main/resources/assets/create/models/block/peculiar_bell/block_double_wall.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/bell_frame_side", - "particle": "create:block/bell" - }, - "elements": [ - { - "from": [0.1, 0, 0], - "to": [15.9, 16, 16], - "faces": { - "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "north": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - }, - { - "from": [15.9, 0, 0], - "to": [0.1, 16, 16], - "faces": { - "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "north": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - } - ], - "groups": [ - { - "name": "Frame", - "origin": [8, 8, 8], - "children": [0, 1] - } - ] -} diff --git a/src/main/resources/assets/create/models/block/peculiar_bell/block_floor.json b/src/main/resources/assets/create/models/block/peculiar_bell/block_floor.json deleted file mode 100644 index 6738c29b4..000000000 --- a/src/main/resources/assets/create/models/block/peculiar_bell/block_floor.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/bell_frame_side", - "2": "create:block/bell_frame", - "particle": "create:block/bell" - }, - "elements": [ - { - "from": [0.1, 0, 0], - "to": [15.9, 16, 16], - "faces": { - "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "west": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "down": {"uv": [0, 0, 15.8, 16], "texture": "#2"} - } - }, - { - "from": [15.9, 0, 0], - "to": [0.1, 16, 16], - "faces": { - "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "west": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#2"} - } - } - ], - "groups": [ - { - "name": "Frame", - "origin": [8, 8, 8], - "children": [0, 1] - } - ] -} diff --git a/src/main/resources/assets/create/models/block/peculiar_bell/block_single_wall.json b/src/main/resources/assets/create/models/block/peculiar_bell/block_single_wall.json deleted file mode 100644 index 7bee57b84..000000000 --- a/src/main/resources/assets/create/models/block/peculiar_bell/block_single_wall.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "1": "create:block/bell_frame_side", - "particle": "create:block/bell" - }, - "elements": [ - { - "from": [0.1, 0, 0], - "to": [15.9, 16, 16], - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - }, - { - "from": [15.9, 0, 0], - "to": [0.1, 16, 16], - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - } - ], - "groups": [ - { - "name": "Frame", - "origin": [8, 8, 8], - "children": [0, 1] - } - ] -} diff --git a/src/main/resources/assets/create/models/item/incomplete_cogwheel.json b/src/main/resources/assets/create/models/item/incomplete_cogwheel.json new file mode 100644 index 000000000..50438130a --- /dev/null +++ b/src/main/resources/assets/create/models/item/incomplete_cogwheel.json @@ -0,0 +1,53 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:block/large_wheels", + "texture_size": [32, 32], + "textures": { + "0": "create:block/axis", + "3": "create:block/axis_top", + "1_2": "create:block/cogwheel", + "particle": "block/stripped_spruce_log" + }, + "elements": [ + { + "name": "Axis", + "from": [6, 0, 6], + "to": [10, 16, 10], + "shade": false, + "faces": { + "north": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "east": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "south": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "west": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "up": {"uv": [6, 6, 10, 10], "texture": "#3"}, + "down": {"uv": [6, 6, 10, 10], "texture": "#3"} + } + }, + { + "name": "GearCaseInner", + "from": [2, 7, 2], + "to": [14, 9, 14], + "faces": { + "north": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "east": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "south": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "west": {"uv": [0, 6, 6, 7], "texture": "#1_2"}, + "up": {"uv": [4, 0, 10, 6], "texture": "#1_2"}, + "down": {"uv": [4, 0, 10, 6], "texture": "#1_2"} + } + }, + { + "name": "GearCaseOuter", + "from": [4, 6, 4], + "to": [12, 10, 12], + "faces": { + "north": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "east": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "south": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "west": {"uv": [0, 4, 4, 6], "texture": "#1_2"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1_2"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1_2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/incomplete_large_cogwheel.json b/src/main/resources/assets/create/models/item/incomplete_large_cogwheel.json new file mode 100644 index 000000000..1a9e884e1 --- /dev/null +++ b/src/main/resources/assets/create/models/item/incomplete_large_cogwheel.json @@ -0,0 +1,105 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:block/large_wheels", + "texture_size": [32, 32], + "textures": { + "0": "create:block/axis", + "3": "create:block/axis_top", + "4": "create:block/large_cogwheel", + "particle": "block/stripped_spruce_log" + }, + "elements": [ + { + "name": "Axis", + "from": [6, 0, 6], + "to": [10, 16, 10], + "shade": false, + "faces": { + "north": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "east": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "south": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "west": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "up": {"uv": [6, 6, 10, 10], "texture": "#3"}, + "down": {"uv": [6, 6, 10, 10], "texture": "#3"} + } + }, + { + "name": "GearCaseInner", + "from": [-2, 7, -2], + "to": [18, 9, 18], + "faces": { + "north": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "east": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "south": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "west": {"uv": [0, 10, 10, 11], "texture": "#4"}, + "up": {"uv": [0, 0, 10, 10], "texture": "#4"}, + "down": {"uv": [0, 0, 10, 10], "texture": "#4"} + } + }, + { + "name": "GearCaseOuter", + "from": [1, 5.5, 1], + "to": [15, 10.5, 15], + "faces": { + "north": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "east": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "south": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "west": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "up": {"uv": [1.5, 1.5, 8.5, 8.5], "texture": "#4"}, + "down": {"uv": [1.5, 1.5, 8.5, 8.5], "texture": "#4"} + } + }, + { + "name": "GearCaseOuter", + "from": [-1, 5.5, 1], + "to": [1, 10.5, 15], + "faces": { + "north": {"uv": [10, 0, 12.5, 1], "rotation": 90, "texture": "#4"}, + "east": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "south": {"uv": [10, 6, 12.5, 7], "rotation": 90, "texture": "#4"}, + "west": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "up": {"uv": [7, 15, 14, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [7, 15, 14, 16], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "GearCaseOuter", + "from": [15, 5.5, 1], + "to": [17, 10.5, 15], + "faces": { + "north": {"uv": [10, 6, 12.5, 7], "rotation": 90, "texture": "#4"}, + "east": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "south": {"uv": [10, 0, 12.5, 1], "rotation": 90, "texture": "#4"}, + "west": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "up": {"uv": [0, 15, 7, 16], "rotation": 270, "texture": "#4"}, + "down": {"uv": [0, 15, 7, 16], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "GearCaseOuter", + "from": [1, 5.5, -1], + "to": [15, 10.5, 1], + "faces": { + "north": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "east": {"uv": [10, 0, 12.5, 1], "rotation": 90, "texture": "#4"}, + "south": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "west": {"uv": [10, 6, 12.5, 7], "rotation": 90, "texture": "#4"}, + "up": {"uv": [7, 14, 14, 15], "rotation": 180, "texture": "#4"}, + "down": {"uv": [0, 14, 7, 15], "texture": "#4"} + } + }, + { + "name": "GearCaseOuter", + "from": [1, 5.5, 15], + "to": [15, 10.5, 17], + "faces": { + "north": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "east": {"uv": [10, 6, 12.5, 7], "rotation": 90, "texture": "#4"}, + "south": {"uv": [10, 0, 12.5, 7], "rotation": 90, "texture": "#4"}, + "west": {"uv": [10, 0, 12.5, 1], "rotation": 90, "texture": "#4"}, + "up": {"uv": [0, 14, 7, 15], "texture": "#4"}, + "down": {"uv": [7, 14, 14, 15], "rotation": 180, "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/potato_cannon/cog.json b/src/main/resources/assets/create/models/item/potato_cannon/cog.json index e0af26eb0..7a630b442 100644 --- a/src/main/resources/assets/create/models/item/potato_cannon/cog.json +++ b/src/main/resources/assets/create/models/item/potato_cannon/cog.json @@ -1,104 +1,116 @@ { "credit": "Made with Blockbench", "parent": "create:item/potato_cannon/item", + "texture_size": [32, 32], "textures": { - "1": "create:block/andesite_bricks", - "particle": "create:block/andesite_bricks" + "1": "create:item/potato_cannon" }, "elements": [ { "name": "Cog", "from": [5.5, 8, 6.5], "to": [10.5, 9, 9.5], - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8.5, 8.5]}, + "rotation": {"angle": 0, "axis": "z", "origin": [8, 8.5, 7.5]}, "faces": { - "north": {"uv": [6, 15, 11, 16], "texture": "#1"}, - "east": {"uv": [7, 13, 8, 16], "rotation": 270, "texture": "#1"}, - "south": {"uv": [6, 14, 11, 15], "texture": "#1"}, - "west": {"uv": [9, 13, 10, 16], "rotation": 90, "texture": "#1"}, - "up": {"uv": [6, 13, 11, 16], "rotation": 180, "texture": "#1"}, - "down": {"uv": [6, 13, 11, 16], "texture": "#1"} - } - }, - { - "name": "Cog", - "from": [5.5, 8, 6.5], - "to": [10.5, 9, 9.5], - "rotation": {"angle": -45, "axis": "z", "origin": [8, 8.5, 8.5]}, - "faces": { - "north": {"uv": [6, 15, 11, 16], "texture": "#1"}, - "east": {"uv": [7, 13, 8, 16], "rotation": 270, "texture": "#1"}, - "south": {"uv": [6, 14, 11, 15], "texture": "#1"}, - "west": {"uv": [9, 13, 10, 16], "rotation": 90, "texture": "#1"}, - "up": {"uv": [6, 13, 11, 16], "rotation": 180, "texture": "#1"}, - "down": {"uv": [6, 13, 11, 16], "texture": "#1"} + "north": {"uv": [6.5, 9.75, 9, 10], "texture": "#1"}, + "east": {"uv": [8.75, 10, 9, 8.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [6.5, 8.5, 9, 8.75], "texture": "#1"}, + "west": {"uv": [8.75, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6.5, 8.5, 9, 10], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6.5, 8.5, 9, 10], "texture": "#1"} } }, { "name": "Cog", "from": [7.5, 6, 6.5], "to": [8.5, 11, 9.5], - "rotation": {"angle": 0, "axis": "z", "origin": [8, 8.5, 8.5]}, + "rotation": {"angle": 0, "axis": "z", "origin": [8, 8.5, 7.5]}, "faces": { - "north": {"uv": [6, 15, 11, 16], "rotation": 270, "texture": "#1"}, - "east": {"uv": [6, 13, 11, 16], "rotation": 270, "texture": "#1"}, - "south": {"uv": [6, 14, 11, 15], "rotation": 90, "texture": "#1"}, - "west": {"uv": [6, 13, 11, 16], "rotation": 90, "texture": "#1"}, - "up": {"uv": [8, 13, 9, 16], "rotation": 180, "texture": "#1"}, - "down": {"uv": [6, 13, 7, 16], "texture": "#1"} + "north": {"uv": [6.5, 9.75, 9, 10], "rotation": 90, "texture": "#1"}, + "east": {"uv": [6.5, 8.5, 9, 10], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6.5, 8.5, 9, 8.75], "rotation": 270, "texture": "#1"}, + "west": {"uv": [6.5, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, + "up": {"uv": [8.75, 10, 9, 8.5], "texture": "#1"}, + "down": {"uv": [8.75, 8.5, 9, 10], "texture": "#1"} + } + }, + { + "name": "Cog", + "from": [7.5, 6, 6.5], + "to": [8.5, 11, 9.5], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8.5, 7.5]}, + "faces": { + "north": {"uv": [6.5, 9.75, 9, 10], "rotation": 90, "texture": "#1"}, + "east": {"uv": [6.5, 8.5, 9, 10], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6.5, 8.5, 9, 8.75], "rotation": 270, "texture": "#1"}, + "west": {"uv": [6.5, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, + "up": {"uv": [8.75, 10, 9, 8.5], "texture": "#1"}, + "down": {"uv": [8.75, 8.5, 9, 10], "texture": "#1"} } }, { "name": "Cog", "from": [5.5, 8, 6.5], "to": [10.5, 9, 9.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 11, 3.5]}, + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8.5, 7.5]}, "faces": { - "north": {"uv": [6, 15, 11, 16], "texture": "#1"}, - "east": {"uv": [6, 13, 7, 16], "rotation": 270, "texture": "#1"}, - "south": {"uv": [6, 14, 11, 15], "texture": "#1"}, - "west": {"uv": [8, 13, 9, 16], "rotation": 90, "texture": "#1"}, - "up": {"uv": [6, 13, 11, 16], "rotation": 180, "texture": "#1"}, - "down": {"uv": [6, 13, 11, 16], "texture": "#1"} + "north": {"uv": [6.5, 9.75, 9, 10], "texture": "#1"}, + "east": {"uv": [8.75, 10, 9, 8.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [6.5, 8.5, 9, 8.75], "texture": "#1"}, + "west": {"uv": [8.75, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6.5, 8.5, 9, 10], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6.5, 8.5, 9, 10], "texture": "#1"} } } ], "display": { "thirdperson_righthand": { - "rotation": [0, 90, 0], - "translation": [0, 3.25, 0] + "translation": [0, 1.75, 0] }, "thirdperson_lefthand": { - "translation": [0, 3.75, 0] + "translation": [0, 1.75, 0] }, "firstperson_righthand": { - "rotation": [-4.5, 100.25, 10], - "translation": [1, 4, 1] + "rotation": [5, 4, 5], + "translation": [0.25, 4, 0.75] }, "firstperson_lefthand": { - "rotation": [17.25, 267, 10], - "translation": [1, 4, 1] + "rotation": [5, 4, 5], + "translation": [0.25, 4, 0.75] }, "ground": { - "rotation": [-90, 0, 0], - "translation": [0, -2.3, 0], + "rotation": [0, 0, 90], + "translation": [0, -1.3, 0], "scale": [0.76914, 0.76914, 0.76914] }, "gui": { - "rotation": [28, -163, 43], + "rotation": [64, 47, -47], "translation": [0.5, 0, 0], - "scale": [1.09453, 1.09453, 1.09453] + "scale": [0.86, 0.86, 0.86] + }, + "head": { + "translation": [0, 8, 0], + "scale": [1.4, 1.4, 1.4] }, "fixed": { - "rotation": [0, 160.5, 0], - "translation": [0.5, 0.5, 0] + "rotation": [0, 90, 0], + "translation": [0.5, 0.5, -1], + "scale": [0.72, 0.72, 0.72] } }, "groups": [ { - "name": "accelerator", + "name": "cog", "origin": [8, 8, 8], - "children": [0, 1, 2, 3] + "color": 0, + "children": [ + { + "name": "accelerator", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3] + } + ] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/potato_cannon/item.json b/src/main/resources/assets/create/models/item/potato_cannon/item.json index 1fc1396f1..ece021b34 100644 --- a/src/main/resources/assets/create/models/item/potato_cannon/item.json +++ b/src/main/resources/assets/create/models/item/potato_cannon/item.json @@ -1,73 +1,83 @@ { "credit": "Made with Blockbench", - "parent": "block/block", + "texture_size": [32, 32], "textures": { - "2": "create:block/fluid_pipe", - "4": "create:block/andesite_casing_very_short", - "5": "create:block/andesite_casing_short", - "particle": "create:block/andesite_bricks" + "1": "create:item/potato_cannon", + "particle": "create:block/copper_casing" }, "elements": [ { - "from": [7, 7, -2.5], - "to": [9, 10, 6.5], + "from": [6.5, 7, -1.5], + "to": [9.5, 10, 6.5], "rotation": {"angle": 0, "axis": "y", "origin": [7, 7.6, 11]}, "faces": { - "north": {"uv": [7.5, 1, 9.5, 4], "texture": "#2"}, - "east": {"uv": [0.5, 6, 3.5, 15], "rotation": 90, "texture": "#2"}, - "south": {"uv": [7.5, 1, 9.5, 4], "texture": "#2"}, - "west": {"uv": [0.5, 6, 3.5, 15], "rotation": 270, "texture": "#2"}, - "up": {"uv": [1, 6, 3, 15], "texture": "#2"}, - "down": {"uv": [1, 6, 3, 15], "rotation": 180, "texture": "#2"} + "east": {"uv": [4, 2, 0, 3.5], "texture": "#1"}, + "south": {"uv": [10, 6, 11.5, 7.5], "texture": "#1"}, + "west": {"uv": [0, 2, 4, 3.5], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 1.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [0, 4, 4, 5.5], "rotation": 270, "texture": "#1"} } }, { - "from": [7, 7, 9.5], - "to": [9, 10, 10.5], + "from": [6, 6.5, -2.5], + "to": [10, 10.5, -1.5], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 7.6, 11]}, + "faces": { + "north": {"uv": [4, 0.5, 6, 2.5], "texture": "#1"}, + "east": {"uv": [6.25, 0.5, 5.75, 2.5], "texture": "#1"}, + "south": {"uv": [4, 3.5, 6, 5.5], "texture": "#1"}, + "west": {"uv": [5.75, 0.5, 6.25, 2.5], "texture": "#1"}, + "up": {"uv": [4, 0.75, 6, 0.25], "texture": "#1"}, + "down": {"uv": [4, 2.75, 6, 2.25], "texture": "#1"} + } + }, + { + "from": [6.5, 7, 9.5], + "to": [9.5, 10, 10.5], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.6, 11]}, "faces": { - "east": {"uv": [0.5, 6, 3.5, 7], "rotation": 90, "texture": "#2"}, - "west": {"uv": [0.5, 6, 3.5, 7], "rotation": 270, "texture": "#2"}, - "up": {"uv": [1, 6, 3, 7], "texture": "#2"}, - "down": {"uv": [1, 6, 3, 7], "rotation": 180, "texture": "#2"} + "north": {"uv": [0, 6, 1.5, 7.5], "texture": "#1"}, + "east": {"uv": [4, 2, 3.5, 3.5], "texture": "#1"}, + "west": {"uv": [3.5, 2, 4, 3.5], "texture": "#1"}, + "up": {"uv": [3.5, 0, 4, 1.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [3.5, 4, 4, 5.5], "texture": "#1"} } }, { "from": [6, 7, 10.5], - "to": [10, 11, 16.5], + "to": [10, 11, 15.5], "rotation": {"angle": 0, "axis": "y", "origin": [8, 9.6, 11]}, "faces": { - "north": {"uv": [7, 7, 15, 15], "rotation": 270, "texture": "#4"}, - "east": {"uv": [4, 4, 12, 16], "rotation": 270, "texture": "#5"}, - "south": {"uv": [7, 7, 15, 15], "rotation": 270, "texture": "#4"}, - "west": {"uv": [4, 4, 12, 16], "rotation": 90, "texture": "#5"}, - "up": {"uv": [4, 4, 12, 16], "rotation": 180, "texture": "#5"}, - "down": {"uv": [4, 4, 12, 16], "texture": "#5"} + "north": {"uv": [10, 3.5, 12, 5.5], "texture": "#1"}, + "east": {"uv": [9.5, 1, 7, 3], "texture": "#1"}, + "south": {"uv": [10, 1, 12, 3], "texture": "#1"}, + "west": {"uv": [7, 1, 9.5, 3], "texture": "#1"}, + "up": {"uv": [7, 3.5, 9.5, 5.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 6, 9.5, 8], "rotation": 270, "texture": "#1"} } }, { - "from": [7, 4, 11.5], + "from": [7, 4, 14.5], "to": [9, 6, 15.5], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.6, 11]}, "faces": { - "north": {"uv": [13, 13, 15, 15], "texture": "#2"}, - "east": {"uv": [1, 6, 3, 10], "rotation": 90, "texture": "#2"}, - "west": {"uv": [1, 6, 3, 10], "rotation": 270, "texture": "#2"}, - "up": {"uv": [1, 6, 3, 10], "texture": "#2"}, - "down": {"uv": [1, 6, 3, 10], "rotation": 180, "texture": "#2"} + "east": {"uv": [0.5, 10, 1, 11], "texture": "#1"}, + "west": {"uv": [0.5, 10, 1, 11], "texture": "#1"}, + "up": {"uv": [0.5, 10, 1, 10.25], "rotation": 90, "texture": "#1"}, + "down": {"uv": [1.5, 10.75, 2.5, 11], "rotation": 90, "texture": "#1"} } }, { - "from": [6.5, 3.5, 9.5], + "from": [6.5, 3.5, 8.5], "to": [9.5, 6.5, 14.5], "rotation": {"angle": -45, "axis": "z", "origin": [8, 5, 11.5]}, "faces": { - "north": {"uv": [12.5, 12.5, 15.5, 15.5], "texture": "#2"}, - "east": {"uv": [0.5, 6, 3.5, 11], "rotation": 90, "texture": "#2"}, - "south": {"uv": [12.5, 12.5, 15.5, 15.5], "texture": "#2"}, - "west": {"uv": [0.5, 6, 3.5, 11], "rotation": 270, "texture": "#2"}, - "up": {"uv": [0.5, 6, 3.5, 11], "texture": "#2"}, - "down": {"uv": [0.5, 6, 3.5, 11], "rotation": 180, "texture": "#2"} + "north": {"uv": [3, 6, 4.5, 7.5], "rotation": 90, "texture": "#1"}, + "east": {"uv": [6, 9.25, 3, 10.75], "texture": "#1"}, + "south": {"uv": [5, 6, 6.5, 7.5], "texture": "#1"}, + "west": {"uv": [3, 8, 6, 9.5], "texture": "#1"}, + "up": {"uv": [3, 9.5, 6, 8], "rotation": 90, "texture": "#1"}, + "down": {"uv": [6, 10.75, 3, 9.25], "rotation": 90, "texture": "#1"} } }, { @@ -75,33 +85,29 @@ "to": [9, 10, 17.5], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.6, 11]}, "faces": { - "north": {"uv": [3, 7, 1, 13], "rotation": 180, "texture": "#2"}, - "east": {"uv": [1, 9, 3, 15], "texture": "#2"}, - "south": {"uv": [3, 7, 1, 13], "rotation": 180, "texture": "#2"}, - "west": {"uv": [3, 9, 1, 15], "texture": "#2"}, - "up": {"uv": [1, 7, 3, 9], "rotation": 180, "texture": "#2"}, - "down": {"uv": [1, 7, 3, 9], "texture": "#2"} + "north": {"uv": [1.25, 8, 0.25, 11], "texture": "#1"}, + "east": {"uv": [2, 8, 1, 11], "texture": "#1"}, + "south": {"uv": [3, 8, 2, 11], "texture": "#1"}, + "west": {"uv": [1, 8, 2, 11], "texture": "#1"}, + "up": {"uv": [2, 7, 3, 8], "texture": "#1"}, + "down": {"uv": [1.5, 10.75, 2.5, 11], "rotation": 90, "texture": "#1"} } } ], "display": { "thirdperson_righthand": { - "translation": [0, 1.75, 0], - "scale": [0.89, 0.89, 0.89] + "translation": [0, 1.75, 0] }, "thirdperson_lefthand": { - "translation": [0, 1.75, 0], - "scale": [0.89, 0.89, 0.89] + "translation": [0, 1.75, 0] }, "firstperson_righthand": { "rotation": [5, 4, 5], - "translation": [0.25, 4, 0.75], - "scale": [1, 1, 0.57] + "translation": [0.25, 4, 0.75] }, "firstperson_lefthand": { "rotation": [5, 4, 5], - "translation": [0.25, 4, 0.75], - "scale": [1, 1, 0.57] + "translation": [0.25, 4, 0.75] }, "ground": { "rotation": [0, 0, 90], @@ -110,7 +116,7 @@ }, "gui": { "rotation": [64, 47, -47], - "translation": [0, 0.5, 0], + "translation": [0.5, 0, 0], "scale": [0.86, 0.86, 0.86] }, "head": { diff --git a/src/main/resources/assets/create/particles/soul_expanding_perimeter.json b/src/main/resources/assets/create/particles/soul_expanding_perimeter.json new file mode 100644 index 000000000..3274e5921 --- /dev/null +++ b/src/main/resources/assets/create/particles/soul_expanding_perimeter.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "create:soul_base_0", + "create:soul_base_1", + "create:soul_base_2", + "create:soul_base_3", + "create:soul_base_2", + "create:soul_base_1", + "create:soul_base_0", + "create:soul_base_0" + ] +} diff --git a/src/main/resources/assets/create/particles/soul_perimeter.json b/src/main/resources/assets/create/particles/soul_perimeter.json new file mode 100644 index 000000000..92b9f65be --- /dev/null +++ b/src/main/resources/assets/create/particles/soul_perimeter.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "create:soul_base_0", + "create:soul_base_1", + "create:soul_base_2", + "create:soul_base_3", + "create:soul_base_4", + "create:soul_base_5", + "create:soul_base_6", + "create:soul_base_7" + ] +} diff --git a/src/main/resources/ponder/adjustable_pulse_repeater.nbt b/src/main/resources/assets/create/ponder/adjustable_pulse_repeater.nbt similarity index 100% rename from src/main/resources/ponder/adjustable_pulse_repeater.nbt rename to src/main/resources/assets/create/ponder/adjustable_pulse_repeater.nbt diff --git a/src/main/resources/ponder/adjustable_repeater.nbt b/src/main/resources/assets/create/ponder/adjustable_repeater.nbt similarity index 100% rename from src/main/resources/ponder/adjustable_repeater.nbt rename to src/main/resources/assets/create/ponder/adjustable_repeater.nbt diff --git a/src/main/resources/ponder/analog_lever.nbt b/src/main/resources/assets/create/ponder/analog_lever.nbt similarity index 100% rename from src/main/resources/ponder/analog_lever.nbt rename to src/main/resources/assets/create/ponder/analog_lever.nbt diff --git a/src/main/resources/ponder/basin.nbt b/src/main/resources/assets/create/ponder/basin.nbt similarity index 100% rename from src/main/resources/ponder/basin.nbt rename to src/main/resources/assets/create/ponder/basin.nbt diff --git a/src/main/resources/ponder/belt/connect.nbt b/src/main/resources/assets/create/ponder/belt/connect.nbt similarity index 100% rename from src/main/resources/ponder/belt/connect.nbt rename to src/main/resources/assets/create/ponder/belt/connect.nbt diff --git a/src/main/resources/ponder/belt/directions.nbt b/src/main/resources/assets/create/ponder/belt/directions.nbt similarity index 100% rename from src/main/resources/ponder/belt/directions.nbt rename to src/main/resources/assets/create/ponder/belt/directions.nbt diff --git a/src/main/resources/ponder/belt/encasing.nbt b/src/main/resources/assets/create/ponder/belt/encasing.nbt similarity index 100% rename from src/main/resources/ponder/belt/encasing.nbt rename to src/main/resources/assets/create/ponder/belt/encasing.nbt diff --git a/src/main/resources/ponder/belt/transport.nbt b/src/main/resources/assets/create/ponder/belt/transport.nbt similarity index 100% rename from src/main/resources/ponder/belt/transport.nbt rename to src/main/resources/assets/create/ponder/belt/transport.nbt diff --git a/src/main/resources/ponder/blaze_burner.nbt b/src/main/resources/assets/create/ponder/blaze_burner.nbt similarity index 100% rename from src/main/resources/ponder/blaze_burner.nbt rename to src/main/resources/assets/create/ponder/blaze_burner.nbt diff --git a/src/main/resources/ponder/cart_assembler/anchor.nbt b/src/main/resources/assets/create/ponder/cart_assembler/anchor.nbt similarity index 100% rename from src/main/resources/ponder/cart_assembler/anchor.nbt rename to src/main/resources/assets/create/ponder/cart_assembler/anchor.nbt diff --git a/src/main/resources/ponder/cart_assembler/dual.nbt b/src/main/resources/assets/create/ponder/cart_assembler/dual.nbt similarity index 100% rename from src/main/resources/ponder/cart_assembler/dual.nbt rename to src/main/resources/assets/create/ponder/cart_assembler/dual.nbt diff --git a/src/main/resources/ponder/cart_assembler/modes.nbt b/src/main/resources/assets/create/ponder/cart_assembler/modes.nbt similarity index 100% rename from src/main/resources/ponder/cart_assembler/modes.nbt rename to src/main/resources/assets/create/ponder/cart_assembler/modes.nbt diff --git a/src/main/resources/ponder/cart_assembler/rails.nbt b/src/main/resources/assets/create/ponder/cart_assembler/rails.nbt similarity index 100% rename from src/main/resources/ponder/cart_assembler/rails.nbt rename to src/main/resources/assets/create/ponder/cart_assembler/rails.nbt diff --git a/src/main/resources/ponder/chain_drive/gearshift.nbt b/src/main/resources/assets/create/ponder/chain_drive/gearshift.nbt similarity index 100% rename from src/main/resources/ponder/chain_drive/gearshift.nbt rename to src/main/resources/assets/create/ponder/chain_drive/gearshift.nbt diff --git a/src/main/resources/ponder/chain_drive/relay.nbt b/src/main/resources/assets/create/ponder/chain_drive/relay.nbt similarity index 100% rename from src/main/resources/ponder/chain_drive/relay.nbt rename to src/main/resources/assets/create/ponder/chain_drive/relay.nbt diff --git a/src/main/resources/ponder/chassis/linear_attachment.nbt b/src/main/resources/assets/create/ponder/chassis/linear_attachment.nbt similarity index 100% rename from src/main/resources/ponder/chassis/linear_attachment.nbt rename to src/main/resources/assets/create/ponder/chassis/linear_attachment.nbt diff --git a/src/main/resources/ponder/chassis/linear_group.nbt b/src/main/resources/assets/create/ponder/chassis/linear_group.nbt similarity index 100% rename from src/main/resources/ponder/chassis/linear_group.nbt rename to src/main/resources/assets/create/ponder/chassis/linear_group.nbt diff --git a/src/main/resources/ponder/chassis/radial.nbt b/src/main/resources/assets/create/ponder/chassis/radial.nbt similarity index 100% rename from src/main/resources/ponder/chassis/radial.nbt rename to src/main/resources/assets/create/ponder/chassis/radial.nbt diff --git a/src/main/resources/ponder/chute/downward.nbt b/src/main/resources/assets/create/ponder/chute/downward.nbt similarity index 100% rename from src/main/resources/ponder/chute/downward.nbt rename to src/main/resources/assets/create/ponder/chute/downward.nbt diff --git a/src/main/resources/ponder/chute/smart.nbt b/src/main/resources/assets/create/ponder/chute/smart.nbt similarity index 100% rename from src/main/resources/ponder/chute/smart.nbt rename to src/main/resources/assets/create/ponder/chute/smart.nbt diff --git a/src/main/resources/ponder/chute/upward.nbt b/src/main/resources/assets/create/ponder/chute/upward.nbt similarity index 100% rename from src/main/resources/ponder/chute/upward.nbt rename to src/main/resources/assets/create/ponder/chute/upward.nbt diff --git a/src/main/resources/ponder/clockwork_bearing.nbt b/src/main/resources/assets/create/ponder/clockwork_bearing.nbt similarity index 100% rename from src/main/resources/ponder/clockwork_bearing.nbt rename to src/main/resources/assets/create/ponder/clockwork_bearing.nbt diff --git a/src/main/resources/ponder/clutch.nbt b/src/main/resources/assets/create/ponder/clutch.nbt similarity index 100% rename from src/main/resources/ponder/clutch.nbt rename to src/main/resources/assets/create/ponder/clutch.nbt diff --git a/src/main/resources/ponder/cog/large.nbt b/src/main/resources/assets/create/ponder/cog/large.nbt similarity index 100% rename from src/main/resources/ponder/cog/large.nbt rename to src/main/resources/assets/create/ponder/cog/large.nbt diff --git a/src/main/resources/ponder/cog/small.nbt b/src/main/resources/assets/create/ponder/cog/small.nbt similarity index 100% rename from src/main/resources/ponder/cog/small.nbt rename to src/main/resources/assets/create/ponder/cog/small.nbt diff --git a/src/main/resources/ponder/cog/speedup.nbt b/src/main/resources/assets/create/ponder/cog/speedup.nbt similarity index 100% rename from src/main/resources/ponder/cog/speedup.nbt rename to src/main/resources/assets/create/ponder/cog/speedup.nbt diff --git a/src/main/resources/ponder/creative_motor.nbt b/src/main/resources/assets/create/ponder/creative_motor.nbt similarity index 100% rename from src/main/resources/ponder/creative_motor.nbt rename to src/main/resources/assets/create/ponder/creative_motor.nbt diff --git a/src/main/resources/ponder/crushing_wheel.nbt b/src/main/resources/assets/create/ponder/crushing_wheel.nbt similarity index 100% rename from src/main/resources/ponder/crushing_wheel.nbt rename to src/main/resources/assets/create/ponder/crushing_wheel.nbt diff --git a/src/main/resources/ponder/debug/scene_1.nbt b/src/main/resources/assets/create/ponder/debug/scene_1.nbt similarity index 100% rename from src/main/resources/ponder/debug/scene_1.nbt rename to src/main/resources/assets/create/ponder/debug/scene_1.nbt diff --git a/src/main/resources/ponder/debug/scene_10.nbt b/src/main/resources/assets/create/ponder/debug/scene_10.nbt similarity index 100% rename from src/main/resources/ponder/debug/scene_10.nbt rename to src/main/resources/assets/create/ponder/debug/scene_10.nbt diff --git a/src/main/resources/ponder/debug/scene_2.nbt b/src/main/resources/assets/create/ponder/debug/scene_2.nbt similarity index 100% rename from src/main/resources/ponder/debug/scene_2.nbt rename to src/main/resources/assets/create/ponder/debug/scene_2.nbt diff --git a/src/main/resources/ponder/debug/scene_3.nbt b/src/main/resources/assets/create/ponder/debug/scene_3.nbt similarity index 100% rename from src/main/resources/ponder/debug/scene_3.nbt rename to src/main/resources/assets/create/ponder/debug/scene_3.nbt diff --git a/src/main/resources/ponder/debug/scene_4.nbt b/src/main/resources/assets/create/ponder/debug/scene_4.nbt similarity index 100% rename from src/main/resources/ponder/debug/scene_4.nbt rename to src/main/resources/assets/create/ponder/debug/scene_4.nbt diff --git a/src/main/resources/ponder/debug/scene_5.nbt b/src/main/resources/assets/create/ponder/debug/scene_5.nbt similarity index 100% rename from src/main/resources/ponder/debug/scene_5.nbt rename to src/main/resources/assets/create/ponder/debug/scene_5.nbt diff --git a/src/main/resources/ponder/debug/scene_6.nbt b/src/main/resources/assets/create/ponder/debug/scene_6.nbt similarity index 100% rename from src/main/resources/ponder/debug/scene_6.nbt rename to src/main/resources/assets/create/ponder/debug/scene_6.nbt diff --git a/src/main/resources/ponder/debug/scene_7.nbt b/src/main/resources/assets/create/ponder/debug/scene_7.nbt similarity index 100% rename from src/main/resources/ponder/debug/scene_7.nbt rename to src/main/resources/assets/create/ponder/debug/scene_7.nbt diff --git a/src/main/resources/ponder/debug/scene_8.nbt b/src/main/resources/assets/create/ponder/debug/scene_8.nbt similarity index 100% rename from src/main/resources/ponder/debug/scene_8.nbt rename to src/main/resources/assets/create/ponder/debug/scene_8.nbt diff --git a/src/main/resources/ponder/debug/scene_9.nbt b/src/main/resources/assets/create/ponder/debug/scene_9.nbt similarity index 100% rename from src/main/resources/ponder/debug/scene_9.nbt rename to src/main/resources/assets/create/ponder/debug/scene_9.nbt diff --git a/src/main/resources/ponder/deployer/contraption.nbt b/src/main/resources/assets/create/ponder/deployer/contraption.nbt similarity index 100% rename from src/main/resources/ponder/deployer/contraption.nbt rename to src/main/resources/assets/create/ponder/deployer/contraption.nbt diff --git a/src/main/resources/ponder/deployer/filter.nbt b/src/main/resources/assets/create/ponder/deployer/filter.nbt similarity index 100% rename from src/main/resources/ponder/deployer/filter.nbt rename to src/main/resources/assets/create/ponder/deployer/filter.nbt diff --git a/src/main/resources/ponder/deployer/modes.nbt b/src/main/resources/assets/create/ponder/deployer/modes.nbt similarity index 100% rename from src/main/resources/ponder/deployer/modes.nbt rename to src/main/resources/assets/create/ponder/deployer/modes.nbt diff --git a/src/main/resources/ponder/deployer/processing.nbt b/src/main/resources/assets/create/ponder/deployer/processing.nbt similarity index 100% rename from src/main/resources/ponder/deployer/processing.nbt rename to src/main/resources/assets/create/ponder/deployer/processing.nbt diff --git a/src/main/resources/ponder/deployer/redstone.nbt b/src/main/resources/assets/create/ponder/deployer/redstone.nbt similarity index 100% rename from src/main/resources/ponder/deployer/redstone.nbt rename to src/main/resources/assets/create/ponder/deployer/redstone.nbt diff --git a/src/main/resources/ponder/depot.nbt b/src/main/resources/assets/create/ponder/depot.nbt similarity index 100% rename from src/main/resources/ponder/depot.nbt rename to src/main/resources/assets/create/ponder/depot.nbt diff --git a/src/main/resources/ponder/empty_blaze_burner.nbt b/src/main/resources/assets/create/ponder/empty_blaze_burner.nbt similarity index 100% rename from src/main/resources/ponder/empty_blaze_burner.nbt rename to src/main/resources/assets/create/ponder/empty_blaze_burner.nbt diff --git a/src/main/resources/ponder/fan/direction.nbt b/src/main/resources/assets/create/ponder/fan/direction.nbt similarity index 100% rename from src/main/resources/ponder/fan/direction.nbt rename to src/main/resources/assets/create/ponder/fan/direction.nbt diff --git a/src/main/resources/ponder/fan/processing.nbt b/src/main/resources/assets/create/ponder/fan/processing.nbt similarity index 100% rename from src/main/resources/ponder/fan/processing.nbt rename to src/main/resources/assets/create/ponder/fan/processing.nbt diff --git a/src/main/resources/ponder/fan/source.nbt b/src/main/resources/assets/create/ponder/fan/source.nbt similarity index 100% rename from src/main/resources/ponder/fan/source.nbt rename to src/main/resources/assets/create/ponder/fan/source.nbt diff --git a/src/main/resources/ponder/fluid_pipe/encasing.nbt b/src/main/resources/assets/create/ponder/fluid_pipe/encasing.nbt similarity index 100% rename from src/main/resources/ponder/fluid_pipe/encasing.nbt rename to src/main/resources/assets/create/ponder/fluid_pipe/encasing.nbt diff --git a/src/main/resources/ponder/fluid_pipe/flow.nbt b/src/main/resources/assets/create/ponder/fluid_pipe/flow.nbt similarity index 100% rename from src/main/resources/ponder/fluid_pipe/flow.nbt rename to src/main/resources/assets/create/ponder/fluid_pipe/flow.nbt diff --git a/src/main/resources/ponder/fluid_pipe/interaction.nbt b/src/main/resources/assets/create/ponder/fluid_pipe/interaction.nbt similarity index 100% rename from src/main/resources/ponder/fluid_pipe/interaction.nbt rename to src/main/resources/assets/create/ponder/fluid_pipe/interaction.nbt diff --git a/src/main/resources/ponder/fluid_tank/sizes.nbt b/src/main/resources/assets/create/ponder/fluid_tank/sizes.nbt similarity index 100% rename from src/main/resources/ponder/fluid_tank/sizes.nbt rename to src/main/resources/assets/create/ponder/fluid_tank/sizes.nbt diff --git a/src/main/resources/ponder/fluid_tank/sizes_creative.nbt b/src/main/resources/assets/create/ponder/fluid_tank/sizes_creative.nbt similarity index 100% rename from src/main/resources/ponder/fluid_tank/sizes_creative.nbt rename to src/main/resources/assets/create/ponder/fluid_tank/sizes_creative.nbt diff --git a/src/main/resources/ponder/fluid_tank/storage.nbt b/src/main/resources/assets/create/ponder/fluid_tank/storage.nbt similarity index 100% rename from src/main/resources/ponder/fluid_tank/storage.nbt rename to src/main/resources/assets/create/ponder/fluid_tank/storage.nbt diff --git a/src/main/resources/ponder/fluid_tank/storage_creative.nbt b/src/main/resources/assets/create/ponder/fluid_tank/storage_creative.nbt similarity index 100% rename from src/main/resources/ponder/fluid_tank/storage_creative.nbt rename to src/main/resources/assets/create/ponder/fluid_tank/storage_creative.nbt diff --git a/src/main/resources/ponder/fluid_valve.nbt b/src/main/resources/assets/create/ponder/fluid_valve.nbt similarity index 100% rename from src/main/resources/ponder/fluid_valve.nbt rename to src/main/resources/assets/create/ponder/fluid_valve.nbt diff --git a/src/main/resources/ponder/funnels/brass.nbt b/src/main/resources/assets/create/ponder/funnels/brass.nbt similarity index 100% rename from src/main/resources/ponder/funnels/brass.nbt rename to src/main/resources/assets/create/ponder/funnels/brass.nbt diff --git a/src/main/resources/ponder/funnels/compat.nbt b/src/main/resources/assets/create/ponder/funnels/compat.nbt similarity index 100% rename from src/main/resources/ponder/funnels/compat.nbt rename to src/main/resources/assets/create/ponder/funnels/compat.nbt diff --git a/src/main/resources/ponder/funnels/direction.nbt b/src/main/resources/assets/create/ponder/funnels/direction.nbt similarity index 100% rename from src/main/resources/ponder/funnels/direction.nbt rename to src/main/resources/assets/create/ponder/funnels/direction.nbt diff --git a/src/main/resources/ponder/funnels/intro.nbt b/src/main/resources/assets/create/ponder/funnels/intro.nbt similarity index 100% rename from src/main/resources/ponder/funnels/intro.nbt rename to src/main/resources/assets/create/ponder/funnels/intro.nbt diff --git a/src/main/resources/ponder/funnels/redstone.nbt b/src/main/resources/assets/create/ponder/funnels/redstone.nbt similarity index 100% rename from src/main/resources/ponder/funnels/redstone.nbt rename to src/main/resources/assets/create/ponder/funnels/redstone.nbt diff --git a/src/main/resources/ponder/funnels/transposer.nbt b/src/main/resources/assets/create/ponder/funnels/transposer.nbt similarity index 100% rename from src/main/resources/ponder/funnels/transposer.nbt rename to src/main/resources/assets/create/ponder/funnels/transposer.nbt diff --git a/src/main/resources/ponder/furnace_engine.nbt b/src/main/resources/assets/create/ponder/furnace_engine.nbt similarity index 100% rename from src/main/resources/ponder/furnace_engine.nbt rename to src/main/resources/assets/create/ponder/furnace_engine.nbt diff --git a/src/main/resources/ponder/gantry/direction.nbt b/src/main/resources/assets/create/ponder/gantry/direction.nbt similarity index 100% rename from src/main/resources/ponder/gantry/direction.nbt rename to src/main/resources/assets/create/ponder/gantry/direction.nbt diff --git a/src/main/resources/ponder/gantry/intro.nbt b/src/main/resources/assets/create/ponder/gantry/intro.nbt similarity index 100% rename from src/main/resources/ponder/gantry/intro.nbt rename to src/main/resources/assets/create/ponder/gantry/intro.nbt diff --git a/src/main/resources/ponder/gantry/redstone.nbt b/src/main/resources/assets/create/ponder/gantry/redstone.nbt similarity index 100% rename from src/main/resources/ponder/gantry/redstone.nbt rename to src/main/resources/assets/create/ponder/gantry/redstone.nbt diff --git a/src/main/resources/ponder/gantry/subgantry.nbt b/src/main/resources/assets/create/ponder/gantry/subgantry.nbt similarity index 100% rename from src/main/resources/ponder/gantry/subgantry.nbt rename to src/main/resources/assets/create/ponder/gantry/subgantry.nbt diff --git a/src/main/resources/ponder/gauges.nbt b/src/main/resources/assets/create/ponder/gauges.nbt similarity index 100% rename from src/main/resources/ponder/gauges.nbt rename to src/main/resources/assets/create/ponder/gauges.nbt diff --git a/src/main/resources/ponder/gearbox.nbt b/src/main/resources/assets/create/ponder/gearbox.nbt similarity index 100% rename from src/main/resources/ponder/gearbox.nbt rename to src/main/resources/assets/create/ponder/gearbox.nbt diff --git a/src/main/resources/ponder/gearshift.nbt b/src/main/resources/assets/create/ponder/gearshift.nbt similarity index 100% rename from src/main/resources/ponder/gearshift.nbt rename to src/main/resources/assets/create/ponder/gearshift.nbt diff --git a/src/main/resources/ponder/hand_crank.nbt b/src/main/resources/assets/create/ponder/hand_crank.nbt similarity index 100% rename from src/main/resources/ponder/hand_crank.nbt rename to src/main/resources/assets/create/ponder/hand_crank.nbt diff --git a/src/main/resources/ponder/harvester.nbt b/src/main/resources/assets/create/ponder/harvester.nbt similarity index 100% rename from src/main/resources/ponder/harvester.nbt rename to src/main/resources/assets/create/ponder/harvester.nbt diff --git a/src/main/resources/ponder/hose_pulley/infinite.nbt b/src/main/resources/assets/create/ponder/hose_pulley/infinite.nbt similarity index 100% rename from src/main/resources/ponder/hose_pulley/infinite.nbt rename to src/main/resources/assets/create/ponder/hose_pulley/infinite.nbt diff --git a/src/main/resources/ponder/hose_pulley/intro.nbt b/src/main/resources/assets/create/ponder/hose_pulley/intro.nbt similarity index 100% rename from src/main/resources/ponder/hose_pulley/intro.nbt rename to src/main/resources/assets/create/ponder/hose_pulley/intro.nbt diff --git a/src/main/resources/ponder/hose_pulley/level.nbt b/src/main/resources/assets/create/ponder/hose_pulley/level.nbt similarity index 100% rename from src/main/resources/ponder/hose_pulley/level.nbt rename to src/main/resources/assets/create/ponder/hose_pulley/level.nbt diff --git a/src/main/resources/ponder/item_drain.nbt b/src/main/resources/assets/create/ponder/item_drain.nbt similarity index 100% rename from src/main/resources/ponder/item_drain.nbt rename to src/main/resources/assets/create/ponder/item_drain.nbt diff --git a/src/main/resources/ponder/mechanical_arm/filter.nbt b/src/main/resources/assets/create/ponder/mechanical_arm/filter.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_arm/filter.nbt rename to src/main/resources/assets/create/ponder/mechanical_arm/filter.nbt diff --git a/src/main/resources/ponder/mechanical_arm/modes.nbt b/src/main/resources/assets/create/ponder/mechanical_arm/modes.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_arm/modes.nbt rename to src/main/resources/assets/create/ponder/mechanical_arm/modes.nbt diff --git a/src/main/resources/ponder/mechanical_arm/redstone.nbt b/src/main/resources/assets/create/ponder/mechanical_arm/redstone.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_arm/redstone.nbt rename to src/main/resources/assets/create/ponder/mechanical_arm/redstone.nbt diff --git a/src/main/resources/ponder/mechanical_arm/setup.nbt b/src/main/resources/assets/create/ponder/mechanical_arm/setup.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_arm/setup.nbt rename to src/main/resources/assets/create/ponder/mechanical_arm/setup.nbt diff --git a/src/main/resources/ponder/mechanical_bearing/anchor.nbt b/src/main/resources/assets/create/ponder/mechanical_bearing/anchor.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_bearing/anchor.nbt rename to src/main/resources/assets/create/ponder/mechanical_bearing/anchor.nbt diff --git a/src/main/resources/ponder/mechanical_bearing/modes.nbt b/src/main/resources/assets/create/ponder/mechanical_bearing/modes.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_bearing/modes.nbt rename to src/main/resources/assets/create/ponder/mechanical_bearing/modes.nbt diff --git a/src/main/resources/ponder/mechanical_bearing/stabilized.nbt b/src/main/resources/assets/create/ponder/mechanical_bearing/stabilized.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_bearing/stabilized.nbt rename to src/main/resources/assets/create/ponder/mechanical_bearing/stabilized.nbt diff --git a/src/main/resources/ponder/mechanical_crafter/connect.nbt b/src/main/resources/assets/create/ponder/mechanical_crafter/connect.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_crafter/connect.nbt rename to src/main/resources/assets/create/ponder/mechanical_crafter/connect.nbt diff --git a/src/main/resources/ponder/mechanical_crafter/covers.nbt b/src/main/resources/assets/create/ponder/mechanical_crafter/covers.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_crafter/covers.nbt rename to src/main/resources/assets/create/ponder/mechanical_crafter/covers.nbt diff --git a/src/main/resources/ponder/mechanical_crafter/setup.nbt b/src/main/resources/assets/create/ponder/mechanical_crafter/setup.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_crafter/setup.nbt rename to src/main/resources/assets/create/ponder/mechanical_crafter/setup.nbt diff --git a/src/main/resources/ponder/mechanical_drill/breaker.nbt b/src/main/resources/assets/create/ponder/mechanical_drill/breaker.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_drill/breaker.nbt rename to src/main/resources/assets/create/ponder/mechanical_drill/breaker.nbt diff --git a/src/main/resources/ponder/mechanical_drill/contraption.nbt b/src/main/resources/assets/create/ponder/mechanical_drill/contraption.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_drill/contraption.nbt rename to src/main/resources/assets/create/ponder/mechanical_drill/contraption.nbt diff --git a/src/main/resources/ponder/mechanical_mixer/mixing.nbt b/src/main/resources/assets/create/ponder/mechanical_mixer/mixing.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_mixer/mixing.nbt rename to src/main/resources/assets/create/ponder/mechanical_mixer/mixing.nbt diff --git a/src/main/resources/ponder/mechanical_piston/anchor.nbt b/src/main/resources/assets/create/ponder/mechanical_piston/anchor.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_piston/anchor.nbt rename to src/main/resources/assets/create/ponder/mechanical_piston/anchor.nbt diff --git a/src/main/resources/ponder/mechanical_piston/modes.nbt b/src/main/resources/assets/create/ponder/mechanical_piston/modes.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_piston/modes.nbt rename to src/main/resources/assets/create/ponder/mechanical_piston/modes.nbt diff --git a/src/main/resources/ponder/mechanical_piston/piston_pole.nbt b/src/main/resources/assets/create/ponder/mechanical_piston/piston_pole.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_piston/piston_pole.nbt rename to src/main/resources/assets/create/ponder/mechanical_piston/piston_pole.nbt diff --git a/src/main/resources/ponder/mechanical_press/compacting.nbt b/src/main/resources/assets/create/ponder/mechanical_press/compacting.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_press/compacting.nbt rename to src/main/resources/assets/create/ponder/mechanical_press/compacting.nbt diff --git a/src/main/resources/ponder/mechanical_press/pressing.nbt b/src/main/resources/assets/create/ponder/mechanical_press/pressing.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_press/pressing.nbt rename to src/main/resources/assets/create/ponder/mechanical_press/pressing.nbt diff --git a/src/main/resources/ponder/mechanical_pump/flow.nbt b/src/main/resources/assets/create/ponder/mechanical_pump/flow.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_pump/flow.nbt rename to src/main/resources/assets/create/ponder/mechanical_pump/flow.nbt diff --git a/src/main/resources/ponder/mechanical_pump/speed.nbt b/src/main/resources/assets/create/ponder/mechanical_pump/speed.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_pump/speed.nbt rename to src/main/resources/assets/create/ponder/mechanical_pump/speed.nbt diff --git a/src/main/resources/ponder/mechanical_saw/breaker.nbt b/src/main/resources/assets/create/ponder/mechanical_saw/breaker.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_saw/breaker.nbt rename to src/main/resources/assets/create/ponder/mechanical_saw/breaker.nbt diff --git a/src/main/resources/ponder/mechanical_saw/contraption.nbt b/src/main/resources/assets/create/ponder/mechanical_saw/contraption.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_saw/contraption.nbt rename to src/main/resources/assets/create/ponder/mechanical_saw/contraption.nbt diff --git a/src/main/resources/ponder/mechanical_saw/processing.nbt b/src/main/resources/assets/create/ponder/mechanical_saw/processing.nbt similarity index 100% rename from src/main/resources/ponder/mechanical_saw/processing.nbt rename to src/main/resources/assets/create/ponder/mechanical_saw/processing.nbt diff --git a/src/main/resources/ponder/millstone.nbt b/src/main/resources/assets/create/ponder/millstone.nbt similarity index 100% rename from src/main/resources/ponder/millstone.nbt rename to src/main/resources/assets/create/ponder/millstone.nbt diff --git a/src/main/resources/ponder/nixie_tube.nbt b/src/main/resources/assets/create/ponder/nixie_tube.nbt similarity index 100% rename from src/main/resources/ponder/nixie_tube.nbt rename to src/main/resources/assets/create/ponder/nixie_tube.nbt diff --git a/src/main/resources/ponder/plough.nbt b/src/main/resources/assets/create/ponder/plough.nbt similarity index 100% rename from src/main/resources/ponder/plough.nbt rename to src/main/resources/assets/create/ponder/plough.nbt diff --git a/src/main/resources/ponder/portable_interface/redstone.nbt b/src/main/resources/assets/create/ponder/portable_interface/redstone.nbt similarity index 100% rename from src/main/resources/ponder/portable_interface/redstone.nbt rename to src/main/resources/assets/create/ponder/portable_interface/redstone.nbt diff --git a/src/main/resources/ponder/portable_interface/redstone_fluid.nbt b/src/main/resources/assets/create/ponder/portable_interface/redstone_fluid.nbt similarity index 100% rename from src/main/resources/ponder/portable_interface/redstone_fluid.nbt rename to src/main/resources/assets/create/ponder/portable_interface/redstone_fluid.nbt diff --git a/src/main/resources/ponder/portable_interface/transfer.nbt b/src/main/resources/assets/create/ponder/portable_interface/transfer.nbt similarity index 100% rename from src/main/resources/ponder/portable_interface/transfer.nbt rename to src/main/resources/assets/create/ponder/portable_interface/transfer.nbt diff --git a/src/main/resources/ponder/portable_interface/transfer_fluid.nbt b/src/main/resources/assets/create/ponder/portable_interface/transfer_fluid.nbt similarity index 100% rename from src/main/resources/ponder/portable_interface/transfer_fluid.nbt rename to src/main/resources/assets/create/ponder/portable_interface/transfer_fluid.nbt diff --git a/src/main/resources/ponder/powered_latch.nbt b/src/main/resources/assets/create/ponder/powered_latch.nbt similarity index 100% rename from src/main/resources/ponder/powered_latch.nbt rename to src/main/resources/assets/create/ponder/powered_latch.nbt diff --git a/src/main/resources/ponder/powered_toggle_latch.nbt b/src/main/resources/assets/create/ponder/powered_toggle_latch.nbt similarity index 100% rename from src/main/resources/ponder/powered_toggle_latch.nbt rename to src/main/resources/assets/create/ponder/powered_toggle_latch.nbt diff --git a/src/main/resources/ponder/pulse_repeater.nbt b/src/main/resources/assets/create/ponder/pulse_repeater.nbt similarity index 100% rename from src/main/resources/ponder/pulse_repeater.nbt rename to src/main/resources/assets/create/ponder/pulse_repeater.nbt diff --git a/src/main/resources/ponder/redstone_contact.nbt b/src/main/resources/assets/create/ponder/redstone_contact.nbt similarity index 100% rename from src/main/resources/ponder/redstone_contact.nbt rename to src/main/resources/assets/create/ponder/redstone_contact.nbt diff --git a/src/main/resources/ponder/redstone_link.nbt b/src/main/resources/assets/create/ponder/redstone_link.nbt similarity index 100% rename from src/main/resources/ponder/redstone_link.nbt rename to src/main/resources/assets/create/ponder/redstone_link.nbt diff --git a/src/main/resources/ponder/rope_pulley/anchor.nbt b/src/main/resources/assets/create/ponder/rope_pulley/anchor.nbt similarity index 100% rename from src/main/resources/ponder/rope_pulley/anchor.nbt rename to src/main/resources/assets/create/ponder/rope_pulley/anchor.nbt diff --git a/src/main/resources/ponder/rope_pulley/attachment.nbt b/src/main/resources/assets/create/ponder/rope_pulley/attachment.nbt similarity index 100% rename from src/main/resources/ponder/rope_pulley/attachment.nbt rename to src/main/resources/assets/create/ponder/rope_pulley/attachment.nbt diff --git a/src/main/resources/ponder/rope_pulley/modes.nbt b/src/main/resources/assets/create/ponder/rope_pulley/modes.nbt similarity index 100% rename from src/main/resources/ponder/rope_pulley/modes.nbt rename to src/main/resources/assets/create/ponder/rope_pulley/modes.nbt diff --git a/src/main/resources/ponder/sail.nbt b/src/main/resources/assets/create/ponder/sail.nbt similarity index 100% rename from src/main/resources/ponder/sail.nbt rename to src/main/resources/assets/create/ponder/sail.nbt diff --git a/src/main/resources/ponder/sequenced_gearshift.nbt b/src/main/resources/assets/create/ponder/sequenced_gearshift.nbt similarity index 100% rename from src/main/resources/ponder/sequenced_gearshift.nbt rename to src/main/resources/assets/create/ponder/sequenced_gearshift.nbt diff --git a/src/main/resources/ponder/shaft/encasing.nbt b/src/main/resources/assets/create/ponder/shaft/encasing.nbt similarity index 100% rename from src/main/resources/ponder/shaft/encasing.nbt rename to src/main/resources/assets/create/ponder/shaft/encasing.nbt diff --git a/src/main/resources/ponder/shaft/relay.nbt b/src/main/resources/assets/create/ponder/shaft/relay.nbt similarity index 100% rename from src/main/resources/ponder/shaft/relay.nbt rename to src/main/resources/assets/create/ponder/shaft/relay.nbt diff --git a/src/main/resources/ponder/smart_pipe.nbt b/src/main/resources/assets/create/ponder/smart_pipe.nbt similarity index 100% rename from src/main/resources/ponder/smart_pipe.nbt rename to src/main/resources/assets/create/ponder/smart_pipe.nbt diff --git a/src/main/resources/ponder/speed_controller.nbt b/src/main/resources/assets/create/ponder/speed_controller.nbt similarity index 100% rename from src/main/resources/ponder/speed_controller.nbt rename to src/main/resources/assets/create/ponder/speed_controller.nbt diff --git a/src/main/resources/ponder/spout.nbt b/src/main/resources/assets/create/ponder/spout.nbt similarity index 100% rename from src/main/resources/ponder/spout.nbt rename to src/main/resources/assets/create/ponder/spout.nbt diff --git a/src/main/resources/ponder/sticker.nbt b/src/main/resources/assets/create/ponder/sticker.nbt similarity index 100% rename from src/main/resources/ponder/sticker.nbt rename to src/main/resources/assets/create/ponder/sticker.nbt diff --git a/src/main/resources/ponder/super_glue.nbt b/src/main/resources/assets/create/ponder/super_glue.nbt similarity index 100% rename from src/main/resources/ponder/super_glue.nbt rename to src/main/resources/assets/create/ponder/super_glue.nbt diff --git a/src/main/resources/ponder/tunnels/andesite.nbt b/src/main/resources/assets/create/ponder/tunnels/andesite.nbt similarity index 100% rename from src/main/resources/ponder/tunnels/andesite.nbt rename to src/main/resources/assets/create/ponder/tunnels/andesite.nbt diff --git a/src/main/resources/ponder/tunnels/brass.nbt b/src/main/resources/assets/create/ponder/tunnels/brass.nbt similarity index 100% rename from src/main/resources/ponder/tunnels/brass.nbt rename to src/main/resources/assets/create/ponder/tunnels/brass.nbt diff --git a/src/main/resources/ponder/tunnels/brass_modes.nbt b/src/main/resources/assets/create/ponder/tunnels/brass_modes.nbt similarity index 100% rename from src/main/resources/ponder/tunnels/brass_modes.nbt rename to src/main/resources/assets/create/ponder/tunnels/brass_modes.nbt diff --git a/src/main/resources/ponder/valve_handle.nbt b/src/main/resources/assets/create/ponder/valve_handle.nbt similarity index 100% rename from src/main/resources/ponder/valve_handle.nbt rename to src/main/resources/assets/create/ponder/valve_handle.nbt diff --git a/src/main/resources/ponder/water_wheel.nbt b/src/main/resources/assets/create/ponder/water_wheel.nbt similarity index 100% rename from src/main/resources/ponder/water_wheel.nbt rename to src/main/resources/assets/create/ponder/water_wheel.nbt diff --git a/src/main/resources/ponder/weighted_ejector/eject.nbt b/src/main/resources/assets/create/ponder/weighted_ejector/eject.nbt similarity index 100% rename from src/main/resources/ponder/weighted_ejector/eject.nbt rename to src/main/resources/assets/create/ponder/weighted_ejector/eject.nbt diff --git a/src/main/resources/ponder/weighted_ejector/redstone.nbt b/src/main/resources/assets/create/ponder/weighted_ejector/redstone.nbt similarity index 100% rename from src/main/resources/ponder/weighted_ejector/redstone.nbt rename to src/main/resources/assets/create/ponder/weighted_ejector/redstone.nbt diff --git a/src/main/resources/ponder/weighted_ejector/split.nbt b/src/main/resources/assets/create/ponder/weighted_ejector/split.nbt similarity index 100% rename from src/main/resources/ponder/weighted_ejector/split.nbt rename to src/main/resources/assets/create/ponder/weighted_ejector/split.nbt diff --git a/src/main/resources/ponder/windmill_bearing/source.nbt b/src/main/resources/assets/create/ponder/windmill_bearing/source.nbt similarity index 100% rename from src/main/resources/ponder/windmill_bearing/source.nbt rename to src/main/resources/assets/create/ponder/windmill_bearing/source.nbt diff --git a/src/main/resources/ponder/windmill_bearing/structure.nbt b/src/main/resources/assets/create/ponder/windmill_bearing/structure.nbt similarity index 100% rename from src/main/resources/ponder/windmill_bearing/structure.nbt rename to src/main/resources/assets/create/ponder/windmill_bearing/structure.nbt diff --git a/src/main/resources/assets/create/sounds/cursed_bell_convert.ogg b/src/main/resources/assets/create/sounds/haunted_bell_convert.ogg similarity index 100% rename from src/main/resources/assets/create/sounds/cursed_bell_convert.ogg rename to src/main/resources/assets/create/sounds/haunted_bell_convert.ogg diff --git a/src/main/resources/assets/create/sounds/cursed_bell_use.ogg b/src/main/resources/assets/create/sounds/haunted_bell_use.ogg similarity index 100% rename from src/main/resources/assets/create/sounds/cursed_bell_use.ogg rename to src/main/resources/assets/create/sounds/haunted_bell_use.ogg diff --git a/src/main/resources/assets/create/textures/block/bell.png b/src/main/resources/assets/create/textures/block/bell.png index cd05091a9..fedafba91 100644 Binary files a/src/main/resources/assets/create/textures/block/bell.png and b/src/main/resources/assets/create/textures/block/bell.png differ diff --git a/src/main/resources/assets/create/textures/block/bell_anim.png b/src/main/resources/assets/create/textures/block/bell_anim.png index 7ed660e49..8feae441b 100644 Binary files a/src/main/resources/assets/create/textures/block/bell_anim.png and b/src/main/resources/assets/create/textures/block/bell_anim.png differ diff --git a/src/main/resources/assets/create/textures/block/bell_frame.png b/src/main/resources/assets/create/textures/block/bell_frame.png index 4855d47a1..c624f8e08 100644 Binary files a/src/main/resources/assets/create/textures/block/bell_frame.png and b/src/main/resources/assets/create/textures/block/bell_frame.png differ diff --git a/src/main/resources/assets/create/textures/block/bell_frame_side.png b/src/main/resources/assets/create/textures/block/bell_frame_side.png index 5751ea545..5dd3a79b4 100644 Binary files a/src/main/resources/assets/create/textures/block/bell_frame_side.png and b/src/main/resources/assets/create/textures/block/bell_frame_side.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_0.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_0.png index 2a955e5f8..4fd7a2316 100644 Binary files a/src/main/resources/assets/create/textures/gui/title/background/panorama_0.png and b/src/main/resources/assets/create/textures/gui/title/background/panorama_0.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_1.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_1.png index dc8632fa2..4ebeb81fe 100644 Binary files a/src/main/resources/assets/create/textures/gui/title/background/panorama_1.png and b/src/main/resources/assets/create/textures/gui/title/background/panorama_1.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_2.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_2.png index b8ea73f25..8a2b80290 100644 Binary files a/src/main/resources/assets/create/textures/gui/title/background/panorama_2.png and b/src/main/resources/assets/create/textures/gui/title/background/panorama_2.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_3.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_3.png index 64542f2a3..1efdd5c7e 100644 Binary files a/src/main/resources/assets/create/textures/gui/title/background/panorama_3.png and b/src/main/resources/assets/create/textures/gui/title/background/panorama_3.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_4.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_4.png index c094a82e9..6fdd8f281 100644 Binary files a/src/main/resources/assets/create/textures/gui/title/background/panorama_4.png and b/src/main/resources/assets/create/textures/gui/title/background/panorama_4.png differ diff --git a/src/main/resources/assets/create/textures/gui/title/background/panorama_5.png b/src/main/resources/assets/create/textures/gui/title/background/panorama_5.png index bbac982a8..608c0f8e8 100644 Binary files a/src/main/resources/assets/create/textures/gui/title/background/panorama_5.png and b/src/main/resources/assets/create/textures/gui/title/background/panorama_5.png differ diff --git a/src/main/resources/assets/create/textures/item/clockwork_component.png b/src/main/resources/assets/create/textures/item/clockwork_component.png deleted file mode 100644 index 02cc85ba2..000000000 Binary files a/src/main/resources/assets/create/textures/item/clockwork_component.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/item/creative_blaze_cake.png b/src/main/resources/assets/create/textures/item/creative_blaze_cake.png new file mode 100644 index 000000000..900ef50db Binary files /dev/null and b/src/main/resources/assets/create/textures/item/creative_blaze_cake.png differ diff --git a/src/main/resources/assets/create/textures/item/incomplete_clockwork_component.png b/src/main/resources/assets/create/textures/item/incomplete_clockwork_component.png deleted file mode 100644 index d15357214..000000000 Binary files a/src/main/resources/assets/create/textures/item/incomplete_clockwork_component.png and /dev/null differ diff --git a/src/main/resources/assets/create/textures/item/incomplete_precision_mechanism.png b/src/main/resources/assets/create/textures/item/incomplete_precision_mechanism.png new file mode 100644 index 000000000..96db614cb Binary files /dev/null and b/src/main/resources/assets/create/textures/item/incomplete_precision_mechanism.png differ diff --git a/src/main/resources/assets/create/textures/item/potato_cannon.png b/src/main/resources/assets/create/textures/item/potato_cannon.png new file mode 100644 index 000000000..ad75120cd Binary files /dev/null and b/src/main/resources/assets/create/textures/item/potato_cannon.png differ diff --git a/src/main/resources/assets/create/textures/item/precision_mechanism.png b/src/main/resources/assets/create/textures/item/precision_mechanism.png new file mode 100644 index 000000000..a4023a69f Binary files /dev/null and b/src/main/resources/assets/create/textures/item/precision_mechanism.png differ