From 38e9edd589e3e814531bc4f037c588103a9aa8bb Mon Sep 17 00:00:00 2001 From: tmvkrpxl0 Date: Tue, 12 May 2026 20:23:32 +0900 Subject: [PATCH 1/4] Switch to semver4j from gradle internal parser --- build.gradle | 19 ++++++++++++++++--- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 36801a2d..e8d20d56 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,16 @@ +buildscript { + dependencies { + classpath 'org.semver4j:semver4j:6.0.0' + } +} + +import org.semver4j.Semver + plugins { id 'java-library' id 'maven-publish' id 'idea' - id 'net.neoforged.moddev' version '2.0.140' + id 'net.neoforged.moddev' version '2.0.141' id 'me.modmuss50.mod-publish-plugin' version '1.1.0' } @@ -85,6 +93,10 @@ sourceSets.main.resources { srcDir 'src/generated/resources' } +configurations { + runtimeClasspath.extendsFrom localRuntime +} + dependencies { implementation "net.neoforged:neoforge:${neo_version}" implementation("com.cake.azimuth:azimuth:${azimuth_version}") @@ -114,7 +126,7 @@ dependencies { if (enable_cc_tweaked.toBoolean()) { compileOnly("cc.tweaked:cc-tweaked-$minecraft_version-core-api:$cc_tweaked_version") compileOnly("cc.tweaked:cc-tweaked-$minecraft_version-forge-api:$cc_tweaked_version") - runtimeOnly("cc.tweaked:cc-tweaked-$minecraft_version-forge:$cc_tweaked_version") + localRuntime("cc.tweaked:cc-tweaked-$minecraft_version-forge:$cc_tweaked_version") } } @@ -176,12 +188,13 @@ String getRelevantChangelog(String targetVersion) { def versionTag = line.substring(2).trim() def entryMinecraftVersion = versionTag.split("-")[0] def entryModVersion = versionTag.split("-").length > 1 ? versionTag.split("-")[1] : "" + entryModVersion = entryModVersion.replace("jolly", "") if (versionTag == targetVersion) { capturing = true continue } if (entryMinecraftVersion == targetMinecraftVersion && - org.gradle.util.VersionNumber.parse(entryModVersion) > org.gradle.util.VersionNumber.parse(targetModVersion)) { + new Semver(entryModVersion) > new Semver(targetModVersion)) { newerVersionsExist = true } } else if (capturing && line.trim()) { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ff23a68d..1a704683 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 5b6496464ee4b3aca54e81d3faa8ab3902a7e10c Mon Sep 17 00:00:00 2001 From: tmvkrpxl0 Date: Tue, 12 May 2026 23:25:13 +0900 Subject: [PATCH 2/4] Re-run datagen --- .../8360b56ed49e5e74b2d001f2139fc65c7861c482 | 3 +- .../9833d8c585dbb9d02ddaa2f15e4cf4ccb8f5b99f | 340 +++++++++--------- .../assets/bits_n_bobs/lang/en_ud.json | 6 +- .../assets/bits_n_bobs/lang/en_us.json | 6 +- .../bits_n_bobs/models/item/cookie_dough.json | 6 - .../models/item/icon_lightbulb.json | 3 - .../bits_n_bobs/advancement/cookie_dough.json | 28 -- 7 files changed, 172 insertions(+), 220 deletions(-) delete mode 100644 src/generated/resources/assets/bits_n_bobs/models/item/cookie_dough.json delete mode 100644 src/generated/resources/assets/bits_n_bobs/models/item/icon_lightbulb.json delete mode 100644 src/generated/resources/data/bits_n_bobs/advancement/cookie_dough.json diff --git a/src/generated/resources/.cache/8360b56ed49e5e74b2d001f2139fc65c7861c482 b/src/generated/resources/.cache/8360b56ed49e5e74b2d001f2139fc65c7861c482 index d71e17f8..0943f111 100644 --- a/src/generated/resources/.cache/8360b56ed49e5e74b2d001f2139fc65c7861c482 +++ b/src/generated/resources/.cache/8360b56ed49e5e74b2d001f2139fc65c7861c482 @@ -1,3 +1,2 @@ -// 1.21.1 2026-04-01T17:36:05.8711422 Bits 'n' Bobs Advancements -a1bc86c589eed354ad7bf9b01b3f4d7f5f31e797 data/bits_n_bobs/advancement/cookie_dough.json +// 1.21.1 2026-05-12T23:22:54.919472619 Bits 'n' Bobs Advancements c8926dbd3a323de81f7c038461a2bf6f8304159e data/bits_n_bobs/advancement/dye_fluid_component.json diff --git a/src/generated/resources/.cache/9833d8c585dbb9d02ddaa2f15e4cf4ccb8f5b99f b/src/generated/resources/.cache/9833d8c585dbb9d02ddaa2f15e4cf4ccb8f5b99f index c355f266..6e9d510f 100644 --- a/src/generated/resources/.cache/9833d8c585dbb9d02ddaa2f15e4cf4ccb8f5b99f +++ b/src/generated/resources/.cache/9833d8c585dbb9d02ddaa2f15e4cf4ccb8f5b99f @@ -1,15 +1,15 @@ -// 1.21.1 2026-04-17T16:26:08.7123878 Registrate Provider for bits_n_bobs [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] +// 1.21.1 2026-05-12T23:22:55.684474395 Registrate Provider for bits_n_bobs [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] bae96470ab6d0efb7a73bf4e5f0a82277358b272 assets/bits_n_bobs/blockstates/andesite_encased_flanged_cogwheel.json 161eacda54e0ee43ba4ec50b5a179c7c27d6ab3a assets/bits_n_bobs/blockstates/andesite_encased_large_flanged_cogwheel.json 70069cf32ef31f524297f96e15c560aa8e3e41ae assets/bits_n_bobs/blockstates/andesite_encased_piston_extension_pole.json -55ef065722d329b3c054797cd63a36d59f1634a8 assets/bits_n_bobs/blockstates/andesite_tiles.json 8810b9385c4f0297369a2d35ef8435b216bae4bb assets/bits_n_bobs/blockstates/andesite_tile_slab.json 67a9c45ad788cd261f7b545e230d1d01bf3fd0d8 assets/bits_n_bobs/blockstates/andesite_tile_stairs.json 71930bd2e19fb58896140d6fa36ede35e226ee5a assets/bits_n_bobs/blockstates/andesite_tile_wall.json -b3e14dc856928e0c2bf9078afd67eb5cff585c08 assets/bits_n_bobs/blockstates/asurine_tiles.json +55ef065722d329b3c054797cd63a36d59f1634a8 assets/bits_n_bobs/blockstates/andesite_tiles.json 10d81d57d02214b922e0da76c679bdeb0b41c360 assets/bits_n_bobs/blockstates/asurine_tile_slab.json d8a9b28bb2e5ebf6fcfb440284a273979cb7401b assets/bits_n_bobs/blockstates/asurine_tile_stairs.json 2196634500a839b280528753af8ac8493ecf4982 assets/bits_n_bobs/blockstates/asurine_tile_wall.json +b3e14dc856928e0c2bf9078afd67eb5cff585c08 assets/bits_n_bobs/blockstates/asurine_tiles.json 79e5765279cfbaec82ea66c3864cc6454c1a9716 assets/bits_n_bobs/blockstates/black_chair.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/black_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/black_nixie_board.json @@ -24,41 +24,41 @@ fa8a7370a031ae6598bf9152995e34dceec93195 assets/bits_n_bobs/blockstates/brown_ch 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/brown_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/brown_nixie_board.json a3bfc3500a49bdcbe3e06fc88c47de52763085be assets/bits_n_bobs/blockstates/cable_girder_strut.json -cecda21d45a8243a23b12088b3fc31ae22eae23b assets/bits_n_bobs/blockstates/calcite_tiles.json 662b6c23ef124ef40131f84698bc9a603641db2c assets/bits_n_bobs/blockstates/calcite_tile_slab.json 1bb8d03ed73f765c3645b92303da83f053f38fca assets/bits_n_bobs/blockstates/calcite_tile_stairs.json a3f6e516ec29d43ee1b6eb10ae894fc7b1a05ccc assets/bits_n_bobs/blockstates/calcite_tile_wall.json +cecda21d45a8243a23b12088b3fc31ae22eae23b assets/bits_n_bobs/blockstates/calcite_tiles.json a4e82b3ce8e7d78c156dc689de8ab45f770eb9d4 assets/bits_n_bobs/blockstates/chain_pulley.json c0f965a0697e1fc54d90fc711126417640cd3553 assets/bits_n_bobs/blockstates/chain_pulley_magnet.json 28b7a44360d3a7ff797b89a7e758648260d26e41 assets/bits_n_bobs/blockstates/chain_rope.json 660a72fb49a8c28c5d71a0c94cf2268d00171800 assets/bits_n_bobs/blockstates/cogwheel_chain_carriage.json -76c9e5ad3acec45cd608e68ccc8183902608ab2b assets/bits_n_bobs/blockstates/crimsite_tiles.json 8f4c834fd95a681a62366d56effc7b98a3200c64 assets/bits_n_bobs/blockstates/crimsite_tile_slab.json 4f03c81a39083504c35de65f470247b080bf2eab assets/bits_n_bobs/blockstates/crimsite_tile_stairs.json 8f9a036f64fa776ef73f293ccf7c72effd4f0d68 assets/bits_n_bobs/blockstates/crimsite_tile_wall.json +76c9e5ad3acec45cd608e68ccc8183902608ab2b assets/bits_n_bobs/blockstates/crimsite_tiles.json 7f52eb3b96890e22b6ac0303073a173158b86a78 assets/bits_n_bobs/blockstates/cyan_chair.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/cyan_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/cyan_nixie_board.json -f4a43066bac7dc7606fe3072e9a776054f3394df assets/bits_n_bobs/blockstates/deepslate_tiles.json b98d19fd950bf290fadff471e0961bea1797a405 assets/bits_n_bobs/blockstates/deepslate_tile_slab.json 0dacd8eab43f4a4ba03a0313a2720e42ee42f966 assets/bits_n_bobs/blockstates/deepslate_tile_stairs.json 06207ed81a4c63ab03888cb5c7f6c67a12f9e3a9 assets/bits_n_bobs/blockstates/deepslate_tile_wall.json -60707b258baeef108c29566daa32ffeed376ca58 assets/bits_n_bobs/blockstates/diorite_tiles.json +f4a43066bac7dc7606fe3072e9a776054f3394df assets/bits_n_bobs/blockstates/deepslate_tiles.json a4d2410d3ff1d080c04eb27defae5ce53ee0cb8c assets/bits_n_bobs/blockstates/diorite_tile_slab.json 9b4747d89c3e4138a19e591d5bc03c4bad7196d4 assets/bits_n_bobs/blockstates/diorite_tile_stairs.json ef59cf755e5af37758df3761c75f22476245aa52 assets/bits_n_bobs/blockstates/diorite_tile_wall.json -844a2a330d24dab8178985d12e00b02cf1c61cda assets/bits_n_bobs/blockstates/dripstone_tiles.json +60707b258baeef108c29566daa32ffeed376ca58 assets/bits_n_bobs/blockstates/diorite_tiles.json 620ea1727448ffb4a5e98f9e9920d31ef8e3219c assets/bits_n_bobs/blockstates/dripstone_tile_slab.json 0abb47cf084948c642893f5dea24407700f4d275 assets/bits_n_bobs/blockstates/dripstone_tile_stairs.json 4cea5e6e1cdace4ee944c7b0f773e98421298e49 assets/bits_n_bobs/blockstates/dripstone_tile_wall.json +844a2a330d24dab8178985d12e00b02cf1c61cda assets/bits_n_bobs/blockstates/dripstone_tiles.json 945aa14fe01a9661ed3f80860150d73284bf6fc9 assets/bits_n_bobs/blockstates/flywheel_bearing.json 9a9f1fa8ecd23a90b7452b3cd96433710d827c9c assets/bits_n_bobs/blockstates/gigantic_cogwheel.json 37a4eb07905a73b7aa23fc98ced9d84edf382156 assets/bits_n_bobs/blockstates/gigantic_cogwheel_satellite.json 6a0ac2241185490eaf2da8778ea49cf4325ca760 assets/bits_n_bobs/blockstates/girder_strut.json -416f0c064c0fb3b051125278c317f919bf597bc5 assets/bits_n_bobs/blockstates/granite_tiles.json cf7282424d3ae45c34efcbc0447be669486ef1a5 assets/bits_n_bobs/blockstates/granite_tile_slab.json 864cd7ffebd2d28eacafd5f88885140b3ce8ed50 assets/bits_n_bobs/blockstates/granite_tile_stairs.json 9ae70fbd2aa70c2e6b936310bfe71f64911f222c assets/bits_n_bobs/blockstates/granite_tile_wall.json +416f0c064c0fb3b051125278c317f919bf597bc5 assets/bits_n_bobs/blockstates/granite_tiles.json cb013e2235d64efae761a9e8fc035f11474e7f65 assets/bits_n_bobs/blockstates/gray_chair.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/gray_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/gray_nixie_board.json @@ -79,28 +79,28 @@ d846d6efd9c7af4d23d1720872128bc4538b174a assets/bits_n_bobs/blockstates/industri 310dbdd4ac66788708b8c7ed3cf41d5108b235e9 assets/bits_n_bobs/blockstates/industrial_truss.json e8136731cacd838e4a712612bb730ec2dc7a41cc assets/bits_n_bobs/blockstates/large_flanged_cogwheel.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/large_nixie_tube.json -8cbed5c28515cb83f03dd9d53dda918ebfaa8768 assets/bits_n_bobs/blockstates/lightbulb.json 5dedfc5b1ab941f514957a2001a4aa6b477f9e90 assets/bits_n_bobs/blockstates/light_blue_chair.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/light_blue_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/light_blue_nixie_board.json ccf703b4fc835d48226c92b0986033a6413a99ff assets/bits_n_bobs/blockstates/light_gray_chair.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/light_gray_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/light_gray_nixie_board.json -49782ac9738f1305af200e79539913d680278fe9 assets/bits_n_bobs/blockstates/limestone_tiles.json -db674c8c71e6bbb65430ff7747df8713ea53cf4d assets/bits_n_bobs/blockstates/limestone_tile_slab.json -f9989a410942e5ffdfab15068d85d5302746442b assets/bits_n_bobs/blockstates/limestone_tile_stairs.json -b3331caaf809dd6701540e8a212fb462e9ead78e assets/bits_n_bobs/blockstates/limestone_tile_wall.json +8cbed5c28515cb83f03dd9d53dda918ebfaa8768 assets/bits_n_bobs/blockstates/lightbulb.json 4509d880e18d48ebf4a4a8370480c66a17126358 assets/bits_n_bobs/blockstates/lime_chair.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/lime_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/lime_nixie_board.json +db674c8c71e6bbb65430ff7747df8713ea53cf4d assets/bits_n_bobs/blockstates/limestone_tile_slab.json +f9989a410942e5ffdfab15068d85d5302746442b assets/bits_n_bobs/blockstates/limestone_tile_stairs.json +b3331caaf809dd6701540e8a212fb462e9ead78e assets/bits_n_bobs/blockstates/limestone_tile_wall.json +49782ac9738f1305af200e79539913d680278fe9 assets/bits_n_bobs/blockstates/limestone_tiles.json 059151d517f716ded997cf8f5ca2d77f0c7e055d assets/bits_n_bobs/blockstates/magenta_chair.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/magenta_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/magenta_nixie_board.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/nixie_board.json -45a98f19227d1b478ef80c80b7b0a78d3928210e assets/bits_n_bobs/blockstates/ochrum_tiles.json 973764c4de02fe0ec97ac707fe9a12eb77fc8bac assets/bits_n_bobs/blockstates/ochrum_tile_slab.json 14dccbad9bc53035dccc59401f906bac2953f3d0 assets/bits_n_bobs/blockstates/ochrum_tile_stairs.json 6eda2bdbb4295c6736c459cb6b7e1a309cd02de3 assets/bits_n_bobs/blockstates/ochrum_tile_wall.json +45a98f19227d1b478ef80c80b7b0a78d3928210e assets/bits_n_bobs/blockstates/ochrum_tiles.json ddd0882eec3c6c2585d13b4700640a0442bcf8e3 assets/bits_n_bobs/blockstates/orange_chair.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/orange_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/orange_nixie_board.json @@ -113,24 +113,24 @@ ddd0882eec3c6c2585d13b4700640a0442bcf8e3 assets/bits_n_bobs/blockstates/orange_c 0fc7d40d8255395155119172ad8ac9959291dc5b assets/bits_n_bobs/blockstates/red_chair.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/red_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/red_nixie_board.json -9adbc657879ad024c13766135250c8f83deba9eb assets/bits_n_bobs/blockstates/scorchia_tiles.json cdbdbfac3923e1270e74ec225b3a594c2bd0319c assets/bits_n_bobs/blockstates/scorchia_tile_slab.json ab281290e813d4444ca848f5d7851bbec97db096 assets/bits_n_bobs/blockstates/scorchia_tile_stairs.json 7e284865b514df3d642154ae1dcd6dab33cd5814 assets/bits_n_bobs/blockstates/scorchia_tile_wall.json -37ee8a34f162ace43c54ef7d0278482747e59f0f assets/bits_n_bobs/blockstates/scoria_tiles.json +9adbc657879ad024c13766135250c8f83deba9eb assets/bits_n_bobs/blockstates/scorchia_tiles.json b5daa6424b526334dc6d8dc5fbf0693e0f05755e assets/bits_n_bobs/blockstates/scoria_tile_slab.json 8ffff1cab4d0a64ce7df3b2b9bd565b5dde67d35 assets/bits_n_bobs/blockstates/scoria_tile_stairs.json 879fd6c9cc278bca5b9595216a1165e257d5726e assets/bits_n_bobs/blockstates/scoria_tile_wall.json +37ee8a34f162ace43c54ef7d0278482747e59f0f assets/bits_n_bobs/blockstates/scoria_tiles.json 520ffe1e738faab83ebe1287b9824ec067a10542 assets/bits_n_bobs/blockstates/small_flanged_cogwheel.json 1b8baf0dd765632b277e313995a0ea5123a4fbc7 assets/bits_n_bobs/blockstates/throttle_lever.json -a8117e1a7af4d62aa27dcf37f3775d813ef232cd assets/bits_n_bobs/blockstates/tuff_tiles.json 6267a2f9b725daa20fe690b95470756dcbc4ef2f assets/bits_n_bobs/blockstates/tuff_tile_slab.json b9e19f6aaa80ba570c63466252f37886ff0085eb assets/bits_n_bobs/blockstates/tuff_tile_stairs.json 61419e5357f8d4a94357986f5550269c42249ef5 assets/bits_n_bobs/blockstates/tuff_tile_wall.json -b0f7060e6d2970ce4b98ab0755eed3ef3f4ece95 assets/bits_n_bobs/blockstates/veridium_tiles.json +a8117e1a7af4d62aa27dcf37f3775d813ef232cd assets/bits_n_bobs/blockstates/tuff_tiles.json a34ad7e7327d467d226f28acfc0d84129e0ad54f assets/bits_n_bobs/blockstates/veridium_tile_slab.json 93691f0669222dbf4b65d002f0c1991a8a10e2d5 assets/bits_n_bobs/blockstates/veridium_tile_stairs.json 4c17b1398c1f6ebed5d04ae858c1227afde2f7be assets/bits_n_bobs/blockstates/veridium_tile_wall.json +b0f7060e6d2970ce4b98ab0755eed3ef3f4ece95 assets/bits_n_bobs/blockstates/veridium_tiles.json fc576b4d7f9cd924c8c9970c1a4c6163255cb41f assets/bits_n_bobs/blockstates/weathered_girder_strut.json e11cd451ae4102173bef40f7c83cccb9b4907d49 assets/bits_n_bobs/blockstates/weathered_iron_encased_cogwheel.json 93e21f5195b893924f2e057bea1e76e609a1cbc2 assets/bits_n_bobs/blockstates/weathered_iron_encased_flanged_cogwheel.json @@ -147,8 +147,8 @@ c0190afa39321b2f2c2ef4fc2365954911f2b89b assets/bits_n_bobs/blockstates/white_ch bbb308f65d8082773ca234d880ab5896c2390014 assets/bits_n_bobs/blockstates/yellow_chair.json 4db90e28dfc8d1b622b3336685268b883059c3fb assets/bits_n_bobs/blockstates/yellow_large_nixie_tube.json 98c1742a3f1ee6f357a35cadd1559b1d5f6d364a assets/bits_n_bobs/blockstates/yellow_nixie_board.json -f56f89833a987b6aaa9449a14188bdc282fb056f assets/bits_n_bobs/lang/en_ud.json -de109c9afe6e3eb80d225fc6814453e08cbd6b18 assets/bits_n_bobs/lang/en_us.json +b48ba7a02b73c8e5640e292dc0b16264728ad5a3 assets/bits_n_bobs/lang/en_ud.json +b144f2289dba3e68f000ed854957259d6dbfe69e assets/bits_n_bobs/lang/en_us.json 42e62dfae8361f2959305f50adfaaffafe2b3e5a assets/bits_n_bobs/models/block/andesite_encased_flanged_cogwheel.json 77e1dc1a5410d8439303b65e92d739dbf9cad9ef assets/bits_n_bobs/models/block/andesite_encased_flanged_cogwheel_bottom.json 189ffb75ff304fd545f38f215657c4e114a6d435 assets/bits_n_bobs/models/block/andesite_encased_flanged_cogwheel_top.json @@ -159,12 +159,6 @@ d2efd4113888d7bef833b23d5070b029b73d18e5 assets/bits_n_bobs/models/block/andesit d21dcfd988b982f7a8f4463e9165dd95a4b3cd83 assets/bits_n_bobs/models/block/andesite_encased_large_flanged_cogwheel_top_bottom.json efb0f37812ce30684fdd1ed42af53e2aa1f5886a assets/bits_n_bobs/models/block/andesite_encased_piston_extension_pole.json dfc067bdfeddb9128ae4b5d4155c1dc16a774319 assets/bits_n_bobs/models/block/andesite_encased_piston_extension_pole_empty.json -dd3ce69870709f327e97fc59a8b18e1c5d5b95f8 assets/bits_n_bobs/models/block/andesite_tiles.json -a99f4d460e7cf7d1d2b275317d29f3ea5262e484 assets/bits_n_bobs/models/block/andesite_tiles_wall_post.json -ac0fde7943f06d74d97bf2fcbdb6d6d114fa4f1f assets/bits_n_bobs/models/block/andesite_tiles_wall_side.json -91d5021e148a3dc8becfa5501f7fca51cea24b90 assets/bits_n_bobs/models/block/andesite_tiles_wall_side_alternate.json -41000470ea69b4644f50951e7933e1fedecc8947 assets/bits_n_bobs/models/block/andesite_tiles_wall_side_tall.json -189b7cd84e8da102ed8b6add79bc0226a55e5abb assets/bits_n_bobs/models/block/andesite_tiles_wall_side_tall_alternate.json f3e26993c5db91ea3985c196e9067b07496aa3f9 assets/bits_n_bobs/models/block/andesite_tile_slab.json 83b76fe4bd2f5d08a8be0415b9c10a60eaac3942 assets/bits_n_bobs/models/block/andesite_tile_slab_top.json 953cf34c0db5711a3db8edd534376fb4733d9fe4 assets/bits_n_bobs/models/block/andesite_tile_stairs.json @@ -173,12 +167,12 @@ d1265b2c7fec87489ddee00b9fa77fef450a3d29 assets/bits_n_bobs/models/block/andesit 49da7499948afb82068a8efaf29a0b46b52d608b assets/bits_n_bobs/models/block/andesite_tile_stairs_inner_alternate.json b78b6f9a2483b94e800a415ad63b65cf6fccfb51 assets/bits_n_bobs/models/block/andesite_tile_stairs_outer.json 5209a51ed892a1662a50e8b87bf4d169811906c2 assets/bits_n_bobs/models/block/andesite_tile_stairs_outer_alternate.json -3e55503136f1bcc11915b5fb3f1fc2bbab7cc008 assets/bits_n_bobs/models/block/asurine_tiles.json -c04d87bf971a69a2470339404fcd8364a327632a assets/bits_n_bobs/models/block/asurine_tiles_wall_post.json -7b5d5f90dc4442fc0fd2d4f20f0609333510e848 assets/bits_n_bobs/models/block/asurine_tiles_wall_side.json -13bbdbf8dec58457ec2258107408f0d1aad83cca assets/bits_n_bobs/models/block/asurine_tiles_wall_side_alternate.json -5a346281d474f1a7c9c412b2f8e04019426b2fa5 assets/bits_n_bobs/models/block/asurine_tiles_wall_side_tall.json -18a969962380a6b94398aeea8dc3eebfa1ab9c89 assets/bits_n_bobs/models/block/asurine_tiles_wall_side_tall_alternate.json +dd3ce69870709f327e97fc59a8b18e1c5d5b95f8 assets/bits_n_bobs/models/block/andesite_tiles.json +a99f4d460e7cf7d1d2b275317d29f3ea5262e484 assets/bits_n_bobs/models/block/andesite_tiles_wall_post.json +ac0fde7943f06d74d97bf2fcbdb6d6d114fa4f1f assets/bits_n_bobs/models/block/andesite_tiles_wall_side.json +91d5021e148a3dc8becfa5501f7fca51cea24b90 assets/bits_n_bobs/models/block/andesite_tiles_wall_side_alternate.json +41000470ea69b4644f50951e7933e1fedecc8947 assets/bits_n_bobs/models/block/andesite_tiles_wall_side_tall.json +189b7cd84e8da102ed8b6add79bc0226a55e5abb assets/bits_n_bobs/models/block/andesite_tiles_wall_side_tall_alternate.json 1ba4af887a2275bbc1ea491c6f93fc940a0cdffb assets/bits_n_bobs/models/block/asurine_tile_slab.json 84412c5fbeefcd4e8e4fcb7a2a21c35905a8fd5e assets/bits_n_bobs/models/block/asurine_tile_slab_top.json e87a85e5d3ab7cc8cac8ec0651c5b8cc438ae132 assets/bits_n_bobs/models/block/asurine_tile_stairs.json @@ -187,6 +181,12 @@ f665f0a65074c59217187496e17d7db9b4ea12b2 assets/bits_n_bobs/models/block/asurine 1459244a083ef828b22ed1d94ccbf6dc0a727999 assets/bits_n_bobs/models/block/asurine_tile_stairs_inner_alternate.json 3bd343f41cbe03b165f61bfe455ab4e81c0a0474 assets/bits_n_bobs/models/block/asurine_tile_stairs_outer.json cfe2d153bc991fe967b4db54417064a797145068 assets/bits_n_bobs/models/block/asurine_tile_stairs_outer_alternate.json +3e55503136f1bcc11915b5fb3f1fc2bbab7cc008 assets/bits_n_bobs/models/block/asurine_tiles.json +c04d87bf971a69a2470339404fcd8364a327632a assets/bits_n_bobs/models/block/asurine_tiles_wall_post.json +7b5d5f90dc4442fc0fd2d4f20f0609333510e848 assets/bits_n_bobs/models/block/asurine_tiles_wall_side.json +13bbdbf8dec58457ec2258107408f0d1aad83cca assets/bits_n_bobs/models/block/asurine_tiles_wall_side_alternate.json +5a346281d474f1a7c9c412b2f8e04019426b2fa5 assets/bits_n_bobs/models/block/asurine_tiles_wall_side_tall.json +18a969962380a6b94398aeea8dc3eebfa1ab9c89 assets/bits_n_bobs/models/block/asurine_tiles_wall_side_tall_alternate.json 2bf002775fd09a9c7fc468e322298c6bc23b5d6f assets/bits_n_bobs/models/block/bracket/cog/ground_weathered_metal.json 225f4eba5bb1470db146edd96986befd3289909a assets/bits_n_bobs/models/block/bracket/cog/wall_weathered_metal.json 1ea1006161c38f41c1c43b75fa1c60128245bb84 assets/bits_n_bobs/models/block/bracket/pipe/ground_weathered_metal.json @@ -203,12 +203,6 @@ efc84f43ef7ea278be710e18e7bf4d7b645c8686 assets/bits_n_bobs/models/block/brass_e 1f0ded4d4381b8671dedab72e99d35cc1d4d60fb assets/bits_n_bobs/models/block/brass_encased_large_flanged_cogwheel_top_bottom.json e6d1372ca9accb29dafe4d2876ca13893c5667da assets/bits_n_bobs/models/block/brass_encased_piston_extension_pole.json 0a84726ba015687431528f9eff786c83b3269c33 assets/bits_n_bobs/models/block/brass_encased_piston_extension_pole_empty.json -f25aa3b67fdb7ce7fc24cda6aebaa6aa9c70b808 assets/bits_n_bobs/models/block/calcite_tiles.json -a17c377ddce5c607a32486f86e477a346816c06a assets/bits_n_bobs/models/block/calcite_tiles_wall_post.json -91520b65e68da89290cf93737d20a4f22ddef53c assets/bits_n_bobs/models/block/calcite_tiles_wall_side.json -c695b6b732e05dfcec1cef8573985cb33ad082f1 assets/bits_n_bobs/models/block/calcite_tiles_wall_side_alternate.json -fe74614d4a644c9711d3fedbc9f80eb038e00c29 assets/bits_n_bobs/models/block/calcite_tiles_wall_side_tall.json -0714fbc72a612b2dcb47afaf02724f2959615006 assets/bits_n_bobs/models/block/calcite_tiles_wall_side_tall_alternate.json 8e34a662b459b391f1dc8565770d1b948280fae0 assets/bits_n_bobs/models/block/calcite_tile_slab.json 31914d8b64efa342b5836556861f6fe92dfec079 assets/bits_n_bobs/models/block/calcite_tile_slab_top.json 0b3d7cd98b95ca2699ce6beb6a779afcdee2c0e7 assets/bits_n_bobs/models/block/calcite_tile_stairs.json @@ -217,6 +211,12 @@ b222c95ea900c117b66979019dc5c4b96228bfd8 assets/bits_n_bobs/models/block/calcite 7911239a27c0ba560feda9b5df74f3dbca02fa8c assets/bits_n_bobs/models/block/calcite_tile_stairs_inner_alternate.json 8d2b66fb854cba53cad1543dd5c0e4629440656a assets/bits_n_bobs/models/block/calcite_tile_stairs_outer.json 46f04a8801ceed5a2394339c6cd3d26d77f01dae assets/bits_n_bobs/models/block/calcite_tile_stairs_outer_alternate.json +f25aa3b67fdb7ce7fc24cda6aebaa6aa9c70b808 assets/bits_n_bobs/models/block/calcite_tiles.json +a17c377ddce5c607a32486f86e477a346816c06a assets/bits_n_bobs/models/block/calcite_tiles_wall_post.json +91520b65e68da89290cf93737d20a4f22ddef53c assets/bits_n_bobs/models/block/calcite_tiles_wall_side.json +c695b6b732e05dfcec1cef8573985cb33ad082f1 assets/bits_n_bobs/models/block/calcite_tiles_wall_side_alternate.json +fe74614d4a644c9711d3fedbc9f80eb038e00c29 assets/bits_n_bobs/models/block/calcite_tiles_wall_side_tall.json +0714fbc72a612b2dcb47afaf02724f2959615006 assets/bits_n_bobs/models/block/calcite_tiles_wall_side_tall_alternate.json 92b4e968484a91900ca61b8e751d8a91ced8ae53 assets/bits_n_bobs/models/block/chair/block_corner_black.json add75f68a4d1a8171cb0dbcb56836b49a7bc0496 assets/bits_n_bobs/models/block/chair/block_corner_blue.json 5460a199a187499eec99c5a219af1955ebbf37c4 assets/bits_n_bobs/models/block/chair/block_corner_brown.json @@ -345,12 +345,6 @@ f052988073f03a2278d91032508f17c298232f26 assets/bits_n_bobs/models/block/chair/r d596c33ac99ac64c05cd62a24179081934f9df2e assets/bits_n_bobs/models/block/chair/right_armrest_red.json c1c51d94dde8335587f1969cd07fd9f86a510204 assets/bits_n_bobs/models/block/chair/right_armrest_white.json 76e0bdd0634fd86c4fc45da338fba5cb03bd1a7c assets/bits_n_bobs/models/block/chair/right_armrest_yellow.json -06341ee452d3bb592f64c3b90a784faee64563f8 assets/bits_n_bobs/models/block/crimsite_tiles.json -07da9eec096cdca46919239adb1a0a754096b568 assets/bits_n_bobs/models/block/crimsite_tiles_wall_post.json -5a63a2c96b8e9fda2f485be000dc727659e9feb1 assets/bits_n_bobs/models/block/crimsite_tiles_wall_side.json -2a4433b2ae48b7d4da4e6f870dc80c9dc0341aa3 assets/bits_n_bobs/models/block/crimsite_tiles_wall_side_alternate.json -9ab361333798c09bd085d9e0f5646ac7b32c5b60 assets/bits_n_bobs/models/block/crimsite_tiles_wall_side_tall.json -01d67e73fc12a6453a1336db9d8e613d04a25020 assets/bits_n_bobs/models/block/crimsite_tiles_wall_side_tall_alternate.json c35275a7494fbce7804d78956c789467106e2976 assets/bits_n_bobs/models/block/crimsite_tile_slab.json ae67fef93571bf53a9a126093e7e75aa5bd4467e assets/bits_n_bobs/models/block/crimsite_tile_slab_top.json d8d5f4f18b5377c2b2acf0be8253bd783598b921 assets/bits_n_bobs/models/block/crimsite_tile_stairs.json @@ -359,12 +353,12 @@ c99df65cb319b2fb1cf4a506e7f5093aa3a5a4a0 assets/bits_n_bobs/models/block/crimsit 5ee59b6af66ec02050ad016cebfec390b0618ef8 assets/bits_n_bobs/models/block/crimsite_tile_stairs_inner_alternate.json 6bb6d9bc480060ef294d5c800433f0d9e1bcc6b3 assets/bits_n_bobs/models/block/crimsite_tile_stairs_outer.json c5c4e549c04ccd539522a43057cbda4e0beef792 assets/bits_n_bobs/models/block/crimsite_tile_stairs_outer_alternate.json -f5f031b665d0da6edbdc900de35fcd4a4d31fb1f assets/bits_n_bobs/models/block/deepslate_tiles.json -1a1ff5e930b2e0ba02d46037c0b1f7c1a0f4164e assets/bits_n_bobs/models/block/deepslate_tiles_wall_post.json -3f289c7b26747c937735a95e0789ece76803f86a assets/bits_n_bobs/models/block/deepslate_tiles_wall_side.json -f7a76cb938a09de2dc0f66284b0d8f913cc50b41 assets/bits_n_bobs/models/block/deepslate_tiles_wall_side_alternate.json -de4b02a04b1c6424db673978970fb2edf6a14d4c assets/bits_n_bobs/models/block/deepslate_tiles_wall_side_tall.json -159b6d56a3cddfbca8f38cc88c7143bca05439db assets/bits_n_bobs/models/block/deepslate_tiles_wall_side_tall_alternate.json +06341ee452d3bb592f64c3b90a784faee64563f8 assets/bits_n_bobs/models/block/crimsite_tiles.json +07da9eec096cdca46919239adb1a0a754096b568 assets/bits_n_bobs/models/block/crimsite_tiles_wall_post.json +5a63a2c96b8e9fda2f485be000dc727659e9feb1 assets/bits_n_bobs/models/block/crimsite_tiles_wall_side.json +2a4433b2ae48b7d4da4e6f870dc80c9dc0341aa3 assets/bits_n_bobs/models/block/crimsite_tiles_wall_side_alternate.json +9ab361333798c09bd085d9e0f5646ac7b32c5b60 assets/bits_n_bobs/models/block/crimsite_tiles_wall_side_tall.json +01d67e73fc12a6453a1336db9d8e613d04a25020 assets/bits_n_bobs/models/block/crimsite_tiles_wall_side_tall_alternate.json fcd18eaf429c20affde60dd34c2b52db13dae128 assets/bits_n_bobs/models/block/deepslate_tile_slab.json f563c3ef28aa4d2f0effca208e2d037d737c24c8 assets/bits_n_bobs/models/block/deepslate_tile_slab_top.json f487e1aa835ed29337a55fdca3b6eae20fb144db assets/bits_n_bobs/models/block/deepslate_tile_stairs.json @@ -373,12 +367,12 @@ f487e1aa835ed29337a55fdca3b6eae20fb144db assets/bits_n_bobs/models/block/deepsla eaf7647facc02db384e2906e4de8887baffaeb97 assets/bits_n_bobs/models/block/deepslate_tile_stairs_inner_alternate.json 2c559e6f107cc0fa3d5997f58e1bbfce9d5fedaf assets/bits_n_bobs/models/block/deepslate_tile_stairs_outer.json d115c36a0cf314c8cd11ddd1e0845bdb300689e8 assets/bits_n_bobs/models/block/deepslate_tile_stairs_outer_alternate.json -1f53f5cdd5ff8e5ee8994f8c79fc53a4c52e0ee9 assets/bits_n_bobs/models/block/diorite_tiles.json -60cbd8117ff211674a68e08c5bd83b00e59b50c1 assets/bits_n_bobs/models/block/diorite_tiles_wall_post.json -63202501e698698cf1e81b44a982fb0e2b84b893 assets/bits_n_bobs/models/block/diorite_tiles_wall_side.json -73eaaf8404f8973898e87c4694198ed0d2b57d9c assets/bits_n_bobs/models/block/diorite_tiles_wall_side_alternate.json -30928281d8e80e765ab961a34a126c32a11df80d assets/bits_n_bobs/models/block/diorite_tiles_wall_side_tall.json -c120bdef84f0021d19a649f2cac6f5a3f6da456d assets/bits_n_bobs/models/block/diorite_tiles_wall_side_tall_alternate.json +f5f031b665d0da6edbdc900de35fcd4a4d31fb1f assets/bits_n_bobs/models/block/deepslate_tiles.json +1a1ff5e930b2e0ba02d46037c0b1f7c1a0f4164e assets/bits_n_bobs/models/block/deepslate_tiles_wall_post.json +3f289c7b26747c937735a95e0789ece76803f86a assets/bits_n_bobs/models/block/deepslate_tiles_wall_side.json +f7a76cb938a09de2dc0f66284b0d8f913cc50b41 assets/bits_n_bobs/models/block/deepslate_tiles_wall_side_alternate.json +de4b02a04b1c6424db673978970fb2edf6a14d4c assets/bits_n_bobs/models/block/deepslate_tiles_wall_side_tall.json +159b6d56a3cddfbca8f38cc88c7143bca05439db assets/bits_n_bobs/models/block/deepslate_tiles_wall_side_tall_alternate.json 247aebecce8849db0d81a0c046d9153cf22498b7 assets/bits_n_bobs/models/block/diorite_tile_slab.json 589bc2937c2b88d0ca00bf561e9a11eec4150a8f assets/bits_n_bobs/models/block/diorite_tile_slab_top.json f83a088c7ba8287963d03bc0e8869c15682c57a0 assets/bits_n_bobs/models/block/diorite_tile_stairs.json @@ -387,12 +381,12 @@ bd539cdc06a5e0ceaafed78dd8137af25064702d assets/bits_n_bobs/models/block/diorite 4153ef7d7ba25d6c4e7714e29acf9d46687b12cf assets/bits_n_bobs/models/block/diorite_tile_stairs_inner_alternate.json d43619972d808f8ac20812ce042d722fb1c911fa assets/bits_n_bobs/models/block/diorite_tile_stairs_outer.json 7871bf32ef99101b8df77620aa5a8839cd248ae4 assets/bits_n_bobs/models/block/diorite_tile_stairs_outer_alternate.json -40558ecc1933de69d21373926b6960fe6488e70c assets/bits_n_bobs/models/block/dripstone_tiles.json -498c800a81cc9dbc7215017a9d9e7bd634d802bf assets/bits_n_bobs/models/block/dripstone_tiles_wall_post.json -3eee57c5e417b06d57a37130af0b2d24f38bec7b assets/bits_n_bobs/models/block/dripstone_tiles_wall_side.json -86b8a31ed443edccc86706d2ecaa7b5d81b15b25 assets/bits_n_bobs/models/block/dripstone_tiles_wall_side_alternate.json -eac00b8b2789c5b1190c3708a97ed33f2ad13f48 assets/bits_n_bobs/models/block/dripstone_tiles_wall_side_tall.json -1c25a54483f57ca6a0e10a3aaf27242dfee0d431 assets/bits_n_bobs/models/block/dripstone_tiles_wall_side_tall_alternate.json +1f53f5cdd5ff8e5ee8994f8c79fc53a4c52e0ee9 assets/bits_n_bobs/models/block/diorite_tiles.json +60cbd8117ff211674a68e08c5bd83b00e59b50c1 assets/bits_n_bobs/models/block/diorite_tiles_wall_post.json +63202501e698698cf1e81b44a982fb0e2b84b893 assets/bits_n_bobs/models/block/diorite_tiles_wall_side.json +73eaaf8404f8973898e87c4694198ed0d2b57d9c assets/bits_n_bobs/models/block/diorite_tiles_wall_side_alternate.json +30928281d8e80e765ab961a34a126c32a11df80d assets/bits_n_bobs/models/block/diorite_tiles_wall_side_tall.json +c120bdef84f0021d19a649f2cac6f5a3f6da456d assets/bits_n_bobs/models/block/diorite_tiles_wall_side_tall_alternate.json b14aba60ab6e148c36c24bb4579b7538a0ed7edc assets/bits_n_bobs/models/block/dripstone_tile_slab.json c1ffe660312ea95b4f5a24869b8c3d9020af36c2 assets/bits_n_bobs/models/block/dripstone_tile_slab_top.json 82f2b8bad21b1e50c6a20b6218926c53b73e49de assets/bits_n_bobs/models/block/dripstone_tile_stairs.json @@ -401,12 +395,12 @@ c1ffe660312ea95b4f5a24869b8c3d9020af36c2 assets/bits_n_bobs/models/block/dripsto 21cfe9713147b2bc1ccf5e4a7ca751ac10bc049b assets/bits_n_bobs/models/block/dripstone_tile_stairs_inner_alternate.json 28b9174317c573852327e0db5f44b762e1b4804c assets/bits_n_bobs/models/block/dripstone_tile_stairs_outer.json 17108eac8372f7a378385b40a23deafee68f3b71 assets/bits_n_bobs/models/block/dripstone_tile_stairs_outer_alternate.json -c2edb15efa6ecb541b957caf60158c1e99fcd425 assets/bits_n_bobs/models/block/granite_tiles.json -a3d93e9e08a43363cfc2e058f42d1153f5e50a83 assets/bits_n_bobs/models/block/granite_tiles_wall_post.json -97a13587fe0baa40595a042fb8fdf455564ac7a4 assets/bits_n_bobs/models/block/granite_tiles_wall_side.json -6fffefd94909cecc7ef690eefd0dbf58ed539b43 assets/bits_n_bobs/models/block/granite_tiles_wall_side_alternate.json -a77475d1d0629cfe656326d887bcee5fe425c8fe assets/bits_n_bobs/models/block/granite_tiles_wall_side_tall.json -6c57415e9c9d8b4e6fe95e05344ae8f797c2aca8 assets/bits_n_bobs/models/block/granite_tiles_wall_side_tall_alternate.json +40558ecc1933de69d21373926b6960fe6488e70c assets/bits_n_bobs/models/block/dripstone_tiles.json +498c800a81cc9dbc7215017a9d9e7bd634d802bf assets/bits_n_bobs/models/block/dripstone_tiles_wall_post.json +3eee57c5e417b06d57a37130af0b2d24f38bec7b assets/bits_n_bobs/models/block/dripstone_tiles_wall_side.json +86b8a31ed443edccc86706d2ecaa7b5d81b15b25 assets/bits_n_bobs/models/block/dripstone_tiles_wall_side_alternate.json +eac00b8b2789c5b1190c3708a97ed33f2ad13f48 assets/bits_n_bobs/models/block/dripstone_tiles_wall_side_tall.json +1c25a54483f57ca6a0e10a3aaf27242dfee0d431 assets/bits_n_bobs/models/block/dripstone_tiles_wall_side_tall_alternate.json 4800d66b9773de4a03727c04c7a6e2d0057453da assets/bits_n_bobs/models/block/granite_tile_slab.json dcbad3959bca05e359a7efbe7f95e6a859ba7538 assets/bits_n_bobs/models/block/granite_tile_slab_top.json 1f530ce03f6f3b5f53be19df0a75d386ca30c994 assets/bits_n_bobs/models/block/granite_tile_stairs.json @@ -415,6 +409,12 @@ dcbad3959bca05e359a7efbe7f95e6a859ba7538 assets/bits_n_bobs/models/block/granite 25981414041ef2023a58f8ae46fa1a5c123ed421 assets/bits_n_bobs/models/block/granite_tile_stairs_inner_alternate.json f40a7104313c6eda16997b9fdcc6f6bd344a8dea assets/bits_n_bobs/models/block/granite_tile_stairs_outer.json 924a41c2b86fc6b4a6fc6792df8628a78023127d assets/bits_n_bobs/models/block/granite_tile_stairs_outer_alternate.json +c2edb15efa6ecb541b957caf60158c1e99fcd425 assets/bits_n_bobs/models/block/granite_tiles.json +a3d93e9e08a43363cfc2e058f42d1153f5e50a83 assets/bits_n_bobs/models/block/granite_tiles_wall_post.json +97a13587fe0baa40595a042fb8fdf455564ac7a4 assets/bits_n_bobs/models/block/granite_tiles_wall_side.json +6fffefd94909cecc7ef690eefd0dbf58ed539b43 assets/bits_n_bobs/models/block/granite_tiles_wall_side_alternate.json +a77475d1d0629cfe656326d887bcee5fe425c8fe assets/bits_n_bobs/models/block/granite_tiles_wall_side_tall.json +6c57415e9c9d8b4e6fe95e05344ae8f797c2aca8 assets/bits_n_bobs/models/block/granite_tiles_wall_side_tall_alternate.json d85b520fd548fca13ea32ea5273b5ad96831232c assets/bits_n_bobs/models/block/industrial_grating.json 602e75c9a227a43c5974d97f47b478002d4aa0dc assets/bits_n_bobs/models/block/industrial_iron_encased_cogwheel.json 0ce3a0848a12e86693e55d501252851b11cac36b assets/bits_n_bobs/models/block/industrial_iron_encased_cogwheel_bottom.json @@ -434,12 +434,6 @@ ae2baa0d9868e0ad64011111643b6702e2ef711c assets/bits_n_bobs/models/block/industr a8e4ea1873a5308dd6eff43bff24d341fd4c7d75 assets/bits_n_bobs/models/block/industrial_iron_encased_large_flanged_cogwheel_top_bottom.json db5fcad61cd5ec9f635c3cd0a1cc7a83886330a9 assets/bits_n_bobs/models/block/industrial_iron_encased_piston_extension_pole.json 4330623a04d5fb9e1f2a02cf1b078f2db4527c5d assets/bits_n_bobs/models/block/industrial_iron_encased_piston_extension_pole_empty.json -8b1c571d8d24c633794f1cdce8618b1977eec6cc assets/bits_n_bobs/models/block/limestone_tiles.json -e80cae1cb7d8ecefb2b50622cb5f75848e0741a3 assets/bits_n_bobs/models/block/limestone_tiles_wall_post.json -6ecf0a27138da13299feed99f290cb4ff7a555d2 assets/bits_n_bobs/models/block/limestone_tiles_wall_side.json -1838e552df16b9d45355dc32b258009e56bd76e6 assets/bits_n_bobs/models/block/limestone_tiles_wall_side_alternate.json -bb486cf0967ac0d2f14c2fbd1eb910f460eec75d assets/bits_n_bobs/models/block/limestone_tiles_wall_side_tall.json -b645f7e11bbed115e9761ba32afdeb82355367cb assets/bits_n_bobs/models/block/limestone_tiles_wall_side_tall_alternate.json c48664074457caf3557deb04c13ebf36e1dde2a3 assets/bits_n_bobs/models/block/limestone_tile_slab.json bcdde69f7b8a7e3b57451ee7ac1a99d41dccea5a assets/bits_n_bobs/models/block/limestone_tile_slab_top.json 4d591036af65af67f3bef19cc3a7878e478f3af8 assets/bits_n_bobs/models/block/limestone_tile_stairs.json @@ -448,12 +442,12 @@ bcdde69f7b8a7e3b57451ee7ac1a99d41dccea5a assets/bits_n_bobs/models/block/limesto 0beb3227a5cdfa60486cf3a3c266c127b128b062 assets/bits_n_bobs/models/block/limestone_tile_stairs_inner_alternate.json 2d5762bd6dbbb916afd71fab23fea6d835e08a63 assets/bits_n_bobs/models/block/limestone_tile_stairs_outer.json e605851a507f2ce81d2f7d8f912ce0f1f1ab806d assets/bits_n_bobs/models/block/limestone_tile_stairs_outer_alternate.json -ee278e1cd2513faa6d50bb82fa2e6bd9b54c0845 assets/bits_n_bobs/models/block/ochrum_tiles.json -dc1478d44ad860710d41f74e24d19b113c3be398 assets/bits_n_bobs/models/block/ochrum_tiles_wall_post.json -e9f10227299456d46a830a3ae1ec625ae92ebea4 assets/bits_n_bobs/models/block/ochrum_tiles_wall_side.json -cf9b648ae5bc8532ce3123097e5f5d154e5bed7c assets/bits_n_bobs/models/block/ochrum_tiles_wall_side_alternate.json -900085d8a6414b91042cab20f14eac4ae1216880 assets/bits_n_bobs/models/block/ochrum_tiles_wall_side_tall.json -ea1d258ce516891804601bbed16ad8d2a4b41907 assets/bits_n_bobs/models/block/ochrum_tiles_wall_side_tall_alternate.json +8b1c571d8d24c633794f1cdce8618b1977eec6cc assets/bits_n_bobs/models/block/limestone_tiles.json +e80cae1cb7d8ecefb2b50622cb5f75848e0741a3 assets/bits_n_bobs/models/block/limestone_tiles_wall_post.json +6ecf0a27138da13299feed99f290cb4ff7a555d2 assets/bits_n_bobs/models/block/limestone_tiles_wall_side.json +1838e552df16b9d45355dc32b258009e56bd76e6 assets/bits_n_bobs/models/block/limestone_tiles_wall_side_alternate.json +bb486cf0967ac0d2f14c2fbd1eb910f460eec75d assets/bits_n_bobs/models/block/limestone_tiles_wall_side_tall.json +b645f7e11bbed115e9761ba32afdeb82355367cb assets/bits_n_bobs/models/block/limestone_tiles_wall_side_tall_alternate.json 86562d3255d9852052f21241e43d5f612dc134ef assets/bits_n_bobs/models/block/ochrum_tile_slab.json f5298c6f31ca5b6702f0d285929288a846eac8e1 assets/bits_n_bobs/models/block/ochrum_tile_slab_top.json 73e3c69a618841ae0878bed814f62d8e5a83c1ed assets/bits_n_bobs/models/block/ochrum_tile_stairs.json @@ -462,12 +456,12 @@ edc50d6d1cbb0fa6aeaf903f8bb3a8add62532cb assets/bits_n_bobs/models/block/ochrum_ 6dc0c0963416c1c4ed2387598d3718a5b5d050d0 assets/bits_n_bobs/models/block/ochrum_tile_stairs_inner_alternate.json 82c62e2ad226fa03b39c8aa25e7284fb0f0b71aa assets/bits_n_bobs/models/block/ochrum_tile_stairs_outer.json 7c165ea76b8748f851f100d43b3d85135e18124c assets/bits_n_bobs/models/block/ochrum_tile_stairs_outer_alternate.json -5140d065838eb08325ffd599256de108b8a4733c assets/bits_n_bobs/models/block/scorchia_tiles.json -d58727807cfc984162bb60ef96a50a91b0df9d1a assets/bits_n_bobs/models/block/scorchia_tiles_wall_post.json -8c2e4797b7dc8dbf75895d75faa00679d41af271 assets/bits_n_bobs/models/block/scorchia_tiles_wall_side.json -a1a51024b0a015d76a5e077046e48bb6fbfffd81 assets/bits_n_bobs/models/block/scorchia_tiles_wall_side_alternate.json -8222807fe82339eecb33261c88f85475bb293cee assets/bits_n_bobs/models/block/scorchia_tiles_wall_side_tall.json -c209475c25e22c32480686cd18e29a4ec4d75949 assets/bits_n_bobs/models/block/scorchia_tiles_wall_side_tall_alternate.json +ee278e1cd2513faa6d50bb82fa2e6bd9b54c0845 assets/bits_n_bobs/models/block/ochrum_tiles.json +dc1478d44ad860710d41f74e24d19b113c3be398 assets/bits_n_bobs/models/block/ochrum_tiles_wall_post.json +e9f10227299456d46a830a3ae1ec625ae92ebea4 assets/bits_n_bobs/models/block/ochrum_tiles_wall_side.json +cf9b648ae5bc8532ce3123097e5f5d154e5bed7c assets/bits_n_bobs/models/block/ochrum_tiles_wall_side_alternate.json +900085d8a6414b91042cab20f14eac4ae1216880 assets/bits_n_bobs/models/block/ochrum_tiles_wall_side_tall.json +ea1d258ce516891804601bbed16ad8d2a4b41907 assets/bits_n_bobs/models/block/ochrum_tiles_wall_side_tall_alternate.json 4ff1f6b25c809f35c34d6deaf6f5f7b30d9ee048 assets/bits_n_bobs/models/block/scorchia_tile_slab.json 74b9192cc5bea784036bc3eb447845e459ae46e4 assets/bits_n_bobs/models/block/scorchia_tile_slab_top.json 0cbc565d864a2c3ebd86e61b7cfd5a280eada09e assets/bits_n_bobs/models/block/scorchia_tile_stairs.json @@ -476,12 +470,12 @@ a7eb522ac23ca46d8a3caa42667fb6ca36e2314b assets/bits_n_bobs/models/block/scorchi fee26db12285a465df262ce2cd16c5c9fdef0fec assets/bits_n_bobs/models/block/scorchia_tile_stairs_inner_alternate.json 566bec03bc9b8dfa64a901bf65788059af63b6cd assets/bits_n_bobs/models/block/scorchia_tile_stairs_outer.json 29b1d9edfd5776ad83c3f4df9322e54f2abea3ce assets/bits_n_bobs/models/block/scorchia_tile_stairs_outer_alternate.json -bd2ed1c46e853b12b13ac3fca930e09e59b1a417 assets/bits_n_bobs/models/block/scoria_tiles.json -e3dfd034a536f26b8c93bea72175842a30d49d5e assets/bits_n_bobs/models/block/scoria_tiles_wall_post.json -aeae2800a1494b19b05b071cfebac50f38b1e931 assets/bits_n_bobs/models/block/scoria_tiles_wall_side.json -04eae527a8a36bfa31ab3b40a2015a2a18351574 assets/bits_n_bobs/models/block/scoria_tiles_wall_side_alternate.json -0fcd2f2ff393400241a798666cdf4b5a538ffb12 assets/bits_n_bobs/models/block/scoria_tiles_wall_side_tall.json -fca3458e9f790c4d6cffd0a86bf16f6c6323b8a3 assets/bits_n_bobs/models/block/scoria_tiles_wall_side_tall_alternate.json +5140d065838eb08325ffd599256de108b8a4733c assets/bits_n_bobs/models/block/scorchia_tiles.json +d58727807cfc984162bb60ef96a50a91b0df9d1a assets/bits_n_bobs/models/block/scorchia_tiles_wall_post.json +8c2e4797b7dc8dbf75895d75faa00679d41af271 assets/bits_n_bobs/models/block/scorchia_tiles_wall_side.json +a1a51024b0a015d76a5e077046e48bb6fbfffd81 assets/bits_n_bobs/models/block/scorchia_tiles_wall_side_alternate.json +8222807fe82339eecb33261c88f85475bb293cee assets/bits_n_bobs/models/block/scorchia_tiles_wall_side_tall.json +c209475c25e22c32480686cd18e29a4ec4d75949 assets/bits_n_bobs/models/block/scorchia_tiles_wall_side_tall_alternate.json f9cb02a3008b6ba794db0d2a50736a5d5029ee64 assets/bits_n_bobs/models/block/scoria_tile_slab.json 37229831d8eb988f70d6c600ca8248d9bca5f593 assets/bits_n_bobs/models/block/scoria_tile_slab_top.json ef1d5bf578b9175d8f29e3119b6434f205b5fb0a assets/bits_n_bobs/models/block/scoria_tile_stairs.json @@ -490,12 +484,12 @@ c131cb450448fe8ef1ae3ee11fb2790b26ac4d03 assets/bits_n_bobs/models/block/scoria_ 3d1515474fbd3dd9e091c3f052599769bcf17307 assets/bits_n_bobs/models/block/scoria_tile_stairs_inner_alternate.json 4b41439352883a2496f4b600135c1ca28a9a9b6d assets/bits_n_bobs/models/block/scoria_tile_stairs_outer.json efd158c0c93d260a13bd1eab356befeb95e6a43b assets/bits_n_bobs/models/block/scoria_tile_stairs_outer_alternate.json -bece2fd02d4e2b5b619ba12f4c9a257520d6caa1 assets/bits_n_bobs/models/block/tuff_tiles.json -50c1b463d203496dc9b6468cb949b2f0794b816c assets/bits_n_bobs/models/block/tuff_tiles_wall_post.json -9c6e0e2440fd869d447d50db091338d054d744d5 assets/bits_n_bobs/models/block/tuff_tiles_wall_side.json -e2264576278e545bc7e1986134ebcedf0de93950 assets/bits_n_bobs/models/block/tuff_tiles_wall_side_alternate.json -cc29942dc39c676388b0472786e83d94beca15ec assets/bits_n_bobs/models/block/tuff_tiles_wall_side_tall.json -4022328a9845a2581d4f7a0b14e6aa1a2f71fe52 assets/bits_n_bobs/models/block/tuff_tiles_wall_side_tall_alternate.json +bd2ed1c46e853b12b13ac3fca930e09e59b1a417 assets/bits_n_bobs/models/block/scoria_tiles.json +e3dfd034a536f26b8c93bea72175842a30d49d5e assets/bits_n_bobs/models/block/scoria_tiles_wall_post.json +aeae2800a1494b19b05b071cfebac50f38b1e931 assets/bits_n_bobs/models/block/scoria_tiles_wall_side.json +04eae527a8a36bfa31ab3b40a2015a2a18351574 assets/bits_n_bobs/models/block/scoria_tiles_wall_side_alternate.json +0fcd2f2ff393400241a798666cdf4b5a538ffb12 assets/bits_n_bobs/models/block/scoria_tiles_wall_side_tall.json +fca3458e9f790c4d6cffd0a86bf16f6c6323b8a3 assets/bits_n_bobs/models/block/scoria_tiles_wall_side_tall_alternate.json d76f88f43eab893efd3d6404d6740691f850cd18 assets/bits_n_bobs/models/block/tuff_tile_slab.json 38b2c7843cb307065c2b7e5b729992857ae5bd67 assets/bits_n_bobs/models/block/tuff_tile_slab_top.json cf9a0de5d9cc4ad0032190b5105bff7f70c35875 assets/bits_n_bobs/models/block/tuff_tile_stairs.json @@ -504,12 +498,12 @@ ba9f4444703487cd1a971724b56416a225cdd225 assets/bits_n_bobs/models/block/tuff_ti 27d37a58ebc67012dee22e012b3c2b26b04efa3e assets/bits_n_bobs/models/block/tuff_tile_stairs_inner_alternate.json 10fa832e27af79af6a401ec3a5bdd6d6103cad7c assets/bits_n_bobs/models/block/tuff_tile_stairs_outer.json 3e9cdbc1e26d315970c64384a9d147a8a53b0bb8 assets/bits_n_bobs/models/block/tuff_tile_stairs_outer_alternate.json -2542a55c0073d938f0a8a45ae2dc465ffc2b370f assets/bits_n_bobs/models/block/veridium_tiles.json -100e74dd93909c5badb868cb67c735888a1c04c2 assets/bits_n_bobs/models/block/veridium_tiles_wall_post.json -74d673eb9e0b300f9728a7e8e0a94b1d1ce971b3 assets/bits_n_bobs/models/block/veridium_tiles_wall_side.json -f9f86f2d1e19097e54d42265da6657284ffb3f35 assets/bits_n_bobs/models/block/veridium_tiles_wall_side_alternate.json -8cc84c848989eca21339782dad59eb0e7deece13 assets/bits_n_bobs/models/block/veridium_tiles_wall_side_tall.json -f049468e013bca26e050fa63470afe773abecb4f assets/bits_n_bobs/models/block/veridium_tiles_wall_side_tall_alternate.json +bece2fd02d4e2b5b619ba12f4c9a257520d6caa1 assets/bits_n_bobs/models/block/tuff_tiles.json +50c1b463d203496dc9b6468cb949b2f0794b816c assets/bits_n_bobs/models/block/tuff_tiles_wall_post.json +9c6e0e2440fd869d447d50db091338d054d744d5 assets/bits_n_bobs/models/block/tuff_tiles_wall_side.json +e2264576278e545bc7e1986134ebcedf0de93950 assets/bits_n_bobs/models/block/tuff_tiles_wall_side_alternate.json +cc29942dc39c676388b0472786e83d94beca15ec assets/bits_n_bobs/models/block/tuff_tiles_wall_side_tall.json +4022328a9845a2581d4f7a0b14e6aa1a2f71fe52 assets/bits_n_bobs/models/block/tuff_tiles_wall_side_tall_alternate.json 359d15ed3da255b402bd8635e610de9846b8b15f assets/bits_n_bobs/models/block/veridium_tile_slab.json 86bff17a2566e2bda85eeb987db6bbebb78a0836 assets/bits_n_bobs/models/block/veridium_tile_slab_top.json b1659cda8e86d626b2075f825d5575825a46e6f4 assets/bits_n_bobs/models/block/veridium_tile_stairs.json @@ -518,6 +512,12 @@ e0344e7ffec8cf6cf3e1647067746bc407bc1cd5 assets/bits_n_bobs/models/block/veridiu f7ed86f40c70c2a6658dbd14e95588388d673d16 assets/bits_n_bobs/models/block/veridium_tile_stairs_inner_alternate.json 8022d37c3760ac627a4bba8b0d2e289e35e7467f assets/bits_n_bobs/models/block/veridium_tile_stairs_outer.json 9679c221f1a83e77d563015d60b33fb83229afec assets/bits_n_bobs/models/block/veridium_tile_stairs_outer_alternate.json +2542a55c0073d938f0a8a45ae2dc465ffc2b370f assets/bits_n_bobs/models/block/veridium_tiles.json +100e74dd93909c5badb868cb67c735888a1c04c2 assets/bits_n_bobs/models/block/veridium_tiles_wall_post.json +74d673eb9e0b300f9728a7e8e0a94b1d1ce971b3 assets/bits_n_bobs/models/block/veridium_tiles_wall_side.json +f9f86f2d1e19097e54d42265da6657284ffb3f35 assets/bits_n_bobs/models/block/veridium_tiles_wall_side_alternate.json +8cc84c848989eca21339782dad59eb0e7deece13 assets/bits_n_bobs/models/block/veridium_tiles_wall_side_tall.json +f049468e013bca26e050fa63470afe773abecb4f assets/bits_n_bobs/models/block/veridium_tiles_wall_side_tall_alternate.json a6fc79998782ac04445b5cbe78a20f99958e3a2f assets/bits_n_bobs/models/block/weathered_iron_encased_cogwheel.json 85ca7fb0c78ffbbd562d030bbc2cfd14771ed159 assets/bits_n_bobs/models/block/weathered_iron_encased_cogwheel_bottom.json 1724d68f50c99052b40f22165842726ed1b441cd assets/bits_n_bobs/models/block/weathered_iron_encased_cogwheel_top.json @@ -539,14 +539,14 @@ bee319c9e1cded0cd8caa9df6df69ebf21e08a95 assets/bits_n_bobs/models/block/weather c9cccded1bb3bdcffba65f792d59c21f3cae0801 assets/bits_n_bobs/models/item/andesite_encased_flanged_cogwheel.json 3152efbd0232ec6a39cc583170cb4d3fd6e87911 assets/bits_n_bobs/models/item/andesite_encased_large_flanged_cogwheel.json 8732b5fe1029aad49cc11917ce0f219f654a04da assets/bits_n_bobs/models/item/andesite_encased_piston_extension_pole.json -c27b58359ee8f65c7d25773c987cdc1e0949fc7d assets/bits_n_bobs/models/item/andesite_tiles.json 47cab5ea927944c68b6c4c3f9ac716030417334a assets/bits_n_bobs/models/item/andesite_tile_slab.json acabff2c23a453a65c86c54a08a3e4b338257d3a assets/bits_n_bobs/models/item/andesite_tile_stairs.json fc61b4b30998d6b4a4fa29761d219d19587159f3 assets/bits_n_bobs/models/item/andesite_tile_wall.json -1b212e21d405ef2950dbcbd55562e68c03564bb9 assets/bits_n_bobs/models/item/asurine_tiles.json +c27b58359ee8f65c7d25773c987cdc1e0949fc7d assets/bits_n_bobs/models/item/andesite_tiles.json 55f35a198003985ffbf928c90b6be80cd36b3b03 assets/bits_n_bobs/models/item/asurine_tile_slab.json 23c26c846578efdaee74573ed5339613dfe7ca79 assets/bits_n_bobs/models/item/asurine_tile_stairs.json f08208db79fbccd64c437bcc0fabb2e770998e2e assets/bits_n_bobs/models/item/asurine_tile_wall.json +1b212e21d405ef2950dbcbd55562e68c03564bb9 assets/bits_n_bobs/models/item/asurine_tiles.json 42b4691ef762f2b3d5e0c90819bd0f49957f115b assets/bits_n_bobs/models/item/black_chair.json f41b86576600958bf973feb8658327eb4beec5db assets/bits_n_bobs/models/item/blue_chair.json 993b7f5ce927b2e92b09350c6d521f008983436c assets/bits_n_bobs/models/item/brass_encased_flanged_cogwheel.json @@ -555,41 +555,39 @@ f41b86576600958bf973feb8658327eb4beec5db assets/bits_n_bobs/models/item/blue_cha eb2648575386ff59794eb509dde6eff42a2b2d18 assets/bits_n_bobs/models/item/brass_lamp.json eca6cdeeeb3bb0ecb6c0803f7221f9d6cb694c05 assets/bits_n_bobs/models/item/brown_chair.json 9b4625246f54320a630b2ff78ae7e27d85520c8c assets/bits_n_bobs/models/item/cable_girder_strut.json -1dde72a2eb974bc8b1a3f47e464b2f12b33859d6 assets/bits_n_bobs/models/item/calcite_tiles.json e4ee5b420a4ad62d2bb1e473eaf7e5a368335174 assets/bits_n_bobs/models/item/calcite_tile_slab.json 046b4eff28f9ecf3cdf7b0f8fe51320fb36a89a5 assets/bits_n_bobs/models/item/calcite_tile_stairs.json 3e95ac2837b53dbe007260c69fc12a710fb81e8d assets/bits_n_bobs/models/item/calcite_tile_wall.json +1dde72a2eb974bc8b1a3f47e464b2f12b33859d6 assets/bits_n_bobs/models/item/calcite_tiles.json 23102220a4a1bd0aa26c0d4972a8bb20c907cdc0 assets/bits_n_bobs/models/item/chain_pulley.json 390c31e7254ef4c6148952c9d87f735a52ef15d9 assets/bits_n_bobs/models/item/cogwheel_chain_carriage.json -011a663fb3f4da3675f389a736e1fa9ef4dd367e assets/bits_n_bobs/models/item/cookie_dough.json -708bc9710da31a64bb7f95be5b9818156f6839e0 assets/bits_n_bobs/models/item/crimsite_tiles.json 96c187feb3920710c5c3a014e2090308636c2054 assets/bits_n_bobs/models/item/crimsite_tile_slab.json 336459b6e55a423047603fb47b39a7733aed8737 assets/bits_n_bobs/models/item/crimsite_tile_stairs.json 176e19ca7e229e1cb7cb788d3cedf41904cf9b6c assets/bits_n_bobs/models/item/crimsite_tile_wall.json +708bc9710da31a64bb7f95be5b9818156f6839e0 assets/bits_n_bobs/models/item/crimsite_tiles.json 1dfbbb3e0ee9a6af8ece52b61d27dd559cc1380f assets/bits_n_bobs/models/item/cyan_chair.json -909daa1ad3e543fd83702c3e6e8525a0ea607e78 assets/bits_n_bobs/models/item/deepslate_tiles.json 94261b393fe33a2344dc661c93977c16f30de021 assets/bits_n_bobs/models/item/deepslate_tile_slab.json 7a55aa7e0da0cf821b05686243a30d3174c0e189 assets/bits_n_bobs/models/item/deepslate_tile_stairs.json cac9801e6d13abb25707a6534e417b180f6ee24a assets/bits_n_bobs/models/item/deepslate_tile_wall.json -6491753b86760bb2e9af3d4c693bb0c599ec7de6 assets/bits_n_bobs/models/item/diorite_tiles.json +909daa1ad3e543fd83702c3e6e8525a0ea607e78 assets/bits_n_bobs/models/item/deepslate_tiles.json ec9ac04e52b279bdaea1077f6d00fcf54624bc49 assets/bits_n_bobs/models/item/diorite_tile_slab.json 806175d05f40428ffd399af784b37f554810425d assets/bits_n_bobs/models/item/diorite_tile_stairs.json 858b3f50df1da718145449d90101e3fbd82a4200 assets/bits_n_bobs/models/item/diorite_tile_wall.json -70d9bc6a2349aed7c91dde772d38705d0765d010 assets/bits_n_bobs/models/item/dripstone_tiles.json +6491753b86760bb2e9af3d4c693bb0c599ec7de6 assets/bits_n_bobs/models/item/diorite_tiles.json d00e6df783cc9d2038e38707f94a2de440472338 assets/bits_n_bobs/models/item/dripstone_tile_slab.json eb7dd3beee6c327215b017e5671d0230b444cbe7 assets/bits_n_bobs/models/item/dripstone_tile_stairs.json 729fd1a050dbfa7f831154f530cc893704e62111 assets/bits_n_bobs/models/item/dripstone_tile_wall.json +70d9bc6a2349aed7c91dde772d38705d0765d010 assets/bits_n_bobs/models/item/dripstone_tiles.json 911b38bbfd8c3cfebb2cc485b0670f56d9715902 assets/bits_n_bobs/models/item/flywheel_bearing.json 6b91ca3a43d3bc5aca19249afa4164817ea80efa assets/bits_n_bobs/models/item/gigantic_cogwheel.json e4b469885e1079719d1e6a5d7ad76c20faf73480 assets/bits_n_bobs/models/item/girder_strut.json -858ae037a6cca6fe2857fb2fb9c52bbbe4bfd760 assets/bits_n_bobs/models/item/granite_tiles.json 30ab6ba209e7f282bce1bfb4c397b632a68648d9 assets/bits_n_bobs/models/item/granite_tile_slab.json cb651d64ddbc17dbde57bd8528c2372dd1936d01 assets/bits_n_bobs/models/item/granite_tile_stairs.json a03a5e3607e312579cb21dd83515c3182b3a1d88 assets/bits_n_bobs/models/item/granite_tile_wall.json +858ae037a6cca6fe2857fb2fb9c52bbbe4bfd760 assets/bits_n_bobs/models/item/granite_tiles.json 62c2ab0aaee1faa5d9505dad7b68e12085a41f99 assets/bits_n_bobs/models/item/gray_chair.json ffd5057178e11ce2c87616a54d3bfb4185eef187 assets/bits_n_bobs/models/item/green_chair.json 0c5ab6eb4618c5fb2fbb27d78a22add1362cdab9 assets/bits_n_bobs/models/item/headlamp.json -e76e09c9479837b69987cb158319841b8eb20fc6 assets/bits_n_bobs/models/item/icon_lightbulb.json 4492a18bbc1ac12985e4fbc64eb1e156aa45bfa2 assets/bits_n_bobs/models/item/industrial_grating.json 0346f97f1bbe2fa0b861bf82c6651e09ca1587a1 assets/bits_n_bobs/models/item/industrial_grating_panel.json 848d923f291238fa8437c9d867b95e5ca6fa32a3 assets/bits_n_bobs/models/item/industrial_iron_encased_cogwheel.json @@ -601,43 +599,43 @@ d96768a7d5129022b536eba8b48013fdd2f01118 assets/bits_n_bobs/models/item/industri ff829b30f50bcb4c6f7c9a8078f3c41b760b6bd2 assets/bits_n_bobs/models/item/industrial_truss.json ecb52e3f88b2534c50483b920031813d371aa658 assets/bits_n_bobs/models/item/large_flanged_cogwheel.json 03050ca4f1b8b52aa0497c114ad57920997a42b2 assets/bits_n_bobs/models/item/large_nixie_tube.json -06d301b6d5574dd793c7b8b37a9742cebc5d2839 assets/bits_n_bobs/models/item/lightbulb.json 6602d40196dd5034ac553df443223bd2ffea9a8c assets/bits_n_bobs/models/item/light_blue_chair.json de95c3e186d97686717795e53dd803adf42f7b2d assets/bits_n_bobs/models/item/light_gray_chair.json -246ca2f003ced300f7878ced359941420e00ff48 assets/bits_n_bobs/models/item/limestone_tiles.json +06d301b6d5574dd793c7b8b37a9742cebc5d2839 assets/bits_n_bobs/models/item/lightbulb.json +0004e12e2f65a7a787c992980da404560a6807cf assets/bits_n_bobs/models/item/lime_chair.json 15ce502c5bb5978c930d5bac5ca1c965c694c376 assets/bits_n_bobs/models/item/limestone_tile_slab.json 31f133317e0a9e2a9dcd515af1f4f8a59209ec7c assets/bits_n_bobs/models/item/limestone_tile_stairs.json db5a6ca41ad92cc5950524ed0b8be796d86c3eb8 assets/bits_n_bobs/models/item/limestone_tile_wall.json -0004e12e2f65a7a787c992980da404560a6807cf assets/bits_n_bobs/models/item/lime_chair.json +246ca2f003ced300f7878ced359941420e00ff48 assets/bits_n_bobs/models/item/limestone_tiles.json 004bb09c4386e7687b0367d038cfd324a448ad30 assets/bits_n_bobs/models/item/magenta_chair.json 5514e534d19f02cdd618b92a158acd821b0e57ad assets/bits_n_bobs/models/item/nixie_board.json -d0dd1693b1ddd0c43240b87f6dbfd5dc265eab87 assets/bits_n_bobs/models/item/ochrum_tiles.json 15a60fa3cc51c7fb928ea42a232557e6502190b1 assets/bits_n_bobs/models/item/ochrum_tile_slab.json 63ae10c38ca1030f6eaf9fa3a2b2a517092eb63a assets/bits_n_bobs/models/item/ochrum_tile_stairs.json 6f8ec45725e462935c0f525cc2dd8dd4380442bd assets/bits_n_bobs/models/item/ochrum_tile_wall.json +d0dd1693b1ddd0c43240b87f6dbfd5dc265eab87 assets/bits_n_bobs/models/item/ochrum_tiles.json e49f7ddde5dadf725a8efdaade459d12abbfa11a assets/bits_n_bobs/models/item/orange_chair.json c617953bb092d9dfd12b8b2452192cc29a81df26 assets/bits_n_bobs/models/item/pink_chair.json dc1462f5e0c0227c1e355ba5676d8b73cc57160b assets/bits_n_bobs/models/item/purple_chair.json 2c48ff154be6e749fcf5e3f90f95288447d4b849 assets/bits_n_bobs/models/item/red_chair.json -827898c3ceb4708adcbed857ca18a15163333022 assets/bits_n_bobs/models/item/scorchia_tiles.json 8e9cea18fc028067366c4807377f2883b101afca assets/bits_n_bobs/models/item/scorchia_tile_slab.json 05d42bdf701d2ebcd114714873887bdae478d149 assets/bits_n_bobs/models/item/scorchia_tile_stairs.json 10a4d03e8f67af8003e0a4236b5ea87fe9ad59e2 assets/bits_n_bobs/models/item/scorchia_tile_wall.json -558df17c5cb73182f0494ef89ae771511ca8eabb assets/bits_n_bobs/models/item/scoria_tiles.json +827898c3ceb4708adcbed857ca18a15163333022 assets/bits_n_bobs/models/item/scorchia_tiles.json 3497900441c4188cb21e9b3db9b54661a27361d2 assets/bits_n_bobs/models/item/scoria_tile_slab.json d6752c8133809bb5523fdf71b2e49e950e0b0ea2 assets/bits_n_bobs/models/item/scoria_tile_stairs.json f3251b7d6131ab94a4e1e744106af4fc88f5c0f4 assets/bits_n_bobs/models/item/scoria_tile_wall.json +558df17c5cb73182f0494ef89ae771511ca8eabb assets/bits_n_bobs/models/item/scoria_tiles.json 8682a4e61eaba77cf26785d95a5de9ed60188b8b assets/bits_n_bobs/models/item/small_flanged_cogwheel.json 146e28fbf3b6786be8600e0551fd13490f3638b9 assets/bits_n_bobs/models/item/test_rope.json 564169db5ddeb872ed0822506e385c285a3def02 assets/bits_n_bobs/models/item/throttle_lever.json -3cb4b44afa6c184876ec3e89e5fcaa82f0f3d440 assets/bits_n_bobs/models/item/tuff_tiles.json 332dae55cfb9bfcc6633f2be5c90e14452cf48a1 assets/bits_n_bobs/models/item/tuff_tile_slab.json fc89e8a2be1c7a44b0838330383033867ffcbccc assets/bits_n_bobs/models/item/tuff_tile_stairs.json c41b4f411ae41391b550d8405623f6de1b779d5b assets/bits_n_bobs/models/item/tuff_tile_wall.json -aa2550a77b6cc70b43bad1a58ba7b95263896b36 assets/bits_n_bobs/models/item/veridium_tiles.json +3cb4b44afa6c184876ec3e89e5fcaa82f0f3d440 assets/bits_n_bobs/models/item/tuff_tiles.json 718569be7e1847a4086fd8b69fcdc085e05703fa assets/bits_n_bobs/models/item/veridium_tile_slab.json 189c456a09b7066b4da6f4c5de9ebf3984ad8099 assets/bits_n_bobs/models/item/veridium_tile_stairs.json 45fa7d83ac6838c96ecb6c4b7bcd545c40096eb8 assets/bits_n_bobs/models/item/veridium_tile_wall.json +aa2550a77b6cc70b43bad1a58ba7b95263896b36 assets/bits_n_bobs/models/item/veridium_tiles.json 68776d40fde2d21196c2624efac34cef4cf937ec assets/bits_n_bobs/models/item/weathered_girder_strut.json bbd08e5d6b1e02b0e9e904b274fd8dbc0e005065 assets/bits_n_bobs/models/item/weathered_iron_encased_cogwheel.json 24bde2b002a02e36c7aae548fe7432360a3a5462 assets/bits_n_bobs/models/item/weathered_iron_encased_flanged_cogwheel.json @@ -650,29 +648,29 @@ a756ec3f1d1ff09079622e814c629a112bbbc14f assets/bits_n_bobs/models/item/weathere f83d44615309b843be16b656e17b472a3dc22019 assets/bits_n_bobs/models/item/white_chair.json 630417845e5676a5c4a82321f9f31fc31409420e assets/bits_n_bobs/models/item/yellow_chair.json cbaf41a095b2aff7823b886ad95974f6a5acde3d data/bits_n_bobs/advancement/recipes/building_blocks/andesite_from_stone_types_andesite_stonecutting.json -c62bcee9a88a07fce1de71894d03ab3abcb3d438 data/bits_n_bobs/advancement/recipes/building_blocks/andesite_tiles_from_stone_types_andesite_stonecutting.json f1acc8fa0fe9d734a584931254e2efb1ac35a96c data/bits_n_bobs/advancement/recipes/building_blocks/andesite_tile_slab.json c7128c52f17cfbfcf91efea9471b2ba88fbfd87f data/bits_n_bobs/advancement/recipes/building_blocks/andesite_tile_slab_from_stone_types_andesite_stonecutting.json 64d88ee4f8d9c73a172657d440136bbdf18090be data/bits_n_bobs/advancement/recipes/building_blocks/andesite_tile_stairs.json a54a6378ad9eda61d23f8dfd2d68c1e390a1243f data/bits_n_bobs/advancement/recipes/building_blocks/andesite_tile_stairs_from_stone_types_andesite_stonecutting.json 4a82bc16b172c30b869f324343133b968d7d1232 data/bits_n_bobs/advancement/recipes/building_blocks/andesite_tile_wall.json b206cd18b9eb59838db0807d4c29aff3d2cafdf0 data/bits_n_bobs/advancement/recipes/building_blocks/andesite_tile_wall_from_stone_types_andesite_stonecutting.json +c62bcee9a88a07fce1de71894d03ab3abcb3d438 data/bits_n_bobs/advancement/recipes/building_blocks/andesite_tiles_from_stone_types_andesite_stonecutting.json 51b496a339484f70ee7260b4d84f4b69c20378cf data/bits_n_bobs/advancement/recipes/building_blocks/asurine_from_stone_types_asurine_stonecutting.json -5ad692ea6270b1b81672a1fdb157c84163cd05d1 data/bits_n_bobs/advancement/recipes/building_blocks/asurine_tiles_from_stone_types_asurine_stonecutting.json aabd8652007ef258f4d19fc5dd2c96085177d8a7 data/bits_n_bobs/advancement/recipes/building_blocks/asurine_tile_slab.json 8ff85e603467537c5a075a908fa2cec1f0e35470 data/bits_n_bobs/advancement/recipes/building_blocks/asurine_tile_slab_from_stone_types_asurine_stonecutting.json 4d2c7e1e11c6328069dc0efbd29aceb540ae854b data/bits_n_bobs/advancement/recipes/building_blocks/asurine_tile_stairs.json b15d3d4035c96f379cef5a22dad3438b07b6af10 data/bits_n_bobs/advancement/recipes/building_blocks/asurine_tile_stairs_from_stone_types_asurine_stonecutting.json 6c6cce8949fbb8cd40134274cbe29ea507f30aa0 data/bits_n_bobs/advancement/recipes/building_blocks/asurine_tile_wall.json 67928644495938cd9b88057ac9073aae110c1730 data/bits_n_bobs/advancement/recipes/building_blocks/asurine_tile_wall_from_stone_types_asurine_stonecutting.json +5ad692ea6270b1b81672a1fdb157c84163cd05d1 data/bits_n_bobs/advancement/recipes/building_blocks/asurine_tiles_from_stone_types_asurine_stonecutting.json b2d91606aee0a86700fd849e88b18efc2e3d89c7 data/bits_n_bobs/advancement/recipes/building_blocks/calcite_from_stone_types_calcite_stonecutting.json -2a56596f38bd0cc2b012c83b25db30d37dcc33c2 data/bits_n_bobs/advancement/recipes/building_blocks/calcite_tiles_from_stone_types_calcite_stonecutting.json 238f61b7ed8f1cc3581ab1b9feafadecd4c3f0bd data/bits_n_bobs/advancement/recipes/building_blocks/calcite_tile_slab.json 3f95f668dd855c745cbccce7bd463c895439fc2a data/bits_n_bobs/advancement/recipes/building_blocks/calcite_tile_slab_from_stone_types_calcite_stonecutting.json 67dea823873500be81b1ccd57071c32ffaae710f data/bits_n_bobs/advancement/recipes/building_blocks/calcite_tile_stairs.json d9f4ad485b8ce867abf45ee55740d897e6485938 data/bits_n_bobs/advancement/recipes/building_blocks/calcite_tile_stairs_from_stone_types_calcite_stonecutting.json 3e79f4d5132b5c5c2b1abec318b0ee76ae004fef data/bits_n_bobs/advancement/recipes/building_blocks/calcite_tile_wall.json 2332fe989105f464644f2574a5596955688ee466 data/bits_n_bobs/advancement/recipes/building_blocks/calcite_tile_wall_from_stone_types_calcite_stonecutting.json +2a56596f38bd0cc2b012c83b25db30d37dcc33c2 data/bits_n_bobs/advancement/recipes/building_blocks/calcite_tiles_from_stone_types_calcite_stonecutting.json 08f836aa8dada79cda63cd7b7b9627d7dce01312 data/bits_n_bobs/advancement/recipes/building_blocks/crafting/black_chair.json e3550b90b10b7dd82a729b8826820ee3fb289d82 data/bits_n_bobs/advancement/recipes/building_blocks/crafting/black_chair_from_other_chair.json 867972ea2574ae283e1ef51f9cebcba13b344898 data/bits_n_bobs/advancement/recipes/building_blocks/crafting/blue_chair.json @@ -706,104 +704,104 @@ d21e893e25ae5558afff5008b8b76d9fccc089fb data/bits_n_bobs/advancement/recipes/bu 6c315ac21f795e9e471e285b7820d8568b17f11f data/bits_n_bobs/advancement/recipes/building_blocks/crafting/yellow_chair.json dfafc5e3d9b271ab65ab32631f3c9c1112d6e73c data/bits_n_bobs/advancement/recipes/building_blocks/crafting/yellow_chair_from_other_chair.json c5245b78f0e1752e48d88f436619f49cb9a6af66 data/bits_n_bobs/advancement/recipes/building_blocks/crimsite_from_stone_types_crimsite_stonecutting.json -466f80693b7d2331cd355088c7473c865211c080 data/bits_n_bobs/advancement/recipes/building_blocks/crimsite_tiles_from_stone_types_crimsite_stonecutting.json 845b22bb803484236f4d275ad60f63528056f6ef data/bits_n_bobs/advancement/recipes/building_blocks/crimsite_tile_slab.json ccde7aee40805dd3d10239805507fda245218ea6 data/bits_n_bobs/advancement/recipes/building_blocks/crimsite_tile_slab_from_stone_types_crimsite_stonecutting.json 097ecea82c9436af13c7c07372fcab3ac3799982 data/bits_n_bobs/advancement/recipes/building_blocks/crimsite_tile_stairs.json b9935554cc0d9cf5ac3c6ef1faf2f577cf459089 data/bits_n_bobs/advancement/recipes/building_blocks/crimsite_tile_stairs_from_stone_types_crimsite_stonecutting.json 96d2d441c5d6028a1ff2507b3bb530061df67931 data/bits_n_bobs/advancement/recipes/building_blocks/crimsite_tile_wall.json 659c9f0f820f65dc43d2261cf156a9ccf8e79786 data/bits_n_bobs/advancement/recipes/building_blocks/crimsite_tile_wall_from_stone_types_crimsite_stonecutting.json +466f80693b7d2331cd355088c7473c865211c080 data/bits_n_bobs/advancement/recipes/building_blocks/crimsite_tiles_from_stone_types_crimsite_stonecutting.json aea1dd6599b0d3768ef47461c78a4ecbe4e2a46a data/bits_n_bobs/advancement/recipes/building_blocks/deepslate_from_stone_types_deepslate_stonecutting.json -52e1e41c318d0505d70a6c651434324172368a22 data/bits_n_bobs/advancement/recipes/building_blocks/deepslate_tiles_from_stone_types_deepslate_stonecutting.json 1af629d382c4b08bc4cc651240e62ae03273a1f2 data/bits_n_bobs/advancement/recipes/building_blocks/deepslate_tile_slab.json 676b01a32c11ea109e7e5741456888d9b2d8af2a data/bits_n_bobs/advancement/recipes/building_blocks/deepslate_tile_slab_from_stone_types_deepslate_stonecutting.json e1765b1b273d9ab776491e84680d1a6acda9e11f data/bits_n_bobs/advancement/recipes/building_blocks/deepslate_tile_stairs.json c11ff40274bc51661470d35a96f971a651171220 data/bits_n_bobs/advancement/recipes/building_blocks/deepslate_tile_stairs_from_stone_types_deepslate_stonecutting.json e4cc2a5a995d72ec20701832890bfc53fc95eadd data/bits_n_bobs/advancement/recipes/building_blocks/deepslate_tile_wall.json af122e5ac17e6033f57deba4a168262cbd25ce6a data/bits_n_bobs/advancement/recipes/building_blocks/deepslate_tile_wall_from_stone_types_deepslate_stonecutting.json +52e1e41c318d0505d70a6c651434324172368a22 data/bits_n_bobs/advancement/recipes/building_blocks/deepslate_tiles_from_stone_types_deepslate_stonecutting.json 9f2ff7546933e473725af302f822bb845721be80 data/bits_n_bobs/advancement/recipes/building_blocks/diorite_from_stone_types_diorite_stonecutting.json -0844eda8fed793c31f585ef1379b08a7cd4c3011 data/bits_n_bobs/advancement/recipes/building_blocks/diorite_tiles_from_stone_types_diorite_stonecutting.json 958a12da07401505bd5d19558721d96510424438 data/bits_n_bobs/advancement/recipes/building_blocks/diorite_tile_slab.json f50519d4589a19dbe23c18429aecc606f3723750 data/bits_n_bobs/advancement/recipes/building_blocks/diorite_tile_slab_from_stone_types_diorite_stonecutting.json 66d5560c9a69127350d264df52aca34270e43083 data/bits_n_bobs/advancement/recipes/building_blocks/diorite_tile_stairs.json cf55d6cf492960793a1e0a3247c53bb96eed6d6c data/bits_n_bobs/advancement/recipes/building_blocks/diorite_tile_stairs_from_stone_types_diorite_stonecutting.json 20542d1bf8084e337bfc956d849203869e98aebf data/bits_n_bobs/advancement/recipes/building_blocks/diorite_tile_wall.json 31067976788f792df32208d9c47f1efaa6a05b33 data/bits_n_bobs/advancement/recipes/building_blocks/diorite_tile_wall_from_stone_types_diorite_stonecutting.json +0844eda8fed793c31f585ef1379b08a7cd4c3011 data/bits_n_bobs/advancement/recipes/building_blocks/diorite_tiles_from_stone_types_diorite_stonecutting.json 116991e944f3e934253257f8b8c8ee31d29d41cd data/bits_n_bobs/advancement/recipes/building_blocks/dripstone_block_from_stone_types_dripstone_stonecutting.json -e1b912ed63ca2b98f7ef41356e3972cdecaad8aa data/bits_n_bobs/advancement/recipes/building_blocks/dripstone_tiles_from_stone_types_dripstone_stonecutting.json 2bc9f3cdd3281e481a989902418f1ef06fc44af5 data/bits_n_bobs/advancement/recipes/building_blocks/dripstone_tile_slab.json 5bcb721b339cbee62c6215358a1113a856c31254 data/bits_n_bobs/advancement/recipes/building_blocks/dripstone_tile_slab_from_stone_types_dripstone_stonecutting.json 0f873744c3d1a62b0bd343c6e940f1ae717d1880 data/bits_n_bobs/advancement/recipes/building_blocks/dripstone_tile_stairs.json 12af0051069b5dc1be3a31e7c2e8f3863f7e976f data/bits_n_bobs/advancement/recipes/building_blocks/dripstone_tile_stairs_from_stone_types_dripstone_stonecutting.json e299d5c691222c6475dc2149187fcee541378ff1 data/bits_n_bobs/advancement/recipes/building_blocks/dripstone_tile_wall.json e91269e210ebce2c71dc23e46c949a0f4a545b77 data/bits_n_bobs/advancement/recipes/building_blocks/dripstone_tile_wall_from_stone_types_dripstone_stonecutting.json +e1b912ed63ca2b98f7ef41356e3972cdecaad8aa data/bits_n_bobs/advancement/recipes/building_blocks/dripstone_tiles_from_stone_types_dripstone_stonecutting.json 1f46a6515eae88620bdfae2976ab9be65c28b9c5 data/bits_n_bobs/advancement/recipes/building_blocks/granite_from_stone_types_granite_stonecutting.json -0fd4b29ef9ea4cf9edad029ab0e496b6afd54197 data/bits_n_bobs/advancement/recipes/building_blocks/granite_tiles_from_stone_types_granite_stonecutting.json 312965cfe19810382f1de7138db590c8a52bf5cd data/bits_n_bobs/advancement/recipes/building_blocks/granite_tile_slab.json bbc844e986a6c8f4d2088f48ac0f639caea52db7 data/bits_n_bobs/advancement/recipes/building_blocks/granite_tile_slab_from_stone_types_granite_stonecutting.json bb471443c4028e14ede3620ae85fc31746c3f99a data/bits_n_bobs/advancement/recipes/building_blocks/granite_tile_stairs.json 921f5bf6108e8b04e48f22974becc84a35c6a1df data/bits_n_bobs/advancement/recipes/building_blocks/granite_tile_stairs_from_stone_types_granite_stonecutting.json 5df7a66282c59213bac6e617197fcbdf15584abd data/bits_n_bobs/advancement/recipes/building_blocks/granite_tile_wall.json 23a43bc045955d0c061b5be560013d7c78a23f1e data/bits_n_bobs/advancement/recipes/building_blocks/granite_tile_wall_from_stone_types_granite_stonecutting.json +0fd4b29ef9ea4cf9edad029ab0e496b6afd54197 data/bits_n_bobs/advancement/recipes/building_blocks/granite_tiles_from_stone_types_granite_stonecutting.json 7517d416a2bbcbdf3a6a95578478b528c6448b94 data/bits_n_bobs/advancement/recipes/building_blocks/limestone_from_stone_types_limestone_stonecutting.json -4d3240eb7c1c69dc49d7e2d589448807e5c3bd63 data/bits_n_bobs/advancement/recipes/building_blocks/limestone_tiles_from_stone_types_limestone_stonecutting.json 8a91ee841bc5db2cab12cacb4fcb0970e75f84cf data/bits_n_bobs/advancement/recipes/building_blocks/limestone_tile_slab.json be5b15a55e9dbbd4f7df0c0efbbd4573cddb324e data/bits_n_bobs/advancement/recipes/building_blocks/limestone_tile_slab_from_stone_types_limestone_stonecutting.json fe492043bf296ae7e8f2538199ed37fea8f2cb6e data/bits_n_bobs/advancement/recipes/building_blocks/limestone_tile_stairs.json c0a9f4526f98711cea0d5f5c1967d2d69cdf1fe5 data/bits_n_bobs/advancement/recipes/building_blocks/limestone_tile_stairs_from_stone_types_limestone_stonecutting.json 55ee95bc76466b9312a3b1480ee7beff4b33eb9e data/bits_n_bobs/advancement/recipes/building_blocks/limestone_tile_wall.json 239abc71616eca3914773273078bd35e5d4a34a9 data/bits_n_bobs/advancement/recipes/building_blocks/limestone_tile_wall_from_stone_types_limestone_stonecutting.json +4d3240eb7c1c69dc49d7e2d589448807e5c3bd63 data/bits_n_bobs/advancement/recipes/building_blocks/limestone_tiles_from_stone_types_limestone_stonecutting.json 9cc8cdff84b75840a0d9f179a4747bba79b3c1ac data/bits_n_bobs/advancement/recipes/building_blocks/ochrum_from_stone_types_ochrum_stonecutting.json -15337a2d8e81019cf8e6f9267bd8d46047819907 data/bits_n_bobs/advancement/recipes/building_blocks/ochrum_tiles_from_stone_types_ochrum_stonecutting.json 7fe38740cea3893ba9bf474871b7e14cf8e942ee data/bits_n_bobs/advancement/recipes/building_blocks/ochrum_tile_slab.json fb6d0ebeea00019793304f5fabac0856c9f837ea data/bits_n_bobs/advancement/recipes/building_blocks/ochrum_tile_slab_from_stone_types_ochrum_stonecutting.json c7568e59bf9753187bcdbf13bdfb77db3884d469 data/bits_n_bobs/advancement/recipes/building_blocks/ochrum_tile_stairs.json f3a045f527e81af433f00a39238f6f97cdeeed18 data/bits_n_bobs/advancement/recipes/building_blocks/ochrum_tile_stairs_from_stone_types_ochrum_stonecutting.json 2727653daf872c6d551631e305e0c7fb6399bbb1 data/bits_n_bobs/advancement/recipes/building_blocks/ochrum_tile_wall.json fad5935d77a4960cd4fde204e8e296cfe0f8662c data/bits_n_bobs/advancement/recipes/building_blocks/ochrum_tile_wall_from_stone_types_ochrum_stonecutting.json +15337a2d8e81019cf8e6f9267bd8d46047819907 data/bits_n_bobs/advancement/recipes/building_blocks/ochrum_tiles_from_stone_types_ochrum_stonecutting.json 90c5a4280499b3ab26593c3c6840f146f0343fc2 data/bits_n_bobs/advancement/recipes/building_blocks/scorchia_from_stone_types_scorchia_stonecutting.json -cd89d9cbc748c79f7669119fd7bb688a0fbf82c3 data/bits_n_bobs/advancement/recipes/building_blocks/scorchia_tiles_from_stone_types_scorchia_stonecutting.json ec7797ac6a1ed0866e9d9dc81ff80a3353ffb18e data/bits_n_bobs/advancement/recipes/building_blocks/scorchia_tile_slab.json be726e9425d2604c3060438ac4b0d824ed1b33ea data/bits_n_bobs/advancement/recipes/building_blocks/scorchia_tile_slab_from_stone_types_scorchia_stonecutting.json 23c2f6b02a8299e0c17425737a74adb2e0dfaf7c data/bits_n_bobs/advancement/recipes/building_blocks/scorchia_tile_stairs.json 5e51c8b55f9fc599628677b39aef5c3fb0bdeb34 data/bits_n_bobs/advancement/recipes/building_blocks/scorchia_tile_stairs_from_stone_types_scorchia_stonecutting.json 7cb2005d542b638cb43619a03b12507ada3ad5ad data/bits_n_bobs/advancement/recipes/building_blocks/scorchia_tile_wall.json 761a20a90e5860f28368f765fff13e9f00d0f20b data/bits_n_bobs/advancement/recipes/building_blocks/scorchia_tile_wall_from_stone_types_scorchia_stonecutting.json +cd89d9cbc748c79f7669119fd7bb688a0fbf82c3 data/bits_n_bobs/advancement/recipes/building_blocks/scorchia_tiles_from_stone_types_scorchia_stonecutting.json 7f0a0903d2ff4f38257854431d76ef8473ca7194 data/bits_n_bobs/advancement/recipes/building_blocks/scoria_from_stone_types_scoria_stonecutting.json -c1c4db9cd671844384151b0a6d4cf1711c0ff548 data/bits_n_bobs/advancement/recipes/building_blocks/scoria_tiles_from_stone_types_scoria_stonecutting.json 4c7a9cda05e5f77add46ba1fb5b6b9d4bec0688a data/bits_n_bobs/advancement/recipes/building_blocks/scoria_tile_slab.json 670672171e7ee320dc72977ea0f8bf672ee78d5a data/bits_n_bobs/advancement/recipes/building_blocks/scoria_tile_slab_from_stone_types_scoria_stonecutting.json 519f5c59c7e44d9f89bd447bfccba5b6744dc528 data/bits_n_bobs/advancement/recipes/building_blocks/scoria_tile_stairs.json 87482eea17b7ce03dbaf116999cb7f538208bb5f data/bits_n_bobs/advancement/recipes/building_blocks/scoria_tile_stairs_from_stone_types_scoria_stonecutting.json 1527e5d866291536e216978b733586d643c2687e data/bits_n_bobs/advancement/recipes/building_blocks/scoria_tile_wall.json 18a83805f5acbd337f73675da3aa5cdcc956dc92 data/bits_n_bobs/advancement/recipes/building_blocks/scoria_tile_wall_from_stone_types_scoria_stonecutting.json +c1c4db9cd671844384151b0a6d4cf1711c0ff548 data/bits_n_bobs/advancement/recipes/building_blocks/scoria_tiles_from_stone_types_scoria_stonecutting.json b4317caf77d88d0d40932628931cdff7e5acc513 data/bits_n_bobs/advancement/recipes/building_blocks/tuff_from_stone_types_tuff_stonecutting.json -9f7ac2ad5f3dd9a31638d53c05089c4e570136a6 data/bits_n_bobs/advancement/recipes/building_blocks/tuff_tiles_from_stone_types_tuff_stonecutting.json 5b0c409ba6edb5d5354f5d16a55218b8e161e4fc data/bits_n_bobs/advancement/recipes/building_blocks/tuff_tile_slab.json 3172788041628d9251468dda7194411c4787abee data/bits_n_bobs/advancement/recipes/building_blocks/tuff_tile_slab_from_stone_types_tuff_stonecutting.json 8ef8029fe6cfe751809db646c9d577d2b75b7210 data/bits_n_bobs/advancement/recipes/building_blocks/tuff_tile_stairs.json 3f91e6dbc65bf6b06c9d80edd20cd16ff969bbb6 data/bits_n_bobs/advancement/recipes/building_blocks/tuff_tile_stairs_from_stone_types_tuff_stonecutting.json 0ce52e243056e4b6f4b6926e4c910e433fbd04d9 data/bits_n_bobs/advancement/recipes/building_blocks/tuff_tile_wall.json 287c080bf69d66b3163d20253343991662841f68 data/bits_n_bobs/advancement/recipes/building_blocks/tuff_tile_wall_from_stone_types_tuff_stonecutting.json +9f7ac2ad5f3dd9a31638d53c05089c4e570136a6 data/bits_n_bobs/advancement/recipes/building_blocks/tuff_tiles_from_stone_types_tuff_stonecutting.json a7dce08d50dfa36a19871ae0e92719abde104e85 data/bits_n_bobs/advancement/recipes/building_blocks/veridium_from_stone_types_veridium_stonecutting.json -1ac04be85591ff905b605a1682e557b40cc2e0af data/bits_n_bobs/advancement/recipes/building_blocks/veridium_tiles_from_stone_types_veridium_stonecutting.json a75bba60ad0d6c3944ab2e6cf8aeb82217952c63 data/bits_n_bobs/advancement/recipes/building_blocks/veridium_tile_slab.json 5f4f5d2533df78ea060c88617ffdb785ca9fe52a data/bits_n_bobs/advancement/recipes/building_blocks/veridium_tile_slab_from_stone_types_veridium_stonecutting.json 9982b8c871e8507b9b0de2b9252ca391be3f7777 data/bits_n_bobs/advancement/recipes/building_blocks/veridium_tile_stairs.json 5f68030b67c6f37333fba324650dec9756694253 data/bits_n_bobs/advancement/recipes/building_blocks/veridium_tile_stairs_from_stone_types_veridium_stonecutting.json 7cfd984d7bc18cad9cf88b782f7f705d8355f5ad data/bits_n_bobs/advancement/recipes/building_blocks/veridium_tile_wall.json 8c408025a947fb3549987168eb6b8e900fc83bc9 data/bits_n_bobs/advancement/recipes/building_blocks/veridium_tile_wall_from_stone_types_veridium_stonecutting.json +1ac04be85591ff905b605a1682e557b40cc2e0af data/bits_n_bobs/advancement/recipes/building_blocks/veridium_tiles_from_stone_types_veridium_stonecutting.json 73a4683dd9d94affaad365c7022fe3aa4df7388d data/bits_n_bobs/loot_table/blocks/andesite_encased_flanged_cogwheel.json 2fd804038e661292809ecbd27bd76a019d9320da data/bits_n_bobs/loot_table/blocks/andesite_encased_large_flanged_cogwheel.json 94f40bc51efc249c0cd868bdd15b0eb293d200be data/bits_n_bobs/loot_table/blocks/andesite_encased_piston_extension_pole.json -9427807544807919115c1eef446626a0b8607f5c data/bits_n_bobs/loot_table/blocks/andesite_tiles.json f29585e794d094ce81f94f269de3b7c9bf1e555e data/bits_n_bobs/loot_table/blocks/andesite_tile_slab.json ee59467e78688613341a57c4696fd9ca6ae0444d data/bits_n_bobs/loot_table/blocks/andesite_tile_stairs.json e6189a1e18014617dac5f6081db9e08f512d577e data/bits_n_bobs/loot_table/blocks/andesite_tile_wall.json -df0fe2571181df3a251686e8c5e8c5aa37a20e4a data/bits_n_bobs/loot_table/blocks/asurine_tiles.json +9427807544807919115c1eef446626a0b8607f5c data/bits_n_bobs/loot_table/blocks/andesite_tiles.json 9c6694985f5982104023edcf96a94b9bdea39d96 data/bits_n_bobs/loot_table/blocks/asurine_tile_slab.json 756e901d6b18a70d92ce026ae6a9562046290ff8 data/bits_n_bobs/loot_table/blocks/asurine_tile_stairs.json bf96206407a23f11fe7bd37acab8ad815d21bea3 data/bits_n_bobs/loot_table/blocks/asurine_tile_wall.json +df0fe2571181df3a251686e8c5e8c5aa37a20e4a data/bits_n_bobs/loot_table/blocks/asurine_tiles.json 47b5916334438f97ef41c4d150b21ef33c7d538c data/bits_n_bobs/loot_table/blocks/black_chair.json 006a4ed2fe2810f8f6dc55b597b16b001e9613d4 data/bits_n_bobs/loot_table/blocks/black_large_nixie_tube.json 8e527886267ea6a8b2a251500f8e7fd535a57415 data/bits_n_bobs/loot_table/blocks/black_nixie_board.json @@ -818,41 +816,41 @@ d8bdaa42977f516ac42facdb821aa09760a67cad data/bits_n_bobs/loot_table/blocks/bras 340fe9dedc86741f670ff888006fbe6b0810387c data/bits_n_bobs/loot_table/blocks/brown_large_nixie_tube.json 4cb22f488c1edf31486e073ef41f1d4ba92e2f55 data/bits_n_bobs/loot_table/blocks/brown_nixie_board.json 6710122fe9f8c5a08ff9fd826458168da4563ec6 data/bits_n_bobs/loot_table/blocks/cable_girder_strut.json -6c72d000dc54641ac87f78971da207752bbc3bb1 data/bits_n_bobs/loot_table/blocks/calcite_tiles.json 80a513861da4948070244e99bc79eff79ba9a7bc data/bits_n_bobs/loot_table/blocks/calcite_tile_slab.json 5beec61715a902900641a6ef29f00ac63ac3a7b1 data/bits_n_bobs/loot_table/blocks/calcite_tile_stairs.json a29b16f717d8f8479683ac568f6aacc862ae13f3 data/bits_n_bobs/loot_table/blocks/calcite_tile_wall.json +6c72d000dc54641ac87f78971da207752bbc3bb1 data/bits_n_bobs/loot_table/blocks/calcite_tiles.json 6e2d4c8500360217046ed5d20de4597164aeecaf data/bits_n_bobs/loot_table/blocks/chain_pulley.json 0b6e3994e52b3bd55ce22202024a02a6db0408ed data/bits_n_bobs/loot_table/blocks/chain_pulley_magnet.json 07419c4023c5a6e7ab6d956848b4a946197e1fac data/bits_n_bobs/loot_table/blocks/chain_rope.json 89c6eff731495b11499983978205ef1d91e44aec data/bits_n_bobs/loot_table/blocks/cogwheel_chain_carriage.json -8d6c89a3f3f1b9b2e6efd1abcddcdf94b94143a0 data/bits_n_bobs/loot_table/blocks/crimsite_tiles.json 7a7861e95efaa7afd2831e2d628d2e1ce48bf583 data/bits_n_bobs/loot_table/blocks/crimsite_tile_slab.json 1d89676b72270022737b3212a73adae3dc40eceb data/bits_n_bobs/loot_table/blocks/crimsite_tile_stairs.json 9dac0785e0d1fc5db1811d8bff902d1b0f912714 data/bits_n_bobs/loot_table/blocks/crimsite_tile_wall.json +8d6c89a3f3f1b9b2e6efd1abcddcdf94b94143a0 data/bits_n_bobs/loot_table/blocks/crimsite_tiles.json 71582491040d23f67da205ad31a48541c6ed9edd data/bits_n_bobs/loot_table/blocks/cyan_chair.json 20ac36d14e058f6dd59bcf9be0fc08d13f260803 data/bits_n_bobs/loot_table/blocks/cyan_large_nixie_tube.json 80e828c265cdfc3c8b65c113580c0415e8d19f1b data/bits_n_bobs/loot_table/blocks/cyan_nixie_board.json -22da94d3faefb42e02826421baa0114622f12875 data/bits_n_bobs/loot_table/blocks/deepslate_tiles.json 7f4746918727831cb1ecd96725aae411d7971504 data/bits_n_bobs/loot_table/blocks/deepslate_tile_slab.json b69e63b18dc94fb1b1d311ae58e051a41b719344 data/bits_n_bobs/loot_table/blocks/deepslate_tile_stairs.json 652e19f5a296e0a2dfa953538e23d76502b0aece data/bits_n_bobs/loot_table/blocks/deepslate_tile_wall.json -cd61494cbe40db0f6605e9b51aa80d6fcab20dcf data/bits_n_bobs/loot_table/blocks/diorite_tiles.json +22da94d3faefb42e02826421baa0114622f12875 data/bits_n_bobs/loot_table/blocks/deepslate_tiles.json 59c6e487ba6bf849bb72a4a75be8a1aee84839fb data/bits_n_bobs/loot_table/blocks/diorite_tile_slab.json e6efe1814db8353f18aa8b56338975ce3735609c data/bits_n_bobs/loot_table/blocks/diorite_tile_stairs.json 334d147506a5db58dcce7405891f565386c6a147 data/bits_n_bobs/loot_table/blocks/diorite_tile_wall.json -2e694b6fcf3680c328a2df60becaba57b52af49c data/bits_n_bobs/loot_table/blocks/dripstone_tiles.json +cd61494cbe40db0f6605e9b51aa80d6fcab20dcf data/bits_n_bobs/loot_table/blocks/diorite_tiles.json 5618814a1377229b4d2c3c03f7af8b5fe03fe165 data/bits_n_bobs/loot_table/blocks/dripstone_tile_slab.json dfe4103baee3c62563086322ff2c0b7801ae9708 data/bits_n_bobs/loot_table/blocks/dripstone_tile_stairs.json c269f51c58aebf400e1375a4d3e5c44e3b83177f data/bits_n_bobs/loot_table/blocks/dripstone_tile_wall.json +2e694b6fcf3680c328a2df60becaba57b52af49c data/bits_n_bobs/loot_table/blocks/dripstone_tiles.json 1fa21743f2a57f1e526a663f6f9baf3fefc92834 data/bits_n_bobs/loot_table/blocks/flywheel_bearing.json f982184ce2835eb99cc339cf33861d58d2c74669 data/bits_n_bobs/loot_table/blocks/gigantic_cogwheel.json 52056f80afd72a47c9515a3fd098d491545a4110 data/bits_n_bobs/loot_table/blocks/gigantic_cogwheel_satellite.json b768e8a90035e52718c555815c861a8d77db869a data/bits_n_bobs/loot_table/blocks/girder_strut.json -1995596300553cc2210ea9d26e91e174dc5366f1 data/bits_n_bobs/loot_table/blocks/granite_tiles.json c83126a83f9099a133739a1460cb89682c3fcdcb data/bits_n_bobs/loot_table/blocks/granite_tile_slab.json af4def6fed59132da19f0948559aadadcca3039d data/bits_n_bobs/loot_table/blocks/granite_tile_stairs.json 0c9140f1173029c119c64d7b15bbe936cd9c8e85 data/bits_n_bobs/loot_table/blocks/granite_tile_wall.json +1995596300553cc2210ea9d26e91e174dc5366f1 data/bits_n_bobs/loot_table/blocks/granite_tiles.json c9b32cd99b01d82141df1029943975bc71df3d06 data/bits_n_bobs/loot_table/blocks/gray_chair.json 1823931cae3300a24364851f9a7b5bc7b1c8e864 data/bits_n_bobs/loot_table/blocks/gray_large_nixie_tube.json 6d650c86824158b623fdde6c59d544e4ee4a898f data/bits_n_bobs/loot_table/blocks/gray_nixie_board.json @@ -873,28 +871,28 @@ c1247cf128b7f420d66bea5f86c849e459407e1f data/bits_n_bobs/loot_table/blocks/indu 540f92adfc94ff33c152fa9664d16f5784921924 data/bits_n_bobs/loot_table/blocks/industrial_truss.json 98d13cca15a8f9781216b2f253d79c226c7c88ba data/bits_n_bobs/loot_table/blocks/large_flanged_cogwheel.json 9878885bce5197bd45d4838870e99f27d97de8cb data/bits_n_bobs/loot_table/blocks/large_nixie_tube.json -cb08e9889baa220e148c29e0515af34412b266ee data/bits_n_bobs/loot_table/blocks/lightbulb.json a916cbae0b94eee842224b2ace0af7423f01b9a6 data/bits_n_bobs/loot_table/blocks/light_blue_chair.json 0fbd2ce69b6bc68bec11854dc10962541e162e27 data/bits_n_bobs/loot_table/blocks/light_blue_large_nixie_tube.json ccb8f55dfaafeac3882bf88ab2342e0d4937d7c0 data/bits_n_bobs/loot_table/blocks/light_blue_nixie_board.json 08d804910a29075ac231df5ae8e222469e152be0 data/bits_n_bobs/loot_table/blocks/light_gray_chair.json a21f16a949a45d0705cc45376350c47ae7ad61fb data/bits_n_bobs/loot_table/blocks/light_gray_large_nixie_tube.json 8bbb6348566fca7e64f6e257ad0c6cafc40ab9d4 data/bits_n_bobs/loot_table/blocks/light_gray_nixie_board.json -c7dac2001ba0e503d0e0c964fa1b57e0f596507e data/bits_n_bobs/loot_table/blocks/limestone_tiles.json -09049a4bdea48fce31b38d70d2e80d124f7a8c5d data/bits_n_bobs/loot_table/blocks/limestone_tile_slab.json -25e0b077690d0d652504cd24e6aa08a701ae56f8 data/bits_n_bobs/loot_table/blocks/limestone_tile_stairs.json -f184f7c1f1216d4744f3beb27999b7f13f8d299e data/bits_n_bobs/loot_table/blocks/limestone_tile_wall.json +cb08e9889baa220e148c29e0515af34412b266ee data/bits_n_bobs/loot_table/blocks/lightbulb.json 5b2f1dbf276f6df75aa3e837b0940d4315c42b44 data/bits_n_bobs/loot_table/blocks/lime_chair.json a22a622a1bde50135c5cd8827a63dd088f4c6893 data/bits_n_bobs/loot_table/blocks/lime_large_nixie_tube.json 9b44f07a1ddea3067dd2dcdef835b30e4f4cfc74 data/bits_n_bobs/loot_table/blocks/lime_nixie_board.json +09049a4bdea48fce31b38d70d2e80d124f7a8c5d data/bits_n_bobs/loot_table/blocks/limestone_tile_slab.json +25e0b077690d0d652504cd24e6aa08a701ae56f8 data/bits_n_bobs/loot_table/blocks/limestone_tile_stairs.json +f184f7c1f1216d4744f3beb27999b7f13f8d299e data/bits_n_bobs/loot_table/blocks/limestone_tile_wall.json +c7dac2001ba0e503d0e0c964fa1b57e0f596507e data/bits_n_bobs/loot_table/blocks/limestone_tiles.json 8c784e331723ce65fdd1488296782e696dddb8c7 data/bits_n_bobs/loot_table/blocks/magenta_chair.json 0d802fedd53c04b35ae0c726d39ae6a55bed5117 data/bits_n_bobs/loot_table/blocks/magenta_large_nixie_tube.json 31fa81eec1a9517b3223d1068b04367d91c6ee1b data/bits_n_bobs/loot_table/blocks/magenta_nixie_board.json b8ea556c1f66ce57b842bff622aa2834fa8a1a16 data/bits_n_bobs/loot_table/blocks/nixie_board.json -27c6426ca45225b19798b9311d4c07dfb0cac624 data/bits_n_bobs/loot_table/blocks/ochrum_tiles.json 65cff771782860a4c7b8cd40232c1398046cd83d data/bits_n_bobs/loot_table/blocks/ochrum_tile_slab.json faafe9b95d4ff5aa75f00a89766939aa9157253d data/bits_n_bobs/loot_table/blocks/ochrum_tile_stairs.json 084f3519e28aa7e563801fdc8710150fa986e166 data/bits_n_bobs/loot_table/blocks/ochrum_tile_wall.json +27c6426ca45225b19798b9311d4c07dfb0cac624 data/bits_n_bobs/loot_table/blocks/ochrum_tiles.json 994a18f002b8ef3611d2b97d74e5474da437b2ab data/bits_n_bobs/loot_table/blocks/orange_chair.json b3993794e493ffd1834c2ee75376bd266a69c2c4 data/bits_n_bobs/loot_table/blocks/orange_large_nixie_tube.json ddd16fc3096b87be8bcde81104a1669a16df3635 data/bits_n_bobs/loot_table/blocks/orange_nixie_board.json @@ -907,24 +905,24 @@ fc3ab55fc238e24fc9b30fce11197553ceeaa173 data/bits_n_bobs/loot_table/blocks/purp 7231be47864415865e3962af7f7163f77ffb17c8 data/bits_n_bobs/loot_table/blocks/red_chair.json 17665d86f9cf4710b082c7b443b220b191e245f2 data/bits_n_bobs/loot_table/blocks/red_large_nixie_tube.json 108baf4d2e2dadc7102b89bed6d64488adb81c5d data/bits_n_bobs/loot_table/blocks/red_nixie_board.json -14c2775eb9e37f3a2ecb0b51f10a7df0e0b69a06 data/bits_n_bobs/loot_table/blocks/scorchia_tiles.json 1135d30cf9ddc2c0da286e270d8c3cc089725175 data/bits_n_bobs/loot_table/blocks/scorchia_tile_slab.json 2ae7d038b8c7d4c6e4f713eab91071024d3a0b0b data/bits_n_bobs/loot_table/blocks/scorchia_tile_stairs.json 90a88bb61f9a6721cb3d40ad5f7dd697ce81ecb8 data/bits_n_bobs/loot_table/blocks/scorchia_tile_wall.json -517e02c816d58d2ce9c022db38003bd63ad542a0 data/bits_n_bobs/loot_table/blocks/scoria_tiles.json +14c2775eb9e37f3a2ecb0b51f10a7df0e0b69a06 data/bits_n_bobs/loot_table/blocks/scorchia_tiles.json eb68cac4791497d705250237a9fb811ff628a6ad data/bits_n_bobs/loot_table/blocks/scoria_tile_slab.json ff885b01fb67565d5ec1d60864f17aa8b2d15942 data/bits_n_bobs/loot_table/blocks/scoria_tile_stairs.json 1abeb1899632cdf135428d440b08a54bb3398b8f data/bits_n_bobs/loot_table/blocks/scoria_tile_wall.json +517e02c816d58d2ce9c022db38003bd63ad542a0 data/bits_n_bobs/loot_table/blocks/scoria_tiles.json 68fe6b050db48f46c1fcbf5c14da81f93ee5f339 data/bits_n_bobs/loot_table/blocks/small_flanged_cogwheel.json 70c83106798123e3b0b9381646125462f460a923 data/bits_n_bobs/loot_table/blocks/throttle_lever.json -3eacf1c8f3ef9727f79207341d6fe011cd1fbaa6 data/bits_n_bobs/loot_table/blocks/tuff_tiles.json a452f5e8658e7f57c076b41b8faad97104df3c5b data/bits_n_bobs/loot_table/blocks/tuff_tile_slab.json c68bb3e6cc8282a5015d907c003194b8c0bb943e data/bits_n_bobs/loot_table/blocks/tuff_tile_stairs.json 55dbe34d8ce14af5101bba5462a7f4492ed725d3 data/bits_n_bobs/loot_table/blocks/tuff_tile_wall.json -fcfa590a9d9bf4299eee38f8fe3210c684e3800b data/bits_n_bobs/loot_table/blocks/veridium_tiles.json +3eacf1c8f3ef9727f79207341d6fe011cd1fbaa6 data/bits_n_bobs/loot_table/blocks/tuff_tiles.json 46b202e99744a4267c54eb672abdc73a4cdb4e5c data/bits_n_bobs/loot_table/blocks/veridium_tile_slab.json 86c1c77bdc92b9a82e72afeb59aef8c8be9b5697 data/bits_n_bobs/loot_table/blocks/veridium_tile_stairs.json 1c389bc9eb467d20d237adcff6bef56c5eafe763 data/bits_n_bobs/loot_table/blocks/veridium_tile_wall.json +fcfa590a9d9bf4299eee38f8fe3210c684e3800b data/bits_n_bobs/loot_table/blocks/veridium_tiles.json 70b6c653700ccc77e21f4dd0ee9ee2d4420ce04e data/bits_n_bobs/loot_table/blocks/weathered_girder_strut.json 187e583af7a697030df5de1b723335fffe38e6a6 data/bits_n_bobs/loot_table/blocks/weathered_iron_encased_cogwheel.json f00663fca4088e7e81af1c518a1e35ebdcf47a25 data/bits_n_bobs/loot_table/blocks/weathered_iron_encased_flanged_cogwheel.json @@ -942,29 +940,29 @@ e69a6e41b208776e408c43c6a1e4207afda75349 data/bits_n_bobs/loot_table/blocks/yell a0e32af6f87c8062a5173945dbf8149347afbaf2 data/bits_n_bobs/loot_table/blocks/yellow_large_nixie_tube.json 6660413d44895a511f670b35a2f9d0e9d9cc3292 data/bits_n_bobs/loot_table/blocks/yellow_nixie_board.json 997760a1fb3118c2f28b153b3f22902001f479e4 data/bits_n_bobs/recipe/andesite_from_stone_types_andesite_stonecutting.json -b883e8e87f40f2110f44fd46a46b9722d871732c data/bits_n_bobs/recipe/andesite_tiles_from_stone_types_andesite_stonecutting.json 11e77a539f781147950908fa65d5ec6f5044ba38 data/bits_n_bobs/recipe/andesite_tile_slab.json 3835ea8c7795df0a6ba755d0abb57cd22bf35e24 data/bits_n_bobs/recipe/andesite_tile_slab_from_stone_types_andesite_stonecutting.json e1044ca5f35e453744c30659f239e8cf537b5bec data/bits_n_bobs/recipe/andesite_tile_stairs.json dd0d97d5521bc8f38e2f41a09e1bd3cab877135b data/bits_n_bobs/recipe/andesite_tile_stairs_from_stone_types_andesite_stonecutting.json 21e867f98e61663d0359de22a063cca1caf66abf data/bits_n_bobs/recipe/andesite_tile_wall.json ae3746051b6867ea835a5f47ee5e66f618877c8b data/bits_n_bobs/recipe/andesite_tile_wall_from_stone_types_andesite_stonecutting.json +b883e8e87f40f2110f44fd46a46b9722d871732c data/bits_n_bobs/recipe/andesite_tiles_from_stone_types_andesite_stonecutting.json 69feffa630329f18c1ff5ee27f15a8c9f0c29855 data/bits_n_bobs/recipe/asurine_from_stone_types_asurine_stonecutting.json -f1e02beeda7deeffee2d6f12ffe3dbb70f07c9e8 data/bits_n_bobs/recipe/asurine_tiles_from_stone_types_asurine_stonecutting.json 869e27c7253961cce1cab89393d6adb58f709167 data/bits_n_bobs/recipe/asurine_tile_slab.json 63971ad37f458647eeca3d757927bc935783cb53 data/bits_n_bobs/recipe/asurine_tile_slab_from_stone_types_asurine_stonecutting.json 32b90168291633d7e47ac2118b90762ec3209961 data/bits_n_bobs/recipe/asurine_tile_stairs.json e93d8d4bfd3d27634e320d0ca50b951be03bf90d data/bits_n_bobs/recipe/asurine_tile_stairs_from_stone_types_asurine_stonecutting.json 39d9156938d46077dbe1c102f79b1d0d48fd3e44 data/bits_n_bobs/recipe/asurine_tile_wall.json f67d2fa36640517db77c9246df9ce91386b6b965 data/bits_n_bobs/recipe/asurine_tile_wall_from_stone_types_asurine_stonecutting.json +f1e02beeda7deeffee2d6f12ffe3dbb70f07c9e8 data/bits_n_bobs/recipe/asurine_tiles_from_stone_types_asurine_stonecutting.json 0a958b0188b8b2e5ec296451cc43968012f06dd6 data/bits_n_bobs/recipe/calcite_from_stone_types_calcite_stonecutting.json -57e20eda68b66bfb54d78709eaa6f77aecd51d1d data/bits_n_bobs/recipe/calcite_tiles_from_stone_types_calcite_stonecutting.json b7e8db9bdab059b1a003a661a28f3c295b42b799 data/bits_n_bobs/recipe/calcite_tile_slab.json 2d9420c4b55500ed9178c8acfa9b6687bea8da79 data/bits_n_bobs/recipe/calcite_tile_slab_from_stone_types_calcite_stonecutting.json fe0bc7c467a963b36664b95abe6420b2beba41ff data/bits_n_bobs/recipe/calcite_tile_stairs.json 3902161350987da8e4048e21a82fb82c0ab24d83 data/bits_n_bobs/recipe/calcite_tile_stairs_from_stone_types_calcite_stonecutting.json d003e62fe1653d7108bde589b00bba1a095a5e97 data/bits_n_bobs/recipe/calcite_tile_wall.json 698864f4c8e0a7428efa30ea391d828b75c322f1 data/bits_n_bobs/recipe/calcite_tile_wall_from_stone_types_calcite_stonecutting.json +57e20eda68b66bfb54d78709eaa6f77aecd51d1d data/bits_n_bobs/recipe/calcite_tiles_from_stone_types_calcite_stonecutting.json e1eafb4a80827e9308d8460e8642c86ecc8c6905 data/bits_n_bobs/recipe/crafting/black_chair.json afedf68adfa7451cb2d6ec607c6a74d7ab9b4b7d data/bits_n_bobs/recipe/crafting/black_chair_from_other_chair.json c7c750cb22b84b5abf8754aff55110b8cb391f79 data/bits_n_bobs/recipe/crafting/blue_chair.json @@ -998,99 +996,101 @@ e1a6303afcfb42bbb4912f2e974f879a869a5cb4 data/bits_n_bobs/recipe/crafting/white_ 5ecc2bafe5e0e4fe638305d60a014799d9dbe244 data/bits_n_bobs/recipe/crafting/yellow_chair.json 53613c979a51fefeda3d2126eb5ff6f95a6ec1cb data/bits_n_bobs/recipe/crafting/yellow_chair_from_other_chair.json a2414f47f89863e74784331e3b400fb50e28a929 data/bits_n_bobs/recipe/crimsite_from_stone_types_crimsite_stonecutting.json -945d4ec96542528673529e94e08712e5c5d15762 data/bits_n_bobs/recipe/crimsite_tiles_from_stone_types_crimsite_stonecutting.json 21754d5ab08e0a2d3beb39f268cdf37d9cd64c8d data/bits_n_bobs/recipe/crimsite_tile_slab.json 7c990b6dc26c1ea1e769e0088ff0d6c1535a31fb data/bits_n_bobs/recipe/crimsite_tile_slab_from_stone_types_crimsite_stonecutting.json 7865113d5e1b68ab721bebf8ad46e871661e66a4 data/bits_n_bobs/recipe/crimsite_tile_stairs.json 921a627da28790b787e2088a167ad4feb3862eac data/bits_n_bobs/recipe/crimsite_tile_stairs_from_stone_types_crimsite_stonecutting.json 9ea43b1142ee69878b45aa77cb0dbdeca09300f1 data/bits_n_bobs/recipe/crimsite_tile_wall.json 5db235b348a992818c2e3a41b12b1fd2bdbc96a7 data/bits_n_bobs/recipe/crimsite_tile_wall_from_stone_types_crimsite_stonecutting.json +945d4ec96542528673529e94e08712e5c5d15762 data/bits_n_bobs/recipe/crimsite_tiles_from_stone_types_crimsite_stonecutting.json 331a4c9b8a3bfc0e251beafcc2715a6342d587e1 data/bits_n_bobs/recipe/deepslate_from_stone_types_deepslate_stonecutting.json -544b57eecea5495bf824ac9952f37c3e3563002f data/bits_n_bobs/recipe/deepslate_tiles_from_stone_types_deepslate_stonecutting.json a6a00aabdfbb967ee63f036f57a25d10136bae8f data/bits_n_bobs/recipe/deepslate_tile_slab.json 5dc96ba2229dfc57d7d8b8f21aa05b584770b59f data/bits_n_bobs/recipe/deepslate_tile_slab_from_stone_types_deepslate_stonecutting.json a5a7885311558a9d437ba543530dbb370eb50093 data/bits_n_bobs/recipe/deepslate_tile_stairs.json 4f7102e69208ef90af78aec833bd6e440445e25b data/bits_n_bobs/recipe/deepslate_tile_stairs_from_stone_types_deepslate_stonecutting.json f8eddd6300c168e3a4d505a43522dc4aa9e139f5 data/bits_n_bobs/recipe/deepslate_tile_wall.json 93b34cbb6f4a3c1fcdaebbfc38eae2d3078424ff data/bits_n_bobs/recipe/deepslate_tile_wall_from_stone_types_deepslate_stonecutting.json +544b57eecea5495bf824ac9952f37c3e3563002f data/bits_n_bobs/recipe/deepslate_tiles_from_stone_types_deepslate_stonecutting.json 235b6af2c3157b2f2e90801006c7b1d8ecf724ed data/bits_n_bobs/recipe/diorite_from_stone_types_diorite_stonecutting.json -bad4804da1ceec45b3652369caa3ad5f8d87e284 data/bits_n_bobs/recipe/diorite_tiles_from_stone_types_diorite_stonecutting.json 26b79fe672f5553a4b5856668955ac809cb70b05 data/bits_n_bobs/recipe/diorite_tile_slab.json 47468a13440214685afdf89f3bddf9a377acddfd data/bits_n_bobs/recipe/diorite_tile_slab_from_stone_types_diorite_stonecutting.json c909475de692d52b4f40cf13d99bf4e521cd3307 data/bits_n_bobs/recipe/diorite_tile_stairs.json 56dd8b08313cf3d5b0a4a96545763bb4e988f46c data/bits_n_bobs/recipe/diorite_tile_stairs_from_stone_types_diorite_stonecutting.json ac1475ec4e60de9b90861b28335073961d1ab6fa data/bits_n_bobs/recipe/diorite_tile_wall.json dacb8eaebc06f959850f1bbc9d62b25712d50604 data/bits_n_bobs/recipe/diorite_tile_wall_from_stone_types_diorite_stonecutting.json +bad4804da1ceec45b3652369caa3ad5f8d87e284 data/bits_n_bobs/recipe/diorite_tiles_from_stone_types_diorite_stonecutting.json 66c212738844deeecadb32deba0664ad70408a6d data/bits_n_bobs/recipe/dripstone_block_from_stone_types_dripstone_stonecutting.json -85068a757af580d91598766322da7117a57adad1 data/bits_n_bobs/recipe/dripstone_tiles_from_stone_types_dripstone_stonecutting.json efd01471cc73730a6ce2ccd72c6d1a14d805c125 data/bits_n_bobs/recipe/dripstone_tile_slab.json e6b58944a820651ddac4d08e484782eda8ab759b data/bits_n_bobs/recipe/dripstone_tile_slab_from_stone_types_dripstone_stonecutting.json 20011480ad69f2338e9720356d351e615b1eb0c2 data/bits_n_bobs/recipe/dripstone_tile_stairs.json 749dfeddb0d506326307de50e7e80800a4ce83f4 data/bits_n_bobs/recipe/dripstone_tile_stairs_from_stone_types_dripstone_stonecutting.json 592c1aff049f055e29d461e77aa8276be910f7fb data/bits_n_bobs/recipe/dripstone_tile_wall.json ffbc38063255b6e829f6220afdebf00b87725758 data/bits_n_bobs/recipe/dripstone_tile_wall_from_stone_types_dripstone_stonecutting.json +85068a757af580d91598766322da7117a57adad1 data/bits_n_bobs/recipe/dripstone_tiles_from_stone_types_dripstone_stonecutting.json 15d2e0c25accffd5a73027a34bbc7bf25407ef34 data/bits_n_bobs/recipe/granite_from_stone_types_granite_stonecutting.json -736997d5920a340ab0052a4765ce015ff50e165b data/bits_n_bobs/recipe/granite_tiles_from_stone_types_granite_stonecutting.json 31557f4ea811b2ec84ec91311714560276f7c064 data/bits_n_bobs/recipe/granite_tile_slab.json 7661f261b1095ab1fcd92d70aa0f4ca9577af6ba data/bits_n_bobs/recipe/granite_tile_slab_from_stone_types_granite_stonecutting.json 88ee4c5b5ae4c1edb40f4702867b2a870af5a4e3 data/bits_n_bobs/recipe/granite_tile_stairs.json e6480b7c2e07edc4509c1662f33ae3f90a34425c data/bits_n_bobs/recipe/granite_tile_stairs_from_stone_types_granite_stonecutting.json 90f566b666f0b8eee1f82affb324d9ad7f59d0fa data/bits_n_bobs/recipe/granite_tile_wall.json 2070f8e8814681667c20d0021255240425a3c88e data/bits_n_bobs/recipe/granite_tile_wall_from_stone_types_granite_stonecutting.json +736997d5920a340ab0052a4765ce015ff50e165b data/bits_n_bobs/recipe/granite_tiles_from_stone_types_granite_stonecutting.json 8626eeb30332ae4d1466937d5c4d1595ca24cfda data/bits_n_bobs/recipe/limestone_from_stone_types_limestone_stonecutting.json -d7c40e68b965c97b18de06b70a7f8b1790ec2fb1 data/bits_n_bobs/recipe/limestone_tiles_from_stone_types_limestone_stonecutting.json 1ed493ebd62a6ad21e9fa8d8cffadde28f29e22d data/bits_n_bobs/recipe/limestone_tile_slab.json 3871b4eed0549d045adbaae3dfca42b3b0e38372 data/bits_n_bobs/recipe/limestone_tile_slab_from_stone_types_limestone_stonecutting.json e6de32ac93cd7027bb25c9bb5432b8f8fed46ba0 data/bits_n_bobs/recipe/limestone_tile_stairs.json 6beefaaf568d61d5efd4309ebc21ccdb02a51674 data/bits_n_bobs/recipe/limestone_tile_stairs_from_stone_types_limestone_stonecutting.json efd36555c513b761a9d2561091de08bb0c4fa74f data/bits_n_bobs/recipe/limestone_tile_wall.json 4d646d4dfe165c3fa629ba00151be701a03dc685 data/bits_n_bobs/recipe/limestone_tile_wall_from_stone_types_limestone_stonecutting.json +d7c40e68b965c97b18de06b70a7f8b1790ec2fb1 data/bits_n_bobs/recipe/limestone_tiles_from_stone_types_limestone_stonecutting.json 84f9a1828331d74829422b13189a85e56ebcccfd data/bits_n_bobs/recipe/ochrum_from_stone_types_ochrum_stonecutting.json -5b08a739720f2f0245b6248b3b49ea3668ce9dfb data/bits_n_bobs/recipe/ochrum_tiles_from_stone_types_ochrum_stonecutting.json 82f1894f9446e82659aa37173b6667bf82396f81 data/bits_n_bobs/recipe/ochrum_tile_slab.json 20f71ef0dd22bfbfb284d2aa7152e2b7ce3b6483 data/bits_n_bobs/recipe/ochrum_tile_slab_from_stone_types_ochrum_stonecutting.json 7a91e04b957fbfb721abdee9685145b89748626d data/bits_n_bobs/recipe/ochrum_tile_stairs.json 60e21b8fd590e121d52b7ebe3500d192e83eadb2 data/bits_n_bobs/recipe/ochrum_tile_stairs_from_stone_types_ochrum_stonecutting.json f76a93845aff3e2cd70a16dc0ae1e43a20dd2bf8 data/bits_n_bobs/recipe/ochrum_tile_wall.json bda0b8471efdedf280e778689749cef17d60bdfe data/bits_n_bobs/recipe/ochrum_tile_wall_from_stone_types_ochrum_stonecutting.json +5b08a739720f2f0245b6248b3b49ea3668ce9dfb data/bits_n_bobs/recipe/ochrum_tiles_from_stone_types_ochrum_stonecutting.json a975397ec1ec48a94646b34bed09fea248bb28a5 data/bits_n_bobs/recipe/scorchia_from_stone_types_scorchia_stonecutting.json -c27aae647a6aba66ce7a14d00368747b2a13815f data/bits_n_bobs/recipe/scorchia_tiles_from_stone_types_scorchia_stonecutting.json 3fcbb5d62166b7d8cfc81815c045c9c2e28a9913 data/bits_n_bobs/recipe/scorchia_tile_slab.json 201cb5579309cb9087ccaeed128cba85e954f0f0 data/bits_n_bobs/recipe/scorchia_tile_slab_from_stone_types_scorchia_stonecutting.json 205d550b91125eced91f7e5b9bd931259e74744a data/bits_n_bobs/recipe/scorchia_tile_stairs.json 84889e7cdc9171c1272393100b8bb9d4d0c6ca73 data/bits_n_bobs/recipe/scorchia_tile_stairs_from_stone_types_scorchia_stonecutting.json d185037662f912023f0db0b87790edc5c3bd888e data/bits_n_bobs/recipe/scorchia_tile_wall.json 325e4f59395b447bdb180d2ceff3bcad194d28f5 data/bits_n_bobs/recipe/scorchia_tile_wall_from_stone_types_scorchia_stonecutting.json +c27aae647a6aba66ce7a14d00368747b2a13815f data/bits_n_bobs/recipe/scorchia_tiles_from_stone_types_scorchia_stonecutting.json 8ca3c03e2454eca503fb185f4dddb32d96d8a211 data/bits_n_bobs/recipe/scoria_from_stone_types_scoria_stonecutting.json -201f8de4a3b2f1ff3eb7acfa588b13cd9e20c8c7 data/bits_n_bobs/recipe/scoria_tiles_from_stone_types_scoria_stonecutting.json 0dc2f0aefe435fe3ece70fcd0f86569804cfd597 data/bits_n_bobs/recipe/scoria_tile_slab.json a017b9b04f8058d6b3db3ed9bf88b2c08fd17164 data/bits_n_bobs/recipe/scoria_tile_slab_from_stone_types_scoria_stonecutting.json 6e1831e358f2ee4d96c0681e8616e077f900fdd5 data/bits_n_bobs/recipe/scoria_tile_stairs.json 0f7780514f21b4e91194c125bda04c8890209e05 data/bits_n_bobs/recipe/scoria_tile_stairs_from_stone_types_scoria_stonecutting.json 99b2bdc4955792aae1a38877f7df468cf9960aec data/bits_n_bobs/recipe/scoria_tile_wall.json fab512bfcc18bf6fa1f7dfbb3faea9d5719a4ee8 data/bits_n_bobs/recipe/scoria_tile_wall_from_stone_types_scoria_stonecutting.json +201f8de4a3b2f1ff3eb7acfa588b13cd9e20c8c7 data/bits_n_bobs/recipe/scoria_tiles_from_stone_types_scoria_stonecutting.json 63a4172ba0bb8b73630956629965df62f67a521b data/bits_n_bobs/recipe/tuff_from_stone_types_tuff_stonecutting.json -ffea9c61f451fa7f7a144d853717957818066063 data/bits_n_bobs/recipe/tuff_tiles_from_stone_types_tuff_stonecutting.json 79593ad56bb77834a642f28154d76654faa6115e data/bits_n_bobs/recipe/tuff_tile_slab.json 60302796d26755de3cbc7f6ab16388a64c2a97b1 data/bits_n_bobs/recipe/tuff_tile_slab_from_stone_types_tuff_stonecutting.json f942343010a31fd5d0b1dc4403f360d4977b7692 data/bits_n_bobs/recipe/tuff_tile_stairs.json 9e88ed9ee3fbd78c54e9763a8e8494a1d1f57488 data/bits_n_bobs/recipe/tuff_tile_stairs_from_stone_types_tuff_stonecutting.json 903126e5ea24aa397c8a0c68d309eaf4a571e7b5 data/bits_n_bobs/recipe/tuff_tile_wall.json 579816236b545d7a48d14cecb21935e6df0abb6d data/bits_n_bobs/recipe/tuff_tile_wall_from_stone_types_tuff_stonecutting.json +ffea9c61f451fa7f7a144d853717957818066063 data/bits_n_bobs/recipe/tuff_tiles_from_stone_types_tuff_stonecutting.json 71d0b5d460d39ba804522ee4bfaacd73cbe93a81 data/bits_n_bobs/recipe/veridium_from_stone_types_veridium_stonecutting.json -beb46cabc06e627d0db0fdc347ece034ea0fe24b data/bits_n_bobs/recipe/veridium_tiles_from_stone_types_veridium_stonecutting.json fb3402cce9c76866d496108ad6a5f687be055a76 data/bits_n_bobs/recipe/veridium_tile_slab.json e76e46d5de1976b380b83892418c248ce1325a6e data/bits_n_bobs/recipe/veridium_tile_slab_from_stone_types_veridium_stonecutting.json 3f89417ff9a2687be0e17e84e39ce8e55986ec4a data/bits_n_bobs/recipe/veridium_tile_stairs.json 0719e755a62ac361bc174e3bb375a2dead423123 data/bits_n_bobs/recipe/veridium_tile_stairs_from_stone_types_veridium_stonecutting.json 7f74637a2c79300ac2dfb5f2f77607f49bfbf537 data/bits_n_bobs/recipe/veridium_tile_wall.json 795cc0d6cc09c70cc2e983083265e0b5e4ad5e53 data/bits_n_bobs/recipe/veridium_tile_wall_from_stone_types_veridium_stonecutting.json +beb46cabc06e627d0db0fdc347ece034ea0fe24b data/bits_n_bobs/recipe/veridium_tiles_from_stone_types_veridium_stonecutting.json 68f2f6978a33b0088959480ad335ef8c29149eb9 data/bits_n_bobs/tags/block/chairs.json 2f0560ab6864b923d56736dbf89b88d74abeb399 data/bits_n_bobs/tags/block/cogwheel_chain_no_small_offset.json 174446959ea51f74caed5b70a109ef3f49ecea86 data/bits_n_bobs/tags/block/heavy.json 3e3ae82eb78211d2a3ed5e221ae729b534a06220 data/bits_n_bobs/tags/block/light.json 7f3c60eee318d93879ff49da2bed2343a654787b data/bits_n_bobs/tags/block/super_heavy.json 68f2f6978a33b0088959480ad335ef8c29149eb9 data/bits_n_bobs/tags/item/chairs.json +2cb2802b72d43e1df64d640dfba8ff2cc66bc4f8 data/c/tags/entity_type/teleporting_not_supported.json +de30238a3ec01e43241a56c5c283d45aae3597b7 data/c/tags/item/ropes.json 0ebc5af10fcfcff286ab3f6f3a83b07f799248b3 data/create/advancement/recipes/building_blocks/andesite_tile_slab_recycling.json 947370477692a3f8341b4341897d05edfab89a1c data/create/advancement/recipes/building_blocks/asurine_tile_slab_recycling.json 951b60582357bb2e41e21810152fab34e17a919a data/create/advancement/recipes/building_blocks/calcite_tile_slab_recycling.json @@ -1136,8 +1136,6 @@ f02db96ec16a6e2ca46b8b0f86125a7fec3cfbdd data/create/tags/item/stone_types/ochru 8955ab716f47c8aa4d7b315cd28ef13a8baa464b data/create/tags/item/stone_types/scoria.json bed0d6245b47c5fffc58a0c1d98679c1c4bbdc85 data/create/tags/item/stone_types/tuff.json f1f656352662478775cd9db2d1ca8f7aac574145 data/create/tags/item/stone_types/veridium.json -2cb2802b72d43e1df64d640dfba8ff2cc66bc4f8 data/c/tags/entity_type/teleporting_not_supported.json -de30238a3ec01e43241a56c5c283d45aae3597b7 data/c/tags/item/ropes.json 033f75b4c401f8616e1d2b8a61c46886cd9a5bc2 data/minecraft/tags/block/climbable.json 83e51315030256cd957187762e5bd942601affb8 data/minecraft/tags/block/mineable/axe.json 10b17d39b9d5e8f999a7b2861e3ae5393e1c3fdc data/minecraft/tags/block/mineable/pickaxe.json diff --git a/src/generated/resources/assets/bits_n_bobs/lang/en_ud.json b/src/generated/resources/assets/bits_n_bobs/lang/en_ud.json index 04d4b3dc..ef0f1138 100644 --- a/src/generated/resources/assets/bits_n_bobs/lang/en_ud.json +++ b/src/generated/resources/assets/bits_n_bobs/lang/en_ud.json @@ -1,6 +1,4 @@ { - "advancement.bits_n_bobs.cookie_dough": "˙˙˙poo⅁ oS sǝʇsɐ⟘ ʇI ʇnᗺ", - "advancement.bits_n_bobs.cookie_dough.desc": "ɥbnop ǝıʞooɔ ʇɐƎ", "advancement.bits_n_bobs.dye_fluid_component": "¿ǝʎp noʎ pıᗡ", "advancement.bits_n_bobs.dye_fluid_component.desc": "ǝdıd ɹo ʞuɐʇ pınןɟ ɐ ǝʎᗡ", "bits_n_bobs.ponder.chain_cog_changing_axis.header": "suıɐɥɔ ןǝǝɥʍboɔ uo sǝxɐ buıbuɐɥƆ", @@ -204,12 +202,10 @@ "block.bits_n_bobs.yellow_chair": "ɹıɐɥƆ ʍoןןǝʎ", "block.bits_n_bobs.yellow_large_nixie_tube": "ǝqn⟘ ǝıxıN ǝbɹɐꞀ ʍoןןǝʎ", "block.bits_n_bobs.yellow_nixie_board": "pɹɐoᗺ ǝıxıN ʍoןןǝʎ", - "create.gui.assembly.exception.bits_n_bobs.no_chain_to_attach_to": "¡oʇ ɥɔɐʇʇɐ oʇ uıɐɥɔ oN", + "create.gui.assembly.exception.bits_n_bobs.no_chain_to_attach_to": "¡oʇ ɥɔɐʇʇɐ oʇ ǝbuɐɹ uı uıɐɥɔ ןǝǝɥʍboɔ oN", "entity.bits_n_bobs.cogwheel_chain_carriage_contraption": "uoıʇdɐɹʇuoƆ ǝbɐıɹɹɐƆ uıɐɥƆ ןǝǝɥʍboƆ", "entity.bits_n_bobs.inert_stationary_contraption": "uoıʇdɐɹʇuoƆ ʎɹɐuoıʇɐʇS ʇɹǝuI", "generator.bits_n_bobs.ponderous_planes": "ʇɐןɟɹǝpuoԀ", - "item.bits_n_bobs.cookie_dough": "ɥbnoᗡ ǝıʞooƆ", - "item.bits_n_bobs.icon_lightbulb": "qןnqʇɥbıꞀ uoɔI", "item.bits_n_bobs.test_rope": "ǝdoᴚ ʇsǝ⟘", "message.bits_n_bobs.cogwheel_chain.chain_addition_aborted.axis_change_forbidden_by_type": "¡sǝbuɐɥɔ sıxɐ ʍoןןɐ ʇou sǝop ǝdʎʇ uıɐɥɔ sıɥ⟘", "message.bits_n_bobs.cogwheel_chain.chain_addition_aborted.cannot_revisit_node": "¡uıɐɥɔ ǝɥʇ ʇɔǝsɹǝʇuı-ɟןǝs ʇouuɐɔ noʎ", diff --git a/src/generated/resources/assets/bits_n_bobs/lang/en_us.json b/src/generated/resources/assets/bits_n_bobs/lang/en_us.json index d1f5c5cf..3948a338 100644 --- a/src/generated/resources/assets/bits_n_bobs/lang/en_us.json +++ b/src/generated/resources/assets/bits_n_bobs/lang/en_us.json @@ -1,6 +1,4 @@ { - "advancement.bits_n_bobs.cookie_dough": "But It Tastes So Good...", - "advancement.bits_n_bobs.cookie_dough.desc": "Eat cookie dough", "advancement.bits_n_bobs.dye_fluid_component": "Did you dye?", "advancement.bits_n_bobs.dye_fluid_component.desc": "Dye a fluid tank or pipe", "bits_n_bobs.ponder.chain_cog_changing_axis.header": "Changing axes on cogwheel chains", @@ -204,12 +202,10 @@ "block.bits_n_bobs.yellow_chair": "Yellow Chair", "block.bits_n_bobs.yellow_large_nixie_tube": "Yellow Large Nixie Tube", "block.bits_n_bobs.yellow_nixie_board": "Yellow Nixie Board", - "create.gui.assembly.exception.bits_n_bobs.no_chain_to_attach_to": "No chain to attach to!", + "create.gui.assembly.exception.bits_n_bobs.no_chain_to_attach_to": "No cogwheel chain in range to attach to!", "entity.bits_n_bobs.cogwheel_chain_carriage_contraption": "Cogwheel Chain Carriage Contraption", "entity.bits_n_bobs.inert_stationary_contraption": "Inert Stationary Contraption", "generator.bits_n_bobs.ponderous_planes": "Ponderflat", - "item.bits_n_bobs.cookie_dough": "Cookie Dough", - "item.bits_n_bobs.icon_lightbulb": "Icon Lightbulb", "item.bits_n_bobs.test_rope": "Test Rope", "message.bits_n_bobs.cogwheel_chain.chain_addition_aborted.axis_change_forbidden_by_type": "This chain type does not allow axis changes!", "message.bits_n_bobs.cogwheel_chain.chain_addition_aborted.cannot_revisit_node": "You cannot self-intersect the chain!", diff --git a/src/generated/resources/assets/bits_n_bobs/models/item/cookie_dough.json b/src/generated/resources/assets/bits_n_bobs/models/item/cookie_dough.json deleted file mode 100644 index 47cfe95f..00000000 --- a/src/generated/resources/assets/bits_n_bobs/models/item/cookie_dough.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "bits_n_bobs:item/cookie_dough" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/bits_n_bobs/models/item/icon_lightbulb.json b/src/generated/resources/assets/bits_n_bobs/models/item/icon_lightbulb.json deleted file mode 100644 index 8140b1b6..00000000 --- a/src/generated/resources/assets/bits_n_bobs/models/item/icon_lightbulb.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "bits_n_bobs:block/lightbulb/lightbulb_on" -} \ No newline at end of file diff --git a/src/generated/resources/data/bits_n_bobs/advancement/cookie_dough.json b/src/generated/resources/data/bits_n_bobs/advancement/cookie_dough.json deleted file mode 100644 index b5c43d26..00000000 --- a/src/generated/resources/data/bits_n_bobs/advancement/cookie_dough.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "parent": "create:mechanical_mixer", - "criteria": { - "0": { - "trigger": "create:bits_n_bobs_cookie_dough_builtin" - } - }, - "display": { - "announce_to_chat": false, - "description": { - "color": "#DBA213", - "translate": "advancement.bits_n_bobs.cookie_dough.desc" - }, - "icon": { - "count": 1, - "id": "bits_n_bobs:cookie_dough" - }, - "title": { - "translate": "advancement.bits_n_bobs.cookie_dough" - } - }, - "requirements": [ - [ - "0" - ] - ], - "sends_telemetry_event": true -} \ No newline at end of file From b81d41326d0871a96f3a9a326d3f5113ce1226a9 Mon Sep 17 00:00:00 2001 From: cake Date: Mon, 11 May 2026 18:35:29 +0100 Subject: [PATCH 3/4] Fixed ?!??!?!?!something --- ...ogwheelChainCarriageMovingInteraction.java | 11 +- .../behaviour/CogwheelChainBehaviour.java | 9 +- .../CogwheelChainBehaviourRenderer.java | 192 ++++++++++-------- ...ogwheelChainPartialEditDisplayHandler.java | 39 +++- .../cogwheel_chain/graph/CogwheelChain.java | 17 +- .../CogwheelChainPlacementInteraction.java | 11 +- .../mixin/glowing_belts/BeltBlockMixin.java | 33 +-- .../PartialEditCogwheelChainPacket.java | 84 ++++++-- .../from_client/PlaceCogwheelChainPacket.java | 2 +- src/main/resources/bits_n_bobs.mixins.json | 1 + 10 files changed, 243 insertions(+), 156 deletions(-) diff --git a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_carriage/block/CogwheelChainCarriageMovingInteraction.java b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_carriage/block/CogwheelChainCarriageMovingInteraction.java index 6e9d69b2..a53b2057 100644 --- a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_carriage/block/CogwheelChainCarriageMovingInteraction.java +++ b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_carriage/block/CogwheelChainCarriageMovingInteraction.java @@ -2,14 +2,12 @@ import com.kipti.bnb.content.kinetics.cogwheel_carriage.contraption.CogwheelChainCarriageContraptionEntity; import com.kipti.bnb.network.packets.from_client.CogwheelChainCarriageQueueDisassemblyPacket; -import com.simibubi.create.AllItems; import com.simibubi.create.api.behaviour.interaction.MovingInteractionBehaviour; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import net.createmod.catnip.platform.CatnipServices; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; public class CogwheelChainCarriageMovingInteraction extends MovingInteractionBehaviour { @@ -22,13 +20,8 @@ public boolean handlePlayerInteraction(final Player player, return false; } - final ItemStack itemInHand = player.getItemInHand(activeHand); - - if (AllItems.WRENCH.isIn(itemInHand)) { - CatnipServices.NETWORK.sendToServer(new CogwheelChainCarriageQueueDisassemblyPacket(cccce.getId())); - return true; - } - return false; + CatnipServices.NETWORK.sendToServer(new CogwheelChainCarriageQueueDisassemblyPacket(cccce.getId())); + return true; } } diff --git a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/behaviour/CogwheelChainBehaviour.java b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/behaviour/CogwheelChainBehaviour.java index 41c28db7..2c1ca9e4 100644 --- a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/behaviour/CogwheelChainBehaviour.java +++ b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/behaviour/CogwheelChainBehaviour.java @@ -53,7 +53,7 @@ public class CogwheelChainBehaviour extends SuperBlockEntityBehaviour implements public CogwheelChainBehaviour(final SmartBlockEntity be) { super(be); - this.setLazyTickRate(5); + this.setLazyTickRate(20); } @Override @@ -387,7 +387,7 @@ public BehaviourRenderSupplier getRenderer() { @Override public BehaviourVisualFactory getVisualFactory() { return (context, behaviour, blockEntity, parentVisual, partialTick) -> { - if (!(blockEntity instanceof final KineticBlockEntity kineticBlockEntity) || behaviour != this) { + if (!(blockEntity instanceof final KineticBlockEntity kineticBlockEntity)) { return null; } return new CogwheelChainBehaviourVisual(context, kineticBlockEntity, this, parentVisual); @@ -436,8 +436,9 @@ private boolean tryReplaceWithResidualChain(final boolean isCreative) { controllerBehaviour.destroyChain(false, true); - if (!result.chain().checkIntegrity(this.getLevel(), controllerWorldPos)) return false; - result.chain().placeInLevel(this.getLevel(), result.placingChain()); + if (!result.chain().checkIntegrity(this.getLevel(), result.placingChain().getNodes().getFirst().pos())) + return false; + result.chain().placeInLevel(this.getLevel(), result.placingChain(), isCreative); if (!isCreative && costDifference > 0) { final ItemStack drops = existingChain.getReturnedItem().getDefaultInstance().copyWithCount(costDifference); diff --git a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/behaviour/CogwheelChainBehaviourRenderer.java b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/behaviour/CogwheelChainBehaviourRenderer.java index 38dbefc3..b203d270 100644 --- a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/behaviour/CogwheelChainBehaviourRenderer.java +++ b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/behaviour/CogwheelChainBehaviourRenderer.java @@ -16,7 +16,6 @@ import dev.engine_room.flywheel.lib.transform.PoseTransformStack; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.animation.AnimationTickHolder; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; @@ -87,6 +86,92 @@ public void renderSafe(final SuperBlockEntityBehaviour behaviour, } } + + private void renderChain(final KineticBlockEntity be, + final PoseStack ms, + final MultiBufferSource buffer, + final Vec3 preFrom, + final Vec3 from, + final Vec3 to, + final Vec3 postTo, + final Vec3 fromCogwheelAxis, + final Vec3 toCogwheelAxis, + final Function lighter, + final float offset, + final float textureSquish, + final CogwheelChainType type, + final boolean flipInsideOutside) { + final Vec3 diff = to.subtract(from); + final double yaw = Mth.RAD_TO_DEG * Mth.atan2(diff.x, diff.z); + final double pitch = Mth.RAD_TO_DEG * Mth.atan2( + diff.y, diff.multiply(1, 0, 1) + .length() + ); + + final BlockPos tilePos = be.getBlockPos(); + + final Vec3 startOffset = from.subtract(Vec3.atCenterOf(tilePos)); + + ms.pushPose(); + final PoseTransformStack chain = TransformStack.of(ms); + chain.center(); + chain.translate(startOffset); + + final int light1 = lighter.apply(new Vector3f((float) from.x, (float) from.y, (float) from.z)); + final int light2 = lighter.apply(new Vector3f((float) to.x, (float) to.y, (float) to.z)); + + final boolean inShipyardLod = ShipyardHelper.isProbablyInShipyard(BlockPos.containing(from)); + +// final boolean far = !inShipyardLod && (Minecraft.getInstance().level == be.getLevel() && !Minecraft.getInstance() +// .getBlockEntityRenderDispatcher().camera.getPosition() +// .closerThan(from.lerp(to, 0.5), MIP_DISTANCE)); +// final boolean close = inShipyardLod || (Minecraft.getInstance().level == be.getLevel() && Minecraft.getInstance() +// .getBlockEntityRenderDispatcher().camera.getPosition() +// .closerThan(from.lerp(to, 0.5), SEAM_DIST)); + + final boolean far = false; + final boolean close = true; + + if (close) + renderChainSlowerButWithoutGaps( + ms, + buffer, + offset, + textureSquish, + preFrom, + from, + to, + postTo, + fromCogwheelAxis, + toCogwheelAxis, + light1, + light2, + type, + flipInsideOutside + ); + else { + chain.rotateYDegrees((float) yaw); + chain.rotateXDegrees(90 - (float) pitch); + chain.rotateYDegrees(45); + final float overextend = 0.05f; + chain.translate(0, 8 / 16f - overextend / 2f, 0); + chain.uncenter(); + renderChainFastButWithGaps( + ms, + buffer, + offset - overextend / 2f, + textureSquish, + (float) from.distanceTo(to) + overextend, + light1, + light2, + far, + type + ); + } + + ms.popPose(); + } + private static void renderChainSlowerButWithoutGaps(final PoseStack ms, final MultiBufferSource buffer, final float offset, @@ -202,9 +287,9 @@ private static void renderChainFastButWithGaps(final PoseStack ms, if (info.getVertexShape() == CogwheelChainType.VertexShape.CROSS) { final float radius = far ? 1f / 16f : w / 2f; final float minV = far ? 0 : offset * textureSquish; - final float maxV = far ? h : length * textureSquish + minV; - final float crossMinU = far ? w : 0; - final float crossMaxU = far ? w + 1f / 16f : w; + final float maxV = far ? 1 / 16f : length * textureSquish + minV; + final float crossMinU = far ? 3 / 16f : 0; + final float crossMaxU = far ? 4 / 16f : w; final float crossUO = far ? 0 : w; // Two perpendicular cross planes, each double-sided @@ -302,7 +387,23 @@ private static void renderChainFastButWithGaps(final PoseStack ms, light2 ); // Left face - renderQuad(matrix4f, pose, vc, 0, length, -halfW, -halfH, -halfW, halfH, 0, h, minV, maxV, light1, light2); + renderQuad( + matrix4f, + pose, + vc, + 0, + length, + -halfW, + -halfH, + -halfW, + halfH, + 0, + h, + minV, + maxV, + light1, + light2 + ); // Bottom face renderQuad( matrix4f, @@ -382,85 +483,4 @@ private static void addVertex(final Matrix4f pPose, .setNormal(pNormal, 0.0F, 1.0F, 0.0F); } - private void renderChain(final KineticBlockEntity be, - final PoseStack ms, - final MultiBufferSource buffer, - final Vec3 preFrom, - final Vec3 from, - final Vec3 to, - final Vec3 postTo, - final Vec3 fromCogwheelAxis, - final Vec3 toCogwheelAxis, - final Function lighter, - final float offset, - final float textureSquish, - final CogwheelChainType type, - final boolean flipInsideOutside) { - final Vec3 diff = to.subtract(from); - final double yaw = Mth.RAD_TO_DEG * Mth.atan2(diff.x, diff.z); - final double pitch = Mth.RAD_TO_DEG * Mth.atan2( - diff.y, diff.multiply(1, 0, 1) - .length() - ); - - final BlockPos tilePos = be.getBlockPos(); - - final Vec3 startOffset = from.subtract(Vec3.atCenterOf(tilePos)); - - ms.pushPose(); - final PoseTransformStack chain = TransformStack.of(ms); - chain.center(); - chain.translate(startOffset); - - final int light1 = lighter.apply(new Vector3f((float) from.x, (float) from.y, (float) from.z)); - final int light2 = lighter.apply(new Vector3f((float) to.x, (float) to.y, (float) to.z)); - - final boolean inShipyardLod = ShipyardHelper.isProbablyInShipyard(BlockPos.containing(from)); - - final boolean far = !inShipyardLod && (Minecraft.getInstance().level == be.getLevel() && !Minecraft.getInstance() - .getBlockEntityRenderDispatcher().camera.getPosition() - .closerThan(from.lerp(to, 0.5), MIP_DISTANCE)); - final boolean close = inShipyardLod || (Minecraft.getInstance().level == be.getLevel() && Minecraft.getInstance() - .getBlockEntityRenderDispatcher().camera.getPosition() - .closerThan(from.lerp(to, 0.5), SEAM_DIST)); - - if (close) - renderChainSlowerButWithoutGaps( - ms, - buffer, - offset, - textureSquish, - preFrom, - from, - to, - postTo, - fromCogwheelAxis, - toCogwheelAxis, - light1, - light2, - type, - flipInsideOutside - ); - else { - chain.rotateYDegrees((float) yaw); - chain.rotateXDegrees(90 - (float) pitch); - chain.rotateYDegrees(45); - final float overextend = 0.05f; - chain.translate(0, 8 / 16f - overextend / 2f, 0); - chain.uncenter(); - renderChainFastButWithGaps( - ms, - buffer, - offset - overextend / 2f, - textureSquish, - (float) from.distanceTo(to) + overextend, - light1, - light2, - far, - type - ); - } - - ms.popPose(); - } } diff --git a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/edit/CogwheelChainPartialEditDisplayHandler.java b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/edit/CogwheelChainPartialEditDisplayHandler.java index a6ad3570..1e2b0ab7 100644 --- a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/edit/CogwheelChainPartialEditDisplayHandler.java +++ b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/edit/CogwheelChainPartialEditDisplayHandler.java @@ -15,6 +15,7 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; @@ -31,7 +32,8 @@ import net.neoforged.neoforge.client.event.ClientTickEvent; import org.jetbrains.annotations.Nullable; -import static com.kipti.bnb.content.kinetics.cogwheel_chain.placement.ChainDriveDisplayRenderer.*; +import static com.kipti.bnb.content.kinetics.cogwheel_chain.placement.ChainDriveDisplayRenderer.INVALID_COLOUR; +import static com.kipti.bnb.content.kinetics.cogwheel_chain.placement.ChainDriveDisplayRenderer.VALID_COLOUR; /** * Client-side display handler for cogwheel chain partial edit previews. @@ -91,6 +93,7 @@ private static void tick(final LocalPlayer player) { } if (insertionPlan != null) { + player.displayClientMessage(Component.empty(), true); renderValidPlacement(level, placement, insertionPlan); renderCostOverlay(player, editContext, insertionPlan); return; @@ -103,9 +106,15 @@ private static void tick(final LocalPlayer player) { } private static void renderValidPlacement(final ClientLevel level, - final ProposedPlacement placement, - final CogwheelChainPartialEditInsertionPlan insertionPlan) { - ChainDriveDisplayRenderer.renderBlockOutline(level, placement.pos(), placement.placementState(), VALID_COLOUR, "partial_edit_preview"); + final ProposedPlacement placement, + final CogwheelChainPartialEditInsertionPlan insertionPlan) { + ChainDriveDisplayRenderer.renderBlockOutline( + level, + placement.pos(), + placement.placementState(), + VALID_COLOUR, + "partial_edit_preview" + ); final int[] displaySides = ChainPlacementPathDisplayHelper.getPathDisplaySides(insertionPlan.rebuiltChain()); ChainDriveDisplayRenderer.renderConnectionSegment( @@ -129,9 +138,15 @@ private static void renderValidPlacement(final ClientLevel level, } private static void renderInvalidPlacement(final ClientLevel level, - final CogwheelChainPartialEditContext editContext, - final ProposedPlacement placement) { - ChainDriveDisplayRenderer.renderBlockOutline(level, placement.pos(), placement.placementState(), INVALID_COLOUR, "partial_edit_preview"); + final CogwheelChainPartialEditContext editContext, + final ProposedPlacement placement) { + ChainDriveDisplayRenderer.renderBlockOutline( + level, + placement.pos(), + placement.placementState(), + INVALID_COLOUR, + "partial_edit_preview" + ); final Vec3 startCenter = editContext.startNode().center(); final Vec3 proposedCenter = placement.pos().getCenter(); @@ -175,8 +190,10 @@ private static void renderInvalidPlacement(final ClientLevel level, axis, baseCandidate.isLarge(), baseCandidate.hasSmallCogwheelOffset()); final BlockPlaceContext placeContext = new BlockPlaceContext( - new UseOnContext(level, player, InteractionHand.MAIN_HAND, heldCogwheel, - new BlockHitResult(Vec3.atCenterOf(placementPos), blockHit.getDirection(), placementPos, false))); + new UseOnContext( + level, player, InteractionHand.MAIN_HAND, heldCogwheel, + new BlockHitResult(Vec3.atCenterOf(placementPos), blockHit.getDirection(), placementPos, false) + )); final BlockState placementState = cogwheelBlock.getStateForPlacement(placeContext); if (placementState == null) return null; @@ -184,8 +201,8 @@ private static void renderInvalidPlacement(final ClientLevel level, } private static void renderCostOverlay(final LocalPlayer player, - final CogwheelChainPartialEditContext editContext, - final CogwheelChainPartialEditInsertionPlan insertionPlan) { + final CogwheelChainPartialEditContext editContext, + final CogwheelChainPartialEditInsertionPlan insertionPlan) { if (player.hasInfiniteMaterials() || insertionPlan.costDelta() == 0) { return; } diff --git a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/graph/CogwheelChain.java b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/graph/CogwheelChain.java index 9cafadcd..cb131cfb 100644 --- a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/graph/CogwheelChain.java +++ b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/graph/CogwheelChain.java @@ -9,6 +9,7 @@ import com.kipti.bnb.registry.core.BnbRegistries; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.core.particles.BlockParticleOption; @@ -24,6 +25,7 @@ import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; @@ -116,6 +118,7 @@ public boolean checkIntegrity(final Level level, final BlockPos origin) { if (!level.isLoaded(pos)) continue; //Skip checks if unloaded final BlockState state = level.getBlockState(pos); final CogwheelChainCandidate candidate = CogwheelChainCandidate.getForBlock(state); + Outliner.getInstance().showAABB("cogwheel_chain_integrity" + pos.hashCode(), new AABB(pos)); if (candidate == null || !candidate.isConsistentWithNode(node)) { return false; } @@ -158,7 +161,7 @@ public boolean equals(final Object o) { && Objects.equals(this.returnedItem, that.returnedItem); } - public void placeInLevel(final Level level, final PlacingCogwheelChain source) { + public void placeInLevel(final Level level, final PlacingCogwheelChain source, final boolean isCreative) { final BlockPos controllerPos = source.getFirstNode().pos(); final int chainsUsed = source.getChainsRequiredInLoop(this.type); @@ -170,16 +173,13 @@ public void placeInLevel(final Level level, final PlacingCogwheelChain source) { boolean isController = true; for (final PlacingCogwheelNode node : source.getVisitedNodes()) { - this.placeChainCogwheelInLevel(level, node, isController, chainsUsed, controllerPos); + this.placeChainCogwheelInLevel(level, node, isController, chainsUsed, controllerPos, isCreative); isController = false; } final BlockEntity be = level.getBlockEntity(controllerPos); if (be instanceof final KineticBlockEntity kbe) { kbe.updateSpeed = true; - } else { - throw new IllegalStateException( - "Expected a kinetic block entity at the controller position when placing a cogwheel chain, but found none! Position: " + controllerPos); } } @@ -187,13 +187,18 @@ private void placeChainCogwheelInLevel(final Level level, final PlacingCogwheelNode node, final boolean isController, final int chainsUsed, - final BlockPos controllerPos) { + final BlockPos controllerPos, + final boolean isCreative) { final CogwheelChainBehaviour behaviour = SuperBlockEntityBehaviour.getOrThrow( level, node.pos(), CogwheelChainBehaviour.TYPE ); + if (behaviour.isPartOfChain()) { + behaviour.destroyChain(isCreative, true); + } + if (isController) { behaviour.setAsController(this); behaviour.setChainsUsed(chainsUsed); diff --git a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/placement/CogwheelChainPlacementInteraction.java b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/placement/CogwheelChainPlacementInteraction.java index 41679ada..58987b4f 100644 --- a/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/placement/CogwheelChainPlacementInteraction.java +++ b/src/main/java/com/kipti/bnb/content/kinetics/cogwheel_chain/placement/CogwheelChainPlacementInteraction.java @@ -18,7 +18,6 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -63,10 +62,10 @@ public class CogwheelChainPlacementInteraction { return currentChainItemType; } - public static void setPlacingChain(PlacingCogwheelChain buildingChain, - ResourceKey chainLevel, - CogwheelChainType chainType, - Item chainItemType) { + public static void setPlacingChain(final PlacingCogwheelChain buildingChain, + final ResourceKey chainLevel, + final CogwheelChainType chainType, + final Item chainItemType) { currentBuildingChain = buildingChain; currentChainLevel = chainLevel; currentChainType = chainType; @@ -189,8 +188,6 @@ private static void rightClickForChain(final InputEvent.InteractionKeyMappingTri heldChainType, chainItemInHand.getItem() ); - - player.displayClientMessage(Component.translatable("tooltip.bits_n_bobs.chain_drive_placing_hint"), true); } else { if (currentBuildingChain.getLastNode().pos().equals(hitPos)) { currentBuildingChain.getNodes().removeLast(); diff --git a/src/main/java/com/kipti/bnb/mixin/glowing_belts/BeltBlockMixin.java b/src/main/java/com/kipti/bnb/mixin/glowing_belts/BeltBlockMixin.java index df42d99f..5627f37d 100644 --- a/src/main/java/com/kipti/bnb/mixin/glowing_belts/BeltBlockMixin.java +++ b/src/main/java/com/kipti/bnb/mixin/glowing_belts/BeltBlockMixin.java @@ -27,6 +27,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +//TODO: remove, this feature is just shit @Mixin(BeltBlock.class) public class BeltBlockMixin extends HorizontalKineticBlock implements IBE { @@ -35,14 +36,16 @@ public BeltBlockMixin(final Properties properties) { } @Inject(method = "createBlockStateDefinition", at = @At("TAIL")) - private void bits_n_bobs$createBlockStateDefinitionWithGlowingProperty(final StateDefinition.Builder builder, final CallbackInfo ci) { + private void bits_n_bobs$createBlockStateDefinitionWithGlowingProperty(final StateDefinition.Builder builder, + final CallbackInfo ci) { builder.add(BnbCreateBlockEdits.GLOWING); } @Inject(method = "", at = @At("TAIL")) - private void bits_n_bobs$constructorWithDefaultGlowing(final BlockBehaviour.Properties properties, final CallbackInfo ci) { - registerDefaultState( - defaultBlockState() + private void bits_n_bobs$constructorWithDefaultGlowing(final BlockBehaviour.Properties properties, + final CallbackInfo ci) { + this.registerDefaultState( + this.defaultBlockState() .setValue(BnbCreateBlockEdits.GLOWING, false) ); } @@ -66,14 +69,20 @@ public BeltBlockMixin(final Properties properties) { final boolean stateIsGlowing = state.getValue(BnbCreateBlockEdits.GLOWING); if (!stateIsGlowing) - withBlockEntityDo(level, pos, be -> { - for (final BlockPos blockPos : BeltBlock.getBeltChain(level, be.getController())) { - final BeltBlockEntity belt = BeltHelper.getSegmentBE(level, blockPos); - if (belt == null) - continue; - level.setBlock(blockPos, level.getBlockState(blockPos).setValue(BnbCreateBlockEdits.GLOWING, true), Block.UPDATE_ALL | Block.UPDATE_MOVE_BY_PISTON); - } - }); + this.withBlockEntityDo( + level, pos, be -> { + for (final BlockPos blockPos : BeltBlock.getBeltChain(level, be.getController())) { + final BeltBlockEntity belt = BeltHelper.getSegmentBE(level, blockPos); + if (belt == null) + continue; + level.setBlock( + blockPos, + level.getBlockState(blockPos).setValue(BnbCreateBlockEdits.GLOWING, true), + Block.UPDATE_ALL | Block.UPDATE_MOVE_BY_PISTON + ); + } + } + ); cir.setReturnValue(ItemInteractionResult.SUCCESS); } diff --git a/src/main/java/com/kipti/bnb/network/packets/from_client/PartialEditCogwheelChainPacket.java b/src/main/java/com/kipti/bnb/network/packets/from_client/PartialEditCogwheelChainPacket.java index 6b379716..8aa046f6 100644 --- a/src/main/java/com/kipti/bnb/network/packets/from_client/PartialEditCogwheelChainPacket.java +++ b/src/main/java/com/kipti/bnb/network/packets/from_client/PartialEditCogwheelChainPacket.java @@ -6,11 +6,7 @@ import com.kipti.bnb.content.kinetics.cogwheel_chain.edit.CogwheelChainPartialEditContext; import com.kipti.bnb.content.kinetics.cogwheel_chain.edit.CogwheelChainPartialEditInsertionPlan; import com.kipti.bnb.content.kinetics.cogwheel_chain.edit.CogwheelChainPartialEditInsertionPlanner; -import com.kipti.bnb.content.kinetics.cogwheel_chain.graph.CogwheelChain; -import com.kipti.bnb.content.kinetics.cogwheel_chain.graph.CogwheelChainPathfinder; -import com.kipti.bnb.content.kinetics.cogwheel_chain.graph.PathedCogwheelNode; -import com.kipti.bnb.content.kinetics.cogwheel_chain.graph.PlacingCogwheelChain; -import com.kipti.bnb.content.kinetics.cogwheel_chain.graph.PlacingCogwheelNode; +import com.kipti.bnb.content.kinetics.cogwheel_chain.graph.*; import com.kipti.bnb.content.kinetics.cogwheel_chain.placement.ChainInteractionFailedException; import com.kipti.bnb.content.kinetics.cogwheel_chain.segment.CogwheelChainSegment; import com.kipti.bnb.content.kinetics.cogwheel_chain.types.CogwheelChainType; @@ -96,13 +92,25 @@ public record PartialEditCogwheelChainPacket( @Override public void handle(final ServerPlayer player) { - if (player.distanceToSqr(this.controllerPos.getX() + 0.5, this.controllerPos.getY() + 0.5, this.controllerPos.getZ() + 0.5) > PlacingCogwheelChain.MAX_CHAIN_INTERACTION_DISTANCE_SQ) + if (player.distanceToSqr( + this.controllerPos.getX() + 0.5, + this.controllerPos.getY() + 0.5, + this.controllerPos.getZ() + 0.5 + ) > PlacingCogwheelChain.MAX_CHAIN_INTERACTION_DISTANCE_SQ) return; - if (player.distanceToSqr(this.newCogwheelPos.getX() + 0.5, this.newCogwheelPos.getY() + 0.5, this.newCogwheelPos.getZ() + 0.5) > 100) + if (player.distanceToSqr( + this.newCogwheelPos.getX() + 0.5, + this.newCogwheelPos.getY() + 0.5, + this.newCogwheelPos.getZ() + 0.5 + ) > 100) return; final Level level = player.level(); - final CogwheelChainBehaviour behaviour = SuperBlockEntityBehaviour.get(level, this.controllerPos, CogwheelChainBehaviour.TYPE); + final CogwheelChainBehaviour behaviour = SuperBlockEntityBehaviour.get( + level, + this.controllerPos, + CogwheelChainBehaviour.TYPE + ); if (behaviour == null || !behaviour.isController()) return; @@ -110,7 +118,10 @@ public void handle(final ServerPlayer player) { if (existingChain == null || existingChain.getReturnedItem() != this.chainItemType.value()) return; - final InteractionHand interactionHand = InteractionHand.values()[Math.min(this.hand, InteractionHand.values().length - 1)]; + final InteractionHand interactionHand = InteractionHand.values()[Math.min( + this.hand, + InteractionHand.values().length - 1 + )]; final ItemStack heldStack = player.getItemInHand(interactionHand); if (!(heldStack.getItem() instanceof final BlockItem blockItem)) return; @@ -119,7 +130,13 @@ public void handle(final ServerPlayer player) { if (!originalState.canBeReplaced()) return; - final BlockState placementState = this.resolvePlacementState(level, player, interactionHand, heldStack, blockItem); + final BlockState placementState = this.resolvePlacementState( + level, + player, + interactionHand, + heldStack, + blockItem + ); if (placementState == null) return; @@ -155,26 +172,47 @@ public void handle(final ServerPlayer player) { } final int addedCost = insertionPlan.addedCost(); - if (!player.hasInfiniteMaterials() && !this.tryConsumeChains(player, existingChain.getReturnedItem(), addedCost)) { + if (!player.hasInfiniteMaterials() && !this.tryConsumeChains( + player, + existingChain.getReturnedItem(), + addedCost + )) { level.setBlock(this.newCogwheelPos, originalState, Block.UPDATE_ALL); return; } - final PlacingCogwheelChain existingWorldChain = CogwheelChainPartialEditInsertionPlanner.toWorldChain(existingChain, this.controllerPos); + final PlacingCogwheelChain existingWorldChain = CogwheelChainPartialEditInsertionPlanner.toWorldChain( + existingChain, + this.controllerPos + ); final CogwheelChain rebuiltCogwheelChain = new CogwheelChain( chainGeometry, existingChain.getChainType(), existingChain.getReturnedItem() ); + final boolean isCreative = player.hasInfiniteMaterials(); + try { - this.replaceChain(level, behaviour, rebuiltCogwheelChain, rebuiltChain, existingChain, existingWorldChain); + this.replaceChain( + level, + behaviour, + rebuiltCogwheelChain, + rebuiltChain, + existingChain, + existingWorldChain, + isCreative + ); } catch (final RuntimeException exception) { level.setBlock(this.newCogwheelPos, originalState, Block.UPDATE_ALL); if (!player.hasInfiniteMaterials()) { this.refundChains(player, existingChain.getReturnedItem(), addedCost); } - CreateBitsnBobs.LOGGER.error("Failed to apply partial cogwheel-chain edit at {}", this.controllerPos, exception); + CreateBitsnBobs.LOGGER.error( + "Failed to apply partial cogwheel-chain edit at {}", + this.controllerPos, + exception + ); return; } @@ -268,25 +306,31 @@ private void replaceChain(final Level level, final CogwheelChain rebuiltCogwheelChain, final PlacingCogwheelChain rebuiltChain, final CogwheelChain existingChain, - final PlacingCogwheelChain existingWorldChain) { + final PlacingCogwheelChain existingWorldChain, + final boolean isCreative) { behaviour.clearStoredChains(); behaviour.destroyChain(false, false); try { - rebuiltCogwheelChain.placeInLevel(level, rebuiltChain); + rebuiltCogwheelChain.placeInLevel(level, rebuiltChain, isCreative); } catch (final RuntimeException exception) { - this.restoreChain(level, existingChain, existingWorldChain); + this.restoreChain(level, existingChain, existingWorldChain, isCreative); throw exception; } } private void restoreChain(final Level level, final CogwheelChain existingChain, - final PlacingCogwheelChain existingWorldChain) { + final PlacingCogwheelChain existingWorldChain, + final boolean isCreative) { try { - existingChain.placeInLevel(level, existingWorldChain); + existingChain.placeInLevel(level, existingWorldChain, isCreative); } catch (final RuntimeException restoreException) { - CreateBitsnBobs.LOGGER.error("Failed to restore cogwheel chain after partial edit failure at {}", this.controllerPos, restoreException); + CreateBitsnBobs.LOGGER.error( + "Failed to restore cogwheel chain after partial edit failure at {}", + this.controllerPos, + restoreException + ); } } diff --git a/src/main/java/com/kipti/bnb/network/packets/from_client/PlaceCogwheelChainPacket.java b/src/main/java/com/kipti/bnb/network/packets/from_client/PlaceCogwheelChainPacket.java index 8069d037..1829adcf 100644 --- a/src/main/java/com/kipti/bnb/network/packets/from_client/PlaceCogwheelChainPacket.java +++ b/src/main/java/com/kipti/bnb/network/packets/from_client/PlaceCogwheelChainPacket.java @@ -78,7 +78,7 @@ public void handle(final ServerPlayer player) { final CogwheelChain chain = new CogwheelChain(chainGeometry, this.chainType, this.chainItemType.value()); - chain.placeInLevel(player.level(), this.worldSpacePartialChain); + chain.placeInLevel(player.level(), this.worldSpacePartialChain, player.isCreative()); } @Override diff --git a/src/main/resources/bits_n_bobs.mixins.json b/src/main/resources/bits_n_bobs.mixins.json index a4ee25a4..88092af6 100644 --- a/src/main/resources/bits_n_bobs.mixins.json +++ b/src/main/resources/bits_n_bobs.mixins.json @@ -18,6 +18,7 @@ "ServerGamePacketListenerImplAccessor", "dyeable.fluid_tank.ConnectivityHandlerMixin", "dyeable.fluid_tank.FluidTankItemMixin", + "dyeable.fluid_tank.FluidTankRendererMixin", "dyeable.pipes.AxisPipeBlockTransitionMixin", "dyeable.pipes.EncasedPipeBlockTransitionMixin", "dyeable.pipes.FluidPipeBlockMixin", From b3e11531e308ab2ca88ed40cf98bf4ed956d268d Mon Sep 17 00:00:00 2001 From: cake Date: Tue, 12 May 2026 19:37:44 +0100 Subject: [PATCH 4/4] Fixes to pipes stuff --- ...industrial_grating_panel_encased_pipe.json | 264 ----------------- ...ndustrial_grating_panel_encased_shaft.json | 264 ----------------- .../assets/bits_n_bobs/lang/en_ud.json | 4 +- .../assets/bits_n_bobs/lang/en_us.json | 4 +- .../models/item/industrial_truss.json | 4 +- ...industrial_grating_panel_encased_pipe.json | 36 --- ...ndustrial_grating_panel_encased_shaft.json | 36 --- .../tags/block/mineable/pickaxe.json | 2 - .../dyeable/pipes/DyeablePipeBehaviour.java | 11 - .../dyeable/tanks/DyeableTankBehaviour.java | 58 ++-- .../decoration/dyeable/tanks/GayDye.java | 6 + .../grating/GratingBlockStateGen.java | 241 ++++++++------- .../grating/GratingEncasedShaftBlock.java | 200 ------------- .../decoration/grating/GratingPanelBlock.java | 101 ------- .../grating/GratingPanelBlockItem.java | 47 --- .../grating/GratingPipePanelBlock.java | 277 ------------------ .../decoration/shroud/ShroudedBehaviour.java | 152 ++++++++++ .../decoration/truss/TrussBlockStateGen.java | 112 +------ .../truss/TrussEncasedShaftBlock.java | 127 -------- .../decoration/truss/TrussPipeBlock.java | 209 ------------- .../bnb/registry/client/BnbPartialModels.java | 6 +- .../registry/content/BnbBlockEntities.java | 20 +- .../blocks/deco/BnbDecorativeBlocks.java | 30 +- .../encased/BnbSpecialEncasedBlocks.java | 71 ----- .../bnb/registry/core/BnbFeatureFlag.java | 12 +- 25 files changed, 328 insertions(+), 1966 deletions(-) delete mode 100644 src/generated/resources/assets/bits_n_bobs/blockstates/industrial_grating_panel_encased_pipe.json delete mode 100644 src/generated/resources/assets/bits_n_bobs/blockstates/industrial_grating_panel_encased_shaft.json delete mode 100644 src/generated/resources/data/bits_n_bobs/loot_table/blocks/industrial_grating_panel_encased_pipe.json delete mode 100644 src/generated/resources/data/bits_n_bobs/loot_table/blocks/industrial_grating_panel_encased_shaft.json delete mode 100644 src/main/java/com/kipti/bnb/content/decoration/grating/GratingEncasedShaftBlock.java delete mode 100644 src/main/java/com/kipti/bnb/content/decoration/grating/GratingPipePanelBlock.java create mode 100644 src/main/java/com/kipti/bnb/content/decoration/shroud/ShroudedBehaviour.java delete mode 100644 src/main/java/com/kipti/bnb/content/decoration/truss/TrussEncasedShaftBlock.java delete mode 100644 src/main/java/com/kipti/bnb/content/decoration/truss/TrussPipeBlock.java diff --git a/src/generated/resources/assets/bits_n_bobs/blockstates/industrial_grating_panel_encased_pipe.json b/src/generated/resources/assets/bits_n_bobs/blockstates/industrial_grating_panel_encased_pipe.json deleted file mode 100644 index 75f37474..00000000 --- a/src/generated/resources/assets/bits_n_bobs/blockstates/industrial_grating_panel_encased_pipe.json +++ /dev/null @@ -1,264 +0,0 @@ -{ - "multipart": [ - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side", - "x": 180 - }, - "when": { - "down": "false", - "facing": "down" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_pipe_cutout", - "x": 180 - }, - "when": { - "down": "true", - "facing": "down" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_pipe_cutout", - "uvlock": true, - "x": 180 - }, - "when": { - "down": "true", - "facing": "down" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true, - "x": 180 - }, - "when": { - "down": "false", - "facing": "down" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side" - }, - "when": { - "facing": "up", - "up": "false" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_pipe_cutout" - }, - "when": { - "facing": "up", - "up": "true" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_pipe_cutout", - "uvlock": true - }, - "when": { - "facing": "up", - "up": "true" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true - }, - "when": { - "facing": "up", - "up": "false" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side", - "x": 90 - }, - "when": { - "facing": "north", - "north": "false" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_pipe_cutout", - "x": 90 - }, - "when": { - "facing": "north", - "north": "true" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_pipe_cutout", - "uvlock": true, - "x": 90 - }, - "when": { - "facing": "north", - "north": "true" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true, - "x": 90 - }, - "when": { - "facing": "north", - "north": "false" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side", - "x": 90, - "y": 180 - }, - "when": { - "facing": "south", - "south": "false" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_pipe_cutout", - "x": 90, - "y": 180 - }, - "when": { - "facing": "south", - "south": "true" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_pipe_cutout", - "uvlock": true, - "x": 90, - "y": 180 - }, - "when": { - "facing": "south", - "south": "true" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true, - "x": 90, - "y": 180 - }, - "when": { - "facing": "south", - "south": "false" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side", - "x": 90, - "y": 270 - }, - "when": { - "facing": "west", - "west": "false" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_pipe_cutout", - "x": 90, - "y": 270 - }, - "when": { - "facing": "west", - "west": "true" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_pipe_cutout", - "uvlock": true, - "x": 90, - "y": 270 - }, - "when": { - "facing": "west", - "west": "true" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true, - "x": 90, - "y": 270 - }, - "when": { - "facing": "west", - "west": "false" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side", - "x": 90, - "y": 90 - }, - "when": { - "east": "false", - "facing": "east" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_pipe_cutout", - "x": 90, - "y": 90 - }, - "when": { - "east": "true", - "facing": "east" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_pipe_cutout", - "uvlock": true, - "x": 90, - "y": 90 - }, - "when": { - "east": "true", - "facing": "east" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true, - "x": 90, - "y": 90 - }, - "when": { - "east": "false", - "facing": "east" - } - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/bits_n_bobs/blockstates/industrial_grating_panel_encased_shaft.json b/src/generated/resources/assets/bits_n_bobs/blockstates/industrial_grating_panel_encased_shaft.json deleted file mode 100644 index 02057759..00000000 --- a/src/generated/resources/assets/bits_n_bobs/blockstates/industrial_grating_panel_encased_shaft.json +++ /dev/null @@ -1,264 +0,0 @@ -{ - "multipart": [ - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side", - "x": 180 - }, - "when": { - "axis": "x|z", - "facing": "down" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_cutout", - "x": 180 - }, - "when": { - "axis": "y", - "facing": "down" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true, - "x": 180 - }, - "when": { - "axis": "x|z", - "facing": "down" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_cutout", - "uvlock": true, - "x": 180 - }, - "when": { - "axis": "y", - "facing": "down" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side" - }, - "when": { - "axis": "x|z", - "facing": "up" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_cutout" - }, - "when": { - "axis": "y", - "facing": "up" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true - }, - "when": { - "axis": "x|z", - "facing": "up" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_cutout", - "uvlock": true - }, - "when": { - "axis": "y", - "facing": "up" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side", - "x": 90 - }, - "when": { - "axis": "x|y", - "facing": "north" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_cutout", - "x": 90 - }, - "when": { - "axis": "z", - "facing": "north" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true, - "x": 90 - }, - "when": { - "axis": "x|y", - "facing": "north" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_cutout", - "uvlock": true, - "x": 90 - }, - "when": { - "axis": "z", - "facing": "north" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side", - "x": 90, - "y": 180 - }, - "when": { - "axis": "x|y", - "facing": "south" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_cutout", - "x": 90, - "y": 180 - }, - "when": { - "axis": "z", - "facing": "south" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true, - "x": 90, - "y": 180 - }, - "when": { - "axis": "x|y", - "facing": "south" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_cutout", - "uvlock": true, - "x": 90, - "y": 180 - }, - "when": { - "axis": "z", - "facing": "south" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side", - "x": 90, - "y": 270 - }, - "when": { - "axis": "y|z", - "facing": "west" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_cutout", - "x": 90, - "y": 270 - }, - "when": { - "axis": "x", - "facing": "west" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true, - "x": 90, - "y": 270 - }, - "when": { - "axis": "y|z", - "facing": "west" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_cutout", - "uvlock": true, - "x": 90, - "y": 270 - }, - "when": { - "axis": "x", - "facing": "west" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side", - "x": 90, - "y": 90 - }, - "when": { - "axis": "y|z", - "facing": "east" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_side_cutout", - "x": 90, - "y": 90 - }, - "when": { - "axis": "x", - "facing": "east" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel", - "uvlock": true, - "x": 90, - "y": 90 - }, - "when": { - "axis": "y|z", - "facing": "east" - } - }, - { - "apply": { - "model": "bits_n_bobs:block/industrial_grating/panel_cutout", - "uvlock": true, - "x": 90, - "y": 90 - }, - "when": { - "axis": "x", - "facing": "east" - } - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/bits_n_bobs/lang/en_ud.json b/src/generated/resources/assets/bits_n_bobs/lang/en_ud.json index ef0f1138..0bf4df8a 100644 --- a/src/generated/resources/assets/bits_n_bobs/lang/en_ud.json +++ b/src/generated/resources/assets/bits_n_bobs/lang/en_ud.json @@ -117,8 +117,7 @@ "block.bits_n_bobs.headlamp.tooltip.summary": "¡ooʇ ǝbɐubıs ʎɔuɐɟ ɹo suıɐɹʇ ɹoɟ ןnɟǝs∩ ˙‾ʞɔoןq ǝɯɐs uı sǝɯıʇ ǝןdıʇןnɯ‾ pǝɔɐןd puɐ pǝʎp ǝq uɐƆ", "block.bits_n_bobs.industrial_grating": "buıʇɐɹ⅁ ןɐıɹʇsnpuI", "block.bits_n_bobs.industrial_grating_panel": "ןǝuɐԀ buıʇɐɹ⅁ ןɐıɹʇsnpuI", - "block.bits_n_bobs.industrial_grating_panel_encased_pipe": "ǝdıԀ pǝsɐɔuƎ ןǝuɐԀ buıʇɐɹ⅁ ןɐıɹʇsnpuI", - "block.bits_n_bobs.industrial_grating_panel_encased_shaft": "ʇɟɐɥS pǝsɐɔuƎ ןǝuɐԀ buıʇɐɹ⅁ ןɐıɹʇsnpuI", + "block.bits_n_bobs.industrial_grating_panel.tooltip.summary": "pǝunʇʇɐ ʎɐʇs os sʇɟɐɥs puɐ sǝdıd ǝsɐɔuǝ oʇ ɟɟnʇs buıssıɯ ɥɥn sı ǝuo sıɥ⟘", "block.bits_n_bobs.industrial_iron_encased_cogwheel": "ןǝǝɥʍboƆ pǝsɐɔuƎ uoɹI ןɐıɹʇsnpuI", "block.bits_n_bobs.industrial_iron_encased_flanged_cogwheel": "ןǝǝɥʍboƆ pǝbuɐןℲ pǝsɐɔuƎ uoɹI ןɐıɹʇsnpuI", "block.bits_n_bobs.industrial_iron_encased_large_cogwheel": "ןǝǝɥʍboƆ ǝbɹɐꞀ pǝsɐɔuƎ uoɹI ןɐıɹʇsnpuI", @@ -126,6 +125,7 @@ "block.bits_n_bobs.industrial_iron_encased_piston_extension_pole": "ǝןoԀ uoısuǝʇxƎ uoʇsıԀ pǝsɐɔuƎ uoɹI ןɐıɹʇsnpuI", "block.bits_n_bobs.industrial_iron_encased_shaft": "ʇɟɐɥS pǝsɐɔuƎ uoɹI ןɐıɹʇsnpuI", "block.bits_n_bobs.industrial_truss": "ssnɹ⟘ ןɐıɹʇsnpuI", + "block.bits_n_bobs.industrial_truss.tooltip.summary": "pǝunʇʇɐ ʎɐʇs os sʇɟɐɥs puɐ sǝdıd ǝsɐɔuǝ oʇ ɟɟnʇs buıssıɯ ɥɥn sı ǝuo sıɥ⟘", "block.bits_n_bobs.large_flanged_cogwheel": "ןǝǝɥʍboƆ pǝbuɐןℲ ǝbɹɐꞀ", "block.bits_n_bobs.large_nixie_tube": "ǝqn⟘ ǝıxıN ǝbɹɐꞀ", "block.bits_n_bobs.light_blue_chair": "ɹıɐɥƆ ǝnןᗺ ʇɥbıꞀ", diff --git a/src/generated/resources/assets/bits_n_bobs/lang/en_us.json b/src/generated/resources/assets/bits_n_bobs/lang/en_us.json index 3948a338..ab4f5898 100644 --- a/src/generated/resources/assets/bits_n_bobs/lang/en_us.json +++ b/src/generated/resources/assets/bits_n_bobs/lang/en_us.json @@ -117,8 +117,7 @@ "block.bits_n_bobs.headlamp.tooltip.summary": "Can be dyed and placed _multiple times in same block_. Useful for trains or fancy signage too!", "block.bits_n_bobs.industrial_grating": "Industrial Grating", "block.bits_n_bobs.industrial_grating_panel": "Industrial Grating Panel", - "block.bits_n_bobs.industrial_grating_panel_encased_pipe": "Industrial Grating Panel Encased Pipe", - "block.bits_n_bobs.industrial_grating_panel_encased_shaft": "Industrial Grating Panel Encased Shaft", + "block.bits_n_bobs.industrial_grating_panel.tooltip.summary": "This one is uhh missing stuff to encase pipes and shafts so stay attuned", "block.bits_n_bobs.industrial_iron_encased_cogwheel": "Industrial Iron Encased Cogwheel", "block.bits_n_bobs.industrial_iron_encased_flanged_cogwheel": "Industrial Iron Encased Flanged Cogwheel", "block.bits_n_bobs.industrial_iron_encased_large_cogwheel": "Industrial Iron Encased Large Cogwheel", @@ -126,6 +125,7 @@ "block.bits_n_bobs.industrial_iron_encased_piston_extension_pole": "Industrial Iron Encased Piston Extension Pole", "block.bits_n_bobs.industrial_iron_encased_shaft": "Industrial Iron Encased Shaft", "block.bits_n_bobs.industrial_truss": "Industrial Truss", + "block.bits_n_bobs.industrial_truss.tooltip.summary": "This one is uhh missing stuff to encase pipes and shafts so stay attuned", "block.bits_n_bobs.large_flanged_cogwheel": "Large Flanged Cogwheel", "block.bits_n_bobs.large_nixie_tube": "Large Nixie Tube", "block.bits_n_bobs.light_blue_chair": "Light Blue Chair", diff --git a/src/generated/resources/assets/bits_n_bobs/models/item/industrial_truss.json b/src/generated/resources/assets/bits_n_bobs/models/item/industrial_truss.json index 740158d7..27fce114 100644 --- a/src/generated/resources/assets/bits_n_bobs/models/item/industrial_truss.json +++ b/src/generated/resources/assets/bits_n_bobs/models/item/industrial_truss.json @@ -1,3 +1,3 @@ { - "parent": "bits_n_bobs:block/industrial_truss/industrial_truss_beams" -} + "parent": "bits_n_bobs:block/industrial_truss/industrial_truss" +} \ No newline at end of file diff --git a/src/generated/resources/data/bits_n_bobs/loot_table/blocks/industrial_grating_panel_encased_pipe.json b/src/generated/resources/data/bits_n_bobs/loot_table/blocks/industrial_grating_panel_encased_pipe.json deleted file mode 100644 index 8c7cddf4..00000000 --- a/src/generated/resources/data/bits_n_bobs/loot_table/blocks/industrial_grating_panel_encased_pipe.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "bits_n_bobs:industrial_grating_panel" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:fluid_pipe" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "bits_n_bobs:blocks/industrial_grating_panel_encased_pipe" -} \ No newline at end of file diff --git a/src/generated/resources/data/bits_n_bobs/loot_table/blocks/industrial_grating_panel_encased_shaft.json b/src/generated/resources/data/bits_n_bobs/loot_table/blocks/industrial_grating_panel_encased_shaft.json deleted file mode 100644 index 6d9049ea..00000000 --- a/src/generated/resources/data/bits_n_bobs/loot_table/blocks/industrial_grating_panel_encased_shaft.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "bits_n_bobs:industrial_grating_panel" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:shaft" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "bits_n_bobs:blocks/industrial_grating_panel_encased_shaft" -} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json index 2396fffc..69df6ccf 100644 --- a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -64,8 +64,6 @@ "bits_n_bobs:weathered_iron_encased_cogwheel", "bits_n_bobs:industrial_iron_encased_large_cogwheel", "bits_n_bobs:weathered_iron_encased_large_cogwheel", - "bits_n_bobs:industrial_grating_panel_encased_shaft", - "bits_n_bobs:industrial_grating_panel_encased_pipe", "bits_n_bobs:granite_tiles", "bits_n_bobs:granite_tile_stairs", "bits_n_bobs:granite_tile_slab", diff --git a/src/main/java/com/kipti/bnb/content/decoration/dyeable/pipes/DyeablePipeBehaviour.java b/src/main/java/com/kipti/bnb/content/decoration/dyeable/pipes/DyeablePipeBehaviour.java index 459d2ec9..b6e8de56 100644 --- a/src/main/java/com/kipti/bnb/content/decoration/dyeable/pipes/DyeablePipeBehaviour.java +++ b/src/main/java/com/kipti/bnb/content/decoration/dyeable/pipes/DyeablePipeBehaviour.java @@ -89,22 +89,11 @@ public static void refreshPipeState(final Level level, final BlockPos pos, final refreshPipeState(level, pos, state, true); } - /** - * Recalculates a pipe's connection shape based on its current dye color and neighbours. - * When {@code propagateToNeighbors} is false the refresh is limited to this block only, - * which avoids cascading neighbour updates (useful in ponder scenes). - */ public static void refreshPipeState(final Level level, final BlockPos pos, BlockState state, final boolean propagateToNeighbors) { if (state.getBlock() instanceof final FluidPipeBlock pipeBlock) { - // Start from defaultBlockState (prevStateSides=0) instead of copying the current - // connections. If we copied them, Create's fallback at: - // if (prevStateSides == 2) return prevState; - // would fire whenever dye filtering produces 0 valid connections, silently - // keeping the old (wrong) corner/straight shape. Starting fresh ensures - // the block always gets a shape consistent with what color filtering allows. BlockState baseState = pipeBlock.defaultBlockState(); if (state.hasProperty(BlockStateProperties.WATERLOGGED)) { baseState = baseState.setValue( diff --git a/src/main/java/com/kipti/bnb/content/decoration/dyeable/tanks/DyeableTankBehaviour.java b/src/main/java/com/kipti/bnb/content/decoration/dyeable/tanks/DyeableTankBehaviour.java index 1dc9df88..16267b12 100644 --- a/src/main/java/com/kipti/bnb/content/decoration/dyeable/tanks/DyeableTankBehaviour.java +++ b/src/main/java/com/kipti/bnb/content/decoration/dyeable/tanks/DyeableTankBehaviour.java @@ -19,6 +19,8 @@ import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; import org.jetbrains.annotations.Nullable; +import java.util.function.Consumer; + public class DyeableTankBehaviour extends BaseDyeableBehaviour { public static final BehaviourType TYPE = new BehaviourType<>("dyeable_fluid_tank"); @@ -44,15 +46,18 @@ public BehaviourType getType() { return TYPE; } + @Override + protected void onColorChanged(@Nullable final DyeColor color) { + this.refreshConnectedPipes(); + } + @Nullable public DyeColor getDisplayedColor() { - if (this.gayDye != null) { - if (this.getBlockEntity() instanceof final FluidTankBlockEntity ftbe) { - final int localY = this.getPos().subtract(ftbe.getController()).getY(); - return this.gayDye.getDisplayedColor(localY); - } + if (this.gayDye == null || !(this.getBlockEntity() instanceof final FluidTankBlockEntity ftbe)) { + return this.getColor(); } - return this.getColor(); + final int localY = this.getPos().subtract(ftbe.getController()).getY(); + return this.gayDye.getDisplayedColor(localY); } @Override @@ -98,54 +103,47 @@ private void dyeSingle(@Nullable final DyeColor color) { } public void setGayDye(@Nullable final GayDye gayDye) { - this.gayDye = gayDye; + this.gayDye = gayDye == null ? null : gayDye.copy(); this.refreshOrNotifyUpdate(); } public void applyGayDyeToEntireTank(final GayDye gayDye) { - final FluidTankBlockEntity tankBE = (FluidTankBlockEntity) this.blockEntity; - final FluidTankBlockEntity controllerBE = tankBE.getControllerBE(); + this.forEachTankPart(behaviour -> behaviour.setGayDye(gayDye)); + } - if (controllerBE == null) { - this.setGayDye(gayDye); + private void dyeEntireTank(@Nullable final DyeColor color) { + this.forEachTankPart(behaviour -> behaviour.setColor(color)); + } + + private void refreshConnectedPipes() { + if (!this.hasLevel()) { return; } + this.getLevel() + .updateNeighborsAt(this.getPos(), this.getBlockState().getBlock()); + } - final Level level = this.getLevel(); - final BlockPos controllerPos = controllerBE.getBlockPos(); - - for (int x = 0; x < controllerBE.getWidth(); x++) { - for (int y = 0; y < controllerBE.getHeight(); y++) { - for (int z = 0; z < controllerBE.getWidth(); z++) { - final BlockPos pos = controllerPos.offset(x, y, z); - final DyeableTankBehaviour behaviour = BlockEntityBehaviour.get(level, pos, TYPE); - if (behaviour != null) { - behaviour.setGayDye(gayDye); - } - } - } + private void forEachTankPart(final Consumer action) { + if (!this.hasLevel()) { + return; } - } - private void dyeEntireTank(@Nullable final DyeColor color) { final FluidTankBlockEntity tankBE = (FluidTankBlockEntity) this.blockEntity; final FluidTankBlockEntity controllerBE = tankBE.getControllerBE(); - if (controllerBE == null) { - this.setColor(color); + action.accept(this); return; } final Level level = this.getLevel(); final BlockPos controllerPos = controllerBE.getBlockPos(); - for (int x = 0; x < controllerBE.getWidth(); x++) { for (int y = 0; y < controllerBE.getHeight(); y++) { for (int z = 0; z < controllerBE.getWidth(); z++) { final BlockPos pos = controllerPos.offset(x, y, z); final DyeableTankBehaviour behaviour = BlockEntityBehaviour.get(level, pos, TYPE); if (behaviour != null) { - behaviour.setColor(color); + action.accept(behaviour); } } } diff --git a/src/main/java/com/kipti/bnb/content/decoration/dyeable/tanks/GayDye.java b/src/main/java/com/kipti/bnb/content/decoration/dyeable/tanks/GayDye.java index c9c0a0ee..436577da 100644 --- a/src/main/java/com/kipti/bnb/content/decoration/dyeable/tanks/GayDye.java +++ b/src/main/java/com/kipti/bnb/content/decoration/dyeable/tanks/GayDye.java @@ -59,6 +59,12 @@ public void tick() { this.animationTick++; } + public GayDye copy() { + final GayDye copy = new GayDye(this.animationType, this.prideType); + copy.animationTick = this.animationTick; + return copy; + } + public void write(final CompoundTag tag) { tag.putInt("GayDyeAnimationTick", this.animationTick); tag.putInt("GayDyeAnimationType", this.animationType.ordinal()); diff --git a/src/main/java/com/kipti/bnb/content/decoration/grating/GratingBlockStateGen.java b/src/main/java/com/kipti/bnb/content/decoration/grating/GratingBlockStateGen.java index f3654a44..3c04f283 100644 --- a/src/main/java/com/kipti/bnb/content/decoration/grating/GratingBlockStateGen.java +++ b/src/main/java/com/kipti/bnb/content/decoration/grating/GratingBlockStateGen.java @@ -1,132 +1,121 @@ package com.kipti.bnb.content.decoration.grating; -import com.kipti.bnb.CreateBitsnBobs; -import com.kipti.bnb.foundation.client.block_state_gen.BnbBlockStateGen; -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.RegistrateBlockstateProvider; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.BooleanProperty; - -import java.util.Map; - public class GratingBlockStateGen { +// +// public static void gratingEncasedShaftBlock(final DataGenContext ctx, +// final RegistrateBlockstateProvider prov) { +// for (final Direction dir : Direction.values()) {//Specifically not using forAllStates cause uh +// final Direction.Axis otherAxisA = dir.getAxis() == Direction.Axis.X ? Direction.Axis.Y : Direction.Axis.X; +// final Direction.Axis otherAxisB = dir.getAxis() == Direction.Axis.Z ? Direction.Axis.Y : Direction.Axis.Z; +// +// // Side panel: solid when shaft axis is perpendicular to facing +// prov.getMultipartBuilder(ctx.get()) +// .part() +// .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( +// "block/industrial_grating/panel_side"))) +// .rotationX(dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0) +// .rotationY(dir.getAxis().isVertical() ? 0 : (((int) dir.toYRot()) + BnbBlockStateGen.DEFAULT_ANGLE_OFFSET) % 360) +// .uvLock(false) +// .addModel() +// .condition(BlockStateProperties.FACING, dir) +// .condition(GratingEncasedShaftBlock.AXIS, otherAxisA, otherAxisB) +// .end() +// // Side panel: cutout when shaft axis aligns with facing (shaft passes through) +// .part() +// .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( +// "block/industrial_grating/panel_side_cutout"))) +// .rotationX(dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0) +// .rotationY(dir.getAxis().isVertical() ? 0 : (((int) dir.toYRot()) + BnbBlockStateGen.DEFAULT_ANGLE_OFFSET) % 360) +// .uvLock(false) +// .addModel() +// .condition(BlockStateProperties.FACING, dir) +// .condition(GratingEncasedShaftBlock.AXIS, dir.getAxis()) +// .end(); +// +// // Top panel: solid when shaft axis is perpendicular to facing +// prov.getMultipartBuilder(ctx.get()).part() +// .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource("block/industrial_grating/panel"))) +// .rotationX(dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0) +// .rotationY(dir.getAxis().isVertical() ? 0 : (((int) dir.toYRot()) + BnbBlockStateGen.DEFAULT_ANGLE_OFFSET) % 360) +// .uvLock(true) +// .addModel() +// .condition(BlockStateProperties.FACING, dir) +// .condition(GratingEncasedShaftBlock.AXIS, otherAxisA, otherAxisB) +// .end() +// // Top panel: cutout when shaft axis aligns with facing (shaft passes through) +// .part() +// .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( +// "block/industrial_grating/panel_cutout"))) +// .rotationX(dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0) +// .rotationY(dir.getAxis().isVertical() ? 0 : (((int) dir.toYRot()) + BnbBlockStateGen.DEFAULT_ANGLE_OFFSET) % 360) +// .uvLock(true) +// .addModel() +// .condition(BlockStateProperties.FACING, dir) +// .condition(GratingEncasedShaftBlock.AXIS, dir.getAxis()) +// .end(); +// } +// } - public static void gratingEncasedShaftBlock(final DataGenContext ctx, - final RegistrateBlockstateProvider prov) { - for (final Direction dir : Direction.values()) {//Specifically not using forAllStates cause uh - final Direction.Axis otherAxisA = dir.getAxis() == Direction.Axis.X ? Direction.Axis.Y : Direction.Axis.X; - final Direction.Axis otherAxisB = dir.getAxis() == Direction.Axis.Z ? Direction.Axis.Y : Direction.Axis.Z; - - // Side panel: solid when shaft axis is perpendicular to facing - prov.getMultipartBuilder(ctx.get()) - .part() - .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( - "block/industrial_grating/panel_side"))) - .rotationX(dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0) - .rotationY(dir.getAxis().isVertical() ? 0 : (((int) dir.toYRot()) + BnbBlockStateGen.DEFAULT_ANGLE_OFFSET) % 360) - .uvLock(false) - .addModel() - .condition(BlockStateProperties.FACING, dir) - .condition(GratingEncasedShaftBlock.AXIS, otherAxisA, otherAxisB) - .end() - // Side panel: cutout when shaft axis aligns with facing (shaft passes through) - .part() - .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( - "block/industrial_grating/panel_side_cutout"))) - .rotationX(dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0) - .rotationY(dir.getAxis().isVertical() ? 0 : (((int) dir.toYRot()) + BnbBlockStateGen.DEFAULT_ANGLE_OFFSET) % 360) - .uvLock(false) - .addModel() - .condition(BlockStateProperties.FACING, dir) - .condition(GratingEncasedShaftBlock.AXIS, dir.getAxis()) - .end(); - - // Top panel: solid when shaft axis is perpendicular to facing - prov.getMultipartBuilder(ctx.get()).part() - .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource("block/industrial_grating/panel"))) - .rotationX(dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0) - .rotationY(dir.getAxis().isVertical() ? 0 : (((int) dir.toYRot()) + BnbBlockStateGen.DEFAULT_ANGLE_OFFSET) % 360) - .uvLock(true) - .addModel() - .condition(BlockStateProperties.FACING, dir) - .condition(GratingEncasedShaftBlock.AXIS, otherAxisA, otherAxisB) - .end() - // Top panel: cutout when shaft axis aligns with facing (shaft passes through) - .part() - .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( - "block/industrial_grating/panel_cutout"))) - .rotationX(dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0) - .rotationY(dir.getAxis().isVertical() ? 0 : (((int) dir.toYRot()) + BnbBlockStateGen.DEFAULT_ANGLE_OFFSET) % 360) - .uvLock(true) - .addModel() - .condition(BlockStateProperties.FACING, dir) - .condition(GratingEncasedShaftBlock.AXIS, dir.getAxis()) - .end(); - } - } - - public static void gratingEncasedPipeBlock(final DataGenContext ctx, - final RegistrateBlockstateProvider prov) { - final Map connectionProperties = Map.of( - Direction.UP, BlockStateProperties.UP, - Direction.DOWN, BlockStateProperties.DOWN, - Direction.NORTH, BlockStateProperties.NORTH, - Direction.SOUTH, BlockStateProperties.SOUTH, - Direction.EAST, BlockStateProperties.EAST, - Direction.WEST, BlockStateProperties.WEST - ); - - for (final Direction dir : Direction.values()) { - final BooleanProperty connectionProp = connectionProperties.get(dir); - final int rotX = dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0; - final int rotY = dir.getAxis().isVertical() ? 0 : (((int) dir.toYRot()) + BnbBlockStateGen.DEFAULT_ANGLE_OFFSET) % 360; - - prov.getMultipartBuilder(ctx.get()) - .part() - .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( - "block/industrial_grating/panel_side"))) - .rotationX(rotX) - .rotationY(rotY) - .uvLock(false) - .addModel() - .condition(BlockStateProperties.FACING, dir) - .condition(connectionProp, false) - .end() - .part() - .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( - "block/industrial_grating/panel_side_pipe_cutout"))) - .rotationX(rotX) - .rotationY(rotY) - .uvLock(false) - .addModel() - .condition(BlockStateProperties.FACING, dir) - .condition(connectionProp, true) - .end(); - - prov.getMultipartBuilder(ctx.get()) - .part() - .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( - "block/industrial_grating/panel_pipe_cutout"))) - .rotationX(rotX) - .rotationY(rotY) - .uvLock(true) - .addModel() - .condition(BlockStateProperties.FACING, dir) - .condition(connectionProp, true) - .end() - .part() - .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( - "block/industrial_grating/panel"))) - .rotationX(rotX) - .rotationY(rotY) - .uvLock(true) - .addModel() - .condition(BlockStateProperties.FACING, dir) - .condition(connectionProp, false) - .end(); - } - } +// public static void gratingEncasedPipeBlock(final DataGenContext ctx, +// final RegistrateBlockstateProvider prov) { +// final Map connectionProperties = Map.of( +// Direction.UP, BlockStateProperties.UP, +// Direction.DOWN, BlockStateProperties.DOWN, +// Direction.NORTH, BlockStateProperties.NORTH, +// Direction.SOUTH, BlockStateProperties.SOUTH, +// Direction.EAST, BlockStateProperties.EAST, +// Direction.WEST, BlockStateProperties.WEST +// ); +// +// for (final Direction dir : Direction.values()) { +// final BooleanProperty connectionProp = connectionProperties.get(dir); +// final int rotX = dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0; +// final int rotY = dir.getAxis().isVertical() ? 0 : (((int) dir.toYRot()) + BnbBlockStateGen.DEFAULT_ANGLE_OFFSET) % 360; +// +// prov.getMultipartBuilder(ctx.get()) +// .part() +// .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( +// "block/industrial_grating/panel_side"))) +// .rotationX(rotX) +// .rotationY(rotY) +// .uvLock(false) +// .addModel() +// .condition(BlockStateProperties.FACING, dir) +// .condition(connectionProp, false) +// .end() +// .part() +// .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( +// "block/industrial_grating/panel_side_pipe_cutout"))) +// .rotationX(rotX) +// .rotationY(rotY) +// .uvLock(false) +// .addModel() +// .condition(BlockStateProperties.FACING, dir) +// .condition(connectionProp, true) +// .end(); +// +// prov.getMultipartBuilder(ctx.get()) +// .part() +// .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( +// "block/industrial_grating/panel_pipe_cutout"))) +// .rotationX(rotX) +// .rotationY(rotY) +// .uvLock(true) +// .addModel() +// .condition(BlockStateProperties.FACING, dir) +// .condition(connectionProp, true) +// .end() +// .part() +// .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource( +// "block/industrial_grating/panel"))) +// .rotationX(rotX) +// .rotationY(rotY) +// .uvLock(true) +// .addModel() +// .condition(BlockStateProperties.FACING, dir) +// .condition(connectionProp, false) +// .end(); +// } +// } } diff --git a/src/main/java/com/kipti/bnb/content/decoration/grating/GratingEncasedShaftBlock.java b/src/main/java/com/kipti/bnb/content/decoration/grating/GratingEncasedShaftBlock.java deleted file mode 100644 index ec21962e..00000000 --- a/src/main/java/com/kipti/bnb/content/decoration/grating/GratingEncasedShaftBlock.java +++ /dev/null @@ -1,200 +0,0 @@ -package com.kipti.bnb.content.decoration.grating; - -import com.kipti.bnb.content.kinetics.encased_blocks.BnbEncasedShaftBlock; -import com.kipti.bnb.registry.content.blocks.deco.BnbDecorativeBlocks; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllShapes; -import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.LevelEvent; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.DirectionProperty; -import net.minecraft.world.level.pathfinder.PathComputationType; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jspecify.annotations.NonNull; - -public class GratingEncasedShaftBlock extends BnbEncasedShaftBlock implements IGratingPanel { - - public static final DirectionProperty FACING = BlockStateProperties.FACING; - - public GratingEncasedShaftBlock(final Properties properties) { - super(properties, BnbDecorativeBlocks.INDUSTRIAL_GRATING_PANEL::get); - this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.UP)); - } - - @Override - protected void createBlockStateDefinition(final StateDefinition.@NotNull Builder builder) { - super.createBlockStateDefinition(builder); - builder.add(FACING); - } - - @Override - public @NonNull BlockState getStateForPlacement(final @NotNull BlockPlaceContext context) { - return super.getStateForPlacement(context).setValue(FACING, this.getPanelFacing(context.getPlayer())); - } - - @Override - public InteractionResult onWrenched(final BlockState state, final UseOnContext context) { - final BlockState rotatedState = this.getTargetedPart(state, context) == TargetedPart.PANEL - ? this.getPanelRotatedState(state, context.getClickedFace()) - : this.getRotatedBlockState(state, context.getClickedFace()); - return this.applyWrenchedState(state, rotatedState, context); - } - - @Override - public InteractionResult onSneakWrenched(final BlockState state, final UseOnContext context) { - if (this.getTargetedPart(state, context) != TargetedPart.PANEL) { - return InteractionResult.PASS; - } - if (context.getLevel().isClientSide) { - return InteractionResult.SUCCESS; - } - - context.getLevel().levelEvent(LevelEvent.PARTICLES_DESTROY_BLOCK, context.getClickedPos(), Block.getId(state)); - KineticBlockEntity.switchToBlockState( - context.getLevel(), - context.getClickedPos(), - AllBlocks.SHAFT.getDefaultState().setValue(AXIS, state.getValue(AXIS)) - ); - if (context.getPlayer() != null && !context.getPlayer().isCreative()) { - context.getPlayer().getInventory().placeItemBackInInventory(BnbDecorativeBlocks.INDUSTRIAL_GRATING_PANEL.asStack()); - } - IWrenchable.playRemoveSound(context.getLevel(), context.getClickedPos()); - return InteractionResult.SUCCESS; - } - - @Override - public void handleEncasing(final BlockState state, - final Level level, - final BlockPos pos, - final ItemStack heldItem, - final Player player, - final InteractionHand hand, - final BlockHitResult ray) { - KineticBlockEntity.switchToBlockState( - level, pos, this.defaultBlockState() - .setValue(AXIS, state.getValue(AXIS)) - .setValue(FACING, this.getPanelFacing(player)) - ); - } - - @Override - protected @NotNull VoxelShape getShape(final BlockState state, - final @NotNull BlockGetter level, - final @NotNull BlockPos pos, - final @NotNull CollisionContext context) { - return Shapes.or(this.getPanelShape(state), this.getShaftShape(state)); - } - - @Override - protected boolean isPathfindable(@NotNull final BlockState state, - @NotNull final PathComputationType pathComputationType) { - return false; - } - - @Override - protected boolean skipRendering(final BlockState state, final BlockState adjacentState, final Direction direction) { - return adjacentState.getBlock() instanceof IGratingPanel && (adjacentState.getValue(FACING) == state.getValue( - FACING)) || super.skipRendering(state, adjacentState, direction); - } - - private InteractionResult applyWrenchedState(final BlockState state, - final BlockState rotatedState, - final UseOnContext context) { - if (!rotatedState.canSurvive(context.getLevel(), context.getClickedPos())) { - return InteractionResult.PASS; - } - - KineticBlockEntity.switchToBlockState( - context.getLevel(), - context.getClickedPos(), - this.updateAfterWrenched(rotatedState, context) - ); - if (context.getLevel().getBlockState(context.getClickedPos()) != state) { - IWrenchable.playRotateSound(context.getLevel(), context.getClickedPos()); - } - return InteractionResult.SUCCESS; - } - - private BlockState getPanelRotatedState(final BlockState state, final Direction targetedFace) { - final Direction stateFacing = state.getValue(FACING); - if (stateFacing.getAxis() == targetedFace.getAxis()) { - return state; - } - - BlockState rotatedState = state; - do { - rotatedState = rotatedState.setValue( - FACING, - rotatedState.getValue(FACING).getClockWise(targetedFace.getAxis()) - ); - } while (rotatedState.getValue(FACING).getAxis() == targetedFace.getAxis()); - return rotatedState; - } - - private Direction getPanelFacing(final @Nullable Player player) { - return player == null ? Direction.UP : player.getNearestViewDirection().getOpposite(); - } - - private VoxelShape getPanelShape(final BlockState state) { - return AllShapes.CASING_3PX.get(state.getValue(FACING)); - } - - private VoxelShape getShaftShape(final BlockState state) { - return AllShapes.FOUR_VOXEL_POLE.get(state.getValue(AXIS)); - } - - private TargetedPart getTargetedPart(final BlockState state, final UseOnContext context) { - final Vec3 start = this.getRayStart(context); - Vec3 end = this.getRayEnd(context); - end = end.add(end.subtract(start)); - final BlockHitResult panelHit = this.getPanelShape(state).clip(start, end, context.getClickedPos()); - final BlockHitResult shaftHit = this.getShaftShape(state).clip(start, end, context.getClickedPos()); - if (panelHit == null) { - return TargetedPart.SHAFT; - } - if (shaftHit == null) { - return TargetedPart.PANEL; - } - - final double panelDistance = panelHit.getLocation().distanceToSqr(start); - final double shaftDistance = shaftHit.getLocation().distanceToSqr(start); - return panelDistance <= shaftDistance ? TargetedPart.PANEL : TargetedPart.SHAFT; - } - - private Vec3 getRayStart(final UseOnContext context) { - if (context.getPlayer() != null) { - return context.getPlayer().getEyePosition(); - } - return context.getClickLocation().subtract(Vec3.atLowerCornerOf(context.getClickedFace().getNormal()).scale(2)); - } - - private Vec3 getRayEnd(final UseOnContext context) { - return context.getClickLocation(); - } - - private enum TargetedPart { - PANEL, - SHAFT - } - -} diff --git a/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPanelBlock.java b/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPanelBlock.java index e713d92a..ad2a533b 100644 --- a/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPanelBlock.java +++ b/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPanelBlock.java @@ -1,31 +1,17 @@ package com.kipti.bnb.content.decoration.grating; -import com.kipti.bnb.registry.content.blocks.encased.BnbSpecialEncasedBlocks; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; -import com.simibubi.create.content.fluids.FluidTransportBehaviour; -import com.simibubi.create.content.fluids.pipes.FluidPipeBlock; -import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.PipeBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.DirectionProperty; import net.minecraft.world.level.pathfinder.PathComputationType; -import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.NotNull; @@ -51,33 +37,6 @@ protected void createBlockStateDefinition(final StateDefinition.@NotNull Builder return super.getStateForPlacement(context).setValue(FACING, this.getPanelFacing(context.getPlayer())); } - public BlockState getEncasedShaftState(final BlockState state, final Direction.Axis shaftAxis) { - return BnbSpecialEncasedBlocks.INDUSTRIAL_GRATING_PANEL.getDefaultState() - .setValue(GratingEncasedShaftBlock.AXIS, shaftAxis) - .setValue(FACING, state.getValue(FACING)); - } - - @Override - protected @NotNull ItemInteractionResult useItemOn(final @NotNull ItemStack stack, - final @NotNull BlockState state, - final @NotNull Level level, - final @NotNull BlockPos pos, - final Player player, - final @NotNull InteractionHand hand, - final @NotNull BlockHitResult hitResult) { - final ItemInteractionResult shaftInsertResult = this.tryInsertShaft(stack, state, level, pos, player, hand); - if (shaftInsertResult.consumesAction()) { - return shaftInsertResult; - } - - final ItemInteractionResult pipeInsertResult = this.tryInsertPipe(stack, state, level, pos, player, hand); - if (pipeInsertResult.consumesAction()) { - return pipeInsertResult; - } - - return super.useItemOn(stack, state, level, pos, player, hand, hitResult); - } - @Override protected @NotNull VoxelShape getShape(final BlockState state, final @NotNull BlockGetter level, @@ -102,65 +61,5 @@ private Direction getPanelFacing(final @Nullable Player player) { return player == null ? Direction.UP : player.getNearestViewDirection().getOpposite(); } - public BlockState getEncasedPipeState(final BlockState state, final Level level, final BlockPos pos) { - BlockState result = BnbSpecialEncasedBlocks.INDUSTRIAL_GRATING_PANEL_PIPE.getDefaultState() - .setValue(FACING, state.getValue(FACING)); - for (Direction direction : Iterate.directions) { - BlockPos neighborPos = pos.relative(direction); - result = result.setValue( - PipeBlock.PROPERTY_BY_DIRECTION.get(direction), - FluidPipeBlock.canConnectTo(level, neighborPos, level.getBlockState(neighborPos), direction) - ); - } - return result; - } - - private ItemInteractionResult tryInsertPipe(final ItemStack stack, - final BlockState state, - final Level level, - final BlockPos pos, - final Player player, - final InteractionHand hand) { - if (!AllBlocks.FLUID_PIPE.isIn(stack)) { - return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; - } - - BlockState pipeState = this.getEncasedPipeState(state, level, pos); - FluidTransportBehaviour.cacheFlows(level, pos); - level.setBlockAndUpdate(pos, pipeState); - FluidTransportBehaviour.loadFlows(level, pos); - level.playSound(null, pos, SoundEvents.METAL_HIT, SoundSource.BLOCKS, 0.5f, 1.25f); - if (!level.isClientSide && !player.isCreative()) { - stack.shrink(1); - if (stack.isEmpty()) { - player.setItemInHand(hand, ItemStack.EMPTY); - } - } - return ItemInteractionResult.SUCCESS; - } - - private ItemInteractionResult tryInsertShaft(final ItemStack stack, - final BlockState state, - final Level level, - final BlockPos pos, - final Player player, - final InteractionHand hand) { - if (!AllBlocks.SHAFT.isIn(stack)) { - return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; - } - - KineticBlockEntity.switchToBlockState( - level, pos, this.getEncasedShaftState(state, player.getNearestViewDirection().getAxis()) - ); - level.playSound(null, pos, SoundEvents.METAL_HIT, SoundSource.BLOCKS, 0.5f, 1.25f); - if (!level.isClientSide && !player.isCreative()) { - stack.shrink(1); - if (stack.isEmpty()) { - player.setItemInHand(hand, ItemStack.EMPTY); - } - } - return ItemInteractionResult.SUCCESS; - } - } diff --git a/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPanelBlockItem.java b/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPanelBlockItem.java index bde1c92d..20006b32 100644 --- a/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPanelBlockItem.java +++ b/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPanelBlockItem.java @@ -1,17 +1,8 @@ package com.kipti.bnb.content.decoration.grating; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; public class GratingPanelBlockItem extends BlockItem { @@ -26,45 +17,7 @@ public GratingPanelBlockItem(final GratingPanelBlock block, final Properties pro if (!result.consumesAction()) { return result; } - - this.tryPlaceOffhandShaft(context); return result; } - private void tryPlaceOffhandShaft(final BlockPlaceContext context) { - final Player player = context.getPlayer(); - if (player == null || context.getHand() != InteractionHand.MAIN_HAND) { - return; - } - - final ItemStack offhandStack = player.getOffhandItem(); - if (!AllBlocks.SHAFT.isIn(offhandStack)) { - return; - } - - final Level level = context.getLevel(); - final BlockState placedState = level.getBlockState(context.getClickedPos()); - if (!(placedState.getBlock() instanceof final GratingPanelBlock gratingPanelBlock)) { - return; - } - - KineticBlockEntity.switchToBlockState( - level, - context.getClickedPos(), - gratingPanelBlock.getEncasedShaftState(placedState, player.getNearestViewDirection().getAxis()) - ); - level.playSound(null, context.getClickedPos(), SoundEvents.METAL_HIT, SoundSource.BLOCKS, 0.5f, 1.25f); - this.consumeOffhandShaft(level, player, offhandStack); - } - - private void consumeOffhandShaft(final Level level, final Player player, final ItemStack offhandStack) { - if (level.isClientSide || player.isCreative()) { - return; - } - - offhandStack.shrink(1); - if (offhandStack.isEmpty()) { - player.setItemInHand(InteractionHand.OFF_HAND, ItemStack.EMPTY); - } - } } diff --git a/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPipePanelBlock.java b/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPipePanelBlock.java deleted file mode 100644 index 63cf6b9c..00000000 --- a/src/main/java/com/kipti/bnb/content/decoration/grating/GratingPipePanelBlock.java +++ /dev/null @@ -1,277 +0,0 @@ -package com.kipti.bnb.content.decoration.grating; - -import com.kipti.bnb.content.decoration.dyeable.DyeableTransitionHelper; -import com.kipti.bnb.registry.content.BnbBlockEntities; -import com.kipti.bnb.registry.content.blocks.deco.BnbDecorativeBlocks; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllShapes; -import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; -import com.simibubi.create.content.contraptions.StructureTransform; -import com.simibubi.create.content.decoration.encasing.EncasedBlock; -import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.content.fluids.FluidTransportBehaviour; -import com.simibubi.create.content.fluids.pipes.EncasedPipeBlock; -import com.simibubi.create.content.fluids.pipes.FluidPipeBlock; -import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity; -import com.simibubi.create.content.schematics.requirement.ItemRequirement; -import net.createmod.catnip.data.Iterate; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.LevelEvent; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.DirectionProperty; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -public class GratingPipePanelBlock extends FluidPipeBlock - implements IGratingPanel, EncasedBlock, SpecialBlockItemRequirement { - - public static final DirectionProperty FACING = BlockStateProperties.FACING; - private static final VoxelShape PIPE_CENTER_BOX = Block.box(4, 4, 4, 12, 12, 12); - - public GratingPipePanelBlock(final Properties properties) { - super(properties); - this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.UP)); - } - - @Override - protected void createBlockStateDefinition(final StateDefinition.@NotNull Builder builder) { - super.createBlockStateDefinition(builder); - builder.add(FACING); - } - - @Override - public @NotNull BlockState getStateForPlacement(final @NotNull BlockPlaceContext context) { - return super.getStateForPlacement(context).setValue(FACING, this.getPanelFacing(context.getPlayer())); - } - - @Override - public BlockEntityType getBlockEntityType() { - return BnbBlockEntities.ENCASED_PIPE.get(); - } - - @Override - public Block getCasing() { - return BnbDecorativeBlocks.INDUSTRIAL_GRATING_PANEL.get(); - } - - @Override - public void handleEncasing(final BlockState state, - final Level level, - final BlockPos pos, - final ItemStack heldItem, - final Player player, - final InteractionHand hand, - final BlockHitResult ray) { - DyeableTransitionHelper.saveCurrentDye(level, pos); - FluidTransportBehaviour.cacheFlows(level, pos); - level.setBlockAndUpdate(pos, - EncasedPipeBlock.transferSixWayProperties(state, this.defaultBlockState()) - .setValue(FACING, this.getPanelFacing(player)) - .setValue(BlockStateProperties.WATERLOGGED, state.getValue(BlockStateProperties.WATERLOGGED))); - FluidTransportBehaviour.loadFlows(level, pos); - DyeableTransitionHelper.applyPreviousDye(level, pos); - } - - @Override - public @NotNull InteractionResult onWrenched(final BlockState state, final UseOnContext context) { - if (this.getTargetedPart(state, context) == TargetedPart.PANEL) { - final BlockState rotatedState = this.getPanelRotatedState(state, context.getClickedFace()); - if (rotatedState == state || !rotatedState.canSurvive(context.getLevel(), context.getClickedPos())) { - return InteractionResult.PASS; - } - context.getLevel().setBlockAndUpdate(context.getClickedPos(), rotatedState); - IWrenchable.playRotateSound(context.getLevel(), context.getClickedPos()); - return InteractionResult.SUCCESS; - } - return InteractionResult.PASS; - } - - @Override - public InteractionResult onSneakWrenched(final BlockState state, final UseOnContext context) { - if (context.getLevel().isClientSide) { - return InteractionResult.SUCCESS; - } - - final Level level = context.getLevel(); - final BlockPos pos = context.getClickedPos(); - final TargetedPart targeted = this.getTargetedPart(state, context); - - level.levelEvent(LevelEvent.PARTICLES_DESTROY_BLOCK, pos, Block.getId(state)); - - if (targeted == TargetedPart.PANEL) { - DyeableTransitionHelper.saveCurrentDye(level, pos); - FluidTransportBehaviour.cacheFlows(level, pos); - final BlockState pipeState = EncasedPipeBlock.transferSixWayProperties( - state, AllBlocks.FLUID_PIPE.getDefaultState()) - .setValue(BlockStateProperties.WATERLOGGED, state.getValue(BlockStateProperties.WATERLOGGED)); - Direction firstFound = Direction.UP; - for (final Direction d : Iterate.directions) { - if (state.getValue(PROPERTY_BY_DIRECTION.get(d))) { - firstFound = d; - break; - } - } - level.setBlockAndUpdate(pos, AllBlocks.FLUID_PIPE.get() - .updateBlockState(pipeState, firstFound, null, level, pos)); - FluidTransportBehaviour.loadFlows(level, pos); - DyeableTransitionHelper.applyPreviousDye(level, pos); - if (context.getPlayer() != null && !context.getPlayer().isCreative()) { - context.getPlayer().getInventory().placeItemBackInInventory( - BnbDecorativeBlocks.INDUSTRIAL_GRATING_PANEL.asStack()); - } - } else { - level.setBlockAndUpdate(pos, - BnbDecorativeBlocks.INDUSTRIAL_GRATING_PANEL.getDefaultState() - .setValue(FACING, state.getValue(FACING))); - if (context.getPlayer() != null && !context.getPlayer().isCreative()) { - context.getPlayer().getInventory().placeItemBackInInventory(AllBlocks.FLUID_PIPE.asStack()); - } - } - - IWrenchable.playRemoveSound(level, pos); - return InteractionResult.SUCCESS; - } - - @Override - public @NotNull ItemStack getCloneItemStack(final @NotNull BlockState state, - final @NotNull HitResult target, - final @NotNull LevelReader level, - final @NotNull BlockPos pos, - final @NotNull Player player) { - return AllBlocks.FLUID_PIPE.asStack(); - } - - @Override - public ItemRequirement getRequiredItems(final BlockState state, final @Nullable BlockEntity blockEntity) { - return ItemRequirement.of(AllBlocks.FLUID_PIPE.getDefaultState(), blockEntity) - .union(ItemRequirement.of(BnbDecorativeBlocks.INDUSTRIAL_GRATING_PANEL.getDefaultState(), blockEntity)); - } - - @Override - protected @NotNull VoxelShape getShape(final @NotNull BlockState state, - final @NotNull BlockGetter level, - final @NotNull BlockPos pos, - final @NotNull CollisionContext context) { - return Shapes.or(this.getPanelShape(state), super.getShape(state, level, pos, context)); - } - - @Override - public Optional removeBracket(final BlockGetter world, final BlockPos pos, final boolean inOnReplacedContext) { - return Optional.empty(); - } - - @Override - protected boolean skipRendering(final @NotNull BlockState state, - final @NotNull BlockState adjacentState, - final @NotNull Direction direction) { - return adjacentState.getBlock() instanceof IGratingPanel - && adjacentState.getValue(FACING) == state.getValue(FACING) - || super.skipRendering(state, adjacentState, direction); - } - - @Override - public @NotNull BlockState rotate(final @NotNull BlockState state, final @NotNull Rotation rotation) { - return super.rotate(state, rotation) - .setValue(FACING, rotation.rotate(state.getValue(FACING))); - } - - @Override - public @NotNull BlockState mirror(final @NotNull BlockState state, final @NotNull Mirror mirror) { - return super.mirror(state, mirror) - .setValue(FACING, mirror.mirror(state.getValue(FACING))); - } - - @Override - public @NotNull BlockState transform(final BlockState state, final StructureTransform transform) { - Direction facing = state.getValue(FACING); - if (transform.mirror != null) { - facing = transform.mirror.mirror(facing); - } - if (transform.rotationAxis == Direction.Axis.Y) { - facing = transform.rotation.rotate(facing); - } else { - facing = transform.rotateFacing(facing); - } - return super.transform(state, transform).setValue(FACING, facing); - } - - private Direction getPanelFacing(final @Nullable Player player) { - return player == null ? Direction.UP : player.getNearestViewDirection().getOpposite(); - } - - private VoxelShape getPanelShape(final BlockState state) { - return AllShapes.CASING_3PX.get(state.getValue(FACING)); - } - - private BlockState getPanelRotatedState(final BlockState state, final Direction targetedFace) { - final Direction stateFacing = state.getValue(FACING); - if (stateFacing.getAxis() == targetedFace.getAxis()) { - return state; - } - BlockState rotatedState = state; - do { - rotatedState = rotatedState.setValue(FACING, - rotatedState.getValue(FACING).getClockWise(targetedFace.getAxis())); - } while (rotatedState.getValue(FACING).getAxis() == targetedFace.getAxis()); - return rotatedState; - } - - private TargetedPart getTargetedPart(final BlockState state, final UseOnContext context) { - final Vec3 start = this.getRayStart(context); - Vec3 end = this.getRayEnd(context); - end = end.add(end.subtract(start)); - final BlockHitResult panelHit = this.getPanelShape(state).clip(start, end, context.getClickedPos()); - final BlockHitResult pipeHit = PIPE_CENTER_BOX.clip(start, end, context.getClickedPos()); - if (panelHit == null) { - return TargetedPart.PIPE; - } - if (pipeHit == null) { - return TargetedPart.PANEL; - } - final double panelDistance = panelHit.getLocation().distanceToSqr(start); - final double pipeDistance = pipeHit.getLocation().distanceToSqr(start); - return panelDistance <= pipeDistance ? TargetedPart.PANEL : TargetedPart.PIPE; - } - - private Vec3 getRayStart(final UseOnContext context) { - if (context.getPlayer() != null) { - return context.getPlayer().getEyePosition(); - } - return context.getClickLocation().subtract(Vec3.atLowerCornerOf(context.getClickedFace().getNormal()).scale(2)); - } - - private Vec3 getRayEnd(final UseOnContext context) { - return context.getClickLocation(); - } - - private enum TargetedPart { - PANEL, - PIPE - } - -} diff --git a/src/main/java/com/kipti/bnb/content/decoration/shroud/ShroudedBehaviour.java b/src/main/java/com/kipti/bnb/content/decoration/shroud/ShroudedBehaviour.java new file mode 100644 index 00000000..030918ff --- /dev/null +++ b/src/main/java/com/kipti/bnb/content/decoration/shroud/ShroudedBehaviour.java @@ -0,0 +1,152 @@ +package com.kipti.bnb.content.decoration.shroud; + +import com.cake.azimuth.behaviour.SuperBlockEntityBehaviour; +import com.simibubi.create.content.contraptions.StructureTransform; +import com.simibubi.create.content.decoration.bracket.BracketBlock; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; +import net.createmod.catnip.nbt.NBTHelper; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LevelEvent; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Predicate; + +public class ShroudedBehaviour extends SuperBlockEntityBehaviour { + + public static final BehaviourType TYPE = new BehaviourType<>(); + + private BlockState shroud; + private boolean reRender; + + private final Predicate pred; + + public ShroudedBehaviour(final SmartBlockEntity be) { + this(be, state -> true); + } + + public ShroudedBehaviour(final SmartBlockEntity be, final Predicate pred) { + super(be); + this.pred = pred; + } + + @Override + public BehaviourType getType() { + return TYPE; + } + + public void applyBracket(final BlockState state) { + this.shroud = state; + this.reRender = true; + this.blockEntity.notifyUpdate(); + final Level world = this.getWorld(); + if (world.isClientSide) + return; + this.blockEntity.getBlockState() + .updateNeighbourShapes(world, this.getPos(), 3); + } + + @Override + public void transform(final BlockEntity be, final StructureTransform transform) { + super.transform(be, transform); + if (this.isBracketPresent()) { + final BlockState transformedBracket = transform.apply(this.shroud); + this.applyBracket(transformedBracket); + } + } + + @Nullable + public BlockState removeBracket(final boolean inOnReplacedContext) { + if (this.shroud == null) { + return null; + } + + final BlockState removed = this.shroud; + final Level world = this.getWorld(); + if (!world.isClientSide) + world.levelEvent(LevelEvent.PARTICLES_DESTROY_BLOCK, this.getPos(), Block.getId(this.shroud)); + this.shroud = null; + this.reRender = true; + if (inOnReplacedContext) { + this.blockEntity.sendData(); + return removed; + } + this.blockEntity.notifyUpdate(); + if (world.isClientSide) + return removed; + this.blockEntity.getBlockState() + .updateNeighbourShapes(world, this.getPos(), 3); + return removed; + } + + public boolean isBracketPresent() { + return this.shroud != null; + } + + public boolean isBracketValid(final BlockState bracketState) { + return bracketState.getBlock() instanceof BracketBlock; + } + + @Nullable + public BlockState getBracket() { + return this.shroud; + } + + public boolean canHaveBracket() { + return this.pred.test(this.blockEntity.getBlockState()); + } + + @Override + public ItemRequirement getRequiredItems() { + if (!this.isBracketPresent()) { + return ItemRequirement.NONE; + } + return ItemRequirement.of(this.shroud, null); + } + + @Override + public boolean isSafeNBT() { + return true; + } + + @Override + public void write(final CompoundTag nbt, final HolderLookup.Provider registries, final boolean clientPacket) { + if (this.isBracketPresent() && this.isBracketValid(this.shroud)) { + nbt.put("Bracket", NbtUtils.writeBlockState(this.shroud)); + } + if (clientPacket && this.reRender) { + NBTHelper.putMarker(nbt, "Redraw"); + this.reRender = false; + } + super.write(nbt, registries, clientPacket); + } + + @Override + public void read(final CompoundTag nbt, final HolderLookup.Provider registries, final boolean clientPacket) { + if (nbt.contains("Bracket")) { + this.shroud = null; + final BlockState readBlockState = NbtUtils.readBlockState( + this.blockEntity.blockHolderGetter(), + nbt.getCompound("Bracket") + ); + if (this.isBracketValid(readBlockState)) + this.shroud = readBlockState; + } + if (clientPacket && nbt.contains("Redraw")) + this.getWorld().sendBlockUpdated( + this.getPos(), + this.blockEntity.getBlockState(), + this.blockEntity.getBlockState(), + 16 + ); + super.read(nbt, registries, clientPacket); + } + +} diff --git a/src/main/java/com/kipti/bnb/content/decoration/truss/TrussBlockStateGen.java b/src/main/java/com/kipti/bnb/content/decoration/truss/TrussBlockStateGen.java index 9a4043d1..a27805ee 100644 --- a/src/main/java/com/kipti/bnb/content/decoration/truss/TrussBlockStateGen.java +++ b/src/main/java/com/kipti/bnb/content/decoration/truss/TrussBlockStateGen.java @@ -1,45 +1,15 @@ package com.kipti.bnb.content.decoration.truss; -import com.kipti.bnb.CreateBitsnBobs; import com.kipti.bnb.foundation.client.block_state_gen.BnbBlockStateGen; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.RegistrateBlockstateProvider; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.PipeBlock; import net.minecraft.world.level.block.RotatedPillarBlock; -import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.neoforged.neoforge.client.model.generators.ConfiguredModel; -import java.util.LinkedHashMap; -import java.util.Map; - public class TrussBlockStateGen { - public static void trussEncasedShaftModel(final DataGenContext ctx, - final RegistrateBlockstateProvider prov) { - prov.getVariantBuilder(ctx.get()) - .forAllStates(state -> { - final Direction.Axis trussAxis = state.getValue(TrussEncasedShaftBlock.TRUSS_AXIS); - final Direction.Axis shaftAxis = state.getValue(RotatedPillarBlock.AXIS); - final boolean alternating = state.getValue(TrussEncasedShaftBlock.ALTERNATING); - final Direction trussDir = Direction.fromAxisAndDirection( - trussAxis, - Direction.AxisDirection.POSITIVE - ); - final int rotX = trussDir.getAxis().isHorizontal() ? 90 : 0; - final int rotY = trussDir.getAxis().isVertical() ? 0 : (((int) trussDir.toYRot()) + 180) % 360; - final String alternatingPart = alternating ? "_alternating" : ""; - final String cutoutSuffix = getCutoutSuffix(trussAxis, shaftAxis); - final String modelPath = "block/industrial_truss/industrial_truss" + alternatingPart + cutoutSuffix; - return ConfiguredModel.builder() - .modelFile(prov.models().getExistingFile(CreateBitsnBobs.asResource(modelPath))) - .rotationX(rotX) - .rotationY(rotY) - .build(); - }); - } - public static void alternatingTrussModel(final DataGenContext ctx, final RegistrateBlockstateProvider prov) { @@ -59,85 +29,5 @@ public static void alternatingTrussModel(final DataGenCon .build(); }); } - - private static String getCutoutSuffix(final Direction.Axis trussAxis, final Direction.Axis shaftAxis) { - if (trussAxis == shaftAxis) - return ""; - if (shaftAxis == Direction.Axis.Y) - return "_cutout_z"; - if (shaftAxis == Direction.Axis.X) - return "_cutout_x"; - return trussAxis == Direction.Axis.Y ? "_cutout_z" : "_cutout_x"; - } - - public static void trussEncasedPipeModel(final DataGenContext ctx, - final RegistrateBlockstateProvider prov) { - for (final Direction.Axis trussAxis : Direction.Axis.values()) { - for (final boolean alternating : new boolean[]{false, true}) { - final Direction trussDir = Direction.fromAxisAndDirection(trussAxis, Direction.AxisDirection.POSITIVE); - final int rotX = trussDir.getAxis().isHorizontal() ? 90 : 0; - final int rotY = trussDir.getAxis().isVertical() ? 0 : (((int) trussDir.toYRot()) + 180) % 360; - - final String altPart = alternating ? "_alternating" : ""; - - prov.getMultipartBuilder(ctx.get()) - .part() - .modelFile(prov.models().getExistingFile( - CreateBitsnBobs.asResource("block/industrial_truss/industrial_truss_beams"))) - .rotationX(rotX).rotationY(rotY) - .addModel() - .condition(TrussPipeBlock.TRUSS_AXIS, trussAxis) - .condition(TrussPipeBlock.ALTERNATING, alternating) - .end(); - - final Map cutoutToWorld = getDirectionMapping(trussAxis); - for (final Map.Entry entry : cutoutToWorld.entrySet()) { - final String cutoutSuffix = entry.getKey(); - final Direction worldDir = entry.getValue(); - final BooleanProperty connectionProp = getConnectionProperty(worldDir); - final String modelPath = "block/industrial_truss/industrial_truss" + altPart + "_pipe_cutout_" + cutoutSuffix; - - prov.getMultipartBuilder(ctx.get()) - .part() - .modelFile(prov.models().getExistingFile( - CreateBitsnBobs.asResource(modelPath))) - .rotationX(rotX).rotationY(rotY) - .addModel() - .condition(TrussPipeBlock.TRUSS_AXIS, trussAxis) - .condition(TrussPipeBlock.ALTERNATING, alternating) - .condition(connectionProp, true) - .end(); - } - } - } - } - - private static Map getDirectionMapping(final Direction.Axis trussAxis) { - final Map map = new LinkedHashMap<>(); - switch (trussAxis) { - case Y: - map.put("z_pos", Direction.SOUTH); - map.put("z_neg", Direction.NORTH); - map.put("x_pos", Direction.EAST); - map.put("x_neg", Direction.WEST); - break; - case X: - map.put("z_pos", Direction.DOWN); - map.put("z_neg", Direction.UP); - map.put("x_pos", Direction.SOUTH); - map.put("x_neg", Direction.NORTH); - break; - case Z: - map.put("z_pos", Direction.DOWN); - map.put("z_neg", Direction.UP); - map.put("x_pos", Direction.EAST); - map.put("x_neg", Direction.WEST); - break; - } - return map; - } - - private static BooleanProperty getConnectionProperty(final Direction dir) { - return PipeBlock.PROPERTY_BY_DIRECTION.get(dir); - } + } diff --git a/src/main/java/com/kipti/bnb/content/decoration/truss/TrussEncasedShaftBlock.java b/src/main/java/com/kipti/bnb/content/decoration/truss/TrussEncasedShaftBlock.java deleted file mode 100644 index 7325b126..00000000 --- a/src/main/java/com/kipti/bnb/content/decoration/truss/TrussEncasedShaftBlock.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.kipti.bnb.content.decoration.truss; - -import com.kipti.bnb.content.kinetics.encased_blocks.BnbEncasedShaftBlock; -import com.kipti.bnb.registry.client.BnbShapes; -import com.kipti.bnb.registry.content.BnbBlockEntities; -import com.kipti.bnb.registry.content.blocks.deco.BnbDecorativeBlocks; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import com.simibubi.create.content.schematics.requirement.ItemRequirement; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.RotatedPillarBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; -import org.jetbrains.annotations.NotNull; - -public class TrussEncasedShaftBlock extends BnbEncasedShaftBlock { - - public static final EnumProperty TRUSS_AXIS = EnumProperty.create( - "truss_axis", - Direction.Axis.class - ); - public static final BooleanProperty ALTERNATING = TrussBlock.ALTERNATING; - - public TrussEncasedShaftBlock(final Properties properties) { - super(properties, BnbDecorativeBlocks.INDUSTRIAL_TRUSS::get); - this.registerDefaultState(this.defaultBlockState() - .setValue(TRUSS_AXIS, Direction.Axis.Y) - .setValue(ALTERNATING, false)); - } - - @Override - protected void createBlockStateDefinition(final StateDefinition.Builder builder) { - super.createBlockStateDefinition(builder); - builder.add(TRUSS_AXIS, ALTERNATING); - } - - @Override - protected @NotNull BlockState updateShape(final BlockState state, - final @NotNull Direction direction, - final @NotNull BlockState neighborState, - final @NotNull LevelAccessor level, - final @NotNull BlockPos pos, - final @NotNull BlockPos neighborPos) { - final Direction positiveAxis = Direction.get(Direction.AxisDirection.POSITIVE, state.getValue(TRUSS_AXIS)); - if (direction == positiveAxis) { - final boolean isAlternating = neighborState.hasProperty(ALTERNATING) && neighborState.getValue(ALTERNATING); - return state.setValue(ALTERNATING, !isAlternating); - } - return super.updateShape(state, direction, neighborState, level, pos, neighborPos); - } - - @Override - public @NotNull BlockState getStateForPlacement(final @NotNull BlockPlaceContext context) { - BlockState state = super.getStateForPlacement(context); - final Direction.Axis trussAxis = context.getNearestLookingDirection().getAxis(); - state = state.setValue(TRUSS_AXIS, trussAxis); - final Direction positiveAxis = Direction.get(Direction.AxisDirection.POSITIVE, trussAxis); - final BlockState neighborState = context.getLevel().getBlockState(context.getClickedPos().relative(positiveAxis)); - final boolean isAlternating = neighborState.hasProperty(ALTERNATING) && neighborState.getValue(ALTERNATING); - return state.setValue(ALTERNATING, !isAlternating); - } - - @Override - public BlockEntityType getBlockEntityType() { - return BnbBlockEntities.ENCASED_SHAFT.get(); - } - - @Override - protected VoxelShape getShape(final BlockState state, - final BlockGetter level, - final BlockPos pos, - final CollisionContext context) { - return BnbShapes.ALTERNATING_TRUSS.get(state.getValue(TRUSS_AXIS)); - } - - @Override - public InteractionResult onWrenched(final BlockState state, final UseOnContext context) { - final BlockState rotated = this.getRotatedBlockState(state, context.getClickedFace()); - if (!rotated.canSurvive(context.getLevel(), context.getClickedPos())) { - return InteractionResult.PASS; - } - KineticBlockEntity.switchToBlockState( - context.getLevel(), context.getClickedPos(), - this.updateAfterWrenched(rotated, context) - ); - if (context.getLevel().getBlockState(context.getClickedPos()) != state) { - IWrenchable.playRotateSound(context.getLevel(), context.getClickedPos()); - } - return InteractionResult.SUCCESS; - } - - @Override - public InteractionResult onSneakWrenched(final BlockState state, final UseOnContext context) { - if (context.getLevel().isClientSide) - return InteractionResult.SUCCESS; - context.getLevel().levelEvent(2001, context.getClickedPos(), Block.getId(state)); - KineticBlockEntity.switchToBlockState( - context.getLevel(), context.getClickedPos(), - BnbDecorativeBlocks.INDUSTRIAL_TRUSS.getDefaultState() - .setValue(RotatedPillarBlock.AXIS, state.getValue(TRUSS_AXIS)) - .setValue(ALTERNATING, state.getValue(ALTERNATING)) - ); - if (context.getPlayer() != null && !context.getPlayer().isCreative()) - context.getPlayer().getInventory().placeItemBackInInventory(AllBlocks.SHAFT.asStack()); - return InteractionResult.SUCCESS; - } - - @Override - public ItemRequirement getRequiredItems(final BlockState state, final BlockEntity be) { - return ItemRequirement.of(AllBlocks.SHAFT.getDefaultState(), be) - .union(ItemRequirement.of(BnbDecorativeBlocks.INDUSTRIAL_TRUSS.getDefaultState(), be)); - } -} diff --git a/src/main/java/com/kipti/bnb/content/decoration/truss/TrussPipeBlock.java b/src/main/java/com/kipti/bnb/content/decoration/truss/TrussPipeBlock.java deleted file mode 100644 index 2072a61d..00000000 --- a/src/main/java/com/kipti/bnb/content/decoration/truss/TrussPipeBlock.java +++ /dev/null @@ -1,209 +0,0 @@ -package com.kipti.bnb.content.decoration.truss; - -import com.kipti.bnb.content.decoration.dyeable.DyeableTransitionHelper; -import com.kipti.bnb.registry.client.BnbShapes; -import com.kipti.bnb.registry.content.BnbBlockEntities; -import com.kipti.bnb.registry.content.blocks.deco.BnbDecorativeBlocks; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.api.schematic.requirement.SpecialBlockItemRequirement; -import com.simibubi.create.content.contraptions.StructureTransform; -import com.simibubi.create.content.decoration.encasing.EncasedBlock; -import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.content.fluids.FluidTransportBehaviour; -import com.simibubi.create.content.fluids.pipes.EncasedPipeBlock; -import com.simibubi.create.content.fluids.pipes.FluidPipeBlock; -import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity; -import com.simibubi.create.content.schematics.requirement.ItemRequirement; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.LevelEvent; -import net.minecraft.world.level.block.RotatedPillarBlock; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraft.world.level.pathfinder.PathComputationType; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class TrussPipeBlock extends FluidPipeBlock implements EncasedBlock, SpecialBlockItemRequirement { - - public static final EnumProperty TRUSS_AXIS = EnumProperty.create( - "truss_axis", - Direction.Axis.class - ); - public static final BooleanProperty ALTERNATING = TrussBlock.ALTERNATING; - - public TrussPipeBlock(final Properties properties) { - super(properties); - this.registerDefaultState(this.defaultBlockState() - .setValue(TRUSS_AXIS, Direction.Axis.Y) - .setValue(ALTERNATING, false)); - } - - @Override - protected void createBlockStateDefinition(final StateDefinition.@NotNull Builder builder) { - super.createBlockStateDefinition(builder); - builder.add(TRUSS_AXIS, ALTERNATING); - } - - @Override - public @NotNull BlockState getStateForPlacement(final @NotNull BlockPlaceContext context) { - BlockState state = super.getStateForPlacement(context); - final Direction.Axis trussAxis = context.getNearestLookingDirection().getAxis(); - state = state.setValue(TRUSS_AXIS, trussAxis); - final Direction positiveAxis = Direction.get(Direction.AxisDirection.POSITIVE, trussAxis); - final BlockState neighborState = context.getLevel().getBlockState(context.getClickedPos().relative(positiveAxis)); - final boolean isAlternating = neighborState.hasProperty(ALTERNATING) && neighborState.getValue(ALTERNATING); - return state.setValue(ALTERNATING, !isAlternating); - } - - @Override - public @NotNull BlockState updateShape(final @NotNull BlockState state, - final @NotNull Direction direction, - final @NotNull BlockState neighborState, - final @NotNull LevelAccessor level, - final @NotNull BlockPos pos, - final @NotNull BlockPos neighborPos) { - final Direction positiveAxis = Direction.get(Direction.AxisDirection.POSITIVE, state.getValue(TRUSS_AXIS)); - BlockState updatedState = state; - if (direction == positiveAxis) { - final boolean isAlternating = neighborState.hasProperty(ALTERNATING) && neighborState.getValue(ALTERNATING); - updatedState = updatedState.setValue(ALTERNATING, !isAlternating); - } - return super.updateShape(updatedState, direction, neighborState, level, pos, neighborPos); - } - - @Override - public BlockEntityType getBlockEntityType() { - return BnbBlockEntities.ENCASED_PIPE.get(); - } - - @Override - public Block getCasing() { - return BnbDecorativeBlocks.INDUSTRIAL_TRUSS.get(); - } - - @Override - public void handleEncasing(final BlockState state, - final Level level, - final BlockPos pos, - final ItemStack heldItem, - final Player player, - final InteractionHand hand, - final BlockHitResult ray) { - DyeableTransitionHelper.saveCurrentDye(level, pos); - FluidTransportBehaviour.cacheFlows(level, pos); - BlockState encased = EncasedPipeBlock.transferSixWayProperties(state, this.defaultBlockState()) - .setValue(BlockStateProperties.WATERLOGGED, state.getValue(BlockStateProperties.WATERLOGGED)); - final Direction.Axis trussAxis = player.getNearestViewDirection().getAxis(); - encased = encased.setValue(TRUSS_AXIS, trussAxis); - final Direction positiveAxis = Direction.get(Direction.AxisDirection.POSITIVE, trussAxis); - final BlockState neighborState = level.getBlockState(pos.relative(positiveAxis)); - final boolean isAlternating = neighborState.hasProperty(ALTERNATING) && neighborState.getValue(ALTERNATING); - encased = encased.setValue(ALTERNATING, !isAlternating); - level.setBlockAndUpdate(pos, encased); - FluidTransportBehaviour.loadFlows(level, pos); - DyeableTransitionHelper.applyPreviousDye(level, pos); - } - - @Override - public @NotNull InteractionResult onWrenched(final BlockState state, final UseOnContext context) { - return InteractionResult.PASS; - } - - @Override - public InteractionResult onSneakWrenched(final BlockState state, final UseOnContext context) { - if (context.getLevel().isClientSide) { - return InteractionResult.SUCCESS; - } - - final Level level = context.getLevel(); - final BlockPos pos = context.getClickedPos(); - - level.levelEvent(LevelEvent.PARTICLES_DESTROY_BLOCK, pos, Block.getId(state)); - level.setBlockAndUpdate( - pos, BnbDecorativeBlocks.INDUSTRIAL_TRUSS.getDefaultState() - .setValue(RotatedPillarBlock.AXIS, state.getValue(TRUSS_AXIS)) - .setValue(TrussBlock.ALTERNATING, state.getValue(ALTERNATING)) - ); - - if (context.getPlayer() != null && !context.getPlayer().isCreative()) { - context.getPlayer().getInventory().placeItemBackInInventory(AllBlocks.FLUID_PIPE.asStack()); - } - IWrenchable.playRemoveSound(level, pos); - return InteractionResult.SUCCESS; - } - - @Override - public @NotNull ItemStack getCloneItemStack(final @NotNull BlockState state, - final @NotNull HitResult target, - final @NotNull LevelReader level, - final @NotNull BlockPos pos, - final @NotNull Player player) { - return AllBlocks.FLUID_PIPE.asStack(); - } - - @Override - public ItemRequirement getRequiredItems(final BlockState state, final @Nullable BlockEntity blockEntity) { - return ItemRequirement.of(AllBlocks.FLUID_PIPE.getDefaultState(), blockEntity) - .union(ItemRequirement.of(BnbDecorativeBlocks.INDUSTRIAL_TRUSS.getDefaultState(), blockEntity)); - } - - @Override - protected @NotNull VoxelShape getShape(final @NotNull BlockState state, - final @NotNull BlockGetter level, - final @NotNull BlockPos pos, - final @NotNull CollisionContext context) { - return BnbShapes.ALTERNATING_TRUSS.get(state.getValue(TRUSS_AXIS)); - } - - @Override - protected boolean isPathfindable(final @NotNull BlockState state, - final @NotNull PathComputationType type) { - return false; - } - - @Override - public @NotNull BlockState rotate(final @NotNull BlockState state, final @NotNull Rotation rotation) { - BlockState rotated = super.rotate(state, rotation); - final Direction.Axis trussAxis = state.getValue(TRUSS_AXIS); - if (rotation == Rotation.CLOCKWISE_90 || rotation == Rotation.COUNTERCLOCKWISE_90) { - if (trussAxis == Direction.Axis.X) { - rotated = rotated.setValue(TRUSS_AXIS, Direction.Axis.Z); - } else if (trussAxis == Direction.Axis.Z) { - rotated = rotated.setValue(TRUSS_AXIS, Direction.Axis.X); - } - } - return rotated; - } - - @Override - public @NotNull BlockState transform(final BlockState state, final StructureTransform transform) { - final Direction trussDir = Direction.fromAxisAndDirection( - state.getValue(TRUSS_AXIS), - Direction.AxisDirection.POSITIVE - ); - final Direction newTrussDir = transform.rotateFacing(trussDir); - return super.transform(state, transform).setValue(TRUSS_AXIS, newTrussDir.getAxis()); - } -} diff --git a/src/main/java/com/kipti/bnb/registry/client/BnbPartialModels.java b/src/main/java/com/kipti/bnb/registry/client/BnbPartialModels.java index b62c0b45..43849676 100644 --- a/src/main/java/com/kipti/bnb/registry/client/BnbPartialModels.java +++ b/src/main/java/com/kipti/bnb/registry/client/BnbPartialModels.java @@ -41,9 +41,11 @@ public class BnbPartialModels { GIGANTIC_COGWHEEL = block("gigantic_cogwheel/cogwheel"), - INDUSTRIAL_TRUSS_PANEL = block("industrial_truss/industrial_truss_panel"), + INDUSTRIAL_TRUSS_BEAMS = block("industrial_truss/industrial_truss_beams"), + INDUSTRIAL_TRUSS_PANEL = block("industrial_truss/industrial_truss_panel"), + INDUSTRIAL_TRUSS_PIPE_CUTOUT = block("industrial_truss/industrial_truss_pipe_cutout"), - THROTTLE_LEVER_HANDLE = block("throttle_lever/handle"); + THROTTLE_LEVER_HANDLE = block("throttle_lever/handle"); public static final Map WEATHERED_METAL_GIRDER_BRACKETS = new EnumMap<>(Direction.class); diff --git a/src/main/java/com/kipti/bnb/registry/content/BnbBlockEntities.java b/src/main/java/com/kipti/bnb/registry/content/BnbBlockEntities.java index 260d1856..47d72af4 100644 --- a/src/main/java/com/kipti/bnb/registry/content/BnbBlockEntities.java +++ b/src/main/java/com/kipti/bnb/registry/content/BnbBlockEntities.java @@ -24,9 +24,7 @@ import com.kipti.bnb.registry.content.blocks.deco.BnbDecorativeBlocks; import com.kipti.bnb.registry.content.blocks.encased.BnbEncasedListBlocks; import com.kipti.bnb.registry.content.blocks.encased.BnbExtraEncasedBlocks; -import com.kipti.bnb.registry.content.blocks.encased.BnbSpecialEncasedBlocks; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.content.kinetics.base.ShaftRenderer; @@ -66,20 +64,20 @@ public class BnbBlockEntities { .validBlocks( BnbDecorativeBlocks.WEATHERED_METAL_GIRDER_ENCASED_SHAFT, BnbExtraEncasedBlocks.INDUSTRIAL_IRON_ENCASED_SHAFT, - BnbExtraEncasedBlocks.WEATHERED_IRON_ENCASED_SHAFT, - BnbSpecialEncasedBlocks.INDUSTRIAL_GRATING_PANEL + BnbExtraEncasedBlocks.WEATHERED_IRON_ENCASED_SHAFT +// BnbSpecialEncasedBlocks.INDUSTRIAL_GRATING_PANEL // BnbDecorativeBlocks.INDUSTRIAL_TRUSS_ENCASED_SHAFT ) .renderer(() -> ShaftRenderer::new) .register(); - - public static final BlockEntityEntry ENCASED_PIPE = REGISTRATE - .blockEntity("encased_pipe", FluidPipeBlockEntity::new) - .validBlocks( - BnbSpecialEncasedBlocks.INDUSTRIAL_GRATING_PANEL_PIPE +// +// public static final BlockEntityEntry ENCASED_PIPE = REGISTRATE +// .blockEntity("encased_pipe", FluidPipeBlockEntity::new) +// .validBlocks( +// BnbSpecialEncasedBlocks.INDUSTRIAL_GRATING_PANEL_PIPE, // BnbDecorativeBlocks.INDUSTRIAL_TRUSS_ENCASED_PIPE - ) - .register(); +// ) +// .register(); public static final BlockEntityEntry ENCASED_COGWHEEL = REGISTRATE .blockEntity("encased_cogwheel", SimpleKineticBlockEntity::new) diff --git a/src/main/java/com/kipti/bnb/registry/content/blocks/deco/BnbDecorativeBlocks.java b/src/main/java/com/kipti/bnb/registry/content/blocks/deco/BnbDecorativeBlocks.java index 067181c7..0f1c1e65 100644 --- a/src/main/java/com/kipti/bnb/registry/content/blocks/deco/BnbDecorativeBlocks.java +++ b/src/main/java/com/kipti/bnb/registry/content/blocks/deco/BnbDecorativeBlocks.java @@ -43,6 +43,8 @@ @IncludeLangDefaults({ @LangDefault(key = "block.bits_n_bobs.girder_strut.tooltip.summary", value = "A type of girder used to span a distance _between two anchor points_."), + @LangDefault(key = "block.bits_n_bobs.industrial_truss.tooltip.summary", value = "This one is uhh missing stuff to encase pipes and shafts so stay attuned"), + @LangDefault(key = "block.bits_n_bobs.industrial_grating_panel.tooltip.summary", value = "This one is uhh missing stuff to encase pipes and shafts so stay attuned"), @LangDefault(key = "message.bits_n_bobs.girder_strut.missing_anchors", value = "You need %s more Girder Struts"), }) public class BnbDecorativeBlocks { @@ -286,34 +288,6 @@ public class BnbDecorativeBlocks { // )) // )) // .addLayer(() -> RenderType::cutout) -// .register(); -// -// public static final BlockEntry INDUSTRIAL_TRUSS_ENCASED_PIPE = CreateBitsnBobs.REGISTRATE.block( -// "industrial_truss_encased_pipe", -// TrussPipeBlock::new -// ) -// .properties(p -> p.mapColor(MapColor.METAL) -// .strength(0.1f, 6.0f) -// .sound(SoundType.METAL) -// .isSuffocating((state, level, pos) -> false) -// .isViewBlocking((state, level, pos) -> false) -// .noOcclusion()) -// .transform(TagGen.pickaxeOnly()) -// .blockstate(TrussBlockStateGen::trussBeamsBaseModel) -// .onRegister(CreateRegistrate.blockModel(() -> TrussPipeModel::new)) -// .addLayer(() -> RenderType::cutout) -// .loot((p, b) -> p.add( -// b, p.createSingleItemTable(INDUSTRIAL_TRUSS.get()) -// .withPool(p.applyExplosionCondition( -// AllBlocks.FLUID_PIPE.get(), LootPool.lootPool() -// .setRolls(ConstantValue -// .exactly(1.0F)) -// .add(LootItem.lootTableItem( -// AllBlocks.FLUID_PIPE -// .get())) -// )) -// )) -// .transform(EncasingRegistry.addVariantTo(AllBlocks.FLUID_PIPE)) // .register(); public static void register() { diff --git a/src/main/java/com/kipti/bnb/registry/content/blocks/encased/BnbSpecialEncasedBlocks.java b/src/main/java/com/kipti/bnb/registry/content/blocks/encased/BnbSpecialEncasedBlocks.java index 8cfc6ebc..0571ea47 100644 --- a/src/main/java/com/kipti/bnb/registry/content/blocks/encased/BnbSpecialEncasedBlocks.java +++ b/src/main/java/com/kipti/bnb/registry/content/blocks/encased/BnbSpecialEncasedBlocks.java @@ -1,78 +1,7 @@ package com.kipti.bnb.registry.content.blocks.encased; -import com.kipti.bnb.CreateBitsnBobs; -import com.kipti.bnb.content.decoration.grating.GratingBlockStateGen; -import com.kipti.bnb.content.decoration.grating.GratingPipePanelBlock; -import com.kipti.bnb.content.decoration.grating.GratingEncasedShaftBlock; -import com.kipti.bnb.content.decoration.grating.GratingPanelCTBehaviour; -import com.kipti.bnb.registry.client.BnbSpriteShifts; -import com.kipti.bnb.registry.content.blocks.deco.BnbDecorativeBlocks; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.decoration.encasing.EncasingRegistry; -import com.simibubi.create.content.fluids.PipeAttachmentModel; -import com.simibubi.create.foundation.data.CreateRegistrate; -import com.simibubi.create.foundation.data.TagGen; -import com.tterrag.registrate.util.entry.BlockEntry; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.material.MapColor; -import net.minecraft.world.level.storage.loot.LootPool; -import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; - -import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; - public class BnbSpecialEncasedBlocks { - public static final BlockEntry INDUSTRIAL_GRATING_PANEL = CreateBitsnBobs.REGISTRATE.block("industrial_grating_panel_encased_shaft", GratingEncasedShaftBlock::new) - .properties(p -> p.mapColor(MapColor.METAL) - .noOcclusion() - .strength(0.1f, 6.0f) - .sound(SoundType.METAL) - .isSuffocating((state, level, pos) -> false) - .isViewBlocking((state, level, pos) -> false) - ) - .transform(TagGen.pickaxeOnly()) - .blockstate(GratingBlockStateGen::gratingEncasedShaftBlock) - .onRegister(connectedTextures(() -> new GratingPanelCTBehaviour(BnbSpriteShifts.INDUSTRIAL_GRATING))) - .onRegister(connectedTextures(() -> new GratingPanelCTBehaviour(BnbSpriteShifts.INDUSTRIAL_GRATING_CUTOUT))) - .addLayer(() -> RenderType::cutout) - .loot((p, b) -> p.add( - b, p.createSingleItemTable(BnbDecorativeBlocks.INDUSTRIAL_GRATING_PANEL.get()) - .withPool(p.applyExplosionCondition( - AllBlocks.SHAFT.get(), LootPool.lootPool() - .setRolls(ConstantValue.exactly(1.0F)) - .add(LootItem.lootTableItem(AllBlocks.SHAFT.get())) - )) - )) - .transform(EncasingRegistry.addVariantTo(AllBlocks.SHAFT)) - .register(); - - public static final BlockEntry INDUSTRIAL_GRATING_PANEL_PIPE = CreateBitsnBobs.REGISTRATE.block("industrial_grating_panel_encased_pipe", GratingPipePanelBlock::new) - .properties(p -> p.mapColor(MapColor.METAL) - .noOcclusion() - .strength(0.1f, 6.0f) - .sound(SoundType.METAL) - .isSuffocating((state, level, pos) -> false) - .isViewBlocking((state, level, pos) -> false) - ) - .transform(TagGen.pickaxeOnly()) - .blockstate(GratingBlockStateGen::gratingEncasedPipeBlock) - .onRegister(connectedTextures(() -> new GratingPanelCTBehaviour(BnbSpriteShifts.INDUSTRIAL_GRATING))) - .onRegister(connectedTextures(() -> new GratingPanelCTBehaviour(BnbSpriteShifts.INDUSTRIAL_GRATING_PIPE_CUTOUT))) - .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withAO)) - .loot((p, b) -> p.add( - b, p.createSingleItemTable(BnbDecorativeBlocks.INDUSTRIAL_GRATING_PANEL.get()) - .withPool(p.applyExplosionCondition( - AllBlocks.FLUID_PIPE.get(), LootPool.lootPool() - .setRolls(ConstantValue.exactly(1.0F)) - .add(LootItem.lootTableItem(AllBlocks.FLUID_PIPE.get())) - )) - )) - .addLayer(() -> RenderType::cutout) - .transform(EncasingRegistry.addVariantTo(AllBlocks.FLUID_PIPE)) - .register(); - public static void register() { } diff --git a/src/main/java/com/kipti/bnb/registry/core/BnbFeatureFlag.java b/src/main/java/com/kipti/bnb/registry/core/BnbFeatureFlag.java index e7e3bdb4..b3030c79 100644 --- a/src/main/java/com/kipti/bnb/registry/core/BnbFeatureFlag.java +++ b/src/main/java/com/kipti/bnb/registry/core/BnbFeatureFlag.java @@ -6,7 +6,6 @@ import com.kipti.bnb.registry.content.blocks.BnbTrinketBlocks; import com.kipti.bnb.registry.content.blocks.deco.BnbDecorativeBlocks; import com.kipti.bnb.registry.content.blocks.encased.BnbExtraEncasedBlocks; -import com.kipti.bnb.registry.content.blocks.encased.BnbSpecialEncasedBlocks; import com.kipti.bnb.registry.worldgen.BnbPaletteStoneTypes; import com.simibubi.create.foundation.block.DyedBlockList; import com.tterrag.registrate.util.entry.BlockEntry; @@ -101,20 +100,19 @@ public enum BnbFeatureFlag { INDUSTRIAL_GRATING( FeatureCategories.BLOCK, "Availability of the industrial grating blocks.", - true, BnbDecorativeBlocks.INDUSTRIAL_GRATING::get, - BnbDecorativeBlocks.INDUSTRIAL_GRATING_PANEL::get, - BnbSpecialEncasedBlocks.INDUSTRIAL_GRATING_PANEL::get, - BnbSpecialEncasedBlocks.INDUSTRIAL_GRATING_PANEL_PIPE::get + BnbDecorativeBlocks.INDUSTRIAL_GRATING_PANEL::get +// BnbSpecialEncasedBlocks.INDUSTRIAL_GRATING_PANEL::get, +// BnbSpecialEncasedBlocks.INDUSTRIAL_GRATING_PANEL_PIPE::get ), INDUSTRIAL_TRUSS( - FeatureCategories.BLOCK, "Availability of the industrial truss blocks.", true, + FeatureCategories.BLOCK, "Availability of the industrial truss blocks.", BnbDecorativeBlocks.INDUSTRIAL_TRUSS::get // BnbDecorativeBlocks.INDUSTRIAL_TRUSS_ENCASED_SHAFT::get, // BnbDecorativeBlocks.INDUSTRIAL_TRUSS_ENCASED_PIPE::get ), COGWHEEL_CHAIN_CARRIAGE( - FeatureCategories.BLOCK, "Availability of the Cogwheel Chain Carriage block.", true, + FeatureCategories.BLOCK, "Availability of the Cogwheel Chain Carriage block.", BnbKineticBlocks.COGWHEEL_CHAIN_CARRIAGE::get ), THROTTLE_LEVER(