Merge branch 'mc1.18/dev' into fr-translate

This commit is contained in:
Augustin Mauroy 2022-10-10 10:35:15 +02:00 committed by GitHub
commit a4b3688a9d
Failed to generate hash of commit
183 changed files with 4984 additions and 1814 deletions

View file

@ -49,6 +49,8 @@ body:
label: Mod Version label: Mod Version
description: The version of the mod you were using when the bug occured description: The version of the mod you were using when the bug occured
options: options:
- "0.5.0f"
- "0.5.0e"
- "0.5.0d" - "0.5.0d"
- "0.5.0c" - "0.5.0c"
- "0.5.0b" - "0.5.0b"
@ -107,6 +109,7 @@ body:
label: Minecraft Version label: Minecraft Version
description: The version of Minecraft you were using when the bug occured description: The version of Minecraft you were using when the bug occured
options: options:
- "1.19.2"
- "1.18.2" - "1.18.2"
- "1.18.1" - "1.18.1"
- "1.18" - "1.18"

View file

@ -8,3 +8,5 @@
- "1.17" - "1.17"
1.18: 1.18:
- "1.18" - "1.18"
1.19:
- "1.19"

View file

@ -4,7 +4,7 @@ org.gradle.jvmargs = -Xmx3G
org.gradle.daemon = false org.gradle.daemon = false
# mod version info # mod version info
mod_version = 0.5.0.d mod_version = 0.5.0.e
artifact_minecraft_version = 1.18.2 artifact_minecraft_version = 1.18.2
minecraft_version = 1.18.2 minecraft_version = 1.18.2

View file

@ -21,13 +21,13 @@ cf9045eb16e5299a1d917c4cb536289f49411276 assets/create/blockstates/birch_window.
e0f1e44c9bce4a7478592cf3a8ee7b91d9083d65 assets/create/blockstates/black_sail.json e0f1e44c9bce4a7478592cf3a8ee7b91d9083d65 assets/create/blockstates/black_sail.json
58b07d2af6030342f0354f6d3fd0ee128d2d74b4 assets/create/blockstates/black_seat.json 58b07d2af6030342f0354f6d3fd0ee128d2d74b4 assets/create/blockstates/black_seat.json
73db8bd55bd5bd21f939ee9eb4b4b02209d9c5ed assets/create/blockstates/black_toolbox.json 73db8bd55bd5bd21f939ee9eb4b4b02209d9c5ed assets/create/blockstates/black_toolbox.json
a71ddf3291bd13d7877f2fe32c42f50407f99afb assets/create/blockstates/black_valve_handle.json afa06da52441feec43d45a063d72867eeb786df3 assets/create/blockstates/black_valve_handle.json
923aeb2a556f67bc0526f237dd97af2d37b4c9f1 assets/create/blockstates/blaze_burner.json 923aeb2a556f67bc0526f237dd97af2d37b4c9f1 assets/create/blockstates/blaze_burner.json
ea1a792572af1ee4c9831cd55825514d6568952d assets/create/blockstates/blue_nixie_tube.json ea1a792572af1ee4c9831cd55825514d6568952d assets/create/blockstates/blue_nixie_tube.json
ec2ab87734acc209e6be3bc4898b1199f819bfd3 assets/create/blockstates/blue_sail.json ec2ab87734acc209e6be3bc4898b1199f819bfd3 assets/create/blockstates/blue_sail.json
4854d1ef52130a7887aecc60bcaffbd66f0871a8 assets/create/blockstates/blue_seat.json 4854d1ef52130a7887aecc60bcaffbd66f0871a8 assets/create/blockstates/blue_seat.json
dea175335c5db0abe758cd208dc984c22506a176 assets/create/blockstates/blue_toolbox.json dea175335c5db0abe758cd208dc984c22506a176 assets/create/blockstates/blue_toolbox.json
9d7341a5cae5d47788c595167946dfb6441cebd1 assets/create/blockstates/blue_valve_handle.json f3697a7d105e5d271f5999b86df071fe5893457c assets/create/blockstates/blue_valve_handle.json
5f57741e500903b70c80d2a72788a25e97387e2e assets/create/blockstates/brass_belt_funnel.json 5f57741e500903b70c80d2a72788a25e97387e2e assets/create/blockstates/brass_belt_funnel.json
8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets/create/blockstates/brass_block.json 8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets/create/blockstates/brass_block.json
b8dd6e505943e06706d0718ece620ab3cf943650 assets/create/blockstates/brass_casing.json b8dd6e505943e06706d0718ece620ab3cf943650 assets/create/blockstates/brass_casing.json
@ -41,7 +41,7 @@ ffe31d5ad0486949b049cf2060d1f34ef7ceaa82 assets/create/blockstates/brown_nixie_t
11ebdd9bd0815833e62ec1bea03a4cdd86ce00f3 assets/create/blockstates/brown_sail.json 11ebdd9bd0815833e62ec1bea03a4cdd86ce00f3 assets/create/blockstates/brown_sail.json
e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets/create/blockstates/brown_seat.json e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets/create/blockstates/brown_seat.json
bd73bfdbe88c58883cc15fe31a9dac7860482ca3 assets/create/blockstates/brown_toolbox.json bd73bfdbe88c58883cc15fe31a9dac7860482ca3 assets/create/blockstates/brown_toolbox.json
322289524c058fac66bbe76b4924c3b0c0c33b84 assets/create/blockstates/brown_valve_handle.json 1729306caa9cd057ffd0bb83eb74dc3c8d6d9245 assets/create/blockstates/brown_valve_handle.json
ff1073a5451691c492102243084d92de42abfc26 assets/create/blockstates/calcite_pillar.json ff1073a5451691c492102243084d92de42abfc26 assets/create/blockstates/calcite_pillar.json
d01a750e6e8214ca8481e40aa69cedeb5c7210f8 assets/create/blockstates/cart_assembler.json d01a750e6e8214ca8481e40aa69cedeb5c7210f8 assets/create/blockstates/cart_assembler.json
470e8c6a9c37b91fa745bc4f6e9d3740bd72467e assets/create/blockstates/chocolate.json 470e8c6a9c37b91fa745bc4f6e9d3740bd72467e assets/create/blockstates/chocolate.json
@ -61,7 +61,7 @@ a002289d0bb7df6927e8e6a99e9eb9ec77bd179d assets/create/blockstates/copper_shingl
a87097f3a092264d9b74966ee9e3bcfc0b743f80 assets/create/blockstates/copper_tile_slab.json a87097f3a092264d9b74966ee9e3bcfc0b743f80 assets/create/blockstates/copper_tile_slab.json
1cc9cdcd48ea76fe3407dce0973220ff9f63f51a assets/create/blockstates/copper_tile_stairs.json 1cc9cdcd48ea76fe3407dce0973220ff9f63f51a assets/create/blockstates/copper_tile_stairs.json
cbae7653d6a6f2d98370e9a4a3bd91fdb529f89d assets/create/blockstates/copper_tiles.json cbae7653d6a6f2d98370e9a4a3bd91fdb529f89d assets/create/blockstates/copper_tiles.json
890be245b914c1a9f29f48a8c5d325640b5be160 assets/create/blockstates/copper_valve_handle.json 543af282e2cb44f00509d850814b4501f3491d48 assets/create/blockstates/copper_valve_handle.json
b759be6f47fb960a7757b70d194921a38261c90a assets/create/blockstates/creative_crate.json b759be6f47fb960a7757b70d194921a38261c90a assets/create/blockstates/creative_crate.json
da3f1203dd0b0096ce19e09705060a0ed0478bee assets/create/blockstates/creative_fluid_tank.json da3f1203dd0b0096ce19e09705060a0ed0478bee assets/create/blockstates/creative_fluid_tank.json
f0031f5e970b3d5695472ed384950b8631b015ed assets/create/blockstates/creative_motor.json f0031f5e970b3d5695472ed384950b8631b015ed assets/create/blockstates/creative_motor.json
@ -188,7 +188,7 @@ d6a8c385c9ebc5bae603c908b6f8eccd6f5ad94b assets/create/blockstates/cut_veridium_
b496452f2f7dbbba385e1fc10b560ec266e4b5e7 assets/create/blockstates/cyan_sail.json b496452f2f7dbbba385e1fc10b560ec266e4b5e7 assets/create/blockstates/cyan_sail.json
4de72f65bff4e5d9c8153fa3adeee6b61d6f912b assets/create/blockstates/cyan_seat.json 4de72f65bff4e5d9c8153fa3adeee6b61d6f912b assets/create/blockstates/cyan_seat.json
8e14112e948e492da8151b773c1fa40bf1467490 assets/create/blockstates/cyan_toolbox.json 8e14112e948e492da8151b773c1fa40bf1467490 assets/create/blockstates/cyan_toolbox.json
2c04d57e56849f243aec8a1e769574d24daac1e9 assets/create/blockstates/cyan_valve_handle.json c5d5ca8a43c08ae27dba1c5a7631b67eabb8ed4c assets/create/blockstates/cyan_valve_handle.json
1726b1b9e04a0634e7e1fdcf1cf4cc898efc5c2f assets/create/blockstates/dark_oak_window.json 1726b1b9e04a0634e7e1fdcf1cf4cc898efc5c2f assets/create/blockstates/dark_oak_window.json
50d4627d8e8b5adade12de764ab528ddacfa9ea5 assets/create/blockstates/dark_oak_window_pane.json 50d4627d8e8b5adade12de764ab528ddacfa9ea5 assets/create/blockstates/dark_oak_window_pane.json
de0116bf32a26d697a3b999044d6fb0b1b98320e assets/create/blockstates/deepslate_pillar.json de0116bf32a26d697a3b999044d6fb0b1b98320e assets/create/blockstates/deepslate_pillar.json
@ -211,7 +211,7 @@ fb41aa1a0828c9256b3f886fdcb55bb54252ba09 assets/create/blockstates/exposed_coppe
7a2259a71fbbbb9491fc1e6a9c935bc9fef14042 assets/create/blockstates/fake_track.json 7a2259a71fbbbb9491fc1e6a9c935bc9fef14042 assets/create/blockstates/fake_track.json
dd6dadfeb65c4a4c4d1dc92516c411355e90dcca assets/create/blockstates/fluid_pipe.json dd6dadfeb65c4a4c4d1dc92516c411355e90dcca assets/create/blockstates/fluid_pipe.json
f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json
5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json d3de8e5a13c417effe1516fba9d9074fa4a6da23 assets/create/blockstates/fluid_valve.json
95b0775bf4d619ca5b0a42dbdc47c6f2c15d7b3d assets/create/blockstates/flywheel.json 95b0775bf4d619ca5b0a42dbdc47c6f2c15d7b3d assets/create/blockstates/flywheel.json
ac00d40e1ef50a37041c0481afa1a23a14dea78e assets/create/blockstates/framed_glass.json ac00d40e1ef50a37041c0481afa1a23a14dea78e assets/create/blockstates/framed_glass.json
b5a2e05ed9557992c6093b76e9d80073eb986d5a assets/create/blockstates/framed_glass_door.json b5a2e05ed9557992c6093b76e9d80073eb986d5a assets/create/blockstates/framed_glass_door.json
@ -227,13 +227,13 @@ e506b85ed71dc4567295be3989f3302e57777ad9 assets/create/blockstates/gray_nixie_tu
5c40c4a27e1dec747a467dd251700c72a6ceb07d assets/create/blockstates/gray_sail.json 5c40c4a27e1dec747a467dd251700c72a6ceb07d assets/create/blockstates/gray_sail.json
a5ec5401ba9f3e102a2e1b35837f643847afbca4 assets/create/blockstates/gray_seat.json a5ec5401ba9f3e102a2e1b35837f643847afbca4 assets/create/blockstates/gray_seat.json
191d2cc56af51349688ccb2dea75801a9bc9de85 assets/create/blockstates/gray_toolbox.json 191d2cc56af51349688ccb2dea75801a9bc9de85 assets/create/blockstates/gray_toolbox.json
5f17a5868616b33eb157965a661046cab7a1427f assets/create/blockstates/gray_valve_handle.json 1ca9210f8867fd9f8525a1952d11143120a5f016 assets/create/blockstates/gray_valve_handle.json
497dd226b6520a6d754413508c74b98e50563e2f assets/create/blockstates/green_nixie_tube.json 497dd226b6520a6d754413508c74b98e50563e2f assets/create/blockstates/green_nixie_tube.json
52b849faef96b8ab9d9d64a1518c8f299af057b8 assets/create/blockstates/green_sail.json 52b849faef96b8ab9d9d64a1518c8f299af057b8 assets/create/blockstates/green_sail.json
13059309684db0cc7a0f1f4fce2407cf06cce80a assets/create/blockstates/green_seat.json 13059309684db0cc7a0f1f4fce2407cf06cce80a assets/create/blockstates/green_seat.json
e91dcebe132d5b745df0f6c5b1c90d5fc4e8af52 assets/create/blockstates/green_toolbox.json e91dcebe132d5b745df0f6c5b1c90d5fc4e8af52 assets/create/blockstates/green_toolbox.json
f4a0fc68e8daaa0a47cdc951ced4310057a874b0 assets/create/blockstates/green_valve_handle.json f1da8d16c9b0122bda60583a03d2b31ec1c70799 assets/create/blockstates/green_valve_handle.json
6ab675fa06317e6d07c0c1a453e7bb43e3f46b3b assets/create/blockstates/hand_crank.json 823fb70623cb02d2e2c2e4d324ec44e54be93ecd assets/create/blockstates/hand_crank.json
34076c9caafe48daa87cc783e96d4c81b0b164c0 assets/create/blockstates/haunted_bell.json 34076c9caafe48daa87cc783e96d4c81b0b164c0 assets/create/blockstates/haunted_bell.json
4572b90f5d6c586e145f2c7a55664c3cb734bd2b assets/create/blockstates/honey.json 4572b90f5d6c586e145f2c7a55664c3cb734bd2b assets/create/blockstates/honey.json
be3bef7e091d8b50bfc1c6b7275946d1f636aefd assets/create/blockstates/horizontal_framed_glass.json be3bef7e091d8b50bfc1c6b7275946d1f636aefd assets/create/blockstates/horizontal_framed_glass.json
@ -264,17 +264,17 @@ b743ef11048fc284ba5622e1fbae3082f0616382 assets/create/blockstates/layered_tuff.
029904f21970947a4423a6e0c8c65c4e02f2e8e6 assets/create/blockstates/light_blue_sail.json 029904f21970947a4423a6e0c8c65c4e02f2e8e6 assets/create/blockstates/light_blue_sail.json
2a0a8b1715700bf1e284ee57ef9f7f163c12f3ee assets/create/blockstates/light_blue_seat.json 2a0a8b1715700bf1e284ee57ef9f7f163c12f3ee assets/create/blockstates/light_blue_seat.json
527f32e0d2b5b975cfeb515542098bb2d5224755 assets/create/blockstates/light_blue_toolbox.json 527f32e0d2b5b975cfeb515542098bb2d5224755 assets/create/blockstates/light_blue_toolbox.json
9bee040558a6b24e21f837fc808e17fae1883e71 assets/create/blockstates/light_blue_valve_handle.json c2efef202f202d8fd1b3126a79fe6b553c9618bb assets/create/blockstates/light_blue_valve_handle.json
bda5c5e9e42b31fdbb819484c74d457ba11fc9a0 assets/create/blockstates/light_gray_nixie_tube.json bda5c5e9e42b31fdbb819484c74d457ba11fc9a0 assets/create/blockstates/light_gray_nixie_tube.json
93537c4e2ab86218a777e7b000c3fcd55a80b1cd assets/create/blockstates/light_gray_sail.json 93537c4e2ab86218a777e7b000c3fcd55a80b1cd assets/create/blockstates/light_gray_sail.json
d9a2551e001bb315d071bb9f1f013323a66a5d09 assets/create/blockstates/light_gray_seat.json d9a2551e001bb315d071bb9f1f013323a66a5d09 assets/create/blockstates/light_gray_seat.json
0c40d13637f00a533175d29ba67559461101ead5 assets/create/blockstates/light_gray_toolbox.json 0c40d13637f00a533175d29ba67559461101ead5 assets/create/blockstates/light_gray_toolbox.json
8bea8c86de8c218c8932eef140f0ed439e173156 assets/create/blockstates/light_gray_valve_handle.json 68d2c9235577293def513a26d23fb2d93433380f assets/create/blockstates/light_gray_valve_handle.json
d023ef67d23da0b3e7b221b1b4ddf7f1f0c09ea7 assets/create/blockstates/lime_nixie_tube.json d023ef67d23da0b3e7b221b1b4ddf7f1f0c09ea7 assets/create/blockstates/lime_nixie_tube.json
ba2c4e3ddafa3c89a72cc243b14e8518fab369aa assets/create/blockstates/lime_sail.json ba2c4e3ddafa3c89a72cc243b14e8518fab369aa assets/create/blockstates/lime_sail.json
1de3a88c003df03f5006e1bbaa0236589aba08ad assets/create/blockstates/lime_seat.json 1de3a88c003df03f5006e1bbaa0236589aba08ad assets/create/blockstates/lime_seat.json
db46a5b6d0b595293a672236d0a64548b0816cab assets/create/blockstates/lime_toolbox.json db46a5b6d0b595293a672236d0a64548b0816cab assets/create/blockstates/lime_toolbox.json
179a3e68b9f2e289eafe0e98e768befbbf91c5c2 assets/create/blockstates/lime_valve_handle.json 2628c657f381ed32e9ca268ccaacc1ca62b612df assets/create/blockstates/lime_valve_handle.json
e7cb0b25e511610b46dfd219e0cc5ea60a79d56b assets/create/blockstates/limestone.json e7cb0b25e511610b46dfd219e0cc5ea60a79d56b assets/create/blockstates/limestone.json
bff90a8d674a839b13fd9cd1f78bf3d0ad9fad4f assets/create/blockstates/limestone_pillar.json bff90a8d674a839b13fd9cd1f78bf3d0ad9fad4f assets/create/blockstates/limestone_pillar.json
69790737767e06f000c7824749c46664a123160e assets/create/blockstates/linear_chassis.json 69790737767e06f000c7824749c46664a123160e assets/create/blockstates/linear_chassis.json
@ -283,7 +283,7 @@ bff90a8d674a839b13fd9cd1f78bf3d0ad9fad4f assets/create/blockstates/limestone_pil
85a58ac539775f90903d9ce66374f3f2ffd4fecf assets/create/blockstates/magenta_sail.json 85a58ac539775f90903d9ce66374f3f2ffd4fecf assets/create/blockstates/magenta_sail.json
84c494d24cc58af274fdd054896c680e8095d2d0 assets/create/blockstates/magenta_seat.json 84c494d24cc58af274fdd054896c680e8095d2d0 assets/create/blockstates/magenta_seat.json
2334006c152d6773040ca03ef3b3d26a58f0dfa0 assets/create/blockstates/magenta_toolbox.json 2334006c152d6773040ca03ef3b3d26a58f0dfa0 assets/create/blockstates/magenta_toolbox.json
3bfce5016e5c929b74368dc2d734e62ae34587a4 assets/create/blockstates/magenta_valve_handle.json 8006292c8eddd76a1b71046d251a2143af6867a7 assets/create/blockstates/magenta_valve_handle.json
3b3250d6e209403a93d025604a8081087965016e assets/create/blockstates/mechanical_arm.json 3b3250d6e209403a93d025604a8081087965016e assets/create/blockstates/mechanical_arm.json
ddcf4bb281e046fbb1026b8f46a2cf12448598df assets/create/blockstates/mechanical_bearing.json ddcf4bb281e046fbb1026b8f46a2cf12448598df assets/create/blockstates/mechanical_bearing.json
5586beef2d9183dc34d8e8d2723620c0569592ae assets/create/blockstates/mechanical_crafter.json 5586beef2d9183dc34d8e8d2723620c0569592ae assets/create/blockstates/mechanical_crafter.json
@ -311,7 +311,7 @@ cf60989f63f02067fc4e4ad25033ac83167cdeb0 assets/create/blockstates/oak_window.js
b0be3d4ff92cb123ec21ec2788db35d0f392ba8a assets/create/blockstates/orange_sail.json b0be3d4ff92cb123ec21ec2788db35d0f392ba8a assets/create/blockstates/orange_sail.json
5764a24f6c4fa552b61d2a02135adfc7d93c2e10 assets/create/blockstates/orange_seat.json 5764a24f6c4fa552b61d2a02135adfc7d93c2e10 assets/create/blockstates/orange_seat.json
7541e5efb98cddf8cdf62138b674458cda877a4c assets/create/blockstates/orange_toolbox.json 7541e5efb98cddf8cdf62138b674458cda877a4c assets/create/blockstates/orange_toolbox.json
1445074ec21a3735ea912b624c0f9f18a450d2d3 assets/create/blockstates/orange_valve_handle.json 1899f3e4f1dc630aadfe6e6bc80fcfb700dc734b assets/create/blockstates/orange_valve_handle.json
8e2028e1a0450a592eed5e10276ba19b1195a206 assets/create/blockstates/ornate_iron_window.json 8e2028e1a0450a592eed5e10276ba19b1195a206 assets/create/blockstates/ornate_iron_window.json
f59198fd966927e21e9bf76e64de533d05ea893b assets/create/blockstates/ornate_iron_window_pane.json f59198fd966927e21e9bf76e64de533d05ea893b assets/create/blockstates/ornate_iron_window_pane.json
af8601235f08eb2b8104e1fabe352531c24d4992 assets/create/blockstates/oxidized_copper_shingle_slab.json af8601235f08eb2b8104e1fabe352531c24d4992 assets/create/blockstates/oxidized_copper_shingle_slab.json
@ -325,7 +325,7 @@ ed1a1d7a8b47027a1fcac2014e80f4e061d0f983 assets/create/blockstates/oxidized_copp
30971f2f76fe56f144178c33ad6bde5fc9fb61c3 assets/create/blockstates/pink_sail.json 30971f2f76fe56f144178c33ad6bde5fc9fb61c3 assets/create/blockstates/pink_sail.json
919a79e4a4a5fab0aac3ef48e1c786017d6aa001 assets/create/blockstates/pink_seat.json 919a79e4a4a5fab0aac3ef48e1c786017d6aa001 assets/create/blockstates/pink_seat.json
588ebcdb4c1d8d4c75225e92f26d6cf80cac2f15 assets/create/blockstates/pink_toolbox.json 588ebcdb4c1d8d4c75225e92f26d6cf80cac2f15 assets/create/blockstates/pink_toolbox.json
471a3bb474a0ae0453143888d561256cce894e3f assets/create/blockstates/pink_valve_handle.json 77e7fb0126b676046b1a0c9e37e587c18e1c1b92 assets/create/blockstates/pink_valve_handle.json
975c97018e9e2419943eaab43aed0970e96feaf7 assets/create/blockstates/piston_extension_pole.json 975c97018e9e2419943eaab43aed0970e96feaf7 assets/create/blockstates/piston_extension_pole.json
7f008a4a1d6a01c49c3f29d5821295e39ce4a3f5 assets/create/blockstates/placard.json 7f008a4a1d6a01c49c3f29d5821295e39ce4a3f5 assets/create/blockstates/placard.json
dae40222478caff3a5337c4f44cceaf5a30d4595 assets/create/blockstates/polished_cut_andesite.json dae40222478caff3a5337c4f44cceaf5a30d4595 assets/create/blockstates/polished_cut_andesite.json
@ -396,7 +396,7 @@ ea8200550190eb65d8631c7842e06d99274b3c79 assets/create/blockstates/purple_nixie_
d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
b78c6057ef94b03f541a17e625b3778ca526a6ad assets/create/blockstates/purple_toolbox.json b78c6057ef94b03f541a17e625b3778ca526a6ad assets/create/blockstates/purple_toolbox.json
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json 0c4acb7e268a9a2a030a3ea8c29a6b03967ce4c6 assets/create/blockstates/purple_valve_handle.json
4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json 4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json
e61e77d19c1abe9d76895909ee520e1bf0f7b512 assets/create/blockstates/railway_casing.json e61e77d19c1abe9d76895909ee520e1bf0f7b512 assets/create/blockstates/railway_casing.json
c9ccf6fe4c80357ba2e4d053f5a1b35df4f377a8 assets/create/blockstates/raw_zinc_block.json c9ccf6fe4c80357ba2e4d053f5a1b35df4f377a8 assets/create/blockstates/raw_zinc_block.json
@ -404,7 +404,7 @@ c9ccf6fe4c80357ba2e4d053f5a1b35df4f377a8 assets/create/blockstates/raw_zinc_bloc
45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
27fad7876f5a2de16f13dfde16d4a05dfe093989 assets/create/blockstates/red_toolbox.json 27fad7876f5a2de16f13dfde16d4a05dfe093989 assets/create/blockstates/red_toolbox.json
722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json 8a604cd639794533c0e9fe68a0ea218e99a3cecf assets/create/blockstates/red_valve_handle.json
8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json 8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json
c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets/create/blockstates/redstone_link.json c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets/create/blockstates/redstone_link.json
b76ed5f6d271349b2509708c11e713bb299a57b6 assets/create/blockstates/refined_radiance_casing.json b76ed5f6d271349b2509708c11e713bb299a57b6 assets/create/blockstates/refined_radiance_casing.json
@ -484,7 +484,7 @@ f0bef20f0e9a6b5d6a993b5fdc6ec3f7dc75d630 assets/create/blockstates/small_tuff_br
70192eb20909ca590e0a851dc7a283bc0899ebe4 assets/create/blockstates/small_veridium_brick_wall.json 70192eb20909ca590e0a851dc7a283bc0899ebe4 assets/create/blockstates/small_veridium_brick_wall.json
4396af91ae23b9783fa34b861e4f01631dd53d49 assets/create/blockstates/small_veridium_bricks.json 4396af91ae23b9783fa34b861e4f01631dd53d49 assets/create/blockstates/small_veridium_bricks.json
fa4ffec5eac02c0180226d994d51756e44f85674 assets/create/blockstates/smart_chute.json fa4ffec5eac02c0180226d994d51756e44f85674 assets/create/blockstates/smart_chute.json
f0f72cc1faacc8f37c8ac1833c22eb910771c800 assets/create/blockstates/smart_fluid_pipe.json 674fe9df0a71860ce8553a504f7f2a770b100743 assets/create/blockstates/smart_fluid_pipe.json
e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/speedometer.json e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/speedometer.json
1cb7cdbefa0ff199263782809287854b9d85074c assets/create/blockstates/spout.json 1cb7cdbefa0ff199263782809287854b9d85074c assets/create/blockstates/spout.json
d62b7908119fa4f51715a186d0882b388bb25cab assets/create/blockstates/spruce_window.json d62b7908119fa4f51715a186d0882b388bb25cab assets/create/blockstates/spruce_window.json
@ -548,34 +548,34 @@ c838c0792511ca2e14493b40032bb1370fac588a assets/create/blockstates/weighted_ejec
512bf17c9ea309b1f7da54440f923530d25e467c assets/create/blockstates/white_sail.json 512bf17c9ea309b1f7da54440f923530d25e467c assets/create/blockstates/white_sail.json
4647010162eb4c350fad236d860317eaa1884c77 assets/create/blockstates/white_seat.json 4647010162eb4c350fad236d860317eaa1884c77 assets/create/blockstates/white_seat.json
3695510f11231c8a5c1a0be94a92703e4b5a0f9c assets/create/blockstates/white_toolbox.json 3695510f11231c8a5c1a0be94a92703e4b5a0f9c assets/create/blockstates/white_toolbox.json
89000903d0ab8139e919abea7aa0361b34c24e55 assets/create/blockstates/white_valve_handle.json ae54261c2da64dd11ed7f887e1c9a19f96281fa7 assets/create/blockstates/white_valve_handle.json
c4cd1131113667da0180898b5db3ebad609db8ba assets/create/blockstates/windmill_bearing.json c4cd1131113667da0180898b5db3ebad609db8ba assets/create/blockstates/windmill_bearing.json
d4f804f2818376950ef28fc8d6250419f4e12218 assets/create/blockstates/wooden_bracket.json d4f804f2818376950ef28fc8d6250419f4e12218 assets/create/blockstates/wooden_bracket.json
21cbde8ab2ab1bebe8bd36b23d1b480091fa9d57 assets/create/blockstates/yellow_nixie_tube.json 21cbde8ab2ab1bebe8bd36b23d1b480091fa9d57 assets/create/blockstates/yellow_nixie_tube.json
e03c48512967845fce09d84b955d3bc7b480fedc assets/create/blockstates/yellow_sail.json e03c48512967845fce09d84b955d3bc7b480fedc assets/create/blockstates/yellow_sail.json
a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.json a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.json
bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbox.json bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbox.json
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 5616dda664dd106d576848124fc0fc1de18d0fd3 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
f85edc574ee6de0de7693ffb031266643db6724a assets/create/lang/en_ud.json f85edc574ee6de0de7693ffb031266643db6724a assets/create/lang/en_ud.json
11fd391ac3015f4dace8138ab1ec423ee822c7b4 assets/create/lang/en_us.json c219c77242e645f32704201dd80e279b3759b794 assets/create/lang/en_us.json
34ab109f0935b7d0a7dd306188e0bd3056a77f93 assets/create/lang/unfinished/de_de.json cf37534c3f98098f42b181083fd7cc1063ac2bbb assets/create/lang/unfinished/de_de.json
b5487949ee53302706c15051157316bb60dfa070 assets/create/lang/unfinished/es_cl.json 83d427726fdc38ec3c5b8c3c0f6f87f49d3e5ff3 assets/create/lang/unfinished/es_cl.json
6df40ff1c18bfb83a33bc17e4458feeeee058bf1 assets/create/lang/unfinished/es_es.json d21caeb0cbe871e38dc101c34ab89ece3cbe2127 assets/create/lang/unfinished/es_es.json
bca24c29adf91e0ee09db39783c59fac843acb46 assets/create/lang/unfinished/fr_fr.json 2215688baa2b0beffe0c19f71a3238df1d01b0c1 assets/create/lang/unfinished/fr_fr.json
d7b53a16d03be2f854dfba1e90e2a149c2abecbd assets/create/lang/unfinished/it_it.json 79484f2c3eba2b40f5d82ffdc3abeb3d2e6962d2 assets/create/lang/unfinished/it_it.json
42a6713a509ecd676e7eae6e6492da1e20e79102 assets/create/lang/unfinished/ja_jp.json d659570c9dc89653f03cd4cc82ed50db443638d8 assets/create/lang/unfinished/ja_jp.json
38e01a060e0e468a51b1ca4f0bcbec203837ce04 assets/create/lang/unfinished/ko_kr.json 03c30521d9b1bc7a6eb85d2a59a4c4676dca581e assets/create/lang/unfinished/ko_kr.json
83d812a1003fa3f25a3c28bbf54bf93f583c594a assets/create/lang/unfinished/nl_nl.json 3a56d579d022cc1b20746e9d3a1483e6fa8fb4be assets/create/lang/unfinished/nl_nl.json
c8c60fe2405f37cce7309326fb62cdb9aa1b49ff assets/create/lang/unfinished/pl_pl.json d5bfeacb442236c8b075fddb41364f85c8cb7feb assets/create/lang/unfinished/pl_pl.json
11b3809e9c4c3c61687f7789979fdbf2332fd6a4 assets/create/lang/unfinished/pt_br.json 0f3f51d065d896a7e3b4abd8c2801fa3e8fbd8c3 assets/create/lang/unfinished/pt_br.json
dd52b8df6ea92c1218e398197a1cedae066b4e0e assets/create/lang/unfinished/pt_pt.json 9f2ec0b2f8fa9b380c7edb56bfb806bcce621cce assets/create/lang/unfinished/pt_pt.json
954a947034232204bd415e4bfb6c59a3a448b604 assets/create/lang/unfinished/ro_ro.json 1f88f0d91bdf5c68224cb65249f77272771939c9 assets/create/lang/unfinished/ro_ro.json
54a92b2d667b55675c694904752760b594ab1424 assets/create/lang/unfinished/ru_ru.json 928ac3ad2ab5e7fa3d582b8b956258c110bea868 assets/create/lang/unfinished/ru_ru.json
2f084cc7b66fe4ea82f5ac3338a1245caf67c54d assets/create/lang/unfinished/uk_ua.json ed29ef4ae8f3633533485d56f7fa8cb77b790a0a assets/create/lang/unfinished/uk_ua.json
82490ac29a0c35c07cde11c340634bf8b416b6a3 assets/create/lang/unfinished/zh_cn.json e5cf7b657be816bc15b331dd058f7ccdabee8c14 assets/create/lang/unfinished/zh_cn.json
426b06805f08ef3fed15f404e9637b2d7082d660 assets/create/lang/unfinished/zh_tw.json 316dae07f95fb65c984fe7c424b566eb8ddba5f9 assets/create/lang/unfinished/zh_tw.json
487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json
b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json
3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json
@ -5633,6 +5633,7 @@ d99d5c67bdffff60789a19bd51a5c5267c75e0a4 data/create/tags/blocks/casing.json
74f4ba5f6f61c30e27947c6fb4557e888d018285 data/create/tags/blocks/safe_nbt.json 74f4ba5f6f61c30e27947c6fb4557e888d018285 data/create/tags/blocks/safe_nbt.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json 6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json
d063e12c9ef75f39518c6d129ea35d833464d547 data/create/tags/blocks/toolboxes.json d063e12c9ef75f39518c6d129ea35d833464d547 data/create/tags/blocks/toolboxes.json
8861f982c335a1f17796df4af53a7d5dc91fc85a data/create/tags/blocks/tree_attachments.json
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json 50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json
eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails.json eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails.json
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/windowable.json 74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/windowable.json

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/black_valve_handle", "model": "create:block/black_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/black_valve_handle" "model": "create:block/black_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/black_valve_handle", "model": "create:block/black_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/black_valve_handle", "model": "create:block/black_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/black_valve_handle", "model": "create:block/black_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/black_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/black_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/black_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/black_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/black_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/black_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/black_valve_handle", "model": "create:block/black_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/blue_valve_handle", "model": "create:block/blue_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/blue_valve_handle" "model": "create:block/blue_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/blue_valve_handle", "model": "create:block/blue_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/blue_valve_handle", "model": "create:block/blue_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/blue_valve_handle", "model": "create:block/blue_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/blue_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/blue_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/blue_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/blue_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/blue_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/blue_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/blue_valve_handle", "model": "create:block/blue_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/brown_valve_handle", "model": "create:block/brown_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/brown_valve_handle" "model": "create:block/brown_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/brown_valve_handle", "model": "create:block/brown_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/brown_valve_handle", "model": "create:block/brown_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/brown_valve_handle", "model": "create:block/brown_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/brown_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/brown_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/brown_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/brown_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/brown_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/brown_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/brown_valve_handle", "model": "create:block/brown_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/copper_valve_handle", "model": "create:block/copper_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/copper_valve_handle" "model": "create:block/copper_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/copper_valve_handle", "model": "create:block/copper_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/copper_valve_handle", "model": "create:block/copper_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/copper_valve_handle", "model": "create:block/copper_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/copper_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/copper_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/copper_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/copper_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/copper_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/copper_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/copper_valve_handle", "model": "create:block/copper_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/cyan_valve_handle", "model": "create:block/cyan_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/cyan_valve_handle" "model": "create:block/cyan_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/cyan_valve_handle", "model": "create:block/cyan_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/cyan_valve_handle", "model": "create:block/cyan_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/cyan_valve_handle", "model": "create:block/cyan_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/cyan_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/cyan_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/cyan_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/cyan_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/cyan_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/cyan_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/cyan_valve_handle", "model": "create:block/cyan_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,98 +1,194 @@
{ {
"variants": { "variants": {
"axis_along_first=false,enabled=false,facing=down": { "axis_along_first=false,enabled=false,facing=down,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_closed", "model": "create:block/fluid_valve/block_horizontal_closed",
"x": 270, "x": 270,
"y": 90 "y": 90
}, },
"axis_along_first=true,enabled=false,facing=down": { "axis_along_first=true,enabled=false,facing=down,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_closed", "model": "create:block/fluid_valve/block_horizontal_closed",
"x": 270 "x": 270
}, },
"axis_along_first=false,enabled=true,facing=down": { "axis_along_first=false,enabled=true,facing=down,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_open", "model": "create:block/fluid_valve/block_horizontal_open",
"x": 270, "x": 270,
"y": 90 "y": 90
}, },
"axis_along_first=true,enabled=true,facing=down": { "axis_along_first=true,enabled=true,facing=down,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_open", "model": "create:block/fluid_valve/block_horizontal_open",
"x": 270 "x": 270
}, },
"axis_along_first=false,enabled=false,facing=up": { "axis_along_first=false,enabled=false,facing=up,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_closed", "model": "create:block/fluid_valve/block_horizontal_closed",
"x": 90, "x": 90,
"y": 90 "y": 90
}, },
"axis_along_first=true,enabled=false,facing=up": { "axis_along_first=true,enabled=false,facing=up,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_closed", "model": "create:block/fluid_valve/block_horizontal_closed",
"x": 90 "x": 90
}, },
"axis_along_first=false,enabled=true,facing=up": { "axis_along_first=false,enabled=true,facing=up,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_open", "model": "create:block/fluid_valve/block_horizontal_open",
"x": 90, "x": 90,
"y": 90 "y": 90
}, },
"axis_along_first=true,enabled=true,facing=up": { "axis_along_first=true,enabled=true,facing=up,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_open", "model": "create:block/fluid_valve/block_horizontal_open",
"x": 90 "x": 90
}, },
"axis_along_first=false,enabled=false,facing=north": { "axis_along_first=false,enabled=false,facing=north,waterlogged=false": {
"model": "create:block/fluid_valve/block_vertical_closed", "model": "create:block/fluid_valve/block_vertical_closed",
"y": 180 "y": 180
}, },
"axis_along_first=true,enabled=false,facing=north": { "axis_along_first=true,enabled=false,facing=north,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_closed", "model": "create:block/fluid_valve/block_horizontal_closed",
"y": 180 "y": 180
}, },
"axis_along_first=false,enabled=true,facing=north": { "axis_along_first=false,enabled=true,facing=north,waterlogged=false": {
"model": "create:block/fluid_valve/block_vertical_open", "model": "create:block/fluid_valve/block_vertical_open",
"y": 180 "y": 180
}, },
"axis_along_first=true,enabled=true,facing=north": { "axis_along_first=true,enabled=true,facing=north,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_open", "model": "create:block/fluid_valve/block_horizontal_open",
"y": 180 "y": 180
}, },
"axis_along_first=false,enabled=false,facing=south": { "axis_along_first=false,enabled=false,facing=south,waterlogged=false": {
"model": "create:block/fluid_valve/block_vertical_closed" "model": "create:block/fluid_valve/block_vertical_closed"
}, },
"axis_along_first=true,enabled=false,facing=south": { "axis_along_first=true,enabled=false,facing=south,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_closed" "model": "create:block/fluid_valve/block_horizontal_closed"
}, },
"axis_along_first=false,enabled=true,facing=south": { "axis_along_first=false,enabled=true,facing=south,waterlogged=false": {
"model": "create:block/fluid_valve/block_vertical_open" "model": "create:block/fluid_valve/block_vertical_open"
}, },
"axis_along_first=true,enabled=true,facing=south": { "axis_along_first=true,enabled=true,facing=south,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_open" "model": "create:block/fluid_valve/block_horizontal_open"
}, },
"axis_along_first=false,enabled=false,facing=west": { "axis_along_first=false,enabled=false,facing=west,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_closed", "model": "create:block/fluid_valve/block_horizontal_closed",
"y": 90 "y": 90
}, },
"axis_along_first=true,enabled=false,facing=west": { "axis_along_first=true,enabled=false,facing=west,waterlogged=false": {
"model": "create:block/fluid_valve/block_vertical_closed", "model": "create:block/fluid_valve/block_vertical_closed",
"y": 90 "y": 90
}, },
"axis_along_first=false,enabled=true,facing=west": { "axis_along_first=false,enabled=true,facing=west,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_open", "model": "create:block/fluid_valve/block_horizontal_open",
"y": 90 "y": 90
}, },
"axis_along_first=true,enabled=true,facing=west": { "axis_along_first=true,enabled=true,facing=west,waterlogged=false": {
"model": "create:block/fluid_valve/block_vertical_open", "model": "create:block/fluid_valve/block_vertical_open",
"y": 90 "y": 90
}, },
"axis_along_first=false,enabled=false,facing=east": { "axis_along_first=false,enabled=false,facing=east,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_closed", "model": "create:block/fluid_valve/block_horizontal_closed",
"y": 270 "y": 270
}, },
"axis_along_first=true,enabled=false,facing=east": { "axis_along_first=true,enabled=false,facing=east,waterlogged=false": {
"model": "create:block/fluid_valve/block_vertical_closed", "model": "create:block/fluid_valve/block_vertical_closed",
"y": 270 "y": 270
}, },
"axis_along_first=false,enabled=true,facing=east": { "axis_along_first=false,enabled=true,facing=east,waterlogged=false": {
"model": "create:block/fluid_valve/block_horizontal_open", "model": "create:block/fluid_valve/block_horizontal_open",
"y": 270 "y": 270
}, },
"axis_along_first=true,enabled=true,facing=east": { "axis_along_first=true,enabled=true,facing=east,waterlogged=false": {
"model": "create:block/fluid_valve/block_vertical_open",
"y": 270
},
"axis_along_first=false,enabled=false,facing=down,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_closed",
"x": 270,
"y": 90
},
"axis_along_first=true,enabled=false,facing=down,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_closed",
"x": 270
},
"axis_along_first=false,enabled=true,facing=down,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_open",
"x": 270,
"y": 90
},
"axis_along_first=true,enabled=true,facing=down,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_open",
"x": 270
},
"axis_along_first=false,enabled=false,facing=up,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_closed",
"x": 90,
"y": 90
},
"axis_along_first=true,enabled=false,facing=up,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_closed",
"x": 90
},
"axis_along_first=false,enabled=true,facing=up,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_open",
"x": 90,
"y": 90
},
"axis_along_first=true,enabled=true,facing=up,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_open",
"x": 90
},
"axis_along_first=false,enabled=false,facing=north,waterlogged=true": {
"model": "create:block/fluid_valve/block_vertical_closed",
"y": 180
},
"axis_along_first=true,enabled=false,facing=north,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_closed",
"y": 180
},
"axis_along_first=false,enabled=true,facing=north,waterlogged=true": {
"model": "create:block/fluid_valve/block_vertical_open",
"y": 180
},
"axis_along_first=true,enabled=true,facing=north,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_open",
"y": 180
},
"axis_along_first=false,enabled=false,facing=south,waterlogged=true": {
"model": "create:block/fluid_valve/block_vertical_closed"
},
"axis_along_first=true,enabled=false,facing=south,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_closed"
},
"axis_along_first=false,enabled=true,facing=south,waterlogged=true": {
"model": "create:block/fluid_valve/block_vertical_open"
},
"axis_along_first=true,enabled=true,facing=south,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_open"
},
"axis_along_first=false,enabled=false,facing=west,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_closed",
"y": 90
},
"axis_along_first=true,enabled=false,facing=west,waterlogged=true": {
"model": "create:block/fluid_valve/block_vertical_closed",
"y": 90
},
"axis_along_first=false,enabled=true,facing=west,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_open",
"y": 90
},
"axis_along_first=true,enabled=true,facing=west,waterlogged=true": {
"model": "create:block/fluid_valve/block_vertical_open",
"y": 90
},
"axis_along_first=false,enabled=false,facing=east,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_closed",
"y": 270
},
"axis_along_first=true,enabled=false,facing=east,waterlogged=true": {
"model": "create:block/fluid_valve/block_vertical_closed",
"y": 270
},
"axis_along_first=false,enabled=true,facing=east,waterlogged=true": {
"model": "create:block/fluid_valve/block_horizontal_open",
"y": 270
},
"axis_along_first=true,enabled=true,facing=east,waterlogged=true": {
"model": "create:block/fluid_valve/block_vertical_open", "model": "create:block/fluid_valve/block_vertical_open",
"y": 270 "y": 270
} }

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/gray_valve_handle", "model": "create:block/gray_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/gray_valve_handle" "model": "create:block/gray_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/gray_valve_handle", "model": "create:block/gray_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/gray_valve_handle", "model": "create:block/gray_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/gray_valve_handle", "model": "create:block/gray_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/gray_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/gray_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/gray_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/gray_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/gray_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/gray_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/gray_valve_handle", "model": "create:block/gray_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/green_valve_handle", "model": "create:block/green_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/green_valve_handle" "model": "create:block/green_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/green_valve_handle", "model": "create:block/green_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/green_valve_handle", "model": "create:block/green_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/green_valve_handle", "model": "create:block/green_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/green_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/green_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/green_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/green_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/green_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/green_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/green_valve_handle", "model": "create:block/green_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/hand_crank/block", "model": "create:block/hand_crank/block",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/hand_crank/block" "model": "create:block/hand_crank/block"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/hand_crank/block", "model": "create:block/hand_crank/block",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/hand_crank/block", "model": "create:block/hand_crank/block",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/hand_crank/block", "model": "create:block/hand_crank/block",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/hand_crank/block",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/hand_crank/block",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/hand_crank/block"
},
"facing=north,waterlogged=true": {
"model": "create:block/hand_crank/block",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/hand_crank/block",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/hand_crank/block",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/hand_crank/block", "model": "create:block/hand_crank/block",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/light_blue_valve_handle", "model": "create:block/light_blue_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/light_blue_valve_handle" "model": "create:block/light_blue_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/light_blue_valve_handle", "model": "create:block/light_blue_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/light_blue_valve_handle", "model": "create:block/light_blue_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/light_blue_valve_handle", "model": "create:block/light_blue_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/light_blue_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/light_blue_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/light_blue_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/light_blue_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/light_blue_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/light_blue_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/light_blue_valve_handle", "model": "create:block/light_blue_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/light_gray_valve_handle", "model": "create:block/light_gray_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/light_gray_valve_handle" "model": "create:block/light_gray_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/light_gray_valve_handle", "model": "create:block/light_gray_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/light_gray_valve_handle", "model": "create:block/light_gray_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/light_gray_valve_handle", "model": "create:block/light_gray_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/light_gray_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/light_gray_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/light_gray_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/light_gray_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/light_gray_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/light_gray_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/light_gray_valve_handle", "model": "create:block/light_gray_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/lime_valve_handle", "model": "create:block/lime_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/lime_valve_handle" "model": "create:block/lime_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/lime_valve_handle", "model": "create:block/lime_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/lime_valve_handle", "model": "create:block/lime_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/lime_valve_handle", "model": "create:block/lime_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/lime_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/lime_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/lime_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/lime_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/lime_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/lime_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/lime_valve_handle", "model": "create:block/lime_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/magenta_valve_handle", "model": "create:block/magenta_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/magenta_valve_handle" "model": "create:block/magenta_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/magenta_valve_handle", "model": "create:block/magenta_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/magenta_valve_handle", "model": "create:block/magenta_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/magenta_valve_handle", "model": "create:block/magenta_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/magenta_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/magenta_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/magenta_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/magenta_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/magenta_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/magenta_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/magenta_valve_handle", "model": "create:block/magenta_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/orange_valve_handle", "model": "create:block/orange_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/orange_valve_handle" "model": "create:block/orange_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/orange_valve_handle", "model": "create:block/orange_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/orange_valve_handle", "model": "create:block/orange_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/orange_valve_handle", "model": "create:block/orange_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/orange_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/orange_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/orange_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/orange_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/orange_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/orange_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/orange_valve_handle", "model": "create:block/orange_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/pink_valve_handle", "model": "create:block/pink_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/pink_valve_handle" "model": "create:block/pink_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/pink_valve_handle", "model": "create:block/pink_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/pink_valve_handle", "model": "create:block/pink_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/pink_valve_handle", "model": "create:block/pink_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/pink_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/pink_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/pink_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/pink_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/pink_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/pink_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/pink_valve_handle", "model": "create:block/pink_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/purple_valve_handle", "model": "create:block/purple_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/purple_valve_handle" "model": "create:block/purple_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/purple_valve_handle", "model": "create:block/purple_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/purple_valve_handle", "model": "create:block/purple_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/purple_valve_handle", "model": "create:block/purple_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/purple_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/purple_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/purple_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/purple_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/purple_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/purple_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/purple_valve_handle", "model": "create:block/purple_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/red_valve_handle", "model": "create:block/red_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/red_valve_handle" "model": "create:block/red_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/red_valve_handle", "model": "create:block/red_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/red_valve_handle", "model": "create:block/red_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/red_valve_handle", "model": "create:block/red_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/red_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/red_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/red_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/red_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/red_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/red_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/red_valve_handle", "model": "create:block/red_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,54 +1,107 @@
{ {
"variants": { "variants": {
"face=floor,facing=north": { "face=floor,facing=north,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"y": 180 "y": 180
}, },
"face=wall,facing=north": { "face=wall,facing=north,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"x": 270, "x": 270,
"y": 180 "y": 180
}, },
"face=ceiling,facing=north": { "face=ceiling,facing=north,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"x": 180 "x": 180
}, },
"face=floor,facing=south": { "face=floor,facing=south,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block" "model": "create:block/smart_fluid_pipe/block"
}, },
"face=wall,facing=south": { "face=wall,facing=south,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"x": 270 "x": 270
}, },
"face=ceiling,facing=south": { "face=ceiling,facing=south,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"x": 180, "x": 180,
"y": 180 "y": 180
}, },
"face=floor,facing=west": { "face=floor,facing=west,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"y": 90 "y": 90
}, },
"face=wall,facing=west": { "face=wall,facing=west,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"x": 270, "x": 270,
"y": 90 "y": 90
}, },
"face=ceiling,facing=west": { "face=ceiling,facing=west,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"x": 180, "x": 180,
"y": 270 "y": 270
}, },
"face=floor,facing=east": { "face=floor,facing=east,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"y": 270 "y": 270
}, },
"face=wall,facing=east": { "face=wall,facing=east,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"x": 270, "x": 270,
"y": 270 "y": 270
}, },
"face=ceiling,facing=east": { "face=ceiling,facing=east,waterlogged=false": {
"model": "create:block/smart_fluid_pipe/block",
"x": 180,
"y": 90
},
"face=floor,facing=north,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block",
"y": 180
},
"face=wall,facing=north,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block",
"x": 270,
"y": 180
},
"face=ceiling,facing=north,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block",
"x": 180
},
"face=floor,facing=south,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block"
},
"face=wall,facing=south,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block",
"x": 270
},
"face=ceiling,facing=south,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block",
"x": 180,
"y": 180
},
"face=floor,facing=west,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block",
"y": 90
},
"face=wall,facing=west,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block",
"x": 270,
"y": 90
},
"face=ceiling,facing=west,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block",
"x": 180,
"y": 270
},
"face=floor,facing=east,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block",
"y": 270
},
"face=wall,facing=east,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block",
"x": 270,
"y": 270
},
"face=ceiling,facing=east,waterlogged=true": {
"model": "create:block/smart_fluid_pipe/block", "model": "create:block/smart_fluid_pipe/block",
"x": 180, "x": 180,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/white_valve_handle", "model": "create:block/white_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/white_valve_handle" "model": "create:block/white_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/white_valve_handle", "model": "create:block/white_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/white_valve_handle", "model": "create:block/white_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/white_valve_handle", "model": "create:block/white_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/white_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/white_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/white_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/white_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/white_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/white_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/white_valve_handle", "model": "create:block/white_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1,27 +1,53 @@
{ {
"variants": { "variants": {
"facing=down": { "facing=down,waterlogged=false": {
"model": "create:block/yellow_valve_handle", "model": "create:block/yellow_valve_handle",
"x": 180 "x": 180
}, },
"facing=up": { "facing=up,waterlogged=false": {
"model": "create:block/yellow_valve_handle" "model": "create:block/yellow_valve_handle"
}, },
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/yellow_valve_handle", "model": "create:block/yellow_valve_handle",
"x": 90 "x": 90
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/yellow_valve_handle", "model": "create:block/yellow_valve_handle",
"x": 90, "x": 90,
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/yellow_valve_handle", "model": "create:block/yellow_valve_handle",
"x": 90, "x": 90,
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/yellow_valve_handle",
"x": 90,
"y": 90
},
"facing=down,waterlogged=true": {
"model": "create:block/yellow_valve_handle",
"x": 180
},
"facing=up,waterlogged=true": {
"model": "create:block/yellow_valve_handle"
},
"facing=north,waterlogged=true": {
"model": "create:block/yellow_valve_handle",
"x": 90
},
"facing=south,waterlogged=true": {
"model": "create:block/yellow_valve_handle",
"x": 90,
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/yellow_valve_handle",
"x": 90,
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/yellow_valve_handle", "model": "create:block/yellow_valve_handle",
"x": 90, "x": 90,
"y": 90 "y": 90

View file

@ -1484,6 +1484,7 @@
"create.schedule.condition.threshold.equal": "exactly", "create.schedule.condition.threshold.equal": "exactly",
"create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s of %3$s", "create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s of %3$s",
"create.schedule.condition.threshold.matching_content": "Matching Content", "create.schedule.condition.threshold.matching_content": "Matching Content",
"create.schedule.condition.threshold.anything": "Anything",
"create.schedule.condition.threshold.item_measure": "Item Measure", "create.schedule.condition.threshold.item_measure": "Item Measure",
"create.schedule.condition.threshold.items": "Items", "create.schedule.condition.threshold.items": "Items",
"create.schedule.condition.threshold.stacks": "Stacks", "create.schedule.condition.threshold.stacks": "Stacks",
@ -1491,6 +1492,7 @@
"create.schedule.condition.threshold.status": "Cargo: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "Cargo: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "Reference Item", "create.schedule.condition.threshold.place_item": "Reference Item",
"create.schedule.condition.threshold.place_item_2": "Filters can be used", "create.schedule.condition.threshold.place_item_2": "Filters can be used",
"create.schedule.condition.threshold.place_item_3": "Leave empty to match any",
"create.schedule.condition.fluid_threshold": "Fluid Cargo Condition", "create.schedule.condition.fluid_threshold": "Fluid Cargo Condition",
"create.schedule.condition.item_threshold": "Item Cargo Condition", "create.schedule.condition.item_threshold": "Item Cargo Condition",
"create.schedule.condition.redstone_link": "Redstone Link", "create.schedule.condition.redstone_link": "Redstone Link",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 840", "_": "Missing Localizations: 842",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "genau", "create.schedule.condition.threshold.equal": "genau",
"create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s %3$s", "create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s %3$s",
"create.schedule.condition.threshold.matching_content": "passender Inhalt", "create.schedule.condition.threshold.matching_content": "passender Inhalt",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "Maßeinheit", "create.schedule.condition.threshold.item_measure": "Maßeinheit",
"create.schedule.condition.threshold.items": "Items", "create.schedule.condition.threshold.items": "Items",
"create.schedule.condition.threshold.stacks": "Stacks", "create.schedule.condition.threshold.stacks": "Stacks",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "Zugladestand: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "Zugladestand: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "Referenz-Item", "create.schedule.condition.threshold.place_item": "Referenz-Item",
"create.schedule.condition.threshold.place_item_2": "Filter können verwendet werden", "create.schedule.condition.threshold.place_item_2": "Filter können verwendet werden",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "Flüssigkeitsladestand", "create.schedule.condition.fluid_threshold": "Flüssigkeitsladestand",
"create.schedule.condition.item_threshold": "Item-Ladestand", "create.schedule.condition.item_threshold": "Item-Ladestand",
"create.schedule.condition.redstone_link": "Redstone-Link", "create.schedule.condition.redstone_link": "Redstone-Link",
@ -1611,7 +1613,7 @@
"create.train.status.end_of_track": "Ein Waggon hat das Ende seines Gleises erreicht", "create.train.status.end_of_track": "Ein Waggon hat das Ende seines Gleises erreicht",
"create.train.status.double_portal": "Ein Waggon kann kein Portal während des Verlassens eines anderen betreten", "create.train.status.double_portal": "Ein Waggon kann kein Portal während des Verlassens eines anderen betreten",
"create.train.status.coupling_stress": "Zwangsbremsung aufgrund von Spannung an einer Kopplung", "create.train.status.coupling_stress": "Zwangsbremsung aufgrund von Spannung an einer Kopplung",
"create.train.status.track_missing": "Gleisen fehlen unter dem Zug", "create.train.status.track_missing": "Gleise fehlen unter dem Zug",
"create.train.status.paused_for_manual": "Fahrplan für manuelle Fahrt pausiert", "create.train.status.paused_for_manual": "Fahrplan für manuelle Fahrt pausiert",
"create.train.status.opposite_driver": "Pfad erfordert einen in die andere Richtung zeigenden Fahrer", "create.train.status.opposite_driver": "Pfad erfordert einen in die andere Richtung zeigenden Fahrer",
"create.train.status.missing_driver": "Fahrer ist verschwunden", "create.train.status.missing_driver": "Fahrer ist verschwunden",
@ -1684,7 +1686,7 @@
"create.display_source.station_summary.platform_column": "Spalte 'Gleis' Größe", "create.display_source.station_summary.platform_column": "Spalte 'Gleis' Größe",
"create.display_source.station_summary.now": "jetzt", "create.display_source.station_summary.now": "jetzt",
"create.display_source.station_summary.minutes": "min", "create.display_source.station_summary.minutes": "min",
"create.display_source.station_summary.seconds": "%1$sen", "create.display_source.station_summary.seconds": "%1$ss",
"create.display_source.observed_train_name": "Zugnamen ermitteln", "create.display_source.observed_train_name": "Zugnamen ermitteln",
"create.display_source.max_enchant_level": "Max. Verzauberungskosten", "create.display_source.max_enchant_level": "Max. Verzauberungskosten",
"create.display_source.boiler_status": "Kesselstatus", "create.display_source.boiler_status": "Kesselstatus",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 986", "_": "Missing Localizations: 988",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly", "create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly",
"create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s",
"create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure",
"create.schedule.condition.threshold.items": "UNLOCALIZED: Items", "create.schedule.condition.threshold.items": "UNLOCALIZED: Items",
"create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item",
"create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition",
"create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition",
"create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link", "create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 6", "_": "Missing Localizations: 8",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "exactamente", "create.schedule.condition.threshold.equal": "exactamente",
"create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s de %3$s", "create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s de %3$s",
"create.schedule.condition.threshold.matching_content": "Contenido coincidente", "create.schedule.condition.threshold.matching_content": "Contenido coincidente",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "Medición de objetos", "create.schedule.condition.threshold.item_measure": "Medición de objetos",
"create.schedule.condition.threshold.items": "Objetos", "create.schedule.condition.threshold.items": "Objetos",
"create.schedule.condition.threshold.stacks": "Pilas de objetos", "create.schedule.condition.threshold.stacks": "Pilas de objetos",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "Cargamento: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "Cargamento: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "Objeto de referencia", "create.schedule.condition.threshold.place_item": "Objeto de referencia",
"create.schedule.condition.threshold.place_item_2": "Los filtros se pueden usar", "create.schedule.condition.threshold.place_item_2": "Los filtros se pueden usar",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "Condición de cargamento de fluidos", "create.schedule.condition.fluid_threshold": "Condición de cargamento de fluidos",
"create.schedule.condition.item_threshold": "Condición de cargamento de objetos", "create.schedule.condition.item_threshold": "Condición de cargamento de objetos",
"create.schedule.condition.redstone_link": "Enlace de redstone", "create.schedule.condition.redstone_link": "Enlace de redstone",

View file

@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly", "create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly",
"create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s",
"create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure",
"create.schedule.condition.threshold.items": "UNLOCALIZED: Items", "create.schedule.condition.threshold.items": "UNLOCALIZED: Items",
"create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item",
"create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition",
"create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition",
"create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link", "create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 6", "_": "Missing Localizations: 2",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -22,13 +22,13 @@
"block.create.belt": "Nastro", "block.create.belt": "Nastro",
"block.create.birch_window": "Finestra di betulla", "block.create.birch_window": "Finestra di betulla",
"block.create.birch_window_pane": "Pannello di finestra di betulla", "block.create.birch_window_pane": "Pannello di finestra di betulla",
"block.create.black_nixie_tube": "Tubo di Nixie nero", "block.create.black_nixie_tube": "Tubo Nixie nero",
"block.create.black_sail": "Vela nera", "block.create.black_sail": "Vela nera",
"block.create.black_seat": "Sedile nero", "block.create.black_seat": "Sedile nero",
"block.create.black_toolbox": "Cassetta degli attrezzi nera", "block.create.black_toolbox": "Cassetta degli attrezzi nera",
"block.create.black_valve_handle": "Maniglia per valvola nera", "block.create.black_valve_handle": "Maniglia per valvola nera",
"block.create.blaze_burner": "Inceneritore a blaze", "block.create.blaze_burner": "Inceneritore a blaze",
"block.create.blue_nixie_tube": "Tubo di Nixie blu", "block.create.blue_nixie_tube": "Tubo Nixie blu",
"block.create.blue_sail": "Vela blu", "block.create.blue_sail": "Vela blu",
"block.create.blue_seat": "Sedile blu", "block.create.blue_seat": "Sedile blu",
"block.create.blue_toolbox": "Cassetta degli attrezzi blu", "block.create.blue_toolbox": "Cassetta degli attrezzi blu",
@ -42,7 +42,7 @@
"block.create.brass_funnel": "Imbuto di ottone", "block.create.brass_funnel": "Imbuto di ottone",
"block.create.brass_ladder": "Scala a pioli in ottone", "block.create.brass_ladder": "Scala a pioli in ottone",
"block.create.brass_tunnel": "Tunnel di ottone", "block.create.brass_tunnel": "Tunnel di ottone",
"block.create.brown_nixie_tube": "Tubo di Nixie marrone", "block.create.brown_nixie_tube": "Tubo Nixie marrone",
"block.create.brown_sail": "Vela marrone", "block.create.brown_sail": "Vela marrone",
"block.create.brown_seat": "Sedile marrone", "block.create.brown_seat": "Sedile marrone",
"block.create.brown_toolbox": "Cassetta degli attrezzi marrone", "block.create.brown_toolbox": "Cassetta degli attrezzi marrone",
@ -189,7 +189,7 @@
"block.create.cut_veridium_slab": "Lastra di veridio tagliato", "block.create.cut_veridium_slab": "Lastra di veridio tagliato",
"block.create.cut_veridium_stairs": "Scalini di veridio tagliato", "block.create.cut_veridium_stairs": "Scalini di veridio tagliato",
"block.create.cut_veridium_wall": "Muretto di veridio tagliato", "block.create.cut_veridium_wall": "Muretto di veridio tagliato",
"block.create.cyan_nixie_tube": "Tubo di Nixie ciano", "block.create.cyan_nixie_tube": "Tubo Nixie ciano",
"block.create.cyan_sail": "Vela ciano", "block.create.cyan_sail": "Vela ciano",
"block.create.cyan_seat": "Sedile ciano", "block.create.cyan_seat": "Sedile ciano",
"block.create.cyan_toolbox": "Cassetta degli attrezzi ciano", "block.create.cyan_toolbox": "Cassetta degli attrezzi ciano",
@ -228,12 +228,12 @@
"block.create.gearshift": "Cambio", "block.create.gearshift": "Cambio",
"block.create.glass_fluid_pipe": "Tubo per fluidi con vetrata", "block.create.glass_fluid_pipe": "Tubo per fluidi con vetrata",
"block.create.granite_pillar": "Pilastro di granito", "block.create.granite_pillar": "Pilastro di granito",
"block.create.gray_nixie_tube": "Tubo di Nixie grigio", "block.create.gray_nixie_tube": "Tubo Nixie grigio",
"block.create.gray_sail": "Vela grigia", "block.create.gray_sail": "Vela grigia",
"block.create.gray_seat": "Sedile grigio", "block.create.gray_seat": "Sedile grigio",
"block.create.gray_toolbox": "Cassetta degli attrezzi grigia", "block.create.gray_toolbox": "Cassetta degli attrezzi grigia",
"block.create.gray_valve_handle": "Maniglia per valvola grigia", "block.create.gray_valve_handle": "Maniglia per valvola grigia",
"block.create.green_nixie_tube": "Tubo di Nixie verde", "block.create.green_nixie_tube": "Tubo Nixie verde",
"block.create.green_sail": "Vela verde", "block.create.green_sail": "Vela verde",
"block.create.green_seat": "Sedile verde", "block.create.green_seat": "Sedile verde",
"block.create.green_toolbox": "Cassetta degli attrezzi verde", "block.create.green_toolbox": "Cassetta degli attrezzi verde",
@ -265,17 +265,17 @@
"block.create.layered_tuff": "Tufo stratificato", "block.create.layered_tuff": "Tufo stratificato",
"block.create.layered_veridium": "Veridio stratificato", "block.create.layered_veridium": "Veridio stratificato",
"block.create.lectern_controller": "Leggio con pulsantiera", "block.create.lectern_controller": "Leggio con pulsantiera",
"block.create.light_blue_nixie_tube": "Tubo di Nixie azzurro", "block.create.light_blue_nixie_tube": "Tubo Nixie azzurro",
"block.create.light_blue_sail": "Vela azzurra", "block.create.light_blue_sail": "Vela azzurra",
"block.create.light_blue_seat": "Sedile azzurro", "block.create.light_blue_seat": "Sedile azzurro",
"block.create.light_blue_toolbox": "Cassetta degli attrezzi azzurra", "block.create.light_blue_toolbox": "Cassetta degli attrezzi azzurra",
"block.create.light_blue_valve_handle": "Maniglia per valvola azzurra", "block.create.light_blue_valve_handle": "Maniglia per valvola azzurra",
"block.create.light_gray_nixie_tube": "Tubo di Nixie grigio chiaro", "block.create.light_gray_nixie_tube": "Tubo Nixie grigio chiaro",
"block.create.light_gray_sail": "Vela grigio chiaro", "block.create.light_gray_sail": "Vela grigio chiaro",
"block.create.light_gray_seat": "Sedile grigio chiaro", "block.create.light_gray_seat": "Sedile grigio chiaro",
"block.create.light_gray_toolbox": "Cassetta degli attrezzi grigia chiaro", "block.create.light_gray_toolbox": "Cassetta degli attrezzi grigia chiaro",
"block.create.light_gray_valve_handle": "Maniglia per valvola grigio chiaro", "block.create.light_gray_valve_handle": "Maniglia per valvola grigio chiaro",
"block.create.lime_nixie_tube": "Tubo di Nixie lime", "block.create.lime_nixie_tube": "Tubo Nixie lime",
"block.create.lime_sail": "Vela lime", "block.create.lime_sail": "Vela lime",
"block.create.lime_seat": "Sedile lime", "block.create.lime_seat": "Sedile lime",
"block.create.lime_toolbox": "Cassetta degli attrezzi lime", "block.create.lime_toolbox": "Cassetta degli attrezzi lime",
@ -284,7 +284,7 @@
"block.create.limestone_pillar": "Pilastro di calcare", "block.create.limestone_pillar": "Pilastro di calcare",
"block.create.linear_chassis": "Telaio lineare", "block.create.linear_chassis": "Telaio lineare",
"block.create.lit_blaze_burner": "Inceneritore a blaze acceso", "block.create.lit_blaze_burner": "Inceneritore a blaze acceso",
"block.create.magenta_nixie_tube": "Tubo di Nixie magenta", "block.create.magenta_nixie_tube": "Tubo Nixie magenta",
"block.create.magenta_sail": "Vela magenta", "block.create.magenta_sail": "Vela magenta",
"block.create.magenta_seat": "Sedile magenta", "block.create.magenta_seat": "Sedile magenta",
"block.create.magenta_toolbox": "Cassetta degli attrezzi magenta", "block.create.magenta_toolbox": "Cassetta degli attrezzi magenta",
@ -307,7 +307,7 @@
"block.create.millstone": "Macina", "block.create.millstone": "Macina",
"block.create.minecart_anchor": "Ancora per carrello da miniera", "block.create.minecart_anchor": "Ancora per carrello da miniera",
"block.create.mysterious_cuckoo_clock": "Orologio a cucù misterioso", "block.create.mysterious_cuckoo_clock": "Orologio a cucù misterioso",
"block.create.nixie_tube": "Tubo di Nixie", "block.create.nixie_tube": "Tubo Nixie",
"block.create.nozzle": "Dispersore", "block.create.nozzle": "Dispersore",
"block.create.oak_window": "Finestra di quercia", "block.create.oak_window": "Finestra di quercia",
"block.create.oak_window_pane": "Pannello di finestra di quercia", "block.create.oak_window_pane": "Pannello di finestra di quercia",
@ -326,7 +326,7 @@
"block.create.oxidized_copper_tile_stairs": "Scalini di mattonelle di rame ossidato", "block.create.oxidized_copper_tile_stairs": "Scalini di mattonelle di rame ossidato",
"block.create.oxidized_copper_tiles": "Mattonelle di rame ossidato", "block.create.oxidized_copper_tiles": "Mattonelle di rame ossidato",
"block.create.peculiar_bell": "Campana peculiare", "block.create.peculiar_bell": "Campana peculiare",
"block.create.pink_nixie_tube": "Tubo di Nixie rosa", "block.create.pink_nixie_tube": "Tubo Nixie rosa",
"block.create.pink_sail": "Vela rosa", "block.create.pink_sail": "Vela rosa",
"block.create.pink_seat": "Sedile rosa", "block.create.pink_seat": "Sedile rosa",
"block.create.pink_toolbox": "Cassetta degli attrezzi rosa", "block.create.pink_toolbox": "Cassetta degli attrezzi rosa",
@ -397,7 +397,7 @@
"block.create.pulley_magnet": "Magnete della carrucola", "block.create.pulley_magnet": "Magnete della carrucola",
"block.create.pulse_extender": "Estensore di impulsi", "block.create.pulse_extender": "Estensore di impulsi",
"block.create.pulse_repeater": "Ripetitore di impulsi", "block.create.pulse_repeater": "Ripetitore di impulsi",
"block.create.purple_nixie_tube": "Tubo di Nixie viola", "block.create.purple_nixie_tube": "Tubo Nixie viola",
"block.create.purple_sail": "Vela viola", "block.create.purple_sail": "Vela viola",
"block.create.purple_seat": "Sedile viola", "block.create.purple_seat": "Sedile viola",
"block.create.purple_toolbox": "Cassetta degli attrezzi viola", "block.create.purple_toolbox": "Cassetta degli attrezzi viola",
@ -405,7 +405,7 @@
"block.create.radial_chassis": "Telaio radiale", "block.create.radial_chassis": "Telaio radiale",
"block.create.railway_casing": "Rivestimento di treno", "block.create.railway_casing": "Rivestimento di treno",
"block.create.raw_zinc_block": "Blocco di zinco grezzo", "block.create.raw_zinc_block": "Blocco di zinco grezzo",
"block.create.red_nixie_tube": "Tubo di Nixie rosso", "block.create.red_nixie_tube": "Tubo Nixie rosso",
"block.create.red_sail": "Vela rossa", "block.create.red_sail": "Vela rossa",
"block.create.red_seat": "Sedile rosso", "block.create.red_seat": "Sedile rosso",
"block.create.red_toolbox": "Cassetta degli attrezzi rossa", "block.create.red_toolbox": "Cassetta degli attrezzi rossa",
@ -549,14 +549,14 @@
"block.create.weathered_copper_tile_stairs": "Scalini di mattonelle di rame corroso", "block.create.weathered_copper_tile_stairs": "Scalini di mattonelle di rame corroso",
"block.create.weathered_copper_tiles": "Mattonelle di rame corroso", "block.create.weathered_copper_tiles": "Mattonelle di rame corroso",
"block.create.weighted_ejector": "Espulsore di pesi", "block.create.weighted_ejector": "Espulsore di pesi",
"block.create.white_nixie_tube": "Tubo di Nixie bianco", "block.create.white_nixie_tube": "Tubo Nixie bianco",
"block.create.white_sail": "Vela bianca", "block.create.white_sail": "Vela bianca",
"block.create.white_seat": "Sedile bianco", "block.create.white_seat": "Sedile bianco",
"block.create.white_toolbox": "Cassetta degli attrezzi bianca", "block.create.white_toolbox": "Cassetta degli attrezzi bianca",
"block.create.white_valve_handle": "Maniglia per valvola bianca", "block.create.white_valve_handle": "Maniglia per valvola bianca",
"block.create.windmill_bearing": "Supporto per mulino a vento", "block.create.windmill_bearing": "Supporto per mulino a vento",
"block.create.wooden_bracket": "Supporto di legno", "block.create.wooden_bracket": "Supporto di legno",
"block.create.yellow_nixie_tube": "Tubo di Nixie giallo", "block.create.yellow_nixie_tube": "Tubo Nixie giallo",
"block.create.yellow_sail": "Vela gialla", "block.create.yellow_sail": "Vela gialla",
"block.create.yellow_seat": "Sedile giallo", "block.create.yellow_seat": "Sedile giallo",
"block.create.yellow_toolbox": "Cassetta degli attrezzi gialla", "block.create.yellow_toolbox": "Cassetta degli attrezzi gialla",
@ -1260,8 +1260,8 @@
"create.item_attributes.smokable.inverted": "non può essere affumicato", "create.item_attributes.smokable.inverted": "non può essere affumicato",
"create.item_attributes.blastable": "è fondibile in un forno fusorio", "create.item_attributes.blastable": "è fondibile in un forno fusorio",
"create.item_attributes.blastable.inverted": "non è fondibile in un forno fusorio", "create.item_attributes.blastable.inverted": "non è fondibile in un forno fusorio",
"create.item_attributes.compostable": "UNLOCALIZED: can be composted", "create.item_attributes.compostable": "può essere gettato in una compstiera",
"create.item_attributes.compostable.inverted": "UNLOCALIZED: cannot be composted", "create.item_attributes.compostable.inverted": "non può essere gettato in una compstiera",
"create.item_attributes.shulker_level": "è uno shulker %1$s", "create.item_attributes.shulker_level": "è uno shulker %1$s",
"create.item_attributes.shulker_level.inverted": "non è uno shulker %1$s", "create.item_attributes.shulker_level.inverted": "non è uno shulker %1$s",
"create.item_attributes.shulker_level.full": "pieno", "create.item_attributes.shulker_level.full": "pieno",
@ -1368,10 +1368,10 @@
"create.tooltip.chute.fans_pull_up": "Il ventilatore tira da sopra", "create.tooltip.chute.fans_pull_up": "Il ventilatore tira da sopra",
"create.tooltip.chute.fans_pull_down": "Il ventilatore tira da sotto", "create.tooltip.chute.fans_pull_down": "Il ventilatore tira da sotto",
"create.tooltip.chute.contains": "Contiene: %1$s x%2$s", "create.tooltip.chute.contains": "Contiene: %1$s x%2$s",
"create.tooltip.deployer.header": "UNLOCALIZED: Deployer Information", "create.tooltip.deployer.header": "Informazioni sull'Installatore",
"create.tooltip.deployer.using": "UNLOCALIZED: Mode: Use", "create.tooltip.deployer.using": "Modalità: Utilizzo",
"create.tooltip.deployer.punching": "UNLOCALIZED: Mode: Attack", "create.tooltip.deployer.punching": "Modalità: Attacco",
"create.tooltip.deployer.contains": "UNLOCALIZED: Item: %1$s x%2$s", "create.tooltip.deployer.contains": "Oggetto: %1$s x%2$s",
"create.tooltip.brass_tunnel.contains": "Sta distribuendo:", "create.tooltip.brass_tunnel.contains": "Sta distribuendo:",
"create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s", "create.tooltip.brass_tunnel.contains_entry": "> %1$s x%2$s",
"create.tooltip.brass_tunnel.retrieve": "Click destro per recuperare", "create.tooltip.brass_tunnel.retrieve": "Click destro per recuperare",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "esattamente", "create.schedule.condition.threshold.equal": "esattamente",
"create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s di %3$s", "create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s di %3$s",
"create.schedule.condition.threshold.matching_content": "Contenuto corrispondente", "create.schedule.condition.threshold.matching_content": "Contenuto corrispondente",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "Misura", "create.schedule.condition.threshold.item_measure": "Misura",
"create.schedule.condition.threshold.items": "Oggetti", "create.schedule.condition.threshold.items": "Oggetti",
"create.schedule.condition.threshold.stacks": "Stack", "create.schedule.condition.threshold.stacks": "Stack",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "Carico: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "Carico: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "Oggetto di riferimento", "create.schedule.condition.threshold.place_item": "Oggetto di riferimento",
"create.schedule.condition.threshold.place_item_2": "È permesso usare Filtri", "create.schedule.condition.threshold.place_item_2": "È permesso usare Filtri",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "Carico di fluidi", "create.schedule.condition.fluid_threshold": "Carico di fluidi",
"create.schedule.condition.item_threshold": "Carico di oggetti", "create.schedule.condition.item_threshold": "Carico di oggetti",
"create.schedule.condition.redstone_link": "Connessione redstone", "create.schedule.condition.redstone_link": "Connessione redstone",
@ -1651,7 +1653,7 @@
"create.display_source.list_items": "Lista di oggetti filtrati", "create.display_source.list_items": "Lista di oggetti filtrati",
"create.display_source.fluid_amount": "Quantità di fluidi filtrati", "create.display_source.fluid_amount": "Quantità di fluidi filtrati",
"create.display_source.list_fluids": "Lista di fluidi filtrati", "create.display_source.list_fluids": "Lista di fluidi filtrati",
"create.display_source.nixie_tube": "Copia Tubo di Nixie", "create.display_source.nixie_tube": "Copia Tubo Nixie",
"create.display_source.fill_level": "Livello di riempimento", "create.display_source.fill_level": "Livello di riempimento",
"create.display_source.fill_level.display": "Formato di visualizzazione", "create.display_source.fill_level.display": "Formato di visualizzazione",
"create.display_source.fill_level.percent": "Percentuale", "create.display_source.fill_level.percent": "Percentuale",
@ -3022,7 +3024,7 @@
"create.ponder.windmill_source.text_7": "Fai click destro sul Supporto in qualsiasi momento per fermarlo e poter modificare di nuovo la struttura", "create.ponder.windmill_source.text_7": "Fai click destro sul Supporto in qualsiasi momento per fermarlo e poter modificare di nuovo la struttura",
"create.ponder.windmill_structure.header": "Macchinari per Mulini a vento", "create.ponder.windmill_structure.header": "Macchinari per Mulini a vento",
"create.ponder.windmill_structure.text_1": "Qualsiasi struttura può essere un Mulino a vento vaido, purché contenga almeno 8 blocchi che possano essere considerati vele.", "create.ponder.windmill_structure.text_1": "Qualsiasi struttura può essere un Mulino a vento valido, purché contenga almeno 8 blocchi che possano essere considerati vele.",
"_": "Thank you for translating Create!" "_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 2", "_": "Missing Localizations: 4",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "ぴったり", "create.schedule.condition.threshold.equal": "ぴったり",
"create.schedule.condition.threshold.x_units_of_item": "%1$s %2$sの%3$s", "create.schedule.condition.threshold.x_units_of_item": "%1$s %2$sの%3$s",
"create.schedule.condition.threshold.matching_content": "一致する貨物", "create.schedule.condition.threshold.matching_content": "一致する貨物",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "アイテム単位", "create.schedule.condition.threshold.item_measure": "アイテム単位",
"create.schedule.condition.threshold.items": "個", "create.schedule.condition.threshold.items": "個",
"create.schedule.condition.threshold.stacks": "スタック", "create.schedule.condition.threshold.stacks": "スタック",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "貨物: %1$s/%2$s%3$s", "create.schedule.condition.threshold.status": "貨物: %1$s/%2$s%3$s",
"create.schedule.condition.threshold.place_item": "参照アイテム", "create.schedule.condition.threshold.place_item": "参照アイテム",
"create.schedule.condition.threshold.place_item_2": "フィルターも使えます", "create.schedule.condition.threshold.place_item_2": "フィルターも使えます",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "液体貨物の状態", "create.schedule.condition.fluid_threshold": "液体貨物の状態",
"create.schedule.condition.item_threshold": "アイテム貨物の状態", "create.schedule.condition.item_threshold": "アイテム貨物の状態",
"create.schedule.condition.redstone_link": "レッドストーンリンク", "create.schedule.condition.redstone_link": "レッドストーンリンク",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 6", "_": "Missing Localizations: 8",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "다음과 동일하면", "create.schedule.condition.threshold.equal": "다음과 동일하면",
"create.schedule.condition.threshold.x_units_of_item": "%3$s %1$s %2$s", "create.schedule.condition.threshold.x_units_of_item": "%3$s %1$s %2$s",
"create.schedule.condition.threshold.matching_content": "내용물 일치", "create.schedule.condition.threshold.matching_content": "내용물 일치",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "아이템 단위", "create.schedule.condition.threshold.item_measure": "아이템 단위",
"create.schedule.condition.threshold.items": "개", "create.schedule.condition.threshold.items": "개",
"create.schedule.condition.threshold.stacks": "스택", "create.schedule.condition.threshold.stacks": "스택",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "저장소: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "저장소: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "기준 아이템", "create.schedule.condition.threshold.place_item": "기준 아이템",
"create.schedule.condition.threshold.place_item_2": "필터를 사용할 수 있음", "create.schedule.condition.threshold.place_item_2": "필터를 사용할 수 있음",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "액체 저장소 조건", "create.schedule.condition.fluid_threshold": "액체 저장소 조건",
"create.schedule.condition.item_threshold": "아이템 저장소 조건", "create.schedule.condition.item_threshold": "아이템 저장소 조건",
"create.schedule.condition.redstone_link": "레드스톤 링크", "create.schedule.condition.redstone_link": "레드스톤 링크",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 2485", "_": "Missing Localizations: 2487",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly", "create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly",
"create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s",
"create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure",
"create.schedule.condition.threshold.items": "UNLOCALIZED: Items", "create.schedule.condition.threshold.items": "UNLOCALIZED: Items",
"create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item",
"create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition",
"create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition",
"create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link", "create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 10", "_": "Missing Localizations: 12",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -564,14 +564,14 @@
"block.create.zinc_block": "Blok cynku", "block.create.zinc_block": "Blok cynku",
"block.create.zinc_ore": "Złoże cynku", "block.create.zinc_ore": "Złoże cynku",
"enchantment.create.capacity": "Pojameność", "enchantment.create.capacity": "Pojemność",
"enchantment.create.potato_recovery": "Odzyskiwanie", "enchantment.create.potato_recovery": "Odzyskiwanie",
"entity.create.carriage_contraption": "Maszyna wagonowa", "entity.create.carriage_contraption": "Maszyna wagonowa",
"entity.create.contraption": "Maszyna", "entity.create.contraption": "Maszyna",
"entity.create.crafting_blueprint": "Szablon konstruowania", "entity.create.crafting_blueprint": "Szablon konstruowania",
"entity.create.gantry_contraption": "Maszyna suwnicowa", "entity.create.gantry_contraption": "Maszyna suwnicowa",
"entity.create.potato_projectile": "Zimniaczany pocisk", "entity.create.potato_projectile": "Ziemniaczany pocisk",
"entity.create.seat": "Siedzenie", "entity.create.seat": "Siedzenie",
"entity.create.stationary_contraption": "Maszyna stacjonarna", "entity.create.stationary_contraption": "Maszyna stacjonarna",
"entity.create.super_glue": "Super Glue", "entity.create.super_glue": "Super Glue",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "dokładnie", "create.schedule.condition.threshold.equal": "dokładnie",
"create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s: %3$s", "create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s: %3$s",
"create.schedule.condition.threshold.matching_content": "Pasująca zawartość", "create.schedule.condition.threshold.matching_content": "Pasująca zawartość",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "Jednostka przedmiotów", "create.schedule.condition.threshold.item_measure": "Jednostka przedmiotów",
"create.schedule.condition.threshold.items": "Przemioty", "create.schedule.condition.threshold.items": "Przemioty",
"create.schedule.condition.threshold.stacks": "Stosy", "create.schedule.condition.threshold.stacks": "Stosy",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "Ładunek: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "Ładunek: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "Przedmiot odniesienia", "create.schedule.condition.threshold.place_item": "Przedmiot odniesienia",
"create.schedule.condition.threshold.place_item_2": "Filtry mogą zostać użyte", "create.schedule.condition.threshold.place_item_2": "Filtry mogą zostać użyte",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "Warunek ładunku płynów", "create.schedule.condition.fluid_threshold": "Warunek ładunku płynów",
"create.schedule.condition.item_threshold": "Warunek ładunku przedmiotów", "create.schedule.condition.item_threshold": "Warunek ładunku przedmiotów",
"create.schedule.condition.redstone_link": "Emiter sygnału", "create.schedule.condition.redstone_link": "Emiter sygnału",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1329", "_": "Missing Localizations: 1331",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly", "create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly",
"create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s",
"create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure",
"create.schedule.condition.threshold.items": "UNLOCALIZED: Items", "create.schedule.condition.threshold.items": "UNLOCALIZED: Items",
"create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item",
"create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition",
"create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition",
"create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link", "create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 2194", "_": "Missing Localizations: 2196",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly", "create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly",
"create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s",
"create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure",
"create.schedule.condition.threshold.items": "UNLOCALIZED: Items", "create.schedule.condition.threshold.items": "UNLOCALIZED: Items",
"create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item",
"create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition",
"create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition",
"create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link", "create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 653", "_": "Missing Localizations: 655",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly", "create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly",
"create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s",
"create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure",
"create.schedule.condition.threshold.items": "UNLOCALIZED: Items", "create.schedule.condition.threshold.items": "UNLOCALIZED: Items",
"create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item",
"create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition",
"create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition",
"create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link", "create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 984", "_": "Missing Localizations: 986",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly", "create.schedule.condition.threshold.equal": "UNLOCALIZED: exactly",
"create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s",
"create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure",
"create.schedule.condition.threshold.items": "UNLOCALIZED: Items", "create.schedule.condition.threshold.items": "UNLOCALIZED: Items",
"create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "UNLOCALIZED: Cargo: %1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item",
"create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition",
"create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition",
"create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link", "create.schedule.condition.redstone_link": "UNLOCALIZED: Redstone Link",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 2", "_": "Missing Localizations: 0",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1260,8 +1260,8 @@
"create.item_attributes.smokable.inverted": "不可被烟熏", "create.item_attributes.smokable.inverted": "不可被烟熏",
"create.item_attributes.blastable": "可被高炉冶炼", "create.item_attributes.blastable": "可被高炉冶炼",
"create.item_attributes.blastable.inverted": "不可被高炉冶炼", "create.item_attributes.blastable.inverted": "不可被高炉冶炼",
"create.item_attributes.compostable": "UNLOCALIZED: can be composted", "create.item_attributes.compostable": "可被堆肥",
"create.item_attributes.compostable.inverted": "UNLOCALIZED: cannot be composted", "create.item_attributes.compostable.inverted": "不可被堆肥",
"create.item_attributes.shulker_level": "潜影盒是%1$s的", "create.item_attributes.shulker_level": "潜影盒是%1$s的",
"create.item_attributes.shulker_level.inverted": "潜影盒不是%1$s的", "create.item_attributes.shulker_level.inverted": "潜影盒不是%1$s的",
"create.item_attributes.shulker_level.full": "满", "create.item_attributes.shulker_level.full": "满",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "恰好", "create.schedule.condition.threshold.equal": "恰好",
"create.schedule.condition.threshold.x_units_of_item": "%1$s%2$s%3$s", "create.schedule.condition.threshold.x_units_of_item": "%1$s%2$s%3$s",
"create.schedule.condition.threshold.matching_content": "匹配内容", "create.schedule.condition.threshold.matching_content": "匹配内容",
"create.schedule.condition.threshold.anything": "任意物品",
"create.schedule.condition.threshold.item_measure": "物品度量", "create.schedule.condition.threshold.item_measure": "物品度量",
"create.schedule.condition.threshold.items": "个", "create.schedule.condition.threshold.items": "个",
"create.schedule.condition.threshold.stacks": "组", "create.schedule.condition.threshold.stacks": "组",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "货物:%1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "货物:%1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "参考物品", "create.schedule.condition.threshold.place_item": "参考物品",
"create.schedule.condition.threshold.place_item_2": "可以使用过滤器", "create.schedule.condition.threshold.place_item_2": "可以使用过滤器",
"create.schedule.condition.threshold.place_item_3": "留空以匹配任意物品",
"create.schedule.condition.fluid_threshold": "流体货物条件", "create.schedule.condition.fluid_threshold": "流体货物条件",
"create.schedule.condition.item_threshold": "物品货物条件", "create.schedule.condition.item_threshold": "物品货物条件",
"create.schedule.condition.redstone_link": "无线红石", "create.schedule.condition.redstone_link": "无线红石",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 6", "_": "Missing Localizations: 8",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1485,6 +1485,7 @@
"create.schedule.condition.threshold.equal": "剛好", "create.schedule.condition.threshold.equal": "剛好",
"create.schedule.condition.threshold.x_units_of_item": "%1$s%2$s %3$s", "create.schedule.condition.threshold.x_units_of_item": "%1$s%2$s %3$s",
"create.schedule.condition.threshold.matching_content": "比對內容", "create.schedule.condition.threshold.matching_content": "比對內容",
"create.schedule.condition.threshold.anything": "UNLOCALIZED: Anything",
"create.schedule.condition.threshold.item_measure": "物品單位", "create.schedule.condition.threshold.item_measure": "物品單位",
"create.schedule.condition.threshold.items": "個", "create.schedule.condition.threshold.items": "個",
"create.schedule.condition.threshold.stacks": "組", "create.schedule.condition.threshold.stacks": "組",
@ -1492,6 +1493,7 @@
"create.schedule.condition.threshold.status": "貨物:%1$s/%2$s %3$s", "create.schedule.condition.threshold.status": "貨物:%1$s/%2$s %3$s",
"create.schedule.condition.threshold.place_item": "參考物品", "create.schedule.condition.threshold.place_item": "參考物品",
"create.schedule.condition.threshold.place_item_2": "可以使用過濾器", "create.schedule.condition.threshold.place_item_2": "可以使用過濾器",
"create.schedule.condition.threshold.place_item_3": "UNLOCALIZED: Leave empty to match any",
"create.schedule.condition.fluid_threshold": "流體貨物條件", "create.schedule.condition.fluid_threshold": "流體貨物條件",
"create.schedule.condition.item_threshold": "物品貨物條件", "create.schedule.condition.item_threshold": "物品貨物條件",
"create.schedule.condition.redstone_link": "無線紅石連接", "create.schedule.condition.redstone_link": "無線紅石連接",

View file

@ -0,0 +1,10 @@
{
"replace": false,
"values": [
"minecraft:bee_nest",
"minecraft:vine",
"minecraft:moss_carpet",
"minecraft:shroomlight",
"minecraft:cocoa"
]
}

View file

@ -124,6 +124,7 @@ public class AllTags {
WINDMILL_SAILS, WINDMILL_SAILS,
WINDOWABLE, WINDOWABLE,
WRENCH_PICKUP, WRENCH_PICKUP,
TREE_ATTACHMENTS,
RELOCATION_NOT_SUPPORTED(FORGE), RELOCATION_NOT_SUPPORTED(FORGE),
WG_STONE(FORGE), WG_STONE(FORGE),
@ -414,6 +415,9 @@ public class AllTags {
Blocks.COMPARATOR, Blocks.OBSERVER, Blocks.REDSTONE_WALL_TORCH, Blocks.PISTON, Blocks.STICKY_PISTON, Blocks.COMPARATOR, Blocks.OBSERVER, Blocks.REDSTONE_WALL_TORCH, Blocks.PISTON, Blocks.STICKY_PISTON,
Blocks.TRIPWIRE, Blocks.TRIPWIRE_HOOK, Blocks.DAYLIGHT_DETECTOR, Blocks.TARGET, Blocks.HOPPER); Blocks.TRIPWIRE, Blocks.TRIPWIRE_HOOK, Blocks.DAYLIGHT_DETECTOR, Blocks.TARGET, Blocks.HOPPER);
AllBlockTags.TREE_ATTACHMENTS.add(Blocks.BEE_NEST, Blocks.VINE, Blocks.MOSS_CARPET, Blocks.SHROOMLIGHT,
Blocks.COCOA);
AllBlockTags.ORE_OVERRIDE_STONE.includeAll(BlockTags.STONE_ORE_REPLACEABLES); AllBlockTags.ORE_OVERRIDE_STONE.includeAll(BlockTags.STONE_ORE_REPLACEABLES);
registerCompat(); registerCompat();

View file

@ -66,7 +66,7 @@ public class Create {
public static final String ID = "create"; public static final String ID = "create";
public static final String NAME = "Create"; public static final String NAME = "Create";
public static final String VERSION = "0.5d"; public static final String VERSION = "0.5e";
public static final Logger LOGGER = LogManager.getLogger(); public static final Logger LOGGER = LogManager.getLogger();

View file

@ -186,6 +186,7 @@ public class CreateJEI implements IModPlugin {
.build("automatic_shapeless", MixingCategory::autoShapeless), .build("automatic_shapeless", MixingCategory::autoShapeless),
brewing = builder(BasinRecipe.class) brewing = builder(BasinRecipe.class)
.enableWhen(c -> c.allowBrewingInMixer)
.addRecipes(() -> PotionMixingRecipes.ALL) .addRecipes(() -> PotionMixingRecipes.ALL)
.catalyst(AllBlocks.MECHANICAL_MIXER::get) .catalyst(AllBlocks.MECHANICAL_MIXER::get)
.catalyst(AllBlocks.BASIN::get) .catalyst(AllBlocks.BASIN::get)

View file

@ -3,23 +3,19 @@ package com.simibubi.create.content.contraptions.components.actors;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.NbtUtils;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.GameRules; import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.block.AirBlock; import net.minecraft.world.level.block.AirBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity { public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity {
@ -40,7 +36,7 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity {
if (destroyProgress == -1) if (destroyProgress == -1)
destroyNextTick(); destroyNextTick();
} }
@Override @Override
public void lazyTick() { public void lazyTick() {
super.lazyTick(); super.lazyTick();
@ -93,9 +89,9 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity {
return; return;
if (getSpeed() == 0) if (getSpeed() == 0)
return; return;
breakingPos = getBreakingPos(); breakingPos = getBreakingPos();
if (ticksUntilNextProgress < 0) if (ticksUntilNextProgress < 0)
return; return;
if (ticksUntilNextProgress-- > 0) if (ticksUntilNextProgress-- > 0)
@ -114,7 +110,8 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity {
float breakSpeed = getBreakSpeed(); float breakSpeed = getBreakSpeed();
destroyProgress += Mth.clamp((int) (breakSpeed / blockHardness), 1, 10 - destroyProgress); destroyProgress += Mth.clamp((int) (breakSpeed / blockHardness), 1, 10 - destroyProgress);
level.playSound(null, worldPosition, stateToBreak.getSoundType().getHitSound(), SoundSource.NEUTRAL, .25f, 1); level.playSound(null, worldPosition, stateToBreak.getSoundType()
.getHitSound(), SoundSource.NEUTRAL, .25f, 1);
if (destroyProgress >= 10) { if (destroyProgress >= 10) {
onBlockBroken(stateToBreak); onBlockBroken(stateToBreak);
@ -133,28 +130,26 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity {
} }
public static boolean isBreakable(BlockState stateToBreak, float blockHardness) { public static boolean isBreakable(BlockState stateToBreak, float blockHardness) {
return !(stateToBreak.getMaterial().isLiquid() || stateToBreak.getBlock() instanceof AirBlock return !(stateToBreak.getMaterial()
|| blockHardness == -1); .isLiquid() || stateToBreak.getBlock() instanceof AirBlock || blockHardness == -1);
} }
public void onBlockBroken(BlockState stateToBreak) { public void onBlockBroken(BlockState stateToBreak) {
FluidState FluidState = level.getFluidState(breakingPos);
level.levelEvent(2001, breakingPos, Block.getId(stateToBreak));
BlockEntity tileentity = stateToBreak.hasBlockEntity() ? level.getBlockEntity(breakingPos) : null;
Vec3 vec = VecHelper.offsetRandomly(VecHelper.getCenterOf(breakingPos), level.random, .125f); Vec3 vec = VecHelper.offsetRandomly(VecHelper.getCenterOf(breakingPos), level.random, .125f);
BlockHelper.destroyBlock(level, breakingPos, 1f, (stack) -> {
Block.getDrops(stateToBreak, (ServerLevel) level, breakingPos, tileentity).forEach((stack) -> { if (stack.isEmpty())
if (!stack.isEmpty() && level.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS) return;
&& !level.restoringBlockSnapshots) { if (!level.getGameRules()
ItemEntity itementity = new ItemEntity(level, vec.x, vec.y, vec.z, stack); .getBoolean(GameRules.RULE_DOBLOCKDROPS))
itementity.setDefaultPickUpDelay(); return;
itementity.setDeltaMovement(Vec3.ZERO); if (level.restoringBlockSnapshots)
level.addFreshEntity(itementity); return;
}
ItemEntity itementity = new ItemEntity(level, vec.x, vec.y, vec.z, stack);
itementity.setDefaultPickUpDelay();
itementity.setDeltaMovement(Vec3.ZERO);
level.addFreshEntity(itementity);
}); });
if (level instanceof ServerLevel)
stateToBreak.spawnAfterBreak((ServerLevel) level, breakingPos, ItemStack.EMPTY);
level.setBlock(breakingPos, FluidState.createLegacyBlock(), 3);
} }
protected float getBreakSpeed() { protected float getBreakSpeed() {

View file

@ -58,6 +58,8 @@ public class BlockBreakingMovementBehaviour implements MovementBehaviour {
continue; continue;
if (entity instanceof AbstractContraptionEntity) if (entity instanceof AbstractContraptionEntity)
continue; continue;
if (entity.isPassengerOfSameVehicle(context.contraption.entity))
continue;
if (entity instanceof AbstractMinecart) if (entity instanceof AbstractMinecart)
for (Entity passenger : entity.getIndirectPassengers()) for (Entity passenger : entity.getIndirectPassengers())
if (passenger instanceof AbstractContraptionEntity if (passenger instanceof AbstractContraptionEntity

View file

@ -104,7 +104,8 @@ public class HarvesterMovementBehaviour implements MovementBehaviour {
dropItem(context, stack); dropItem(context, stack);
}); });
world.setBlockAndUpdate(pos, cutCrop(world, pos, stateVisited)); BlockState cutCrop = cutCrop(world, pos, stateVisited);
world.setBlockAndUpdate(pos, cutCrop.canSurvive(world, pos) ? cutCrop : Blocks.AIR.defaultBlockState());
} }
public boolean isValidCrop(Level world, BlockPos pos, BlockState state) { public boolean isValidCrop(Level world, BlockPos pos, BlockState state) {

View file

@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.actors;
import com.simibubi.create.content.contraptions.components.actors.PloughBlock.PloughFakePlayer; import com.simibubi.create.content.contraptions.components.actors.PloughBlock.PloughFakePlayer;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.content.logistics.trains.ITrackBlock;
import com.simibubi.create.content.logistics.trains.track.FakeTrackBlock; import com.simibubi.create.content.logistics.trains.track.FakeTrackBlock;
import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
@ -105,6 +106,8 @@ public class PloughMovementBehaviour extends BlockBreakingMovementBehaviour {
return false; return false;
if (state.getBlock() instanceof NetherPortalBlock) if (state.getBlock() instanceof NetherPortalBlock)
return false; return false;
if (state.getBlock() instanceof ITrackBlock)
return true;
if (state.getBlock() instanceof FakeTrackBlock) if (state.getBlock() instanceof FakeTrackBlock)
return false; return false;
return state.getCollisionShape(world, breakingPos) return state.getCollisionShape(world, breakingPos)

View file

@ -100,7 +100,8 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock
if (crafter != null) { if (crafter != null) {
if (crafter.covered) if (crafter.covered)
Block.popResource(worldIn, pos, AllItems.CRAFTER_SLOT_COVER.asStack()); Block.popResource(worldIn, pos, AllItems.CRAFTER_SLOT_COVER.asStack());
crafter.ejectWholeGrid(); if (!isMoving)
crafter.ejectWholeGrid();
} }
for (Direction direction : Iterate.directions) { for (Direction direction : Iterate.directions) {

View file

@ -7,6 +7,7 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock;
import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Couple;
@ -19,11 +20,14 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.CollisionContext;
@ -31,10 +35,12 @@ import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
public class HandCrankBlock extends DirectionalKineticBlock implements ITE<HandCrankTileEntity> { public class HandCrankBlock extends DirectionalKineticBlock
implements ITE<HandCrankTileEntity>, ProperWaterloggedBlock {
public HandCrankBlock(Properties properties) { public HandCrankBlock(Properties properties) {
super(properties); super(properties);
registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false));
} }
@Override @Override
@ -42,6 +48,11 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE<HandC
return AllShapes.CRANK.get(state.getValue(FACING)); return AllShapes.CRANK.get(state.getValue(FACING));
} }
@Override
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) {
super.createBlockStateDefinition(builder.add(WATERLOGGED));
}
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public PartialModel getRenderedHandle() { public PartialModel getRenderedHandle() {
return AllBlockPartials.HAND_CRANK_HANDLE; return AllBlockPartials.HAND_CRANK_HANDLE;
@ -61,21 +72,22 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE<HandC
BlockHitResult hit) { BlockHitResult hit) {
withTileEntityDo(worldIn, pos, te -> te.turn(player.isShiftKeyDown())); withTileEntityDo(worldIn, pos, te -> te.turn(player.isShiftKeyDown()));
player.causeFoodExhaustion(getRotationSpeed() * AllConfigs.SERVER.kinetics.crankHungerMultiplier.getF()); player.causeFoodExhaustion(getRotationSpeed() * AllConfigs.SERVER.kinetics.crankHungerMultiplier.getF());
if (player.getFoodData() if (player.getFoodData()
.getFoodLevel() == 0) .getFoodLevel() == 0)
AllAdvancements.HAND_CRANK.awardTo(player); AllAdvancements.HAND_CRANK.awardTo(player);
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
@Override @Override
public BlockState getStateForPlacement(BlockPlaceContext context) { public BlockState getStateForPlacement(BlockPlaceContext context) {
Direction preferred = getPreferredFacing(context); Direction preferred = getPreferredFacing(context);
BlockState defaultBlockState = withWater(defaultBlockState(), context);
if (preferred == null || (context.getPlayer() != null && context.getPlayer() if (preferred == null || (context.getPlayer() != null && context.getPlayer()
.isShiftKeyDown())) .isShiftKeyDown()))
return defaultBlockState().setValue(FACING, context.getClickedFace()); return defaultBlockState.setValue(FACING, context.getClickedFace());
return defaultBlockState().setValue(FACING, preferred.getOpposite()); return defaultBlockState.setValue(FACING, preferred.getOpposite());
} }
@Override @Override
@ -102,6 +114,18 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE<HandC
} }
} }
} }
@Override
public BlockState updateShape(BlockState pState, Direction pDirection, BlockState pNeighborState,
LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pNeighborPos) {
updateWater(pLevel, pState, pCurrentPos);
return pState;
}
@Override
public FluidState getFluidState(BlockState pState) {
return fluidState(pState);
}
@Override @Override
public boolean hasShaftTowards(LevelReader world, BlockPos pos, BlockState state, Direction face) { public boolean hasShaftTowards(LevelReader world, BlockPos pos, BlockState state, Direction face) {
@ -129,7 +153,7 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE<HandC
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
return false; return false;
} }
public static Couple<Integer> getSpeedRange() { public static Couple<Integer> getSpeedRange() {
return Couple.create(32, 32); return Couple.create(32, 32);
} }

View file

@ -124,8 +124,8 @@ public class DeployerTileEntity extends KineticTileEntity {
private void initHandler() { private void initHandler() {
if (invHandler != null) if (invHandler != null)
return; return;
if (!level.isClientSide) { if (level instanceof ServerLevel sLevel) {
player = new DeployerFakePlayer((ServerLevel) level); player = new DeployerFakePlayer(sLevel);
if (deferredInventoryList != null) { if (deferredInventoryList != null) {
player.getInventory() player.getInventory()
.load(deferredInventoryList); .load(deferredInventoryList);

View file

@ -218,10 +218,18 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
protected List<Recipe<?>> getMatchingRecipes() { protected List<Recipe<?>> getMatchingRecipes() {
List<Recipe<?>> matchingRecipes = super.getMatchingRecipes(); List<Recipe<?>> matchingRecipes = super.getMatchingRecipes();
if (!AllConfigs.SERVER.recipes.allowBrewingInMixer.get())
return matchingRecipes;
Optional<BasinTileEntity> basin = getBasin(); Optional<BasinTileEntity> basin = getBasin();
if (!basin.isPresent()) if (!basin.isPresent())
return matchingRecipes; return matchingRecipes;
IItemHandler availableItems = basin.get()
BasinTileEntity basinTileEntity = basin.get();
if (basin.isEmpty())
return matchingRecipes;
IItemHandler availableItems = basinTileEntity
.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) .getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
.orElse(null); .orElse(null);
if (availableItems == null) if (availableItems == null)

View file

@ -478,8 +478,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
public static boolean isSawable(BlockState stateToBreak) { public static boolean isSawable(BlockState stateToBreak) {
if (stateToBreak.is(BlockTags.SAPLINGS)) if (stateToBreak.is(BlockTags.SAPLINGS))
return false; return false;
if (stateToBreak.is(BlockTags.LOGS) || AllTags.AllBlockTags.SLIMY_LOGS.matches(stateToBreak) if (TreeCutter.isLog(stateToBreak) || (stateToBreak.is(BlockTags.LEAVES)))
|| (stateToBreak.is(BlockTags.LEAVES)))
return true; return true;
Block block = stateToBreak.getBlock(); Block block = stateToBreak.getBlock();
if (block instanceof BambooBlock) if (block instanceof BambooBlock)

View file

@ -33,6 +33,7 @@ import com.simibubi.create.content.curiosities.deco.SlidingDoorBlock;
import com.simibubi.create.content.logistics.trains.entity.CarriageContraption; import com.simibubi.create.content.logistics.trains.entity.CarriageContraption;
import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity;
import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.entity.Train;
import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.collision.Matrix3d; import com.simibubi.create.foundation.collision.Matrix3d;
import com.simibubi.create.foundation.mixin.accessor.ServerLevelAccessor; import com.simibubi.create.foundation.mixin.accessor.ServerLevelAccessor;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
@ -139,6 +140,10 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
public boolean collisionEnabled() { public boolean collisionEnabled() {
return true; return true;
} }
public void registerColliding(Entity collidingEntity) {
collidingEntities.put(collidingEntity, new MutableInt());
}
public void addSittingPassenger(Entity passenger, int seatIndex) { public void addSittingPassenger(Entity passenger, int seatIndex) {
for (Entity entity : getPassengers()) { for (Entity entity : getPassengers()) {
@ -177,16 +182,28 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
contraption.getSeatMapping() contraption.getSeatMapping()
.remove(passenger.getUUID()); .remove(passenger.getUUID());
AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this),
new ContraptionSeatMappingPacket(getId(), contraption.getSeatMapping())); new ContraptionSeatMappingPacket(getId(), contraption.getSeatMapping(), passenger.getId()));
} }
@Override @Override
public Vec3 getDismountLocationForPassenger(LivingEntity pLivingEntity) { public Vec3 getDismountLocationForPassenger(LivingEntity entityLiving) {
Vec3 loc = super.getDismountLocationForPassenger(pLivingEntity); Vec3 position = super.getDismountLocationForPassenger(entityLiving);
CompoundTag data = pLivingEntity.getPersistentData(); CompoundTag data = entityLiving.getPersistentData();
if (!data.contains("ContraptionDismountLocation")) if (!data.contains("ContraptionDismountLocation"))
return loc; return position;
return VecHelper.readNBT(data.getList("ContraptionDismountLocation", Tag.TAG_DOUBLE));
position = VecHelper.readNBT(data.getList("ContraptionDismountLocation", Tag.TAG_DOUBLE));
data.remove("ContraptionDismountLocation");
entityLiving.setOnGround(false);
if (!data.contains("ContraptionMountLocation"))
return position;
Vec3 prevPosition = VecHelper.readNBT(data.getList("ContraptionMountLocation", Tag.TAG_DOUBLE));
data.remove("ContraptionMountLocation");
if (entityLiving instanceof Player player && !prevPosition.closerThan(position, 5000))
AllAdvancements.LONG_TRAVEL.awardTo(player);
return position;
} }
@Override @Override
@ -200,7 +217,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
transformedVector.y + SeatEntity.getCustomEntitySeatOffset(passenger) - 1 / 8f, transformedVector.z); transformedVector.y + SeatEntity.getCustomEntitySeatOffset(passenger) - 1 / 8f, transformedVector.z);
} }
protected Vec3 getPassengerPosition(Entity passenger, float partialTicks) { public Vec3 getPassengerPosition(Entity passenger, float partialTicks) {
UUID id = passenger.getUUID(); UUID id = passenger.getUUID();
if (passenger instanceof OrientedContraptionEntity) { if (passenger instanceof OrientedContraptionEntity) {
BlockPos localPos = contraption.getBearingPosOf(id); BlockPos localPos = contraption.getBearingPosOf(id);
@ -300,17 +317,27 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
} }
public Vec3 toGlobalVector(Vec3 localVec, float partialTicks) { public Vec3 toGlobalVector(Vec3 localVec, float partialTicks) {
return toGlobalVector(localVec, partialTicks, false);
}
public Vec3 toGlobalVector(Vec3 localVec, float partialTicks, boolean prevAnchor) {
Vec3 anchor = prevAnchor ? getPrevAnchorVec() : getAnchorVec();
Vec3 rotationOffset = VecHelper.getCenterOf(BlockPos.ZERO); Vec3 rotationOffset = VecHelper.getCenterOf(BlockPos.ZERO);
localVec = localVec.subtract(rotationOffset); localVec = localVec.subtract(rotationOffset);
localVec = applyRotation(localVec, partialTicks); localVec = applyRotation(localVec, partialTicks);
localVec = localVec.add(rotationOffset) localVec = localVec.add(rotationOffset)
.add(getAnchorVec()); .add(anchor);
return localVec; return localVec;
} }
public Vec3 toLocalVector(Vec3 localVec, float partialTicks) {
return toLocalVector(localVec, partialTicks, false);
}
public Vec3 toLocalVector(Vec3 globalVec, float partialTicks) { public Vec3 toLocalVector(Vec3 globalVec, float partialTicks, boolean prevAnchor) {
Vec3 anchor = prevAnchor ? getPrevAnchorVec() : getAnchorVec();
Vec3 rotationOffset = VecHelper.getCenterOf(BlockPos.ZERO); Vec3 rotationOffset = VecHelper.getCenterOf(BlockPos.ZERO);
globalVec = globalVec.subtract(getAnchorVec()) globalVec = globalVec.subtract(anchor)
.subtract(rotationOffset); .subtract(rotationOffset);
globalVec = reverseRotation(globalVec, partialTicks); globalVec = reverseRotation(globalVec, partialTicks);
globalVec = globalVec.add(rotationOffset); globalVec = globalVec.add(rotationOffset);
@ -519,6 +546,10 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
public Vec3 getAnchorVec() { public Vec3 getAnchorVec() {
return position(); return position();
} }
public Vec3 getPrevAnchorVec() {
return getPrevPositionVec();
}
public float getYawOffset() { public float getYawOffset() {
return 0; return 0;
@ -792,9 +823,11 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
public Vec3 getContactPointMotion(Vec3 globalContactPoint) { public Vec3 getContactPointMotion(Vec3 globalContactPoint) {
if (prevPosInvalid) if (prevPosInvalid)
return Vec3.ZERO; return Vec3.ZERO;
Vec3 contactPoint = toGlobalVector(toLocalVector(globalContactPoint, 0), 1);
return contactPoint.subtract(globalContactPoint) Vec3 contactPoint = toGlobalVector(toLocalVector(globalContactPoint, 0, true), 1, true);
.add(position().subtract(getPrevPositionVec())); Vec3 contraptionLocalMovement = contactPoint.subtract(globalContactPoint);
Vec3 contraptionAnchorMovement = position().subtract(getPrevPositionVec());
return contraptionLocalMovement.add(contraptionAnchorMovement);
} }
public boolean canCollideWith(Entity e) { public boolean canCollideWith(Entity e) {

View file

@ -133,6 +133,7 @@ public abstract class Contraption {
public BlockPos anchor; public BlockPos anchor;
public boolean stalled; public boolean stalled;
public boolean hasUniversalCreativeCrate; public boolean hasUniversalCreativeCrate;
public boolean disassembled;
protected Map<BlockPos, StructureBlockInfo> blocks; protected Map<BlockPos, StructureBlockInfo> blocks;
protected List<MutablePair<StructureBlockInfo, MovementContext>> actors; protected List<MutablePair<StructureBlockInfo, MovementContext>> actors;
@ -1001,6 +1002,10 @@ public abstract class Contraption {
} }
public void addBlocksToWorld(Level world, StructureTransform transform) { public void addBlocksToWorld(Level world, StructureTransform transform) {
if (disassembled)
return;
disassembled = true;
for (boolean nonBrittles : Iterate.trueAndFalse) { for (boolean nonBrittles : Iterate.trueAndFalse) {
for (StructureBlockInfo block : blocks.values()) { for (StructureBlockInfo block : blocks.values()) {
if (nonBrittles == BlockMovementChecks.isBrittle(block.state)) if (nonBrittles == BlockMovementChecks.isBrittle(block.state))

View file

@ -7,7 +7,6 @@ import java.util.List;
import org.apache.commons.lang3.mutable.MutableBoolean; import org.apache.commons.lang3.mutable.MutableBoolean;
import org.apache.commons.lang3.mutable.MutableFloat; import org.apache.commons.lang3.mutable.MutableFloat;
import org.apache.commons.lang3.mutable.MutableInt;
import org.apache.commons.lang3.mutable.MutableObject; import org.apache.commons.lang3.mutable.MutableObject;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
@ -33,6 +32,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.Axis;
import net.minecraft.core.Direction.AxisDirection; import net.minecraft.core.Direction.AxisDirection;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
@ -88,11 +88,12 @@ public class ContraptionCollider {
if (playerType == PlayerType.REMOTE) if (playerType == PlayerType.REMOTE)
continue; continue;
entity.getSelfAndPassengers().forEach(e -> { entity.getSelfAndPassengers()
if (e instanceof ServerPlayer) .forEach(e -> {
((ServerPlayer) e).connection.aboveGroundTickCount = 0; if (e instanceof ServerPlayer)
}); ((ServerPlayer) e).connection.aboveGroundTickCount = 0;
});
if (playerType == PlayerType.SERVER) if (playerType == PlayerType.SERVER)
continue; continue;
@ -329,50 +330,15 @@ public class ContraptionCollider {
entityPosition.z + allowedMovement.z); entityPosition.z + allowedMovement.z);
entityPosition = entity.position(); entityPosition = entity.position();
if (contraptionEntity instanceof CarriageContraptionEntity cce && entity.isOnGround() entityMotion =
&& !(entity instanceof ItemEntity) && cce.nonDamageTicks == 0 handleDamageFromTrain(world, contraptionEntity, contraptionMotion, entity, entityMotion, playerType);
&& AllConfigs.SERVER.trains.trainsCauseDamage.get()) {
Vec3 diffMotion = contraptionMotion.subtract(entity.getDeltaMovement());
if (diffMotion.length() > 0.35f && contraptionMotion.length() > 0.35f) {
EntityDamageSource pSource = new EntityDamageSource("create.run_over", contraptionEntity);
double damage = diffMotion.length();
if (entity.getClassification(false) == MobCategory.MONSTER)
damage *= 2;
if (!(entity instanceof Player p) || !p.isCreative() && !p.isSpectator()) {
if (playerType == PlayerType.CLIENT) {
AllPackets.channel
.sendToServer(new TrainCollisionPacket((int) (damage * 16), contraptionEntity.getId()));
world.playSound((Player) entity, entity.blockPosition(), SoundEvents.PLAYER_ATTACK_CRIT,
SoundSource.NEUTRAL, 1, .75f);
} else {
entity.hurt(pSource, (int) (damage * 16));
world.playSound(null, entity.blockPosition(), SoundEvents.PLAYER_ATTACK_CRIT,
SoundSource.NEUTRAL, 1, .75f);
if (!entity.isAlive())
contraptionEntity.getControllingPlayer()
.map(world::getPlayerByUUID)
.ifPresent(AllAdvancements.TRAIN_ROADKILL::awardTo);
}
Vec3 added = entityMotion.add(contraptionMotion.multiply(1, 0, 1)
.normalize()
.add(0, .25, 0)
.scale(damage * 4))
.add(diffMotion);
entityMotion = VecHelper.clamp(added, 3);
}
}
}
entity.hurtMarked = true; entity.hurtMarked = true;
Vec3 contactPointMotion = Vec3.ZERO; Vec3 contactPointMotion = Vec3.ZERO;
if (surfaceCollision.isTrue()) { if (surfaceCollision.isTrue()) {
contraptionEntity.registerColliding(entity);
entity.fallDistance = 0; entity.fallDistance = 0;
contraptionEntity.collidingEntities.put(entity, new MutableInt(0));
boolean canWalk = bounce != 0 || slide == 0; boolean canWalk = bounce != 0 || slide == 0;
if (canWalk || !rotation.hasVerticalRotation()) { if (canWalk || !rotation.hasVerticalRotation()) {
if (canWalk) if (canWalk)
@ -401,6 +367,64 @@ public class ContraptionCollider {
} }
private static Vec3 handleDamageFromTrain(Level world, AbstractContraptionEntity contraptionEntity,
Vec3 contraptionMotion, Entity entity, Vec3 entityMotion, PlayerType playerType) {
if (!(contraptionEntity instanceof CarriageContraptionEntity cce))
return entityMotion;
if (!entity.isOnGround())
return entityMotion;
CompoundTag persistentData = entity.getPersistentData();
if (persistentData.contains("ContraptionGrounded")) {
persistentData.remove("ContraptionGrounded");
return entityMotion;
}
if (cce.collidingEntities.containsKey(entity))
return entityMotion;
if (entity instanceof ItemEntity)
return entityMotion;
if (cce.nonDamageTicks != 0)
return entityMotion;
if (!AllConfigs.SERVER.trains.trainsCauseDamage.get())
return entityMotion;
Vec3 diffMotion = contraptionMotion.subtract(entity.getDeltaMovement());
if (diffMotion.length() <= 0.35f || contraptionMotion.length() <= 0.35f)
return entityMotion;
EntityDamageSource pSource = new EntityDamageSource("create.run_over", contraptionEntity);
double damage = diffMotion.length();
if (entity.getClassification(false) == MobCategory.MONSTER)
damage *= 2;
if (entity instanceof Player p && (p.isCreative() || p.isSpectator()))
return entityMotion;
if (playerType == PlayerType.CLIENT) {
AllPackets.channel.sendToServer(new TrainCollisionPacket((int) (damage * 16), contraptionEntity.getId()));
world.playSound((Player) entity, entity.blockPosition(), SoundEvents.PLAYER_ATTACK_CRIT,
SoundSource.NEUTRAL, 1, .75f);
} else {
entity.hurt(pSource, (int) (damage * 16));
world.playSound(null, entity.blockPosition(), SoundEvents.PLAYER_ATTACK_CRIT, SoundSource.NEUTRAL, 1, .75f);
if (!entity.isAlive())
contraptionEntity.getControllingPlayer()
.map(world::getPlayerByUUID)
.ifPresent(AllAdvancements.TRAIN_ROADKILL::awardTo);
}
Vec3 added = entityMotion.add(contraptionMotion.multiply(1, 0, 1)
.normalize()
.add(0, .25, 0)
.scale(damage * 4))
.add(diffMotion);
return VecHelper.clamp(added, 3);
}
static boolean bounceEntity(Entity entity, Vec3 normal, AbstractContraptionEntity contraption, double factor) { static boolean bounceEntity(Entity entity, Vec3 normal, AbstractContraptionEntity contraption, double factor) {
if (factor == 0) if (factor == 0)
return false; return false;
@ -473,10 +497,10 @@ public class ContraptionCollider {
boolean flag = p_20273_.x != vec3.x; boolean flag = p_20273_.x != vec3.x;
boolean flag1 = p_20273_.y != vec3.y; boolean flag1 = p_20273_.y != vec3.y;
boolean flag2 = p_20273_.z != vec3.z; boolean flag2 = p_20273_.z != vec3.z;
boolean flag3 = e.isOnGround() || flag1 && p_20273_.y < 0.0D; boolean flag3 = flag1 && p_20273_.y < 0.0D;
if (e.getStepHeight() > 0.0F && flag3 && (flag || flag2)) { if (e.getStepHeight() > 0.0F && flag3 && (flag || flag2)) {
Vec3 vec31 = Vec3 vec31 = collideBoundingBox(e, new Vec3(p_20273_.x, (double) e.getStepHeight(), p_20273_.z), aabb,
collideBoundingBox(e, new Vec3(p_20273_.x, (double) e.getStepHeight(), p_20273_.z), aabb, e.level, list); e.level, list);
Vec3 vec32 = collideBoundingBox(e, new Vec3(0.0D, (double) e.getStepHeight(), 0.0D), Vec3 vec32 = collideBoundingBox(e, new Vec3(0.0D, (double) e.getStepHeight(), 0.0D),
aabb.expandTowards(p_20273_.x, 0.0D, p_20273_.z), e.level, list); aabb.expandTowards(p_20273_.x, 0.0D, p_20273_.z), e.level, list);
if (vec32.y < (double) e.getStepHeight()) { if (vec32.y < (double) e.getStepHeight()) {

View file

@ -7,7 +7,6 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.WorldAttached; import com.simibubi.create.foundation.utility.WorldAttached;
@ -17,7 +16,6 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.Tag;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
@ -65,24 +63,18 @@ public class ContraptionHandler {
} }
public static void entitiesWhoJustDismountedGetSentToTheRightLocation(LivingEntity entityLiving, Level world) { public static void entitiesWhoJustDismountedGetSentToTheRightLocation(LivingEntity entityLiving, Level world) {
if (world.isClientSide) if (!world.isClientSide)
return; return;
CompoundTag data = entityLiving.getPersistentData(); CompoundTag data = entityLiving.getPersistentData();
if (!data.contains("ContraptionDismountLocation")) if (!data.contains("ContraptionDismountLocation"))
return; return;
Vec3 position = VecHelper.readNBT(data.getList("ContraptionDismountLocation", Tag.TAG_DOUBLE)); Vec3 position = VecHelper.readNBT(data.getList("ContraptionDismountLocation", Tag.TAG_DOUBLE));
if (entityLiving.getVehicle() == null) if (entityLiving.getVehicle() == null)
entityLiving.teleportTo(position.x, position.y, position.z); entityLiving.absMoveTo(position.x, position.y, position.z, entityLiving.getYRot(), entityLiving.getXRot());
data.remove("ContraptionDismountLocation"); data.remove("ContraptionDismountLocation");
entityLiving.setOnGround(false); entityLiving.setOnGround(false);
if (!data.contains("ContraptionMountLocation"))
return;
Vec3 prevPosition = VecHelper.readNBT(data.getList("ContraptionMountLocation", Tag.TAG_DOUBLE));
data.remove("ContraptionMountLocation");
if (entityLiving instanceof Player player && !prevPosition.closerThan(position, 5000))
AllAdvancements.LONG_TRAVEL.awardTo(player);
} }
} }

View file

@ -1,6 +1,7 @@
package com.simibubi.create.content.contraptions.components.structureMovement; package com.simibubi.create.content.contraptions.components.structureMovement;
import java.util.List; import java.lang.ref.WeakReference;
import java.util.Collection;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -86,10 +87,19 @@ public class ContraptionHandlerClient {
Vec3 origin = rayInputs.getFirst(); Vec3 origin = rayInputs.getFirst();
Vec3 target = rayInputs.getSecond(); Vec3 target = rayInputs.getSecond();
AABB aabb = new AABB(origin, target).inflate(16); AABB aabb = new AABB(origin, target).inflate(16);
List<AbstractContraptionEntity> intersectingContraptions =
mc.level.getEntitiesOfClass(AbstractContraptionEntity.class, aabb);
for (AbstractContraptionEntity contraptionEntity : intersectingContraptions) { Collection<WeakReference<AbstractContraptionEntity>> contraptions =
ContraptionHandler.loadedContraptions.get(mc.level)
.values();
for (WeakReference<AbstractContraptionEntity> ref : contraptions) {
AbstractContraptionEntity contraptionEntity = ref.get();
if (contraptionEntity == null)
continue;
if (!contraptionEntity.getBoundingBox()
.intersects(aabb))
continue;
BlockHitResult rayTraceResult = rayTraceContraption(origin, target, contraptionEntity); BlockHitResult rayTraceResult = rayTraceContraption(origin, target, contraptionEntity);
if (rayTraceResult == null) if (rayTraceResult == null)
continue; continue;

View file

@ -493,7 +493,14 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity {
@Override @Override
public Vec3 getAnchorVec() { public Vec3 getAnchorVec() {
return new Vec3(getX() - .5, getY(), getZ() - .5); Vec3 anchorVec = super.getAnchorVec();
return anchorVec.subtract(.5, 0, .5);
}
@Override
public Vec3 getPrevAnchorVec() {
Vec3 prevAnchorVec = super.getPrevAnchorVec();
return prevAnchorVec.subtract(.5, 0, .5);
} }
@Override @Override

View file

@ -5,12 +5,17 @@ import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.apache.commons.lang3.tuple.MutablePair;
import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams; import com.google.common.io.ByteStreams;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.AllMovementBehaviours;
import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceMovement;
import com.simibubi.create.content.contraptions.components.deployer.DeployerFakePlayer; import com.simibubi.create.content.contraptions.components.deployer.DeployerFakePlayer;
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; 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.Contraption;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity;
import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.config.ContraptionMovementSetting; import com.simibubi.create.foundation.config.ContraptionMovementSetting;
@ -41,6 +46,7 @@ import net.minecraft.world.level.block.BaseRailBlock;
import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.block.DispenserBlock;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.RailShape; import net.minecraft.world.level.block.state.properties.RailShape;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo;
import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.Material;
import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
@ -218,11 +224,13 @@ public class MinecartContraptionItem extends Item {
List<Entity> passengers = cart.getPassengers(); List<Entity> passengers = cart.getPassengers();
if (passengers.isEmpty() || !(passengers.get(0) instanceof OrientedContraptionEntity)) if (passengers.isEmpty() || !(passengers.get(0) instanceof OrientedContraptionEntity))
return; return;
OrientedContraptionEntity contraption = (OrientedContraptionEntity) passengers.get(0); OrientedContraptionEntity oce = (OrientedContraptionEntity) passengers.get(0);
Contraption contraption = oce.getContraption();
if(ContraptionMovementSetting.isNoPickup(contraption.getContraption().getBlocks().values())) { if (ContraptionMovementSetting.isNoPickup(contraption.getBlocks()
.values())) {
player.displayClientMessage(Lang.translateDirect("contraption.minecart_contraption_illegal_pickup") player.displayClientMessage(Lang.translateDirect("contraption.minecart_contraption_illegal_pickup")
.withStyle(ChatFormatting.RED), true); .withStyle(ChatFormatting.RED), true);
return; return;
} }
@ -232,7 +240,13 @@ public class MinecartContraptionItem extends Item {
return; return;
} }
ItemStack generatedStack = create(type, contraption).setHoverName(entity.getCustomName()); contraption.stop(event.getWorld());
for (MutablePair<StructureBlockInfo, MovementContext> pair : contraption.getActors())
if (AllMovementBehaviours.getBehaviour(pair.left.state)instanceof PortableStorageInterfaceMovement psim)
psim.reset(pair.right);
ItemStack generatedStack = create(type, oce).setHoverName(entity.getCustomName());
try { try {
ByteArrayDataOutput dataOutput = ByteStreams.newDataOutput(); ByteArrayDataOutput dataOutput = ByteStreams.newDataOutput();
@ -249,13 +263,13 @@ public class MinecartContraptionItem extends Item {
return; return;
} }
if (contraption.getContraption() if (contraption.getBlocks()
.getBlocks()
.size() > 200) .size() > 200)
AllAdvancements.CART_PICKUP.awardTo(player); AllAdvancements.CART_PICKUP.awardTo(player);
player.getInventory().placeItemBackInInventory(generatedStack); player.getInventory()
contraption.discard(); .placeItemBackInInventory(generatedStack);
oce.discard();
entity.discard(); entity.discard();
event.setCancellationResult(InteractionResult.SUCCESS); event.setCancellationResult(InteractionResult.SUCCESS);
event.setCanceled(true); event.setCanceled(true);

View file

@ -11,6 +11,7 @@ import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.phys.AABB;
import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.ForgeMod;
import net.minecraftforge.network.NetworkEvent.Context; import net.minecraftforge.network.NetworkEvent.Context;
@ -54,7 +55,9 @@ public class ContraptionInteractionPacket extends SimplePacketBase {
if (!(entityByID instanceof AbstractContraptionEntity)) if (!(entityByID instanceof AbstractContraptionEntity))
return; return;
AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID; AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID;
double d = sender.getAttribute(ForgeMod.REACH_DISTANCE.get()).getValue() + 10; AABB bb = contraptionEntity.getBoundingBox();
double boundsExtra = Math.max(bb.getXsize(), bb.getYsize());
double d = sender.getAttribute(ForgeMod.REACH_DISTANCE.get()).getValue() + 10 + boundsExtra;
if (!sender.hasLineOfSight(entityByID)) if (!sender.hasLineOfSight(entityByID))
d -= 3; d -= 3;
d *= d; d *= d;

View file

@ -7,24 +7,33 @@ import java.util.function.Supplier;
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.foundation.networking.SimplePacketBase;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.network.NetworkEvent.Context; import net.minecraftforge.network.NetworkEvent.Context;
public class ContraptionSeatMappingPacket extends SimplePacketBase { public class ContraptionSeatMappingPacket extends SimplePacketBase {
private Map<UUID, Integer> mapping; private Map<UUID, Integer> mapping;
private int entityID; private int entityID;
private int dismountedID;
public ContraptionSeatMappingPacket(int entityID, Map<UUID, Integer> mapping) { public ContraptionSeatMappingPacket(int entityID, Map<UUID, Integer> mapping) {
this(entityID, mapping, -1);
}
public ContraptionSeatMappingPacket(int entityID, Map<UUID, Integer> mapping, int dismountedID) {
this.entityID = entityID; this.entityID = entityID;
this.mapping = mapping; this.mapping = mapping;
this.dismountedID = dismountedID;
} }
public ContraptionSeatMappingPacket(FriendlyByteBuf buffer) { public ContraptionSeatMappingPacket(FriendlyByteBuf buffer) {
entityID = buffer.readInt(); entityID = buffer.readInt();
dismountedID = buffer.readInt();
mapping = new HashMap<>(); mapping = new HashMap<>();
short size = buffer.readShort(); short size = buffer.readShort();
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
@ -34,6 +43,7 @@ public class ContraptionSeatMappingPacket extends SimplePacketBase {
@Override @Override
public void write(FriendlyByteBuf buffer) { public void write(FriendlyByteBuf buffer) {
buffer.writeInt(entityID); buffer.writeInt(entityID);
buffer.writeInt(dismountedID);
buffer.writeShort(mapping.size()); buffer.writeShort(mapping.size());
mapping.forEach((k, v) -> { mapping.forEach((k, v) -> {
buffer.writeUUID(k); buffer.writeUUID(k);
@ -49,6 +59,17 @@ public class ContraptionSeatMappingPacket extends SimplePacketBase {
if (!(entityByID instanceof AbstractContraptionEntity)) if (!(entityByID instanceof AbstractContraptionEntity))
return; return;
AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID; AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID;
if (dismountedID != -1) {
Entity dismountedByID = Minecraft.getInstance().level.getEntity(dismountedID);
if (Minecraft.getInstance().player != dismountedByID)
return;
Vec3 transformedVector = contraptionEntity.getPassengerPosition(dismountedByID, 1);
if (transformedVector != null)
dismountedByID.getPersistentData()
.put("ContraptionDismountLocation", VecHelper.writeNBT(transformedVector));
}
contraptionEntity.getContraption() contraptionEntity.getContraption()
.setSeatMapping(mapping); .setSeatMapping(mapping);
}); });

View file

@ -8,6 +8,7 @@ import java.util.Set;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.content.contraptions.fluids.PipeConnection.Flow; import com.simibubi.create.content.contraptions.fluids.PipeConnection.Flow;
import com.simibubi.create.content.contraptions.fluids.pipes.AxisPipeBlock; import com.simibubi.create.content.contraptions.fluids.pipes.AxisPipeBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock;
@ -173,7 +174,8 @@ public class FluidPropagator {
return false; return false;
if (VanillaFluidTargets.shouldPipesConnectTo(connectedState)) if (VanillaFluidTargets.shouldPipesConnectTo(connectedState))
return true; return true;
if (BlockHelper.hasBlockSolidSide(connectedState, reader, connectedPos, side.getOpposite())) if (BlockHelper.hasBlockSolidSide(connectedState, reader, connectedPos, side.getOpposite())
&& !AllBlockTags.FAN_TRANSPARENT.matches(connectedState))
return false; return false;
if (hasFluidCapability(reader, connectedPos, side.getOpposite())) if (hasFluidCapability(reader, connectedPos, side.getOpposite()))
return false; return false;

View file

@ -9,6 +9,7 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock;
import com.simibubi.create.content.contraptions.fluids.FluidPropagator; import com.simibubi.create.content.contraptions.fluids.FluidPropagator;
import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@ -16,26 +17,31 @@ import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.Axis;
import net.minecraft.network.protocol.game.DebugPackets; import net.minecraft.network.protocol.game.DebugPackets;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.ticks.TickPriority; import net.minecraft.world.ticks.TickPriority;
public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxisPipe, ITE<FluidValveTileEntity> { public class FluidValveBlock extends DirectionalAxisKineticBlock
implements IAxisPipe, ITE<FluidValveTileEntity>, ProperWaterloggedBlock {
public static final BooleanProperty ENABLED = BooleanProperty.create("enabled"); public static final BooleanProperty ENABLED = BooleanProperty.create("enabled");
public FluidValveBlock(Properties properties) { public FluidValveBlock(Properties properties) {
super(properties); super(properties);
registerDefaultState(defaultBlockState().setValue(ENABLED, false)); registerDefaultState(defaultBlockState().setValue(ENABLED, false)
.setValue(WATERLOGGED, false));
} }
@Override @Override
@ -46,7 +52,7 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi
@Override @Override
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) { protected void createBlockStateDefinition(Builder<Block, BlockState> builder) {
super.createBlockStateDefinition(builder.add(ENABLED)); super.createBlockStateDefinition(builder.add(ENABLED, WATERLOGGED));
} }
@Override @Override
@ -125,7 +131,7 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi
public void tick(BlockState state, ServerLevel world, BlockPos pos, Random r) { public void tick(BlockState state, ServerLevel world, BlockPos pos, Random r) {
FluidPropagator.propagateChangedPipe(world, pos, state); FluidPropagator.propagateChangedPipe(world, pos, state);
} }
@Override @Override
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
return false; return false;
@ -141,4 +147,21 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi
return AllTileEntities.FLUID_VALVE.get(); return AllTileEntities.FLUID_VALVE.get();
} }
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
return withWater(super.getStateForPlacement(context), context);
}
@Override
public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, LevelAccessor world,
BlockPos pos, BlockPos neighbourPos) {
updateWater(world, state, pos);
return state;
}
@Override
public FluidState getFluidState(BlockState state) {
return fluidState(state);
}
} }

View file

@ -8,6 +8,7 @@ import com.simibubi.create.content.contraptions.fluids.FluidPropagator;
import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.advancement.AdvancementBehaviour;
import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.VoxelShaper; import com.simibubi.create.foundation.utility.VoxelShaper;
@ -21,6 +22,7 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.FaceAttachedHorizontalDirectionalBlock; import net.minecraft.world.level.block.FaceAttachedHorizontalDirectionalBlock;
@ -28,22 +30,23 @@ import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.block.state.properties.AttachFace; import net.minecraft.world.level.block.state.properties.AttachFace;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.ticks.TickPriority; import net.minecraft.world.ticks.TickPriority;
public class SmartFluidPipeBlock extends FaceAttachedHorizontalDirectionalBlock public class SmartFluidPipeBlock extends FaceAttachedHorizontalDirectionalBlock
implements ITE<SmartFluidPipeTileEntity>, IAxisPipe, IWrenchable { implements ITE<SmartFluidPipeTileEntity>, IAxisPipe, IWrenchable, ProperWaterloggedBlock {
public SmartFluidPipeBlock(Properties p_i48339_1_) { public SmartFluidPipeBlock(Properties p_i48339_1_) {
super(p_i48339_1_); super(p_i48339_1_);
registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false));
} }
@Override @Override
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) { protected void createBlockStateDefinition(Builder<Block, BlockState> builder) {
builder.add(FACE) builder.add(FACE, FACING, WATERLOGGED);
.add(FACING);
} }
@Override @Override
@ -76,7 +79,7 @@ public class SmartFluidPipeBlock extends FaceAttachedHorizontalDirectionalBlock
} }
} }
return stateForPlacement; return withWater(stateForPlacement, ctx);
} }
protected boolean prefersConnectionTo(LevelReader reader, BlockPos pos, Direction facing) { protected boolean prefersConnectionTo(LevelReader reader, BlockPos pos, Direction facing) {
@ -158,6 +161,18 @@ public class SmartFluidPipeBlock extends FaceAttachedHorizontalDirectionalBlock
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
return false; return false;
} }
@Override
public BlockState updateShape(BlockState pState, Direction pFacing, BlockState pFacingState, LevelAccessor pLevel,
BlockPos pCurrentPos, BlockPos pFacingPos) {
updateWater(pLevel, pState, pCurrentPos);
return pState;
}
@Override
public FluidState getFluidState(BlockState pState) {
return fluidState(pState);
}
@Override @Override
public Class<SmartFluidPipeTileEntity> getTileEntityClass() { public Class<SmartFluidPipeTileEntity> getTileEntityClass() {

View file

@ -1,5 +1,6 @@
package com.simibubi.create.content.contraptions.processing; package com.simibubi.create.content.contraptions.processing;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -64,7 +65,8 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
return true; return true;
if (level == null || level.isClientSide) if (level == null || level.isClientSide)
return true; return true;
if (!getBasin().filter(BasinTileEntity::canContinueProcessing) Optional<BasinTileEntity> basin = getBasin();
if (!basin.filter(BasinTileEntity::canContinueProcessing)
.isPresent()) .isPresent())
return true; return true;
@ -118,6 +120,10 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
} }
protected List<Recipe<?>> getMatchingRecipes() { protected List<Recipe<?>> getMatchingRecipes() {
if (getBasin().map(BasinTileEntity::isEmpty)
.orElse(true))
return new ArrayList<>();
List<Recipe<?>> list = RecipeFinder.get(getRecipeCacheKey(), level, this::matchStaticFilters); List<Recipe<?>> list = RecipeFinder.get(getRecipeCacheKey(), level, this::matchStaticFilters);
return list.stream() return list.stream()
.filter(this::matchBasinRecipe) .filter(this::matchBasinRecipe)

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.processing;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -17,9 +16,11 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBe
import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; 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.behaviour.fluid.SmartFluidTankBehaviour.TankSegment;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.recipe.DummyCraftingContainer;
import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.CraftingRecipe;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@ -78,7 +79,6 @@ public class BasinRecipe extends ProcessingRecipe<SmartInventory> {
List<FluidStack> recipeOutputFluids = new ArrayList<>(); List<FluidStack> recipeOutputFluids = new ArrayList<>();
List<Ingredient> ingredients = new LinkedList<>(recipe.getIngredients()); List<Ingredient> ingredients = new LinkedList<>(recipe.getIngredients());
ingredients.sort(Comparator.comparingInt(i -> i.getItems().length));
List<FluidIngredient> fluidIngredients = List<FluidIngredient> fluidIngredients =
isBasinRecipe ? ((BasinRecipe) recipe).getFluidIngredients() : Collections.emptyList(); isBasinRecipe ? ((BasinRecipe) recipe).getFluidIngredients() : Collections.emptyList();
@ -106,9 +106,6 @@ public class BasinRecipe extends ProcessingRecipe<SmartInventory> {
continue Ingredients; continue Ingredients;
if (!simulate) if (!simulate)
availableItems.extractItem(slot, 1, false); availableItems.extractItem(slot, 1, false);
else if (extracted.hasContainerItem())
recipeOutputItems.add(extracted.getContainerItem()
.copy());
extractedItemsFromSlot[slot]++; extractedItemsFromSlot[slot]++;
continue Ingredients; continue Ingredients;
} }
@ -152,11 +149,17 @@ public class BasinRecipe extends ProcessingRecipe<SmartInventory> {
} }
if (simulate) { if (simulate) {
if (recipe instanceof BasinRecipe) { if (recipe instanceof BasinRecipe basinRecipe) {
recipeOutputItems.addAll(((BasinRecipe) recipe).rollResults()); recipeOutputItems.addAll(basinRecipe.rollResults());
recipeOutputFluids.addAll(((BasinRecipe) recipe).getFluidResults()); recipeOutputFluids.addAll(basinRecipe.getFluidResults());
} else recipeOutputItems.addAll(basinRecipe.getRemainingItems(basin.getInputInventory()));
} else {
recipeOutputItems.add(recipe.getResultItem()); recipeOutputItems.add(recipe.getResultItem());
if (recipe instanceof CraftingRecipe craftingRecipe) {
recipeOutputItems.addAll(craftingRecipe.getRemainingItems(new DummyCraftingContainer(availableItems, extractedItemsFromSlot)));
}
}
} }
if (!basin.acceptOutputs(recipeOutputItems, recipeOutputFluids, simulate)) if (!basin.acceptOutputs(recipeOutputItems, recipeOutputFluids, simulate))

View file

@ -88,6 +88,7 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor
Direction preferredSpoutput; Direction preferredSpoutput;
protected List<ItemStack> spoutputBuffer; protected List<ItemStack> spoutputBuffer;
protected List<FluidStack> spoutputFluidBuffer; protected List<FluidStack> spoutputFluidBuffer;
int recipeBackupCheck;
public static final int OUTPUT_ANIMATION_TIME = 10; public static final int OUTPUT_ANIMATION_TIME = 10;
List<IntAttached<ItemStack>> visualizedOutputItems; List<IntAttached<ItemStack>> visualizedOutputItems;
@ -115,6 +116,7 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor
preferredSpoutput = null; preferredSpoutput = null;
spoutputBuffer = new ArrayList<>(); spoutputBuffer = new ArrayList<>();
spoutputFluidBuffer = new ArrayList<>(); spoutputFluidBuffer = new ArrayList<>();
recipeBackupCheck = 20;
} }
@Override @Override
@ -227,19 +229,32 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor
@Override @Override
public void lazyTick() { public void lazyTick() {
super.lazyTick(); super.lazyTick();
updateSpoutput();
if (!level.isClientSide) if (!level.isClientSide) {
updateSpoutput();
if (recipeBackupCheck-- > 0)
return;
recipeBackupCheck = 20;
if (isEmpty())
return;
notifyChangeOfContents();
return; return;
}
BlockEntity tileEntity = level.getBlockEntity(worldPosition.above(2)); BlockEntity tileEntity = level.getBlockEntity(worldPosition.above(2));
if (!(tileEntity instanceof MechanicalMixerTileEntity)) { if (!(tileEntity instanceof MechanicalMixerTileEntity)) {
setAreFluidsMoving(false); setAreFluidsMoving(false);
return; return;
} }
MechanicalMixerTileEntity mixer = (MechanicalMixerTileEntity) tileEntity; MechanicalMixerTileEntity mixer = (MechanicalMixerTileEntity) tileEntity;
setAreFluidsMoving(mixer.running && mixer.runningTicks <= 20); setAreFluidsMoving(mixer.running && mixer.runningTicks <= 20);
} }
public boolean isEmpty() {
return inputInventory.isEmpty() && outputInventory.isEmpty() && inputTank.isEmpty() && outputTank.isEmpty();
}
public void onWrenched(Direction face) { public void onWrenched(Direction face) {
BlockState blockState = getBlockState(); BlockState blockState = getBlockState();
Direction currentFacing = blockState.getValue(BasinBlock.FACING); Direction currentFacing = blockState.getValue(BasinBlock.FACING);
@ -256,15 +271,8 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor
} }
private void updateSpoutput() { private void updateSpoutput() {
if (level.isClientSide)
return;
BlockState blockState = getBlockState(); BlockState blockState = getBlockState();
Direction currentFacing = blockState.getValue(BasinBlock.FACING); Direction currentFacing = blockState.getValue(BasinBlock.FACING);
if (currentFacing != Direction.DOWN)
notifyChangeOfContents();
Direction newFacing = Direction.DOWN; Direction newFacing = Direction.DOWN;
for (Direction test : Iterate.horizontalDirections) { for (Direction test : Iterate.horizontalDirections) {
boolean canOutputTo = BasinBlock.canOutputTo(level, worldPosition, test); boolean canOutputTo = BasinBlock.canOutputTo(level, worldPosition, test);

View file

@ -465,7 +465,7 @@ public class BeltTileEntity extends KineticTileEntity {
return inserted; return inserted;
if (!simulate) { if (!simulate) {
BeltTunnelInteractionHandler.flapTunnel(nextInventory, index, side.getOpposite(), true); BeltTunnelInteractionHandler.flapTunnel(nextInventory, index, side.getOpposite(), true);
tunnelTE.setStackToDistribute(inserted); tunnelTE.setStackToDistribute(inserted, side.getOpposite());
} }
return empty; return empty;
} }

View file

@ -54,7 +54,7 @@ public class BeltTunnelInteractionHandler {
if (!brassTunnel.canTakeItems()) if (!brassTunnel.canTakeItems())
return true; return true;
if (onServer) { if (onServer) {
brassTunnel.setStackToDistribute(current.stack); brassTunnel.setStackToDistribute(current.stack, movementFacing.getOpposite());
current.stack = ItemStack.EMPTY; current.stack = ItemStack.EMPTY;
beltInventory.belt.sendData(); beltInventory.belt.sendData();
beltInventory.belt.setChanged(); beltInventory.belt.setChanged();

View file

@ -9,7 +9,6 @@ import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket; import net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket;
@ -22,7 +21,7 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor;
public class BackTankUtil { public class BackTankUtil {
@ -105,11 +104,10 @@ public class BackTankUtil {
// For Air-using tools // For Air-using tools
@OnlyIn(Dist.CLIENT)
public static boolean isBarVisible(ItemStack stack, int usesPerTank) { public static boolean isBarVisible(ItemStack stack, int usesPerTank) {
if (usesPerTank == 0) if (usesPerTank == 0)
return false; return false;
LocalPlayer player = Minecraft.getInstance().player; Player player = DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> () -> Minecraft.getInstance().player);
if (player == null) if (player == null)
return false; return false;
ItemStack backtank = get(player); ItemStack backtank = get(player);
@ -118,11 +116,10 @@ public class BackTankUtil {
return true; return true;
} }
@OnlyIn(Dist.CLIENT)
public static int getBarWidth(ItemStack stack, int usesPerTank) { public static int getBarWidth(ItemStack stack, int usesPerTank) {
if (usesPerTank == 0) if (usesPerTank == 0)
return 13; return 13;
LocalPlayer player = Minecraft.getInstance().player; Player player = DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> () -> Minecraft.getInstance().player);
if (player == null) if (player == null)
return 13; return 13;
ItemStack backtank = get(player); ItemStack backtank = get(player);
@ -132,11 +129,10 @@ public class BackTankUtil {
.getBarWidth(backtank); .getBarWidth(backtank);
} }
@OnlyIn(Dist.CLIENT)
public static int getBarColor(ItemStack stack, int usesPerTank) { public static int getBarColor(ItemStack stack, int usesPerTank) {
if (usesPerTank == 0) if (usesPerTank == 0)
return 0; return 0;
LocalPlayer player = Minecraft.getInstance().player; Player player = DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> () -> Minecraft.getInstance().player);
if (player == null) if (player == null)
return 0; return 0;
ItemStack backtank = get(player); ItemStack backtank = get(player);

View file

@ -3,7 +3,6 @@ package com.simibubi.create.content.logistics.block.belts.tunnel;
import java.util.List; import java.util.List;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
@ -44,7 +43,7 @@ public class BrassTunnelBlock extends BeltTunnelBlock {
for (ItemStack itemStack : stacksOfGroup) for (ItemStack itemStack : stacksOfGroup)
player.getInventory().placeItemBackInInventory(itemStack.copy()); player.getInventory().placeItemBackInInventory(itemStack.copy());
world.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f, world.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f,
1f + Create.RANDOM.nextFloat()); 1f + world.random.nextFloat());
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
}); });
} }
@ -61,16 +60,16 @@ public class BrassTunnelBlock extends BeltTunnelBlock {
} }
@Override @Override
public void onRemove(BlockState p_196243_1_, Level p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) {
boolean p_196243_5_) { if (state.hasBlockEntity() && (state.getBlock() != newState.getBlock() || !newState.hasBlockEntity())) {
if (p_196243_1_.hasBlockEntity() TileEntityBehaviour.destroy(level, pos, FilteringBehaviour.TYPE);
&& (p_196243_1_.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasBlockEntity())) { withTileEntityDo(level, pos, te -> {
TileEntityBehaviour.destroy(p_196243_2_, p_196243_3_, FilteringBehaviour.TYPE); if (!(te instanceof BrassTunnelTileEntity btte))
withTileEntityDo(p_196243_2_, p_196243_3_, te -> { return;
if (te instanceof BrassTunnelTileEntity) Block.popResource(level, pos, btte.stackToDistribute);
Block.popResource(p_196243_2_, p_196243_3_, ((BrassTunnelTileEntity) te).stackToDistribute); btte.stackEnteredFrom = null;
}); });
p_196243_2_.removeBlockEntity(p_196243_3_); level.removeBlockEntity(pos);
} }
} }

View file

@ -34,7 +34,7 @@ public class BrassTunnelItemHandler implements IItemHandler {
if (!te.canTakeItems()) if (!te.canTakeItems())
return stack; return stack;
if (!simulate) if (!simulate)
te.setStackToDistribute(stack); te.setStackToDistribute(stack, null);
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }

View file

@ -17,6 +17,9 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; 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.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape;
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform;
@ -61,6 +64,8 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave
boolean connectedRight; boolean connectedRight;
ItemStack stackToDistribute; ItemStack stackToDistribute;
Direction stackEnteredFrom;
float distributionProgress; float distributionProgress;
int distributionDistanceLeft; int distributionDistanceLeft;
int distributionDistanceRight; int distributionDistanceRight;
@ -81,6 +86,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave
distributionTargets = Couple.create(ArrayList::new); distributionTargets = Couple.create(ArrayList::new);
syncSet = new HashSet<>(); syncSet = new HashSet<>();
stackToDistribute = ItemStack.EMPTY; stackToDistribute = ItemStack.EMPTY;
stackEnteredFrom = null;
beltCapability = LazyOptional.empty(); beltCapability = LazyOptional.empty();
tunnelCapability = LazyOptional.of(() -> new BrassTunnelItemHandler(this)); tunnelCapability = LazyOptional.of(() -> new BrassTunnelItemHandler(this));
previousOutputIndex = 0; previousOutputIndex = 0;
@ -183,6 +189,8 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave
for (Pair<BlockPos, Direction> pair : list) { for (Pair<BlockPos, Direction> pair : list) {
BlockPos tunnelPos = pair.getKey(); BlockPos tunnelPos = pair.getKey();
Direction output = pair.getValue(); Direction output = pair.getValue();
if (tunnelPos.equals(worldPosition) && output == stackEnteredFrom)
continue;
BlockEntity te = level.getBlockEntity(tunnelPos); BlockEntity te = level.getBlockEntity(tunnelPos);
if (!(te instanceof BrassTunnelTileEntity)) if (!(te instanceof BrassTunnelTileEntity))
continue; continue;
@ -306,13 +314,16 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave
toDistribute.grow(failedTransferrals); toDistribute.grow(failedTransferrals);
stackToDistribute = ItemHandlerHelper.copyStackWithSize(stackToDistribute, toDistribute.getCount()); stackToDistribute = ItemHandlerHelper.copyStackWithSize(stackToDistribute, toDistribute.getCount());
if (stackToDistribute.isEmpty())
stackEnteredFrom = null;
previousOutputIndex++; previousOutputIndex++;
previousOutputIndex %= amountTargets; previousOutputIndex %= amountTargets;
notifyUpdate(); notifyUpdate();
} }
public void setStackToDistribute(ItemStack stack) { public void setStackToDistribute(ItemStack stack, @Nullable Direction enteredFrom) {
stackToDistribute = stack; stackToDistribute = stack;
stackEnteredFrom = enteredFrom;
distributionProgress = -1; distributionProgress = -1;
sendData(); sendData();
setChanged(); setChanged();
@ -329,7 +340,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave
if (!own.isEmpty()) { if (!own.isEmpty()) {
list.add(own); list.add(own);
if (!simulate) if (!simulate)
setStackToDistribute(ItemStack.EMPTY); setStackToDistribute(ItemStack.EMPTY, null);
} }
for (boolean left : Iterate.trueAndFalse) { for (boolean left : Iterate.trueAndFalse) {
@ -345,7 +356,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave
continue; continue;
list.add(other); list.add(other);
if (!simulate) if (!simulate)
adjacent.setStackToDistribute(ItemStack.EMPTY); adjacent.setStackToDistribute(ItemStack.EMPTY, null);
} }
} }
@ -514,22 +525,30 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave
continue; continue;
if (direction == movementFacing.getOpposite()) if (direction == movementFacing.getOpposite())
continue; continue;
if (tunnelTE.sides.contains(direction)) { if (!tunnelTE.sides.contains(direction))
BlockPos offset = tunnelTE.worldPosition.below() continue;
.relative(direction);
DirectBeltInputBehaviour inputBehaviour = BlockPos offset = tunnelTE.worldPosition.below()
TileEntityBehaviour.get(level, offset, DirectBeltInputBehaviour.TYPE); .relative(direction);
if (inputBehaviour == null) {
if (direction == movementFacing) BlockState potentialFunnel = level.getBlockState(offset.above());
if (!BlockHelper.hasBlockSolidSide(level.getBlockState(offset), level, offset, if (potentialFunnel.getBlock() instanceof BeltFunnelBlock
direction.getOpposite())) && potentialFunnel.getValue(BeltFunnelBlock.SHAPE) == Shape.PULLING
validOutputs.add(Pair.of(tunnelTE, direction)); && FunnelBlock.getFunnelFacing(potentialFunnel) == direction)
continue; continue;
}
if (inputBehaviour.canInsertFromSide(direction)) DirectBeltInputBehaviour inputBehaviour =
validOutputs.add(Pair.of(tunnelTE, direction)); TileEntityBehaviour.get(level, offset, DirectBeltInputBehaviour.TYPE);
if (inputBehaviour == null) {
if (direction == movementFacing)
if (!BlockHelper.hasBlockSolidSide(level.getBlockState(offset), level, offset,
direction.getOpposite()))
validOutputs.add(Pair.of(tunnelTE, direction));
continue; continue;
} }
if (inputBehaviour.canInsertFromSide(direction))
validOutputs.add(Pair.of(tunnelTE, direction));
continue;
} }
} }
} }
@ -559,7 +578,11 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave
compound.putBoolean("SyncedOutput", syncedOutputActive); compound.putBoolean("SyncedOutput", syncedOutputActive);
compound.putBoolean("ConnectedLeft", connectedLeft); compound.putBoolean("ConnectedLeft", connectedLeft);
compound.putBoolean("ConnectedRight", connectedRight); compound.putBoolean("ConnectedRight", connectedRight);
compound.put("StackToDistribute", stackToDistribute.serializeNBT()); compound.put("StackToDistribute", stackToDistribute.serializeNBT());
if (stackEnteredFrom != null)
NBTHelper.writeEnum(compound, "StackEnteredFrom", stackEnteredFrom);
compound.putFloat("DistributionProgress", distributionProgress); compound.putFloat("DistributionProgress", distributionProgress);
compound.putInt("PreviousIndex", previousOutputIndex); compound.putInt("PreviousIndex", previousOutputIndex);
compound.putInt("DistanceLeft", distributionDistanceLeft); compound.putInt("DistanceLeft", distributionDistanceLeft);
@ -587,7 +610,12 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave
syncedOutputActive = compound.getBoolean("SyncedOutput"); syncedOutputActive = compound.getBoolean("SyncedOutput");
connectedLeft = compound.getBoolean("ConnectedLeft"); connectedLeft = compound.getBoolean("ConnectedLeft");
connectedRight = compound.getBoolean("ConnectedRight"); connectedRight = compound.getBoolean("ConnectedRight");
stackToDistribute = ItemStack.of(compound.getCompound("StackToDistribute")); stackToDistribute = ItemStack.of(compound.getCompound("StackToDistribute"));
stackEnteredFrom =
compound.contains("StackEnteredFrom") ? NBTHelper.readEnum(compound, "StackEnteredFrom", Direction.class)
: null;
distributionProgress = compound.getFloat("DistributionProgress"); distributionProgress = compound.getFloat("DistributionProgress");
previousOutputIndex = compound.getInt("PreviousIndex"); previousOutputIndex = compound.getInt("PreviousIndex");
distributionDistanceLeft = compound.getInt("DistanceLeft"); distributionDistanceLeft = compound.getInt("DistanceLeft");

View file

@ -40,9 +40,10 @@ public class ScoreboardDisplaySource extends ValueListDisplaySource {
return sLevel.getScoreboard() return sLevel.getScoreboard()
.getPlayerScores(objective) .getPlayerScores(objective)
.stream() .stream()
.limit(maxRows) .map(score -> IntAttached.with(score.getScore(), Components.literal(score.getOwner())
.map(score -> IntAttached.with(score.getScore(), Components.literal(score.getOwner()).copy())) .copy()))
.sorted(IntAttached.comparator()); .sorted(IntAttached.comparator())
.limit(maxRows);
} }
private ImmutableList<IntAttached<MutableComponent>> notFound(String objective) { private ImmutableList<IntAttached<MutableComponent>> notFound(String objective) {

View file

@ -56,6 +56,11 @@ public class BookCopyAttribute implements ItemAttribute {
return new BookCopyAttribute(nbt.getInt("generation")); return new BookCopyAttribute(nbt.getInt("generation"));
} }
@Override
public String getNBTKey() {
return "book_copy";
}
private int extractGeneration(ItemStack stack) { private int extractGeneration(ItemStack stack) {
CompoundTag nbt = stack.getTag(); CompoundTag nbt = stack.getTag();
if (nbt != null && stack.getItem() instanceof WrittenBookItem) { if (nbt != null && stack.getItem() instanceof WrittenBookItem) {

View file

@ -84,12 +84,12 @@ public class TrainRelocationPacket extends SimplePacketBase {
return; return;
if (!sender.position() if (!sender.position()
.closerThan(Vec3.atCenterOf(pos), 26)) { .closerThan(Vec3.atCenterOf(pos), 64)) {
Create.LOGGER.warn(messagePrefix + train.name.getString() + ": player too far from clicked pos"); Create.LOGGER.warn(messagePrefix + train.name.getString() + ": player too far from clicked pos");
return; return;
} }
if (!sender.position() if (!sender.position()
.closerThan(cce.position(), 26 + cce.getBoundingBox() .closerThan(cce.position(), 64 + cce.getBoundingBox()
.getXsize() / 2)) { .getXsize() / 2)) {
Create.LOGGER.warn(messagePrefix + train.name.getString() + ": player too far from carriage entity"); Create.LOGGER.warn(messagePrefix + train.name.getString() + ": player too far from carriage entity");
return; return;

View file

@ -5,20 +5,29 @@ import com.simibubi.create.content.logistics.trains.DimensionPalette;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.NbtUtils;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
public abstract class SingleTileEdgePoint extends TrackEdgePoint { public abstract class SingleTileEdgePoint extends TrackEdgePoint {
public ResourceKey<Level> tileDimension;
public BlockPos tilePos; public BlockPos tilePos;
public BlockPos getTilePos() { public BlockPos getTilePos() {
return tilePos; return tilePos;
} }
public ResourceKey<Level> getTileDimension() {
return tileDimension;
}
@Override @Override
public void tileAdded(BlockEntity tile, boolean front) { public void tileAdded(BlockEntity tile, boolean front) {
this.tilePos = tile.getBlockPos(); this.tilePos = tile.getBlockPos();
this.tileDimension = tile.getLevel()
.dimension();
} }
@Override @Override
@ -42,12 +51,14 @@ public abstract class SingleTileEdgePoint extends TrackEdgePoint {
if (migration) if (migration)
return; return;
tilePos = NbtUtils.readBlockPos(nbt.getCompound("TilePos")); tilePos = NbtUtils.readBlockPos(nbt.getCompound("TilePos"));
tileDimension = dimensions.decode(nbt.contains("TileDimension") ? nbt.getInt("TileDimension") : -1);
} }
@Override @Override
public void write(CompoundTag nbt, DimensionPalette dimensions) { public void write(CompoundTag nbt, DimensionPalette dimensions) {
super.write(nbt, dimensions); super.write(nbt, dimensions);
nbt.put("TilePos", NbtUtils.writeBlockPos(tilePos)); nbt.put("TilePos", NbtUtils.writeBlockPos(tilePos));
nbt.putInt("TileDimension", dimensions.encode(tileDimension));
} }
} }

View file

@ -66,8 +66,7 @@ public class ScheduleItem extends Item implements MenuProvider {
return InteractionResultHolder.pass(heldItem); return InteractionResultHolder.pass(heldItem);
} }
@Override public InteractionResult handScheduleTo(ItemStack pStack, Player pPlayer, LivingEntity pInteractionTarget,
public InteractionResult interactLivingEntity(ItemStack pStack, Player pPlayer, LivingEntity pInteractionTarget,
InteractionHand pUsedHand) { InteractionHand pUsedHand) {
InteractionResult pass = InteractionResult.PASS; InteractionResult pass = InteractionResult.PASS;
@ -123,6 +122,7 @@ public class ScheduleItem extends Item implements MenuProvider {
pStack.shrink(1); pStack.shrink(1);
pPlayer.setItemInHand(pUsedHand, pStack.isEmpty() ? ItemStack.EMPTY : pStack); pPlayer.setItemInHand(pUsedHand, pStack.isEmpty() ? ItemStack.EMPTY : pStack);
} }
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }

View file

@ -11,19 +11,20 @@ import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract; import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteractSpecific;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber @EventBusSubscriber
public class ScheduleItemRetrieval { public class ScheduleItemEntityInteraction {
@SubscribeEvent @SubscribeEvent
public static void removeScheduleFromConductor(EntityInteract event) { public static void interactWithConductor(EntityInteractSpecific event) {
Entity entity = event.getTarget(); Entity entity = event.getTarget();
Player player = event.getPlayer(); Player player = event.getPlayer();
if (player == null || entity == null) if (player == null || entity == null)
@ -34,16 +35,24 @@ public class ScheduleItemRetrieval {
Entity rootVehicle = entity.getRootVehicle(); Entity rootVehicle = entity.getRootVehicle();
if (!(rootVehicle instanceof CarriageContraptionEntity)) if (!(rootVehicle instanceof CarriageContraptionEntity))
return; return;
if (!(entity instanceof LivingEntity living))
return;
if (player.getCooldowns()
.isOnCooldown(AllItems.SCHEDULE.get()))
return;
ItemStack itemStack = event.getItemStack(); ItemStack itemStack = event.getItemStack();
if (AllItems.SCHEDULE.isIn(itemStack) && entity instanceof Wolf wolf) { if (itemStack.getItem()instanceof ScheduleItem si) {
itemStack.getItem() InteractionResult result = si.handScheduleTo(itemStack, player, living, event.getHand());
.interactLivingEntity(itemStack, player, wolf, event.getHand()); if (result.consumesAction()) {
return; player.getCooldowns()
.addCooldown(AllItems.SCHEDULE.get(), 5);
event.setCancellationResult(result);
event.setCanceled(true);
return;
}
} }
if (player.level.isClientSide)
return;
if (event.getHand() == InteractionHand.OFF_HAND) if (event.getHand() == InteractionHand.OFF_HAND)
return; return;
@ -68,31 +77,47 @@ public class ScheduleItemRetrieval {
if (directions == null) if (directions == null)
return; return;
boolean onServer = !event.getWorld().isClientSide;
if (train.runtime.paused && !train.runtime.completed) { if (train.runtime.paused && !train.runtime.completed) {
train.runtime.paused = false; if (onServer) {
AllSoundEvents.CONFIRM.playOnServer(player.level, player.blockPosition(), 1, 1); train.runtime.paused = false;
player.displayClientMessage(Lang.translateDirect("schedule.continued"), true); AllSoundEvents.CONFIRM.playOnServer(player.level, player.blockPosition(), 1, 1);
player.displayClientMessage(Lang.translateDirect("schedule.continued"), true);
}
player.getCooldowns()
.addCooldown(AllItems.SCHEDULE.get(), 5);
event.setCancellationResult(InteractionResult.SUCCESS);
event.setCanceled(true); event.setCanceled(true);
return; return;
} }
ItemStack itemInHand = player.getItemInHand(event.getHand()); ItemStack itemInHand = player.getItemInHand(event.getHand());
if (!itemInHand.isEmpty()) { if (!itemInHand.isEmpty()) {
AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1); if (onServer) {
player.displayClientMessage(Lang.translateDirect("schedule.remove_with_empty_hand"), true); AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1);
player.displayClientMessage(Lang.translateDirect("schedule.remove_with_empty_hand"), true);
}
event.setCancellationResult(InteractionResult.SUCCESS);
event.setCanceled(true); event.setCanceled(true);
return; return;
} }
AllSoundEvents.playItemPickup(player); if (onServer) {
player.displayClientMessage( AllSoundEvents.playItemPickup(player);
Lang.translateDirect( player.displayClientMessage(
train.runtime.isAutoSchedule ? "schedule.auto_removed_from_train" : "schedule.removed_from_train"), Lang.translateDirect(
true); train.runtime.isAutoSchedule ? "schedule.auto_removed_from_train" : "schedule.removed_from_train"),
true);
player.getInventory() player.getInventory()
.placeItemBackInInventory(train.runtime.returnSchedule()); .placeItemBackInInventory(train.runtime.returnSchedule());
// player.setItemInHand(event.getHand(), train.runtime.returnSchedule()); }
player.getCooldowns()
.addCooldown(AllItems.SCHEDULE.get(), 5);
event.setCancellationResult(InteractionResult.SUCCESS);
event.setCanceled(true); event.setCanceled(true);
return; return;
} }

View file

@ -29,6 +29,9 @@ import net.minecraft.world.level.Level;
public class ScheduleRuntime { public class ScheduleRuntime {
private static final int TBD = -1;
private static final int INVALID = -2;
public enum State { public enum State {
PRE_TRANSIT, IN_TRANSIT, POST_TRANSIT PRE_TRANSIT, IN_TRANSIT, POST_TRANSIT
} }
@ -129,7 +132,7 @@ public class ScheduleRuntime {
destinationReached(); destinationReached();
return; return;
} }
if (train.navigation.startNavigation(nextStation, Double.MAX_VALUE, false) != -1) { if (train.navigation.startNavigation(nextStation, Double.MAX_VALUE, false) != TBD) {
state = State.IN_TRANSIT; state = State.IN_TRANSIT;
ticksInTransit = 0; ticksInTransit = 0;
} }
@ -231,7 +234,7 @@ public class ScheduleRuntime {
isAutoSchedule = auto; isAutoSchedule = auto;
train.status.newSchedule(); train.status.newSchedule();
predictionTicks = new ArrayList<>(); predictionTicks = new ArrayList<>();
schedule.entries.forEach($ -> predictionTicks.add(-1)); schedule.entries.forEach($ -> predictionTicks.add(TBD));
displayLinkUpdateRequested = true; displayLinkUpdateRequested = true;
} }
@ -269,8 +272,10 @@ public class ScheduleRuntime {
if (currentStation != null) if (currentStation != null)
predictions.add(createPrediction(current, currentStation.name, currentTitle, 0)); predictions.add(createPrediction(current, currentStation.name, currentTitle, 0));
int departureTime = estimateStayDuration(current); int departureTime = estimateStayDuration(current);
if (departureTime == -1) if (departureTime == INVALID)
accumulatedTime = -1; accumulatedTime = INVALID;
else
accumulatedTime += departureTime;
} else { } else {
GlobalStation destination = train.navigation.destination; GlobalStation destination = train.navigation.destination;
@ -292,10 +297,10 @@ public class ScheduleRuntime {
predictions.add(createPrediction(current, destination.name, currentTitle, accumulatedTime)); predictions.add(createPrediction(current, destination.name, currentTitle, accumulatedTime));
int departureTime = estimateStayDuration(current); int departureTime = estimateStayDuration(current);
if (departureTime != -1) if (departureTime != INVALID)
accumulatedTime += departureTime; accumulatedTime += departureTime;
if (departureTime == -1) else
accumulatedTime = -1; accumulatedTime = INVALID;
} else } else
predictForEntry(current, currentTitle, accumulatedTime, predictions); predictForEntry(current, currentTitle, accumulatedTime, predictions);
@ -327,47 +332,56 @@ public class ScheduleRuntime {
return accumulatedTime; return accumulatedTime;
if (predictionTicks.size() <= currentEntry) if (predictionTicks.size() <= currentEntry)
return accumulatedTime; return accumulatedTime;
if (accumulatedTime == -1) {
int departureTime = estimateStayDuration(index);
if (accumulatedTime < 0) {
predictions.add(createPrediction(index, filter.getFilter(), currentTitle, accumulatedTime)); predictions.add(createPrediction(index, filter.getFilter(), currentTitle, accumulatedTime));
return -1; return Math.min(accumulatedTime, departureTime);
} }
int predictedTime = predictionTicks.get(index); int predictedTime = predictionTicks.get(index);
int departureTime = estimateStayDuration(index); accumulatedTime += predictedTime;
if (predictedTime == -1) if (predictedTime == TBD)
accumulatedTime = -1; accumulatedTime = TBD;
else {
accumulatedTime += predictedTime;
if (departureTime != -1)
accumulatedTime += departureTime;
}
predictions.add(createPrediction(index, filter.getFilter(), currentTitle, accumulatedTime)); predictions.add(createPrediction(index, filter.getFilter(), currentTitle, accumulatedTime));
if (departureTime == -1) if (accumulatedTime != TBD)
return -1; accumulatedTime += departureTime;
if (departureTime == INVALID)
accumulatedTime = INVALID;
return accumulatedTime; return accumulatedTime;
} }
private int estimateStayDuration(int index) { private int estimateStayDuration(int index) {
if (index >= schedule.entries.size()) { if (index >= schedule.entries.size()) {
if (!schedule.cyclic) if (!schedule.cyclic)
return 100000; return INVALID;
index = 0; index = 0;
} }
ScheduleEntry scheduleEntry = schedule.entries.get(index); ScheduleEntry scheduleEntry = schedule.entries.get(index);
for (List<ScheduleWaitCondition> list : scheduleEntry.conditions) Columns: for (List<ScheduleWaitCondition> list : scheduleEntry.conditions) {
for (ScheduleWaitCondition condition : list) int total = 0;
if (condition instanceof ScheduledDelay wait) for (ScheduleWaitCondition condition : list) {
return wait.totalWaitTicks(); if (!(condition instanceof ScheduledDelay wait))
continue Columns;
total += wait.totalWaitTicks();
}
return total;
}
return 5; // TODO properly ask conditions for time prediction return INVALID;
} }
private TrainDeparturePrediction createPrediction(int index, String destination, String currentTitle, int time) { private TrainDeparturePrediction createPrediction(int index, String destination, String currentTitle, int time) {
if (time == INVALID)
return null;
int size = schedule.entries.size(); int size = schedule.entries.size();
if (index >= size) { if (index >= size) {
if (!schedule.cyclic) if (!schedule.cyclic)
@ -422,7 +436,7 @@ public class ScheduleRuntime {
int[] readTransits = tag.getIntArray("TransitTimes"); int[] readTransits = tag.getIntArray("TransitTimes");
if (schedule != null) { if (schedule != null) {
schedule.entries.forEach($ -> predictionTicks.add(-1)); schedule.entries.forEach($ -> predictionTicks.add(TBD));
if (readTransits.length == schedule.entries.size()) if (readTransits.length == schedule.entries.size())
for (int i = 0; i < readTransits.length; i++) for (int i = 0; i < readTransits.length; i++)
predictionTicks.set(i, readTransits[i]); predictionTicks.set(i, readTransits[i]);

View file

@ -110,6 +110,8 @@ public abstract class CargoThresholdCondition extends LazyTickedScheduleConditio
public List<Component> getSecondLineTooltip(int slot) { public List<Component> getSecondLineTooltip(int slot) {
return ImmutableList.of(Lang.translateDirect("schedule.condition.threshold.place_item"), return ImmutableList.of(Lang.translateDirect("schedule.condition.threshold.place_item"),
Lang.translateDirect("schedule.condition.threshold.place_item_2") Lang.translateDirect("schedule.condition.threshold.place_item_2")
.withStyle(ChatFormatting.GRAY),
Lang.translateDirect("schedule.condition.threshold.place_item_3")
.withStyle(ChatFormatting.GRAY)); .withStyle(ChatFormatting.GRAY));
} }

View file

@ -44,9 +44,6 @@ public class FluidThresholdCondition extends CargoThresholdCondition {
Ops operator = getOperator(); Ops operator = getOperator();
int target = getThreshold(); int target = getThreshold();
if (compareStack.isEmpty())
return true;
int foundFluid = 0; int foundFluid = 0;
for (Carriage carriage : train.carriages) { for (Carriage carriage : train.carriages) {
IFluidHandler fluids = carriage.storage.getFluids(); IFluidHandler fluids = carriage.storage.getFluids();
@ -100,9 +97,10 @@ public class FluidThresholdCondition extends CargoThresholdCondition {
Lang.translateDirect("schedule.condition.threshold." + Lang.asId(getOperator().name()))), Lang.translateDirect("schedule.condition.threshold." + Lang.asId(getOperator().name()))),
Lang.translateDirect("schedule.condition.threshold.x_units_of_item", getThreshold(), Lang.translateDirect("schedule.condition.threshold.x_units_of_item", getThreshold(),
Lang.translateDirect("schedule.condition.threshold.buckets"), Lang.translateDirect("schedule.condition.threshold.buckets"),
compareStack.getItem() instanceof FilterItem compareStack.isEmpty() ? Lang.translateDirect("schedule.condition.threshold.anything")
? Lang.translateDirect("schedule.condition.threshold.matching_content") : compareStack.getItem() instanceof FilterItem
: loadFluid().getDisplayName()) ? Lang.translateDirect("schedule.condition.threshold.matching_content")
: loadFluid().getDisplayName())
.withStyle(ChatFormatting.DARK_AQUA)); .withStyle(ChatFormatting.DARK_AQUA));
} }

View file

@ -41,9 +41,6 @@ public class ItemThresholdCondition extends CargoThresholdCondition {
int target = getThreshold(); int target = getThreshold();
boolean stacks = inStacks(); boolean stacks = inStacks();
if (stack.isEmpty())
return true;
int foundItems = 0; int foundItems = 0;
for (Carriage carriage : train.carriages) { for (Carriage carriage : train.carriages) {
IItemHandlerModifiable items = carriage.storage.getItems(); IItemHandlerModifiable items = carriage.storage.getItems();
@ -97,8 +94,10 @@ public class ItemThresholdCondition extends CargoThresholdCondition {
Lang.translateDirect("schedule.condition.threshold." + Lang.asId(getOperator().name()))), Lang.translateDirect("schedule.condition.threshold." + Lang.asId(getOperator().name()))),
Lang.translateDirect("schedule.condition.threshold.x_units_of_item", getThreshold(), Lang.translateDirect("schedule.condition.threshold.x_units_of_item", getThreshold(),
Lang.translateDirect("schedule.condition.threshold." + (inStacks() ? "stacks" : "items")), Lang.translateDirect("schedule.condition.threshold." + (inStacks() ? "stacks" : "items")),
stack.getItem() instanceof FilterItem ? Lang.translateDirect("schedule.condition.threshold.matching_content") stack.isEmpty() ? Lang.translateDirect("schedule.condition.threshold.anything")
: stack.getHoverName()) : stack.getItem() instanceof FilterItem
? Lang.translateDirect("schedule.condition.threshold.matching_content")
: stack.getHoverName())
.withStyle(ChatFormatting.DARK_AQUA)); .withStyle(ChatFormatting.DARK_AQUA));
} }

View file

@ -10,7 +10,10 @@ import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@ -26,9 +29,14 @@ public class StationPoweredCondition extends ScheduleWaitCondition {
if (currentStation == null) if (currentStation == null)
return false; return false;
BlockPos stationPos = currentStation.getTilePos(); BlockPos stationPos = currentStation.getTilePos();
if (!level.isLoaded(stationPos)) ResourceKey<Level> stationDim = currentStation.getTileDimension();
MinecraftServer server = level.getServer();
if (server == null)
return false; return false;
return level.hasNeighborSignal(stationPos); ServerLevel stationLevel = server.getLevel(stationDim);
if (stationLevel == null || !stationLevel.isLoaded(stationPos))
return false;
return stationLevel.hasNeighborSignal(stationPos);
} }
@Override @Override

View file

@ -10,6 +10,7 @@ import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@ -21,6 +22,7 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.pathfinder.BlockPathTypes;
import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
@ -43,6 +45,11 @@ public class FakeTrackBlock extends Block implements EntityBlock, ProperWaterlog
public RenderShape getRenderShape(BlockState pState) { public RenderShape getRenderShape(BlockState pState) {
return RenderShape.ENTITYBLOCK_ANIMATED; return RenderShape.ENTITYBLOCK_ANIMATED;
} }
@Override
public BlockPathTypes getAiPathNodeType(BlockState state, BlockGetter world, BlockPos pos, Mob entity) {
return BlockPathTypes.DAMAGE_OTHER;
}
@Override @Override
protected void createBlockStateDefinition(Builder<Block, BlockState> pBuilder) { protected void createBlockStateDefinition(Builder<Block, BlockState> pBuilder) {

View file

@ -66,6 +66,7 @@ import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.BlockPlaceContext;
@ -89,6 +90,7 @@ import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.BoundingBox;
import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.level.material.PushReaction;
import net.minecraft.world.level.pathfinder.BlockPathTypes;
import net.minecraft.world.level.portal.PortalForcer; import net.minecraft.world.level.portal.PortalForcer;
import net.minecraft.world.level.portal.PortalInfo; import net.minecraft.world.level.portal.PortalInfo;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
@ -119,6 +121,11 @@ public class TrackBlock extends Block
protected void createBlockStateDefinition(Builder<Block, BlockState> p_49915_) { protected void createBlockStateDefinition(Builder<Block, BlockState> p_49915_) {
super.createBlockStateDefinition(p_49915_.add(SHAPE, HAS_TE, WATERLOGGED)); super.createBlockStateDefinition(p_49915_.add(SHAPE, HAS_TE, WATERLOGGED));
} }
@Override
public BlockPathTypes getAiPathNodeType(BlockState state, BlockGetter world, BlockPos pos, Mob entity) {
return BlockPathTypes.RAIL;
}
@Override @Override
public FluidState getFluidState(BlockState state) { public FluidState getFluidState(BlockState state) {

View file

@ -17,6 +17,7 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.StringTag; import net.minecraft.nbt.StringTag;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.HoverEvent;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Style; import net.minecraft.network.chat.Style;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
@ -154,7 +155,11 @@ public class MaterialChecklist {
private Component entry(ItemStack item, int amount, boolean unfinished) { private Component entry(ItemStack item, int amount, boolean unfinished) {
int stacks = amount / 64; int stacks = amount / 64;
int remainder = amount % 64; int remainder = amount % 64;
MutableComponent tc = Components.translatable(item.getDescriptionId()); MutableComponent tc = Components.empty();
tc.append(Components.translatable(item.getDescriptionId())
.setStyle(Style.EMPTY
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo(item)))));
if (!unfinished) if (!unfinished)
tc.append(" \u2714"); tc.append(" \u2714");
tc.withStyle(unfinished ? ChatFormatting.BLUE : ChatFormatting.DARK_GREEN); tc.withStyle(unfinished ? ChatFormatting.BLUE : ChatFormatting.DARK_GREEN);

View file

@ -31,7 +31,7 @@ import net.minecraft.world.phys.Vec3;
public class DumpRailwaysCommand { public class DumpRailwaysCommand {
static ArgumentBuilder<CommandSourceStack, ?> register() { static ArgumentBuilder<CommandSourceStack, ?> register() {
return Commands.literal("dumpRailways") return Commands.literal("trains")
.requires(cs -> cs.hasPermission(2)) .requires(cs -> cs.hasPermission(2))
.executes(ctx -> { .executes(ctx -> {
CommandSourceStack source = ctx.getSource(); CommandSourceStack source = ctx.getSource();
@ -52,7 +52,7 @@ public class DumpRailwaysCommand {
int orange = 0xFFAD60; int orange = 0xFFAD60;
chat.accept("", white); chat.accept("", white);
chat.accept("-+------<< Railways Summary: >>------+-", white); chat.accept("-+------<< Train Summary: >>------+-", white);
int graphCount = railways.trackNetworks.size(); int graphCount = railways.trackNetworks.size();
chat.accept("Track Networks: " + graphCount, blue); chat.accept("Track Networks: " + graphCount, blue);
chat.accept("Signal Groups: " + railways.signalEdgeGroups.size(), blue); chat.accept("Signal Groups: " + railways.signalEdgeGroups.size(), blue);

View file

@ -4,6 +4,7 @@ public class CRecipes extends ConfigBase {
public final ConfigBool bulkPressing = b(false, "bulkPressing", Comments.bulkPressing); public final ConfigBool bulkPressing = b(false, "bulkPressing", Comments.bulkPressing);
public final ConfigBool bulkCutting = b(false, "bulkCutting", Comments.bulkCutting); public final ConfigBool bulkCutting = b(false, "bulkCutting", Comments.bulkCutting);
public final ConfigBool allowBrewingInMixer = b(true, "allowBrewingInMixer", Comments.allowBrewingInMixer);
public final ConfigBool allowShapelessInMixer = b(true, "allowShapelessInMixer", Comments.allowShapelessInMixer); public final ConfigBool allowShapelessInMixer = b(true, "allowShapelessInMixer", Comments.allowShapelessInMixer);
public final ConfigBool allowShapedSquareInPress = b(true, "allowShapedSquareInPress", Comments.allowShapedSquareInPress); public final ConfigBool allowShapedSquareInPress = b(true, "allowShapedSquareInPress", Comments.allowShapedSquareInPress);
public final ConfigBool allowRegularCraftingInCrafter = public final ConfigBool allowRegularCraftingInCrafter =
@ -28,8 +29,9 @@ public class CRecipes extends ConfigBase {
private static class Comments { private static class Comments {
static String bulkPressing = "Allow the Mechanical Press to process entire stacks at a time."; static String bulkPressing = "Allow the Mechanical Press to process entire stacks at a time.";
static String bulkCutting = "Allow the Mechanical Saw to process entire stacks at a time."; static String bulkCutting = "Allow the Mechanical Saw to process entire stacks at a time.";
static String allowBrewingInMixer = "Allow supported potions to be brewed by a Mechanical Mixer + Basin.";
static String allowShapelessInMixer = static String allowShapelessInMixer =
"Allow allows any shapeless crafting recipes to be processed by a Mechanical Mixer + Basin."; "Allow any shapeless crafting recipes to be processed by a Mechanical Mixer + Basin.";
static String allowShapedSquareInPress = static String allowShapedSquareInPress =
"Allow any single-ingredient 2x2 or 3x3 crafting recipes to be processed by a Mechanical Press + Basin."; "Allow any single-ingredient 2x2 or 3x3 crafting recipes to be processed by a Mechanical Press + Basin.";
static String allowRegularCraftingInCrafter = static String allowRegularCraftingInCrafter =

View file

@ -22,7 +22,7 @@ public class CStress extends ConfigBase implements IStressValueProvider {
@Override @Override
protected void registerAll(Builder builder) { protected void registerAll(Builder builder) {
builder.comment("", Comments.su, Comments.impact) builder.comment(".", Comments.su, Comments.impact)
.push("impact"); .push("impact");
BlockStressDefaults.DEFAULT_IMPACTS.forEach((r, i) -> { BlockStressDefaults.DEFAULT_IMPACTS.forEach((r, i) -> {
if (r.getNamespace() if (r.getNamespace()
@ -31,7 +31,7 @@ public class CStress extends ConfigBase implements IStressValueProvider {
}); });
builder.pop(); builder.pop();
builder.comment("", Comments.su, Comments.capacity) builder.comment(".", Comments.su, Comments.capacity)
.push("capacity"); .push("capacity");
BlockStressDefaults.DEFAULT_CAPACITIES.forEach((r, i) -> { BlockStressDefaults.DEFAULT_CAPACITIES.forEach((r, i) -> {
if (r.getNamespace() if (r.getNamespace()

View file

@ -110,11 +110,11 @@ public abstract class ConfigBase {
public void addComments(Builder builder, String... comment) { public void addComments(Builder builder, String... comment) {
if (comment.length > 0) { if (comment.length > 0) {
String[] comments = new String[comment.length + 1]; String[] comments = new String[comment.length + 1];
comments[0] = " "; comments[0] = ".";
System.arraycopy(comment, 0, comments, 1, comment.length); System.arraycopy(comment, 0, comments, 1, comment.length);
builder.comment(comments); builder.comment(comments);
} else } else
builder.comment(" "); builder.comment(".");
} }
public void register(ForgeConfigSpec.Builder builder) { public void register(ForgeConfigSpec.Builder builder) {

View file

@ -46,10 +46,11 @@ public enum ContraptionMovementSetting {
} }
public static void registerDefaults() { public static void registerDefaults() {
register(Blocks.BUDDING_AMETHYST, () -> AllConfigs.SERVER.kinetics.amethystMovement.get());
register(Blocks.SPAWNER, () -> AllConfigs.SERVER.kinetics.spawnerMovement.get()); register(Blocks.SPAWNER, () -> AllConfigs.SERVER.kinetics.spawnerMovement.get());
register(Blocks.BUDDING_AMETHYST, () -> AllConfigs.SERVER.kinetics.amethystMovement.get());
register(Blocks.OBSIDIAN, () -> AllConfigs.SERVER.kinetics.obsidianMovement.get()); register(Blocks.OBSIDIAN, () -> AllConfigs.SERVER.kinetics.obsidianMovement.get());
register(Blocks.CRYING_OBSIDIAN, () -> AllConfigs.SERVER.kinetics.obsidianMovement.get()); register(Blocks.CRYING_OBSIDIAN, () -> AllConfigs.SERVER.kinetics.obsidianMovement.get());
register(Blocks.RESPAWN_ANCHOR, () -> AllConfigs.SERVER.kinetics.obsidianMovement.get());
} }
public interface IMovementSettingProvider extends IForgeBlock { public interface IMovementSettingProvider extends IForgeBlock {

View file

@ -204,11 +204,13 @@ public abstract class FluidIngredient implements Predicate<FluidStack> {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
protected boolean testInternal(FluidStack t) { protected boolean testInternal(FluidStack t) {
if (tag == null) if (tag == null) {
for (FluidStack accepted : getMatchingFluidStacks()) for (FluidStack accepted : getMatchingFluidStacks())
if (accepted.getFluid() if (accepted.getFluid()
.isSame(t.getFluid())) .isSame(t.getFluid()))
return true; return true;
return false;
}
return t.getFluid().is(tag); return t.getFluid().is(tag);
} }

View file

@ -5,6 +5,7 @@ import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.logging.log4j.util.TriConsumer; import org.apache.logging.log4j.util.TriConsumer;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
@ -56,18 +57,21 @@ public abstract class EntityContraptionInteractionMixin extends CapabilityProvid
protected abstract void playStepSound(BlockPos p_180429_1_, BlockState p_180429_2_); protected abstract void playStepSound(BlockPos p_180429_1_, BlockState p_180429_2_);
private Set<AbstractContraptionEntity> getIntersectingContraptions() { private Set<AbstractContraptionEntity> getIntersectingContraptions() {
Set<AbstractContraptionEntity> contraptions = ContraptionHandler.loadedContraptions.get(self.level) Set<AbstractContraptionEntity> contraptions = getIntersectionContraptionsStream().collect(Collectors.toSet());
.values()
.stream()
.map(Reference::get)
.filter(cEntity -> cEntity != null && cEntity.collidingEntities.containsKey(self))
.collect(Collectors.toSet());
contraptions.addAll(self.level.getEntitiesOfClass(AbstractContraptionEntity.class, self.getBoundingBox() contraptions.addAll(self.level.getEntitiesOfClass(AbstractContraptionEntity.class, self.getBoundingBox()
.inflate(1f))); .inflate(1f)));
return contraptions; return contraptions;
} }
private Stream<AbstractContraptionEntity> getIntersectionContraptionsStream() {
return ContraptionHandler.loadedContraptions.get(self.level)
.values()
.stream()
.map(Reference::get)
.filter(cEntity -> cEntity != null && cEntity.collidingEntities.containsKey(self));
}
private void forCollision(Vec3 anchorPos, TriConsumer<Contraption, BlockState, BlockPos> action) { private void forCollision(Vec3 anchorPos, TriConsumer<Contraption, BlockState, BlockPos> action) {
getIntersectingContraptions().forEach(cEntity -> { getIntersectingContraptions().forEach(cEntity -> {
Vec3 localPos = ContraptionCollider.getWorldToLocalTranslation(anchorPos, cEntity); Vec3 localPos = ContraptionCollider.getWorldToLocalTranslation(anchorPos, cEntity);
@ -88,7 +92,7 @@ public abstract class EntityContraptionInteractionMixin extends CapabilityProvid
@Inject(at = @At(value = "JUMP", opcode = 154, // IFNE line 661 injecting before `!blockstate.isAir(this.world, blockpos)` @Inject(at = @At(value = "JUMP", opcode = 154, // IFNE line 661 injecting before `!blockstate.isAir(this.world, blockpos)`
ordinal = 7), method = "move") ordinal = 7), method = "move")
private void movementMixin(MoverType mover, Vec3 movement, CallbackInfo ci) { private void movementStepMixin(MoverType mover, Vec3 movement, CallbackInfo ci) { // involves block step sounds on contraptions
Vec3 worldPos = self.position() Vec3 worldPos = self.position()
.add(0, -0.2, 0); .add(0, -0.2, 0);
AtomicBoolean stepped = new AtomicBoolean(false); AtomicBoolean stepped = new AtomicBoolean(false);
@ -104,6 +108,43 @@ public abstract class EntityContraptionInteractionMixin extends CapabilityProvid
this.nextStep = this.nextStep(); this.nextStep = this.nextStep();
} }
@Inject(at = @At(value = "TAIL"), method = "move")
private void movementMixin(MoverType mover, Vec3 movement, CallbackInfo ci) {
// involves client-side view bobbing animation on contraptions
if (!self.level.isClientSide)
return;
if (self.isOnGround())
return;
if (self.isPassenger())
return;
Vec3 worldPos = self.position()
.add(0, -0.2, 0);
boolean onAtLeastOneContraption = getIntersectionContraptionsStream().anyMatch(cEntity -> {
Vec3 localPos = ContraptionCollider.getWorldToLocalTranslation(worldPos, cEntity);
localPos = worldPos.add(localPos);
BlockPos blockPos = new BlockPos(localPos);
Contraption contraption = cEntity.getContraption();
StructureTemplate.StructureBlockInfo info = contraption.getBlocks()
.get(blockPos);
if (info == null)
return false;
cEntity.registerColliding(self);
return true;
});
if (!onAtLeastOneContraption)
return;
self.setOnGround(true);
self.getPersistentData()
.putBoolean("ContraptionGrounded", true);
}
@Inject(method = { "spawnSprintParticle" }, at = @At(value = "TAIL")) @Inject(method = { "spawnSprintParticle" }, at = @At(value = "TAIL"))
private void createRunningParticlesMixin(CallbackInfo ci) { private void createRunningParticlesMixin(CallbackInfo ci) {
Vec3 worldPos = self.position() Vec3 worldPos = self.position()

View file

@ -188,7 +188,7 @@ public enum AllPackets {
; ;
public static final ResourceLocation CHANNEL_NAME = Create.asResource("main"); public static final ResourceLocation CHANNEL_NAME = Create.asResource("main");
public static final int NETWORK_VERSION = 1; public static final int NETWORK_VERSION = 2;
public static final String NETWORK_VERSION_STR = String.valueOf(NETWORK_VERSION); public static final String NETWORK_VERSION_STR = String.valueOf(NETWORK_VERSION);
public static SimpleChannel channel; public static SimpleChannel channel;

View file

@ -134,14 +134,14 @@ public class PonderScene {
} }
public Pair<ItemStack, BlockPos> rayTraceScene(Vec3 from, Vec3 to) { public Pair<ItemStack, BlockPos> rayTraceScene(Vec3 from, Vec3 to) {
MutableObject<Pair<WorldSectionElement, BlockPos>> nearestHit = new MutableObject<>(); MutableObject<Pair<WorldSectionElement, Pair<Vec3, BlockHitResult>>> nearestHit = new MutableObject<>();
MutableDouble bestDistance = new MutableDouble(0); MutableDouble bestDistance = new MutableDouble(0);
forEach(WorldSectionElement.class, wse -> { forEach(WorldSectionElement.class, wse -> {
wse.resetSelectedBlock(); wse.resetSelectedBlock();
if (!wse.isVisible()) if (!wse.isVisible())
return; return;
Pair<Vec3, BlockPos> rayTrace = wse.rayTrace(world, from, to); Pair<Vec3, BlockHitResult> rayTrace = wse.rayTrace(world, from, to);
if (rayTrace == null) if (rayTrace == null)
return; return;
double distanceTo = rayTrace.getFirst() double distanceTo = rayTrace.getFirst()
@ -149,15 +149,17 @@ public class PonderScene {
if (nearestHit.getValue() != null && distanceTo >= bestDistance.getValue()) if (nearestHit.getValue() != null && distanceTo >= bestDistance.getValue())
return; return;
nearestHit.setValue(Pair.of(wse, rayTrace.getSecond())); nearestHit.setValue(Pair.of(wse, rayTrace));
bestDistance.setValue(distanceTo); bestDistance.setValue(distanceTo);
}); });
if (nearestHit.getValue() == null) if (nearestHit.getValue() == null)
return Pair.of(ItemStack.EMPTY, null); return Pair.of(ItemStack.EMPTY, null);
BlockPos selectedPos = nearestHit.getValue() Pair<Vec3, BlockHitResult> selectedHit = nearestHit.getValue()
.getSecond(); .getSecond();
BlockPos selectedPos = selectedHit.getSecond()
.getBlockPos();
BlockPos origin = new BlockPos(basePlateOffsetX, 0, basePlateOffsetZ); BlockPos origin = new BlockPos(basePlateOffsetX, 0, basePlateOffsetZ);
if (!world.getBounds() if (!world.getBounds()
@ -176,9 +178,14 @@ public class PonderScene {
.getFirst() .getFirst()
.selectBlock(selectedPos); .selectBlock(selectedPos);
BlockState blockState = world.getBlockState(selectedPos); BlockState blockState = world.getBlockState(selectedPos);
ItemStack pickBlock = blockState.getCloneItemStack(
new BlockHitResult(VecHelper.getCenterOf(selectedPos), Direction.UP, selectedPos, true), world, selectedPos, Direction direction = selectedHit.getSecond()
Minecraft.getInstance().player); .getDirection();
Vec3 location = selectedHit.getSecond()
.getLocation();
ItemStack pickBlock = blockState.getCloneItemStack(new BlockHitResult(location, direction, selectedPos, true),
world, selectedPos, Minecraft.getInstance().player);
return Pair.of(pickBlock, selectedPos); return Pair.of(pickBlock, selectedPos);
} }

View file

@ -34,6 +34,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.BlockParticleOption; import net.minecraft.core.particles.BlockParticleOption;
import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
@ -54,7 +55,7 @@ public class PonderWorld extends SchematicWorld {
public PonderScene scene; public PonderScene scene;
protected Map<BlockPos, BlockState> originalBlocks; protected Map<BlockPos, BlockState> originalBlocks;
protected Map<BlockPos, BlockEntity> originalTileEntities; protected Map<BlockPos, CompoundTag> originalTileEntities;
protected Map<BlockPos, Integer> blockBreakingProgressions; protected Map<BlockPos, Integer> blockBreakingProgressions;
protected List<Entity> originalEntities; protected List<Entity> originalEntities;
private Supplier<ClientLevel> asClientWorld = Suppliers.memoize(() -> WrappedClientWorld.of(this)); private Supplier<ClientLevel> asClientWorld = Suppliers.memoize(() -> WrappedClientWorld.of(this));
@ -79,8 +80,7 @@ public class PonderWorld extends SchematicWorld {
originalBlocks.clear(); originalBlocks.clear();
originalTileEntities.clear(); originalTileEntities.clear();
blocks.forEach((k, v) -> originalBlocks.put(k, v)); blocks.forEach((k, v) -> originalBlocks.put(k, v));
tileEntities.forEach( tileEntities.forEach((k, v) -> originalTileEntities.put(k, v.saveWithFullMetadata()));
(k, v) -> originalTileEntities.put(k, BlockEntity.loadStatic(k, blocks.get(k), v.saveWithFullMetadata())));
entities.forEach(e -> EntityType.create(e.serializeNBT(), this) entities.forEach(e -> EntityType.create(e.serializeNBT(), this)
.ifPresent(originalEntities::add)); .ifPresent(originalEntities::add));
} }
@ -93,7 +93,7 @@ public class PonderWorld extends SchematicWorld {
renderedTileEntities.clear(); renderedTileEntities.clear();
originalBlocks.forEach((k, v) -> blocks.put(k, v)); originalBlocks.forEach((k, v) -> blocks.put(k, v));
originalTileEntities.forEach((k, v) -> { originalTileEntities.forEach((k, v) -> {
BlockEntity te = BlockEntity.loadStatic(k, originalBlocks.get(k), v.saveWithFullMetadata()); BlockEntity te = BlockEntity.loadStatic(k, originalBlocks.get(k), v);
onTEadded(te, te.getBlockPos()); onTEadded(te, te.getBlockPos());
tileEntities.put(k, te); tileEntities.put(k, te);
renderedTileEntities.add(te); renderedTileEntities.add(te);
@ -109,8 +109,7 @@ public class PonderWorld extends SchematicWorld {
if (originalBlocks.containsKey(p)) if (originalBlocks.containsKey(p))
blocks.put(p, originalBlocks.get(p)); blocks.put(p, originalBlocks.get(p));
if (originalTileEntities.containsKey(p)) { if (originalTileEntities.containsKey(p)) {
BlockEntity te = BlockEntity.loadStatic(p, originalBlocks.get(p), originalTileEntities.get(p) BlockEntity te = BlockEntity.loadStatic(p, originalBlocks.get(p), originalTileEntities.get(p));
.saveWithFullMetadata());
onTEadded(te, te.getBlockPos()); onTEadded(te, te.getBlockPos());
tileEntities.put(p, te); tileEntities.put(p, te);
} }

View file

@ -181,7 +181,7 @@ public class WorldSectionElement extends AnimatedSceneElement {
BlockPos worldPos; BlockPos worldPos;
} }
public Pair<Vec3, BlockPos> rayTrace(PonderWorld world, Vec3 source, Vec3 target) { public Pair<Vec3, BlockHitResult> rayTrace(PonderWorld world, Vec3 source, Vec3 target) {
world.setMask(this.section); world.setMask(this.section);
Vec3 transformedTarget = reverseTransformVec(target); Vec3 transformedTarget = reverseTransformVec(target);
BlockHitResult rayTraceBlocks = world.clip(new ClipContext(reverseTransformVec(source), transformedTarget, BlockHitResult rayTraceBlocks = world.clip(new ClipContext(reverseTransformVec(source), transformedTarget,
@ -199,7 +199,7 @@ public class WorldSectionElement extends AnimatedSceneElement {
/ source.subtract(target) / source.subtract(target)
.lengthSqr(); .lengthSqr();
Vec3 actualHit = VecHelper.lerp((float) t, target, source); Vec3 actualHit = VecHelper.lerp((float) t, target, source);
return Pair.of(actualHit, rayTraceBlocks.getBlockPos()); return Pair.of(actualHit, rayTraceBlocks);
} }
private Vec3 reverseTransformVec(Vec3 in) { private Vec3 reverseTransformVec(Vec3 in) {

Some files were not shown because too many files have changed in this diff Show more