Resolved merge conflicts - Does not Build

This commit is contained in:
Bob Dole 2020-10-30 03:06:15 -04:00
commit c739fdbb09
116 changed files with 3500 additions and 675 deletions

View file

@ -56,6 +56,7 @@ dc76bca1fdd41c8e6ada27fd59a2b73d7adc9596 assets/create/blockstates/copper_shingl
ecf4a72411870bfdbf8a59469b114cd77621c343 assets/create/blockstates/copper_tiles.json
890be245b914c1a9f29f48a8c5d325640b5be160 assets/create/blockstates/copper_valve_handle.json
3df0d5d5170a2f6cbab0f8a9bc8f2d64229589af assets/create/blockstates/creative_crate.json
da3f1203dd0b0096ce19e09705060a0ed0478bee assets/create/blockstates/creative_fluid_tank.json
f0031f5e970b3d5695472ed384950b8631b015ed assets/create/blockstates/creative_motor.json
fe2f78b94c20944399101e7369e2d43324297fb6 assets/create/blockstates/crushing_wheel.json
a1dd6cb3daa97ea871290ef7b178d28b564ee2a2 assets/create/blockstates/crushing_wheel_controller.json
@ -174,6 +175,8 @@ f4a0fc68e8daaa0a47cdc951ced4310057a874b0 assets/create/blockstates/green_valve_h
6ab675fa06317e6d07c0c1a453e7bb43e3f46b3b assets/create/blockstates/hand_crank.json
be3bef7e091d8b50bfc1c6b7275946d1f636aefd assets/create/blockstates/horizontal_framed_glass.json
18d9fdaa1352a7e2ec91135e46dae5c02ccd8f8f assets/create/blockstates/horizontal_framed_glass_pane.json
30ec347dfc827a9ae52cf3da964b828005acede1 assets/create/blockstates/hose_pulley.json
6651c84ea621777d572a3d7aa13b75d9f061191b assets/create/blockstates/item_drain.json
5d851c90d23de5087ce546d4bbe509e112b84c49 assets/create/blockstates/jungle_window.json
b15bea757ef981e0ca60f740ca234ee2014eb7b7 assets/create/blockstates/jungle_window_pane.json
f651091db216b009b3379b2f48d56d03481c8675 assets/create/blockstates/large_cogwheel.json
@ -288,12 +291,8 @@ e1eca91fdcf60b8ac0c2b8cdf6674046b0bc55f4 assets/create/blockstates/paved_limesto
c17d334e938dcb742550ba8307ca8266a1fc9b49 assets/create/blockstates/paved_weathered_limestone.json
cb23aef25f3106b06c8fa8f152c638bb0d2185d8 assets/create/blockstates/paved_weathered_limestone_slab.json
d62b0992cec1de45dad1f2c273132225f4ef33a0 assets/create/blockstates/paved_weathered_limestone_stairs.json
<<<<<<< HEAD
e29e245d06c46dac94fcd0e01a9bf7fa8e02fb87 assets/create/blockstates/paved_weathered_limestone_wall.json
=======
dba4cf86e82ed4502fffed363fbce226a445e774 assets/create/blockstates/paved_weathered_limestone_wall.json
30971f2f76fe56f144178c33ad6bde5fc9fb61c3 assets/create/blockstates/pink_sail.json
>>>>>>> mc1.15/dev
919a79e4a4a5fab0aac3ef48e1c786017d6aa001 assets/create/blockstates/pink_seat.json
471a3bb474a0ae0453143888d561256cce894e3f assets/create/blockstates/pink_valve_handle.json
975c97018e9e2419943eaab43aed0970e96feaf7 assets/create/blockstates/piston_extension_pole.json
@ -329,12 +328,8 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl
d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json
<<<<<<< HEAD
d2e6f19325be65457e94bea44fd52863c0f66be7 assets/create/blockstates/radial_chassis.json
=======
bdd56f32ce0a148b6e466a55ab2777f69fc08cfc assets/create/blockstates/radial_chassis.json
45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json
>>>>>>> mc1.15/dev
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json
8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json
@ -394,43 +389,23 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
<<<<<<< HEAD
33f621fe1a09a46426af59c9352c33e97c2bc00d assets/create/lang/en_ud.json
25fba2944b4a86281bc40fddba4a8136d53e3c26 assets/create/lang/en_us.json
52ad08a48ec59354f826b9cfe7eb6ea79ec7bab9 assets/create/lang/unfinished/de_de.json
62bf8e59e095e3c5dfc0a00f68b25de09cbd1b7e assets/create/lang/unfinished/fr_fr.json
4fb16e3e63bd5df457d7c77c6290b4ce595fd4a8 assets/create/lang/unfinished/it_it.json
654032efb15080b3824536cc4a0b32507b006264 assets/create/lang/unfinished/ja_jp.json
fec915edfbc9bca029dcbd6b5bdd7f9c777fb08b assets/create/lang/unfinished/ko_kr.json
8de3030ee744fe793ad2c27c5f9f2e7a3b933e3c assets/create/lang/unfinished/nl_nl.json
5cebc2913e4c04b496e00e0841474118c7709c4e assets/create/lang/unfinished/pt_br.json
68beb3243e78a3f34426229286f97a7cf2f3e489 assets/create/lang/unfinished/ru_ru.json
bf38c2b2063126ca3c3ed9183726665c8aaea419 assets/create/lang/unfinished/zh_cn.json
487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json
b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json
3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json
1358ff546e99004444fccca5355853d1738ef191 assets/create/models/block/acacia_window_pane_post.json
bd33b944ec6ad89850a1d275b3d2843fe6f831cc assets/create/models/block/acacia_window_pane_side.json
b272035cd746364a0bd3bf13061f51190e9b46d6 assets/create/models/block/acacia_window_pane_side_alt.json
=======
ad168f04d430ebd783a845e5928c3273da3f0074 assets/create/lang/en_ud.json
25b02b7b025f988b0cda9655b2c586c82dfd369c assets/create/lang/en_us.json
cf9075cacdbd171b33fa0b6cb68365e2c3614b40 assets/create/lang/unfinished/de_de.json
87ea3d2da2863fa61c5d5b9f535aac8c1703be28 assets/create/lang/unfinished/fr_fr.json
3349f2726256c99abd7e5268faa806b628d91e4d assets/create/lang/unfinished/it_it.json
3cf205e25543b7860d6b00f2f91dd799333b9d74 assets/create/lang/unfinished/ja_jp.json
d112e8b804ca16511c4096b328f3635b4c84a3e9 assets/create/lang/unfinished/ko_kr.json
78791855041e56a27fb3520b289ca8a144de98ad assets/create/lang/unfinished/nl_nl.json
d92ac1ec1ebbad873dd6563509767428603b6ba2 assets/create/lang/unfinished/pt_br.json
5d4f30e05fea3bec9c6c85a5f7767eb3dd0a7dfe assets/create/lang/unfinished/ru_ru.json
46996569e164858a5f9dc7f60731707d3517b888 assets/create/lang/unfinished/zh_cn.json
6fe6c50ae75a9c89c90d3423bc74f3e628bc213a assets/create/lang/en_ud.json
b054eb6cf72ac04fbb2512569effa84768adef74 assets/create/lang/en_us.json
cf432c7dcf9b91769a570242a59c12ecca79a091 assets/create/lang/unfinished/de_de.json
5a2e2499696f45b1f95feeaa702119b8e1b371eb assets/create/lang/unfinished/fr_fr.json
12ac01a6f21c536aa09599c36139f593cbbf7d1f assets/create/lang/unfinished/it_it.json
3e65e163c658e4f34124807716b009e1907187cc assets/create/lang/unfinished/ja_jp.json
4dfeba1d56d8ad688442d2ca026dfa16147178ef assets/create/lang/unfinished/ko_kr.json
3d114a874d1c198ecf0978fd13b98249536cc684 assets/create/lang/unfinished/nl_nl.json
3434f2d429bdf64dcbc915c0365e20250b64d819 assets/create/lang/unfinished/pt_br.json
0bfd9476411fc565a3011ffc43eecaca3f0e53ff assets/create/lang/unfinished/ru_ru.json
d7150e9c65d74f41e2dc65daadf003dc200e512c assets/create/lang/unfinished/zh_cn.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json
7d23c8e4543108f5f53b78ccb4908f7a5bb76c54 assets/create/models/block/acacia_window_pane_post.json
3bdcc6bd616a179ffc22e66307aab538e9bcb75f assets/create/models/block/acacia_window_pane_side.json
7b5b6809e3ef685a497ba15b549d3918aeb6c135 assets/create/models/block/acacia_window_pane_side_alt.json
>>>>>>> mc1.15/dev
7c81658c8839fdb23429e54f847c2a0aee0e866e assets/create/models/block/adjustable_pulley_end_horizontal.json
20cfb751fc395a0e07c66ce87ab035207f9d1e0e assets/create/models/block/adjustable_pulley_end_horizontal_powered.json
bb02f94b260be8fe1944b801cc4050b4d213f1df assets/create/models/block/adjustable_pulley_end_vertical.json
@ -476,20 +451,6 @@ aa5b45c6c657436bd38621344f6728d44ea974ad assets/create/models/block/andesite_cob
7c0e71f479aeef7bf02f0fb76c4333fa2227b83e assets/create/models/block/andesite_cobblestone_wall_side_tall.json
51e851b15870c0922cfbe911ef1a2f22062969f3 assets/create/models/block/andesite_funnel.json
f28da6703691f1b08cfb49208f0f7bb0c5ca816d assets/create/models/block/andesite_funnel_powered.json
<<<<<<< HEAD
f77390658e8aeed4352e47b94fd24df116ea1857 assets/create/models/block/andesite_pillar.json
2294f74b5c30430de89a345af60f6669c975f33a assets/create/models/block/andesite_tunnel/cross.json
17f860947f51e84a3f9b32b10cdf61f863db3afc assets/create/models/block/andesite_tunnel/straight.json
e74aa39f8142293c202e57dbd92e8660818b18b5 assets/create/models/block/andesite_tunnel/t_left.json
c93978d636fe70d456a6e1914b65527cbc18544c assets/create/models/block/andesite_tunnel/t_right.json
2a86780c6825edce8fbdaa118a267fc09ce410b0 assets/create/models/block/andesite_tunnel/window.json
0ce09f6fdfb07dead5936c118efb4064f2f6f50f assets/create/models/block/birch_window.json
a5f0ed76e27d2ca706445f7f7c5f9270f98e34f9 assets/create/models/block/birch_window_pane_noside.json
9ad5224419ab7165c5208852bc4a4a5e65dcbf83 assets/create/models/block/birch_window_pane_noside_alt.json
f40c4d4ea6c037158f4b9862a7c11e6024a261e6 assets/create/models/block/birch_window_pane_post.json
dbfd2a996820d885d9741a3f168aa36c3538cfbd assets/create/models/block/birch_window_pane_side.json
557b35671ec417597259ba8d0239fe18c14c3d20 assets/create/models/block/birch_window_pane_side_alt.json
=======
b1d0bb538fc8285b7d3fd77a977d78a104b83b62 assets/create/models/block/andesite_pillar.json
aaf2e4259bcfcedd3400e9acb2d64c0cf06f7fb1 assets/create/models/block/andesite_tunnel/cross.json
75f628178fa21a2bd301eea8d1cebf7e94f7d5cc assets/create/models/block/andesite_tunnel/straight.json
@ -503,7 +464,6 @@ e2801a0c3fe8e1c2485291485b977f581fdc8b7c assets/create/models/block/andesite_tun
62b3f2edc5ef5d7dabbcff19220921b0e3582376 assets/create/models/block/birch_window_pane_side.json
95d4230eb366f5e7684820c9337e3956ed34042a assets/create/models/block/birch_window_pane_side_alt.json
2b59d6f937cd542eba670689c30fe16887dfd9a0 assets/create/models/block/black_sail.json
>>>>>>> mc1.15/dev
97d79ab99c0fb278a9b5dc54e1c6563868f87b76 assets/create/models/block/black_seat.json
02747ea1a0e5d4a1cd466bf26878885a89d347fa assets/create/models/block/black_valve_handle.json
d876627b6e519c6f3f59c7c27cc7b0f903206f7c assets/create/models/block/blue_sail.json
@ -529,16 +489,6 @@ a0612a633756433e1b37ddc6d290aa1fc07839ef assets/create/models/block/brass_tunnel
8ab097caaa0db0915ae9254f7d65092d9171bc60 assets/create/models/block/brown_sail.json
4eed0ad902f5e84f2b6c160f3283e8028640e77d assets/create/models/block/brown_seat.json
6c39677f8c3a84280835c717ea1ef569b7c76a1b assets/create/models/block/brown_valve_handle.json
<<<<<<< HEAD
db7279f05c1d89e21da8887a15d3a1cfff4a9cf2 assets/create/models/block/chiseled_dark_scoria.json
22d4ad2de48739ab754f8dfcd6f84ad2267abf8b assets/create/models/block/chiseled_dolomite.json
550dc0622377b4736610b1c924dc890c857a0fd0 assets/create/models/block/chiseled_gabbro.json
1deb93125b9a8cac79bec1f4ea5345d6ea857656 assets/create/models/block/chiseled_limestone.json
1cf4b68c8cf1885ede334fbfa54e52c76ba211b6 assets/create/models/block/chiseled_scoria.json
041a20dd674277ff4f1613a0a89600f05458edf4 assets/create/models/block/chiseled_weathered_limestone.json
f9a3f0939ea43b404eb2826b94211a25fca5ebc2 assets/create/models/block/clockwork_bearing.json
1f01a4b6608f75145734b60ddf4a33ce318425ff assets/create/models/block/copper_casing.json
=======
028a07b49c05fe8a93f1d8c229d81e73d887c2df assets/create/models/block/chiseled_dark_scoria.json
b1f9ee4867373dd8f976625bab744a1c72c7fd16 assets/create/models/block/chiseled_dolomite.json
cd7751090cf3d55296b8e415d0af9b6f18d69770 assets/create/models/block/chiseled_gabbro.json
@ -547,7 +497,6 @@ ac07568fa7b2d3fa84d0fe89a498514d30514291 assets/create/models/block/chiseled_sco
ecb2b85ee210dce329d2be66b98d0f0d4e6fc223 assets/create/models/block/chiseled_weathered_limestone.json
30fe120af3cb32faf0729df4d2cdf868f804be17 assets/create/models/block/clockwork_bearing.json
70406933cc4fa5471af6e562fd84a397347dba17 assets/create/models/block/copper_casing.json
>>>>>>> mc1.15/dev
b2c528cfd24a5cb0cb96c45d0a914f1090f8c32b assets/create/models/block/copper_valve_handle.json
1ef7060b0ca7e9c0bfc8151f98ca08da31862cda assets/create/models/block/crate/brass/bottom.json
4ef2c7c3018f2d219f159a3ce58ceb00610b9c5d assets/create/models/block/crate/brass/left.json
@ -559,6 +508,30 @@ a09f639bde4c61d68592eb06c807e7a6791ff950 assets/create/models/block/crate/brass/
7635211e4d833748acaea37ea48b1f749c32ea5f assets/create/models/block/crate/creative/right.json
a123e3c8a9e2ea1665f268cf3991aa7e4b3119c6 assets/create/models/block/crate/creative/single.json
29ab5cfe7aed1271ede125e91bf78c1372b5f96e assets/create/models/block/crate/creative/top.json
e04c4987746379ec24c63929abf0df4e41e13e6a assets/create/models/block/creative_bottom.json
5b1f6d98adf1e92f678a59b7eef720deeeda2795 assets/create/models/block/creative_bottom_window.json
6dd1cf78624d5ce69259fc723e9700bd842c94c8 assets/create/models/block/creative_bottom_window_ne.json
c0dfda633c3158633814e9a6cd4f4dba793ad4c8 assets/create/models/block/creative_bottom_window_nw.json
e30b13d2ae9a437664792c16be537cea73552cf8 assets/create/models/block/creative_bottom_window_se.json
8d68f53dfa4d17f8193cd8df693e340ac7a1b92e assets/create/models/block/creative_bottom_window_sw.json
77a84b8ca790ddef80e792beb79c2ae0db78005b assets/create/models/block/creative_middle.json
179f6208a04832141d83f9a6bef96334cf4fe4aa assets/create/models/block/creative_middle_window.json
cadd6df93f6ba708a3c92a958e88531cbc1d6ebf assets/create/models/block/creative_middle_window_ne.json
75b37b07555312798a519bea3325d4af6a57eb86 assets/create/models/block/creative_middle_window_nw.json
d9d6b61ba21270c83361b3ee2391161125dfc6f0 assets/create/models/block/creative_middle_window_se.json
73696b00c063cdf6c5a492eac7e5e06062abad88 assets/create/models/block/creative_middle_window_sw.json
3af304cfaa0cdba11c120e85cea88d96c986eebc assets/create/models/block/creative_single.json
feed58a4ad7d7a9e855f0cd7b3fc720616120b4b assets/create/models/block/creative_single_window.json
4f8753ba3a04853fb006be37e15d760cc154d937 assets/create/models/block/creative_single_window_ne.json
39ee24e3b1e06d38bfa4ef36aa4f89577c7f6eab assets/create/models/block/creative_single_window_nw.json
81250161ba79b846614859fe8c991c9e18bf77ba assets/create/models/block/creative_single_window_se.json
0fdca0706c76794586199287f1e29c8e87ef6385 assets/create/models/block/creative_single_window_sw.json
873b263b688f191a927a63b2d873a797eab801e1 assets/create/models/block/creative_top.json
723c5db04011eeb1f2e0483f3466bf05432c5f4c assets/create/models/block/creative_top_window.json
0994ef30adac0d9faa19d06fd933eb16b11d1ef3 assets/create/models/block/creative_top_window_ne.json
59c43cc18525792ca96026c966076f52cf7ebef7 assets/create/models/block/creative_top_window_nw.json
a6eea01609266b757342984889af16234ecd5189 assets/create/models/block/creative_top_window_se.json
6e1d2fb66291f2a3e3a213f43b47fb9760cb959f assets/create/models/block/creative_top_window_sw.json
68843a02a32c156afad85830877b83f9b51c5147 assets/create/models/block/cyan_sail.json
6704782830b3d872321e895b6903709c18e3778f assets/create/models/block/cyan_seat.json
f45ef4a5f0aa8482d493661673b1c0ab6d061157 assets/create/models/block/cyan_valve_handle.json
@ -736,47 +709,6 @@ d13df8a5920c5778d98081fb0e97f045e2fd46a2 assets/create/models/block/framed_glass
a5938ddd48109f067a19a90a0f9abab655c18821 assets/create/models/block/framed_glass_pane_post.json
41645919ece236df5804a5a73ef682720194de34 assets/create/models/block/framed_glass_pane_side.json
8bc0abaabdc62d0c27730dba7eb6da54607b7e96 assets/create/models/block/framed_glass_pane_side_alt.json
<<<<<<< HEAD
894518bf911d73cece24d4557ab29829829d70c0 assets/create/models/block/gabbro.json
d84f558506d4a399f72d86b15f318b234ce67e58 assets/create/models/block/gabbro_bricks.json
6ca3de3137526e3e103b9759c9f79edcaec3bab3 assets/create/models/block/gabbro_bricks_slab.json
fd6102766ba2567a70c86e7613992a23a5a3e7c6 assets/create/models/block/gabbro_bricks_slab_top.json
ae26c480f3d9d51c8b9d2e20427ec9234a0db8d5 assets/create/models/block/gabbro_bricks_stairs.json
8a19d9f9f8f1d0f0ea9311cb8b2488c5027fba25 assets/create/models/block/gabbro_bricks_stairs_inner.json
78d2189693c37ff41751cc5f0464f88c36482d77 assets/create/models/block/gabbro_bricks_stairs_outer.json
79e4fcf540e86a4d5910d57d9d9045ce181b0070 assets/create/models/block/gabbro_bricks_wall_post.json
49398d10642388e8301159505dde8b0c25ab2edc assets/create/models/block/gabbro_bricks_wall_side.json
23854558036ea469c6d78880d0f5244b64fdb418 assets/create/models/block/gabbro_bricks_wall_side_tall.json
c50dddabd9be06f251f6bedcf7e122eb79bb9400 assets/create/models/block/gabbro_cobblestone.json
19f29ac6c463b21311629ef277ddb6dc0673caa1 assets/create/models/block/gabbro_cobblestone_slab.json
3eaa34ce53980d6340547445536444f5fcfd4e2c assets/create/models/block/gabbro_cobblestone_slab_top.json
ca94584799cbc0861e783dee631ea70e154a0898 assets/create/models/block/gabbro_cobblestone_stairs.json
47ea92c04b31fc43a2123d418ac2142f7104d780 assets/create/models/block/gabbro_cobblestone_stairs_inner.json
dc099cc48208c776cb561fb0cf20142fe1f905a4 assets/create/models/block/gabbro_cobblestone_stairs_outer.json
acb516b2ecb4bbb8dc9c7c4a8b4ef8f7347af0f7 assets/create/models/block/gabbro_cobblestone_wall_post.json
a66072ee1cd164a10935417c036f4f55772769b1 assets/create/models/block/gabbro_cobblestone_wall_side.json
b8f5a5d25a3e3731670b4a7f7c83fd22f72ebd1d assets/create/models/block/gabbro_cobblestone_wall_side_tall.json
4f8ee4ea7f0a79f7da29414397d8829c1969b7b5 assets/create/models/block/gabbro_pillar.json
adf7ef2d029fb6b26a445de79c62b710e6832c06 assets/create/models/block/granite_bricks.json
47765dd5359ab0a1d76cbc503d621250224063fd assets/create/models/block/granite_bricks_slab.json
80d7b25ff3782fc7e5cd419e275300fe3722892d assets/create/models/block/granite_bricks_slab_top.json
a56aa126a5a4a88914e62926630f5548b24c62e0 assets/create/models/block/granite_bricks_stairs.json
cdafe87bed3980b6109a2d85dd85a207967382da assets/create/models/block/granite_bricks_stairs_inner.json
b15b4ef4354b189b678fa944cf3ad456480fd30a assets/create/models/block/granite_bricks_stairs_outer.json
45999378195baa93e1eec5e58c0065a3d255490b assets/create/models/block/granite_bricks_wall_post.json
c1c86afd629d16387627d1f136e5ab6f846e072e assets/create/models/block/granite_bricks_wall_side.json
44df8fb0bcf2bb17aa0c70ae3829d01c3452e4be assets/create/models/block/granite_bricks_wall_side_tall.json
8804fa93deed01d2c488894ae0f4e35ceed0218c assets/create/models/block/granite_cobblestone.json
ea28ac79636a92779066ab43d727cc0dd99f12a5 assets/create/models/block/granite_cobblestone_slab.json
0425978f192f8dbaa6e077739f4ef77443b03b7f assets/create/models/block/granite_cobblestone_slab_top.json
9f1243adc9affaaaa43355a73570d8b8cc0b76ab assets/create/models/block/granite_cobblestone_stairs.json
ddc8bf8dc62464d424ab812f801dd7a1f68072d0 assets/create/models/block/granite_cobblestone_stairs_inner.json
2ed22800ed503bd0b903b2b7ed86209861833fcd assets/create/models/block/granite_cobblestone_stairs_outer.json
01236266fd0d5057e97dea0fbb114de702fe2c48 assets/create/models/block/granite_cobblestone_wall_post.json
87f6b4e30f2cdd0ddb3b48e43f15317b386597e6 assets/create/models/block/granite_cobblestone_wall_side.json
5c7340740d822deae7aa32c15c36531476862fbb assets/create/models/block/granite_cobblestone_wall_side_tall.json
f55c5825c63f345a95e822a2113e76b5a62d8f7c assets/create/models/block/granite_pillar.json
=======
af8bceaa94d714ab377ab9cef1a46ec8cd2b6382 assets/create/models/block/gabbro.json
d21fdbd5ae4013fed068e6ae015d68880d4d3d5c assets/create/models/block/gabbro_bricks.json
acdb20098521f67a530dd809190b1c024464749d assets/create/models/block/gabbro_bricks_slab.json
@ -813,7 +745,6 @@ cf267628d47aa424bc20977e69e255ceda3ddfe4 assets/create/models/block/granite_cobb
a4f50b75a3186829fc5d62ee4e33997cd202dbd5 assets/create/models/block/granite_cobblestone_wall_side.json
349a58ac4e4535d0fe9ea467632ed904da2c6098 assets/create/models/block/granite_pillar.json
a68cd40ffb769b195437107f4a2c2188b222b74a assets/create/models/block/gray_sail.json
>>>>>>> mc1.15/dev
6eb5e59e803e1055968b90f3099cd0a17a1d3fd5 assets/create/models/block/gray_seat.json
7e213be39cc928363bf2b096f055439211050b8d assets/create/models/block/gray_valve_handle.json
17b651233c62b928f0228562a7f6e7a2b7b2d6b7 assets/create/models/block/green_sail.json
@ -825,23 +756,6 @@ d13df8a5920c5778d98081fb0e97f045e2fd46a2 assets/create/models/block/horizontal_f
a5938ddd48109f067a19a90a0f9abab655c18821 assets/create/models/block/horizontal_framed_glass_pane_post.json
41645919ece236df5804a5a73ef682720194de34 assets/create/models/block/horizontal_framed_glass_pane_side.json
8bc0abaabdc62d0c27730dba7eb6da54607b7e96 assets/create/models/block/horizontal_framed_glass_pane_side_alt.json
<<<<<<< HEAD
35253c91ed72c7c2ce981c384d334c1113851469 assets/create/models/block/jungle_window.json
65da656d412d973865f50ab7f02e278fe5398bea assets/create/models/block/jungle_window_pane_noside.json
9f4144df2e6b35c1fad04e594be5adb3b107bdb8 assets/create/models/block/jungle_window_pane_noside_alt.json
2e8cec84ae0fe8933a3e2e39721937673c4941d1 assets/create/models/block/jungle_window_pane_post.json
4e3cc8764a8e5cefd2dfb415e66e75c4059cb804 assets/create/models/block/jungle_window_pane_side.json
b233d493ec57204f7527c6ccf803580c1131b2ae assets/create/models/block/jungle_window_pane_side_alt.json
6abd1f7dd176b861e2335f65c8f8cdc50c90aaac assets/create/models/block/layered_andesite.json
be3a70d4f88abeb9321bdef6629790cb4220b688 assets/create/models/block/layered_dark_scoria.json
936e118bb2275fa468bc0d0e934a14e3a6c768ee assets/create/models/block/layered_diorite.json
e1add9f62cf886a7989f7ebb545906da16ad7a41 assets/create/models/block/layered_dolomite.json
3ed6faede6762dd9b44139d137ff081797189300 assets/create/models/block/layered_gabbro.json
650f878e71110f84abaa44c076b0c0023425be45 assets/create/models/block/layered_granite.json
cecf946818c65370b685dfeaade50819183acb41 assets/create/models/block/layered_limestone.json
258fb9644d396872719c56ae1ca89f50667a1077 assets/create/models/block/layered_scoria.json
60b05926e706d5dd27f3cb4997120c948797f2f4 assets/create/models/block/layered_weathered_limestone.json
=======
2536b29d5d87ba7da1d0f29c791572f67d1bd951 assets/create/models/block/jungle_window.json
50ad1922e3fcc045c9ea9fc085fdeeb53ab95c7a assets/create/models/block/jungle_window_pane_noside.json
38e4df0859d04d1a2dd4973b530748eb39c9f6c9 assets/create/models/block/jungle_window_pane_noside_alt.json
@ -858,7 +772,6 @@ ff78465839cbd36a356cd4153c721c88b1f0b297 assets/create/models/block/layered_gabb
9408ce7ba29a96053c9333b15a05d716752392c6 assets/create/models/block/layered_scoria.json
da71aca99ac5cf3731896be47e15d774397a3330 assets/create/models/block/layered_weathered_limestone.json
19bd08ad6ac351e6eee2131f7b4c11a768bf8f08 assets/create/models/block/light_blue_sail.json
>>>>>>> mc1.15/dev
1a28b07da68d1461cd04c971ae548d94165e0cf3 assets/create/models/block/light_blue_seat.json
68e01f8d8a31f07f236383e19b49ae1be4cbe3f4 assets/create/models/block/light_blue_valve_handle.json
73f14b905d5fdb433751a33b963852de6491722a assets/create/models/block/light_gray_sail.json
@ -867,33 +780,6 @@ da71aca99ac5cf3731896be47e15d774397a3330 assets/create/models/block/layered_weat
8292d043ebfe280340526a6a0f96d4160099e213 assets/create/models/block/lime_sail.json
31c9474210d8535c5417021fe042d4cc31e17328 assets/create/models/block/lime_seat.json
74008bd0d775b0e2e96b43be2e51d0f3c3abdf21 assets/create/models/block/lime_valve_handle.json
<<<<<<< HEAD
fccac0de94fff5f4e180fc9dbddeb0f8ddf3baab assets/create/models/block/limesand.json
3c49d63386b3f5326051edbf6e2f0f8f0e2ff4f3 assets/create/models/block/limestone.json
84920646b4df506f94e64611ee231f3af51b5379 assets/create/models/block/limestone_bricks.json
34a6379261b13f0b5b856bdcbecac1aa8de98ec8 assets/create/models/block/limestone_bricks_slab.json
a4eb94d59365c854b205c22b98c03742a3e45007 assets/create/models/block/limestone_bricks_slab_top.json
6030ff8209edb3ef04e6dcf83cf181ee4cad13fa assets/create/models/block/limestone_bricks_stairs.json
0e830acdd0e39b099d0d0b3f2b9326af0c182633 assets/create/models/block/limestone_bricks_stairs_inner.json
38c3bc0412baa9ed842c6436874c528e4a27fe00 assets/create/models/block/limestone_bricks_stairs_outer.json
d36db8a76c0abf8f42798fb2d8914d4aad0cb7b9 assets/create/models/block/limestone_bricks_wall_post.json
628493255ec16d79455bc54497c6a4b8207e0649 assets/create/models/block/limestone_bricks_wall_side.json
9c4cbf01802a59919c284bc616ae4d390b34d917 assets/create/models/block/limestone_bricks_wall_side_tall.json
93d3ca6df1c824a6f8b54d917bc61e48675f5ff5 assets/create/models/block/limestone_cobblestone.json
7786068e25079538528bf717e473d5c4e2266f7c assets/create/models/block/limestone_cobblestone_slab.json
454f09c5eb4c92bfa0e0b81c0b28c88caa78a907 assets/create/models/block/limestone_cobblestone_slab_top.json
213e897e2e2df5647e6c2df23691e52e92eaccab assets/create/models/block/limestone_cobblestone_stairs.json
c54e5a17495f88fa21b3488e8da32a365452c36c assets/create/models/block/limestone_cobblestone_stairs_inner.json
17cd5d20df9a8a16ad8993bcf5fc273ca80933dc assets/create/models/block/limestone_cobblestone_stairs_outer.json
464053d2fad1f398662a0878e6891a0dc613061d assets/create/models/block/limestone_cobblestone_wall_post.json
9d2826391999f3d65b948f560c91bc178dbe8846 assets/create/models/block/limestone_cobblestone_wall_side.json
6d4fb04b155e1460c6f8019491310707ed5cca28 assets/create/models/block/limestone_cobblestone_wall_side_tall.json
7527b3f1274744a64f7eb4bc94f7bc125dcbcf28 assets/create/models/block/limestone_pillar.json
0766a12c95977dfb8f3a8ea453d45c9832e7e824 assets/create/models/block/linear_chassis.json
7991d6620d2225b1a026e2b62dc076cf0a33613d assets/create/models/block/linear_chassis_bottom.json
56e585805c6235552ce5e15ff2f125ff8ec0fa2d assets/create/models/block/linear_chassis_top.json
12b35c916e3ee83ee4fd1e309c73403dec9a7297 assets/create/models/block/linear_chassis_top_bottom.json
=======
ce6fb36a386c895486e021823eb008b0fa4862c3 assets/create/models/block/limesand.json
a2cbc86d24fdd70c5f33c8b30ba52a8928dde63f assets/create/models/block/limestone.json
447686a6861773e03c5c18f2de4bc11d06c65f78 assets/create/models/block/limestone_bricks.json
@ -918,7 +804,6 @@ eee8ae85daa99fcd594da3d4af393726af69493b assets/create/models/block/limestone_co
999ce855842170f47db9d1e8e8636c24f7d3ad3d assets/create/models/block/linear_chassis_top.json
b9abbd1dcf71e0a1416fd998a82a560c06cef5a3 assets/create/models/block/linear_chassis_top_bottom.json
ec6b5f636e163ff5e361d486cf628ca1af4849a1 assets/create/models/block/magenta_sail.json
>>>>>>> mc1.15/dev
cbee001cd1bb1125a97d1bb2d1e6e5a68f129303 assets/create/models/block/magenta_seat.json
bc5a03a5552eb4a518abefe5e8615f14ee13ca29 assets/create/models/block/magenta_valve_handle.json
2e67f27a895c9163a5d1be62897d5e66b119767a assets/create/models/block/mechanical_bearing.json
@ -931,15 +816,6 @@ f2f7cda5de21279ff8e359142c523e07a3377477 assets/create/models/block/mossy_granit
de9b0f933881cc735ae0acf2bd71e6eafa732ff8 assets/create/models/block/mossy_limestone.json
f88a9558a20033d4955e7b6de4f8aa23b1a11b9f assets/create/models/block/mossy_scoria.json
8c3296378aa7e5dc1bc7dfdde2f0a436b8bb8b78 assets/create/models/block/mossy_weathered_limestone.json
<<<<<<< HEAD
50f28bf7a7de95caf12b4f040994f0f3da72a55a assets/create/models/block/natural_scoria.json
e3cd8b33b8c5f0543e4f6728a5b3e05642f9efe1 assets/create/models/block/oak_window.json
54a3b3158f8c914788812aa44515b798b2a9e2f3 assets/create/models/block/oak_window_pane_noside.json
b9c27f90d4d258e3fdcd713aaa42142f5d46a79e assets/create/models/block/oak_window_pane_noside_alt.json
8c3fdc51742897d110641ba9127f857297300edb assets/create/models/block/oak_window_pane_post.json
8f77db5a66b165d2ca85f9119666907dcf65105f assets/create/models/block/oak_window_pane_side.json
b3e056a176e86660fc2d3a51f9ba8b01eebb56c5 assets/create/models/block/oak_window_pane_side_alt.json
=======
24cbd7e60a7769a8fc9f530978ef7094ae65a9eb assets/create/models/block/natural_scoria.json
269ec2c32ba22a216b1c6831e6284ef98e78ee75 assets/create/models/block/oak_window.json
f324403f578d724c118055ca04e6bec23607ea90 assets/create/models/block/oak_window_pane_noside.json
@ -948,7 +824,6 @@ e55363147cc27fba84590c7e24460603988118e3 assets/create/models/block/oak_window_p
aa12818d00d1995e5b8a218cb613215ec0161d23 assets/create/models/block/oak_window_pane_side.json
488dfd3f4bd82ab1b5b751b4a46881befb8d6819 assets/create/models/block/oak_window_pane_side_alt.json
ff9b51fcaffe54e321b9479f035f4ea7b278bfec assets/create/models/block/orange_sail.json
>>>>>>> mc1.15/dev
fda0628a09ef726e3e8323b2f38b6a3e612dc2ca assets/create/models/block/orange_seat.json
3b07f3f1985495051d173725b01ddd52b5f70ac4 assets/create/models/block/orange_valve_handle.json
de5ecd753303b2c5dc3819299b9a316f0d7035f6 assets/create/models/block/ornate_iron_window.json
@ -966,130 +841,6 @@ ca08c15006d65701d72bb88852df884236822522 assets/create/models/block/overgrown_di
3368bbdf335c81b9e84adc30afeab9261256279c assets/create/models/block/overgrown_limestone.json
c21c58e982ec0eb1c88948ac53b570b26bf1c9bc assets/create/models/block/overgrown_scoria.json
6d7842c5c0f58a3cb3150e54bee2b51e7138df45 assets/create/models/block/overgrown_weathered_limestone.json
<<<<<<< HEAD
8dfe5334887c09375f2571aa3835f2dd9de76875 assets/create/models/block/oxidized/copper_block_0.json
3f5af8864db20346df2463066265d7f6709a5e65 assets/create/models/block/oxidized/copper_block_1.json
ee0f11c96fafc164fd9ac64fde0f89cfd527a65a assets/create/models/block/oxidized/copper_block_2.json
060743439c0f0e991a7ccfcc9053ee9741e73805 assets/create/models/block/oxidized/copper_block_3.json
131b2a2b3c883deeb6af544f15fcc0d88a3ff5fe assets/create/models/block/oxidized/copper_block_4.json
4e0fbfc3b61f04f68c6022d6a9a9eabdffdd8673 assets/create/models/block/oxidized/copper_block_5.json
e3d374a2e5ceac212bed21b6ec964b4593aa847a assets/create/models/block/oxidized/copper_block_6.json
125966d6e25b601779e3bff4a9da84d85e3984ff assets/create/models/block/oxidized/copper_block_7.json
8f2b2d983c1a0d128dbb1d6465a4eb3a7f98e34c assets/create/models/block/oxidized/copper_ore_0.json
4fd860b564a98869c6450e21446e0e41a8303206 assets/create/models/block/oxidized/copper_ore_1.json
430a115e26a2e95b7a6c04746b10f617212a3091 assets/create/models/block/oxidized/copper_ore_2.json
596fb93cc5f59ccff8e84c07a99398f5ec20d169 assets/create/models/block/oxidized/copper_ore_3.json
d7e94d32a8c739fe8ccfc51b3bf5c1dff038b47f assets/create/models/block/oxidized/copper_ore_4.json
895d3ce98dc576b7396fa309dce69eaeba419c95 assets/create/models/block/oxidized/copper_ore_5.json
578ee4b7b0aaf4f5fbdecc7800f1d8b0d9ea6576 assets/create/models/block/oxidized/copper_ore_6.json
7c4e54d05a8e76e390044099ad02c5dd082f2460 assets/create/models/block/oxidized/copper_ore_7.json
2091e38299cd736320de736b9450e9b5209106cd assets/create/models/block/oxidized/copper_shingles_0.json
3614bcea228962535a048b68b3069a9058156a16 assets/create/models/block/oxidized/copper_shingles_1.json
3d2219e127df9e14109c876ef2e3499a21268209 assets/create/models/block/oxidized/copper_shingles_2.json
6f9461d372dbd9561460649a9325c62cd3f3ef36 assets/create/models/block/oxidized/copper_shingles_3.json
d9867c3574ecd484ea179a8ffc2d3b562a389bc2 assets/create/models/block/oxidized/copper_shingles_4.json
649cf546f5f4535f0936dedf0074aeb878829129 assets/create/models/block/oxidized/copper_shingles_5.json
c3bb01e750f02312c62990d71bd113df41f0746c assets/create/models/block/oxidized/copper_shingles_6.json
cde13928d8643fe28f891b4ed6358971b6eb49f7 assets/create/models/block/oxidized/copper_shingles_7.json
a223e5ddcd9c0f282a0193434189ae91b67e1571 assets/create/models/block/oxidized/copper_tiles_0.json
590c75f1c1a9013c8adb5b90f05e8578a75a140f assets/create/models/block/oxidized/copper_tiles_1.json
66af247eac88396e9c26b61443e2d324f250a160 assets/create/models/block/oxidized/copper_tiles_2.json
3fc4e85ed7115e4b3289739268b4366f8d8777c5 assets/create/models/block/oxidized/copper_tiles_3.json
abdcf49a3ad1a25b37653c1c6eccd24b9a97c87f assets/create/models/block/oxidized/copper_tiles_4.json
99580c32742505b9a2eb64185f9529a5388d2751 assets/create/models/block/oxidized/copper_tiles_5.json
be9ac7815d4bbf0c42dc40d20d34212250ac86a7 assets/create/models/block/oxidized/copper_tiles_6.json
a4e5715d04bd13860e2d5981c2122fbc6b435e80 assets/create/models/block/oxidized/copper_tiles_7.json
44abcee4d7f0d63d2f91b42a6e223cb8211597df assets/create/models/block/paved_andesite.json
afcf525fd574ebd6918d0357442d2f8099276079 assets/create/models/block/paved_andesite_covered.json
ee19b3143803e4d41639dbd564f84bf86b01d77d assets/create/models/block/paved_andesite_slab.json
39da471b29a69b94dd481b8a7d6aad2b8efcc993 assets/create/models/block/paved_andesite_slab_top.json
7f61f36812ec6f1a684bfc06e7058114dbe4c7d4 assets/create/models/block/paved_andesite_stairs.json
91a169ff2d8463520d419738d2341afdc4cf1f0f assets/create/models/block/paved_andesite_stairs_inner.json
7c7d1081ce8c4cf8c247afeafed434172c8ccd00 assets/create/models/block/paved_andesite_stairs_outer.json
b14d753208e48c3a2780d258bec6e0d20ccbafc1 assets/create/models/block/paved_andesite_wall_post.json
1edd248747a0db1381115b3ecc40f7fa24ae845d assets/create/models/block/paved_andesite_wall_side.json
5bfc3655067f7ac2e80dee3ccc1c4a9b387316a0 assets/create/models/block/paved_andesite_wall_side_tall.json
516936f48542723e9ea19fe06412348d36d4461b assets/create/models/block/paved_dark_scoria.json
5a9c0029ac5c10a65709bdf59a4f3dd778369370 assets/create/models/block/paved_dark_scoria_covered.json
4dfbc6beec27bf266b03a7fc9c9ddd8dc2d24745 assets/create/models/block/paved_dark_scoria_slab.json
9657df68fa3903ddef2aa49b88ec66a7e91ebb7e assets/create/models/block/paved_dark_scoria_slab_top.json
8c6fcbe10e4287e39b7f5161d677b628b933cb17 assets/create/models/block/paved_dark_scoria_stairs.json
fb5bd6499bf17d861d5f504b45d2caf9a734ff77 assets/create/models/block/paved_dark_scoria_stairs_inner.json
bc58687ad19f3a12b8c730dd2c7284b3baff370c assets/create/models/block/paved_dark_scoria_stairs_outer.json
346b7db2932c5f32a26e35bf0383b33c6109ee3c assets/create/models/block/paved_dark_scoria_wall_post.json
695b167aa884c3c827bf3f743233d7c5f0d220d3 assets/create/models/block/paved_dark_scoria_wall_side.json
75870726f58f388244ffbbde1676a9f66c52120c assets/create/models/block/paved_dark_scoria_wall_side_tall.json
ad5ecc000e088252a9aa144250f1be3324dac366 assets/create/models/block/paved_diorite.json
171351fbd56ea8a19ba6c9b0fd82bf88ee176528 assets/create/models/block/paved_diorite_covered.json
bc66da45a57ac338c066aa26427c3c55d78d798c assets/create/models/block/paved_diorite_slab.json
c3e7a4cc76ea1cf2511f6921ed715540dcb200df assets/create/models/block/paved_diorite_slab_top.json
dfd06d83473b0cf8855fbd0ed89831567bcc6212 assets/create/models/block/paved_diorite_stairs.json
6f852f3f90c24cfebbfc603f11803e039ea9a0c0 assets/create/models/block/paved_diorite_stairs_inner.json
cd32a4355eed1eadfdd133a2acc135c0836011a7 assets/create/models/block/paved_diorite_stairs_outer.json
6c52f7f025f56dcd45fcdef87c76263318ffbee5 assets/create/models/block/paved_diorite_wall_post.json
5ee12e7349d48986ff245512764defbf18d03a45 assets/create/models/block/paved_diorite_wall_side.json
1584f34af51c9ee584d7e6c528d68a7ff2a9b5a0 assets/create/models/block/paved_diorite_wall_side_tall.json
e763ba96670e52800dfadb96cc402ef50bc23c21 assets/create/models/block/paved_dolomite.json
1ea5247d696ab136f8e323f68e2918a9e871ce1c assets/create/models/block/paved_dolomite_covered.json
dba94cd61f0672829bbab3ace3409dce589bef62 assets/create/models/block/paved_dolomite_slab.json
74e8a30e8e14e4f4bb05f53159928544e99006ec assets/create/models/block/paved_dolomite_slab_top.json
c282fd047907899c439f022203aee6a1491070b4 assets/create/models/block/paved_dolomite_stairs.json
88f4e3af8e0a7fd38adc300e49f8f0efb19ee8a9 assets/create/models/block/paved_dolomite_stairs_inner.json
91b6be901eb9a18518585c679757c1baec16c7c5 assets/create/models/block/paved_dolomite_stairs_outer.json
8b9309e098b6066dff8cd206e80938e33b692c8e assets/create/models/block/paved_dolomite_wall_post.json
378609052c8daa9a38259b54a0a0d995c4636396 assets/create/models/block/paved_dolomite_wall_side.json
47b5f4d682d041008c8256fc3df1be25130fa10a assets/create/models/block/paved_dolomite_wall_side_tall.json
f90897992da49371e405088756b9077113a5c7dd assets/create/models/block/paved_gabbro.json
7ab1400fe9c2968fbe276bf70325ae6d159d37c3 assets/create/models/block/paved_gabbro_covered.json
fa1ed152122fee3a8bce34157159964b5fd8d79a assets/create/models/block/paved_gabbro_slab.json
8cd07e28885661fedca14b976dcd48b7042cee2a assets/create/models/block/paved_gabbro_slab_top.json
460a95cf5fc13f037902b6794a7e8c54a091b3cc assets/create/models/block/paved_gabbro_stairs.json
ce9c4a0cc7168b2fbe094b40a9a13c5fc5368426 assets/create/models/block/paved_gabbro_stairs_inner.json
f51b8fe5408d80ecf79b45fd2e758b947bd89d12 assets/create/models/block/paved_gabbro_stairs_outer.json
3113c182a4ff13adbc156b70a31c80b0e7de064a assets/create/models/block/paved_gabbro_wall_post.json
39a7a337bdca36263fb998c22a02b698b3e9ef06 assets/create/models/block/paved_gabbro_wall_side.json
8bce3c1a2d05e3d1897670c4768883b7a02e5159 assets/create/models/block/paved_gabbro_wall_side_tall.json
12ddeae599606fa0aaee5539f9cea99003220dd3 assets/create/models/block/paved_granite.json
528f2d902f402260d7d7670ef0f0b01b5367cb7b assets/create/models/block/paved_granite_covered.json
053fcddd1f3705dc47f2be515470d6cd006cea04 assets/create/models/block/paved_granite_slab.json
23329b2e8aaf3adddc50aba4ad8e2204db6677af assets/create/models/block/paved_granite_slab_top.json
1f39a935603bd49a76721cccafe49ca56ad616b9 assets/create/models/block/paved_granite_stairs.json
e9a6d727123642bc7db48f1f7e6024f08fa389c5 assets/create/models/block/paved_granite_stairs_inner.json
f7fddf3184dc69b095c432f3f2dfe9204b36ce21 assets/create/models/block/paved_granite_stairs_outer.json
2897b4cc6610e9cbb57582e84913f613903eda2d assets/create/models/block/paved_granite_wall_post.json
7292a674884325407786551a47f42ddc751b8e38 assets/create/models/block/paved_granite_wall_side.json
eec5d2ea68490b4b377bc8d8ae8dcc168e450174 assets/create/models/block/paved_granite_wall_side_tall.json
fd47f060b2d9686414d771fa79f73b0d7d18d1cf assets/create/models/block/paved_limestone.json
a02a16fcd7157e6e7485526673ba6fb30d228501 assets/create/models/block/paved_limestone_covered.json
3af3115c9d46fbf5ff9fb0c2c315292b2932601f assets/create/models/block/paved_limestone_slab.json
73873290e35c04be5e373593c5ab8555d045f239 assets/create/models/block/paved_limestone_slab_top.json
77d83f143597871e51450a370a4c3bf9a21d2d9f assets/create/models/block/paved_limestone_stairs.json
a95e3d5f34c0c8b03bd2a995a2811f3f63f91378 assets/create/models/block/paved_limestone_stairs_inner.json
825770b522f098d39c20850b7e8c887f429cdce1 assets/create/models/block/paved_limestone_stairs_outer.json
7462e8f922b26eacfe28ef5bc56fd1ed2ffdfb0a assets/create/models/block/paved_limestone_wall_post.json
1b3f725c75a524fe9e8039e03f8db84a1b252a96 assets/create/models/block/paved_limestone_wall_side.json
3a5f1bbca22ba53520138c192de22fa05c36fbfd assets/create/models/block/paved_limestone_wall_side_tall.json
2ad932c3a89dd2faa2f6d82c97f32242b092f7d2 assets/create/models/block/paved_scoria.json
a24a73544adbd4dc8afdcb42f42fe95e401a40c0 assets/create/models/block/paved_scoria_covered.json
f737e38308efcf68537505069cf60dba6d1c3658 assets/create/models/block/paved_scoria_slab.json
c6dab2f8010a5d75b1b145ea9c7e30329d099243 assets/create/models/block/paved_scoria_slab_top.json
ffdb9bb5e7072576a9db048fdb6375a27ad6df51 assets/create/models/block/paved_scoria_stairs.json
de95cca903aea66a0fd33e5629b1014fe33e6211 assets/create/models/block/paved_scoria_stairs_inner.json
f70d47a341a352ce53c39c272ef0556e8d6f62b5 assets/create/models/block/paved_scoria_stairs_outer.json
060b7c9b493c172916e99310663636376192eedf assets/create/models/block/paved_scoria_wall_post.json
308450fd3a19195364d268e29bef8afc7f9ca733 assets/create/models/block/paved_scoria_wall_side.json
100b1a1142953a107d283eab42000664c356c214 assets/create/models/block/paved_scoria_wall_side_tall.json
af309a5dd825509e64e3f2dc4db749e7d416cd71 assets/create/models/block/paved_weathered_limestone.json
04f8ab203f904371d9075d601dbb467931a75a50 assets/create/models/block/paved_weathered_limestone_covered.json
2d3700ea734cc2805fff93e1e7c63d8b716b3f43 assets/create/models/block/paved_weathered_limestone_slab.json
38177158a119e703e4e99b47eb12733e232ae768 assets/create/models/block/paved_weathered_limestone_slab_top.json
7aac84ea55c52494e5d9d61f53dc6f9a794afec4 assets/create/models/block/paved_weathered_limestone_stairs.json
db56f592a9ce027f33264d381b29830592b7d42e assets/create/models/block/paved_weathered_limestone_stairs_inner.json
f924c6104378768a3a645f5e77f9ed80d2c31e5a assets/create/models/block/paved_weathered_limestone_stairs_outer.json
46e3eeeefd47f7e6007e53bb1b22de2c6c2a5923 assets/create/models/block/paved_weathered_limestone_wall_post.json
c7941c0bcbdf7ec7e2d34679afac744cf81b7489 assets/create/models/block/paved_weathered_limestone_wall_side.json
39aaea370e31fa032e471d3b8f0ebf0586ee1a03 assets/create/models/block/paved_weathered_limestone_wall_side_tall.json
=======
e151c82942df13d7f4296b6b717b12036c4c47fe assets/create/models/block/oxidized/copper_block_0.json
35cb12fe13b6f39d2baad9b5a1638b6c5b364513 assets/create/models/block/oxidized/copper_block_1.json
a7ea046b36c810816dd749727fcc3f1008807c4c assets/create/models/block/oxidized/copper_block_2.json
@ -1204,7 +955,6 @@ cc36e21013b80b1dfa041b55047096db127ffa51 assets/create/models/block/paved_weathe
34ba32e570e0a54501db071b9f8c38513edea93d assets/create/models/block/paved_weathered_limestone_wall_post.json
daf65510d95730bcf0373d746f2a2dbfe6b44fc0 assets/create/models/block/paved_weathered_limestone_wall_side.json
1b5f9e819cd4b5f5fe6e8c24920b916e8d93c95e assets/create/models/block/pink_sail.json
>>>>>>> mc1.15/dev
ecc60ce7ee6b753073a99c597db95d6d9df3d438 assets/create/models/block/pink_seat.json
7ada61878d3a3c1d3cc33bcf9a80c21b8f9aaff2 assets/create/models/block/pink_valve_handle.json
84fdb35acc12ae9580496f458def3e49aa0551ea assets/create/models/block/polished_dark_scoria.json
@ -1272,12 +1022,8 @@ c934df1cfe097bcc0f0c21d1b1a3f3b53e50e831 assets/create/models/block/polished_wea
f22d7d8263dcabd726aa04784031ae9062633579 assets/create/models/block/powered_toggle_latch_off_powered.json
e6097d9ab9dc9954cbc750020bc33c7a423b73c6 assets/create/models/block/powered_toggle_latch_on_powered.json
622239a3a09fcac7235b9670eb395a530839a59b assets/create/models/block/pulse_repeater_powered.json
<<<<<<< HEAD
d469dce70d15759baed35025b8c7fa403c8b3b26 assets/create/models/block/pulse_repeater_pulsing.json
=======
0102e253c941904f12de7acdd46b0079ee3ccf69 assets/create/models/block/pulse_repeater_pulsing.json
b56fad63b82434564bc41ae9c01e3b427203fb5b assets/create/models/block/purple_sail.json
>>>>>>> mc1.15/dev
96adc7865ebe64b43865bc2fe914830c11258856 assets/create/models/block/purple_seat.json
062406aacf25e099f9b28a3bf7cacfcaa1da4ef6 assets/create/models/block/purple_valve_handle.json
27d64a828607f94296c0b86cdb35fad996bc5d23 assets/create/models/block/radial_chassis_side_x.json
@ -1416,13 +1162,8 @@ afd697168c9786eb80e54eccdc6a23afa6c7fb0e assets/create/models/item/chiseled_gabb
a47fbe5f2da79080d99ef0975bfa8da4d08f8be4 assets/create/models/item/chiseled_scoria.json
70232ce9b88119fb383717e2c1ad113f7aad6a99 assets/create/models/item/chiseled_weathered_limestone.json
fe67c3f380d17735a9436a4579a8be1a02b8e4a0 assets/create/models/item/chute.json
<<<<<<< HEAD
6680a68526576ded5dac2aa3bc9fb9de3e744146 assets/create/models/item/cinder_flour.json
b1531a7bd3f7f27b9587d13e818a93dc2d088bc8 assets/create/models/item/clockwork_bearing.json
=======
d418205c83d3e57c830755ee8c09e2962353e493 assets/create/models/item/cinder_flour.json
c1da21be9f1af4f7a2ef4ec9cd92195d65ada316 assets/create/models/item/clockwork_bearing.json
>>>>>>> mc1.15/dev
0a2a0f0aafeab0088172f77afd40c1fa2cc1f2b8 assets/create/models/item/clutch.json
dcb09deae110077bcddf090996b51cc66e9a7de3 assets/create/models/item/cogwheel.json
7717e3b21cff39f497f07687c70c1fa40eaa756d assets/create/models/item/content_observer.json
@ -1437,6 +1178,7 @@ f56bf22324faf8958eaef4d94b958f1108d52e5a assets/create/models/item/copper_tiles.
5583368909c319acfcf0f7a419bedf23272fe613 assets/create/models/item/copper_valve_handle.json
4e253e7c0626dfd76e2d39786ce1a34e0baaa62d assets/create/models/item/crafter_slot_cover.json
7b333dea353afaa27b182aedc647c9e9e34e92ef assets/create/models/item/creative_crate.json
f7d06c52c3ca8c22ad67f5741471f06ac22e7fcb assets/create/models/item/creative_fluid_tank.json
5b39403f6c81f05e566b621b62e267267de47c41 assets/create/models/item/creative_motor.json
6281a7439c92459761893835f91fde25467fae76 assets/create/models/item/crushed_brass.json
cd148cb7e881091ecce2390dac0d9f545573c91c assets/create/models/item/crushed_copper_ore.json
@ -1563,8 +1305,10 @@ cfab82a2cf7495d21778c1de9730a26afbdd523d assets/create/models/item/handheld_bloc
dee43bf1a9c211a752fac2c07aeba123f7f0c914 assets/create/models/item/handheld_worldshaper.json
955e8accadb47f9b360e5fd48cd959c507b00f2d assets/create/models/item/horizontal_framed_glass.json
f0e3b2b8a553b6e61746c922c27302dabfff71b6 assets/create/models/item/horizontal_framed_glass_pane.json
d9f222e963f8f8910ca9dbc3c31842ef149f7a1f assets/create/models/item/integrated_circuit.json
9d605ce0da83a73b535bce45c107e604364e2b20 assets/create/models/item/iron_sheet.json
ff92f6a9dfb73a6ee1eaaed3279c89390ff04a80 assets/create/models/item/hose_pulley.json
771d439eac70b52f593fa7381f2c48729fbdaec7 assets/create/models/item/integrated_circuit.json
d254f47bc185f2a2f01608a875aa63ed2c4ceb0f assets/create/models/item/iron_sheet.json
52e435014cb03e93411666c4799ebff206e55fc9 assets/create/models/item/item_drain.json
83fa8699318e51f838b483b40b3e897c34ed53d1 assets/create/models/item/jungle_window.json
766323f6026c3505a75db2dee2996d342370d9c2 assets/create/models/item/jungle_window_pane.json
fe89522b2bd9b4393b8afa2a97f6db4277a8a4b4 assets/create/models/item/lapis_sheet.json
@ -1724,16 +1468,10 @@ ef52b3734a47e96c5f83d60da73110e925737933 assets/create/models/item/refined_radia
6daff6b82b33374d7add65e352e05ecb2fd9ebdd assets/create/models/item/rope_pulley.json
0817505d2d3ee516424100b985ca3fe2d2e7f01e assets/create/models/item/rose_quartz.json
acfbf487ee65c2c58d89cb2644e33fda75751fde assets/create/models/item/rotation_speed_controller.json
<<<<<<< HEAD
5fa0bfe8642e2614a7e97d27af1a95dd2e012097 assets/create/models/item/sand_paper.json
3202829de06e9c532dc8a61c955458648b70d645 assets/create/models/item/schematic.json
3f07bc7d4587d78de463ae2ce236e4f363b923cd assets/create/models/item/schematic_and_quill.json
=======
171c343f7f536008f79ea1d63e0a443d064e9ef1 assets/create/models/item/sail_frame.json
be86c8156d55d2f128feb66abd70923b3be765cc assets/create/models/item/sand_paper.json
69196df5122a27573112dad49b334dea96aafed0 assets/create/models/item/schematic.json
533483999f61e3b091af567a473875247edaedb3 assets/create/models/item/schematic_and_quill.json
>>>>>>> mc1.15/dev
8dd5caa4d7a0ee45bd9b39e09c4503159933d089 assets/create/models/item/schematic_table.json
0a1c4080ca572106c19a0ba6e2df4baba5f45d35 assets/create/models/item/schematicannon.json
22a6dfdc3cbb1b6ac20ec123b490e15c72dfbfcf assets/create/models/item/scoria.json
@ -1779,14 +1517,9 @@ f2cd30c585a25e336868ee4f8dd80799ecb986c6 assets/create/models/item/weathered_lim
3d26cb5616182ba6926d0bf703119ebfbeacbe31 assets/create/models/item/weathered_limestone_cobblestone_stairs.json
ea1d735b557a71bbb2b35e5f03ba571d54c38dbe assets/create/models/item/weathered_limestone_cobblestone_wall.json
40bed7f5e9e97da45c5d9cebc3fcf87b2b13a808 assets/create/models/item/weathered_limestone_pillar.json
<<<<<<< HEAD
30c449f637e8d56b7670b81ec2a90942e2972739 assets/create/models/item/wheat_flour.json
9502a51ed2f6a110b6d41731a5948be4d70c8af8 assets/create/models/item/whisk.json
=======
8914910270736f8f15364c623cd08d4638383cc5 assets/create/models/item/wheat_flour.json
0cc80844db689404d4722c93f1002b0bed05edcd assets/create/models/item/whisk.json
c6253e0f8db3c3992d3f78fe5045e276d39d5b22 assets/create/models/item/white_sail.json
>>>>>>> mc1.15/dev
69328eb4f91c4407fbcad5e3c4b88363f1a9572c assets/create/models/item/white_seat.json
be7a2d59d43083d7f2427193dcb9d68004224dd3 assets/create/models/item/white_valve_handle.json
d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bearing.json
@ -1890,6 +1623,7 @@ c023b9221d7983487d21e5ecc7d92246cfc7e791 data/create/advancements/recipes/create
2ba23f019a110a3e035a49e56ee8156fc11d74c0 data/create/advancements/recipes/create.base/crafting/kinetics/green_seat_from_other_seat.json
9af3d92d11c3f520df3e22f3069042bf34585010 data/create/advancements/recipes/create.base/crafting/kinetics/green_valve_handle_from_other_valve_handle.json
dbb96a4db4ef8172af73a626bed9727278d804bd data/create/advancements/recipes/create.base/crafting/kinetics/hand_crank.json
21cd686e1f3a4004d8e9bd3d92675bd61fb2b4db data/create/advancements/recipes/create.base/crafting/kinetics/hose_pulley.json
a71b626b6ee58a4eabee56f67c48f041a1323506 data/create/advancements/recipes/create.base/crafting/kinetics/large_cogwheel.json
eb007bb079bbe6b6aaad2ca90f5af84261e3f8ea data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat.json
571da50fbf5f2fcd3363b3dab91e7233e0ebffa0 data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat_from_other_seat.json
@ -2471,6 +2205,7 @@ a5a7ba88a1d38da83b37bbe842dc7cc0544f37be data/create/loot_tables/blocks/copper_s
c013613df278f6e8b4c9dad5f16e0ec6c3e992e3 data/create/loot_tables/blocks/copper_tiles.json
5c15f22db359a2af8efa18561e080cdf361a0100 data/create/loot_tables/blocks/copper_valve_handle.json
b160899aa785dc54d8c6cc095337f70b81f3e44f data/create/loot_tables/blocks/creative_crate.json
51d66e32581b87beb871d99b93cb45d45eada8dd data/create/loot_tables/blocks/creative_fluid_tank.json
d8f2f8921b9200b1d9476a77ee1be32c25308ac3 data/create/loot_tables/blocks/creative_motor.json
c28fa42746a4d5ca2f824001b67e58673810169e data/create/loot_tables/blocks/crushing_wheel.json
205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/crushing_wheel_controller.json
@ -2589,6 +2324,8 @@ a71599eecd3f1179e3d0367623460e798828aa6d data/create/loot_tables/blocks/green_se
9bdc47ea3ffc52f037f12f40f387e6b72a352c4e data/create/loot_tables/blocks/hand_crank.json
22012e7759f1dbccbb06bcaf0311a54190270825 data/create/loot_tables/blocks/horizontal_framed_glass.json
5d3f585539942f13bbc458a0a002849c1f034fc1 data/create/loot_tables/blocks/horizontal_framed_glass_pane.json
1b28cc5e1e535aa0c62d4a75ad76fcb40bf6232c data/create/loot_tables/blocks/hose_pulley.json
ef3890c4fa262959cf31a0063fd21919da86eda1 data/create/loot_tables/blocks/item_drain.json
cf2bfae903e7f8510962e672b6266c0e74176aae data/create/loot_tables/blocks/jungle_window.json
1a3a19517f95fc632286d3cc693bfee4a59dfa0a data/create/loot_tables/blocks/jungle_window_pane.json
4d948f80fb7a8b6b99897544681f43fe3d2058f0 data/create/loot_tables/blocks/large_cogwheel.json
@ -2891,6 +2628,7 @@ b7fa20d10c0e0e7270b1c0d6f3881b8e25b39bea data/create/recipes/crafting/kinetics/g
6f65a84e00f25d956a6ae834678ff781569b243a data/create/recipes/crafting/kinetics/green_seat_from_other_seat.json
63edaccace961a65aa7bd406d36894c7ca4816b8 data/create/recipes/crafting/kinetics/green_valve_handle_from_other_valve_handle.json
9f08bdaeec88e04a43c2dc103869f9648deee079 data/create/recipes/crafting/kinetics/hand_crank.json
d10639b0c3999481531fe0a9383a1bb4af60225e data/create/recipes/crafting/kinetics/hose_pulley.json
237541c1c318b8426734c1c43be31fbd01413d39 data/create/recipes/crafting/kinetics/large_cogwheel.json
a33e3301fc6d3a446e61a1c4b8a93aff079baeba data/create/recipes/crafting/kinetics/light_blue_seat.json
958bb5d3aeb8d8e5dbf5d97cf5fd9ff5151575dc data/create/recipes/crafting/kinetics/light_blue_seat_from_other_seat.json
@ -3527,20 +3265,11 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data/create/recipes/weathered_limestone
11667414f73bc2d00bda7c5c1a7d2934bf6e9165 data/create/recipes/weathered_limestone_pillar_from_weathered_limestone_stonecutting.json
f9ecec40e11a87de73c9dc7c2963c1cb10b1a180 data/create/tags/blocks/brittle.json
246ee2ec4e778e38a362f319506564886d4e0e76 data/create/tags/blocks/fan_heaters.json
<<<<<<< HEAD
798ef82869dbe22682121504a372e95607a785dc data/create/tags/blocks/fan_transparent.json
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/non_movable.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json
7fa13854a216ee49c0ae3b1e0e23c4cd1fbc4859 data/create/tags/blocks/windmill_sails.json
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/windowable.json
=======
551299f2f784435859bef13057c2b033eaefc784 data/create/tags/blocks/fan_transparent.json
c9ac7e3e5ec18554e7184168d65e9b8e44ef5610 data/create/tags/blocks/sails.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json
eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails.json
>>>>>>> mc1.15/dev
081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data/create/tags/items/create_ingots.json
d2dc4ff179ef7b2aa9276455c196e15d44aa95a8 data/create/tags/items/crushed_ores.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/items/seats.json

View file

@ -0,0 +1,76 @@
{
"variants": {
"bottom=false,shape=plain,top=false": {
"model": "create:block/creative_middle"
},
"bottom=true,shape=plain,top=false": {
"model": "create:block/creative_bottom"
},
"bottom=false,shape=window,top=false": {
"model": "create:block/creative_middle_window"
},
"bottom=true,shape=window,top=false": {
"model": "create:block/creative_bottom_window"
},
"bottom=false,shape=window_nw,top=false": {
"model": "create:block/creative_middle_window_nw"
},
"bottom=true,shape=window_nw,top=false": {
"model": "create:block/creative_bottom_window_nw"
},
"bottom=false,shape=window_sw,top=false": {
"model": "create:block/creative_middle_window_sw"
},
"bottom=true,shape=window_sw,top=false": {
"model": "create:block/creative_bottom_window_sw"
},
"bottom=false,shape=window_ne,top=false": {
"model": "create:block/creative_middle_window_ne"
},
"bottom=true,shape=window_ne,top=false": {
"model": "create:block/creative_bottom_window_ne"
},
"bottom=false,shape=window_se,top=false": {
"model": "create:block/creative_middle_window_se"
},
"bottom=true,shape=window_se,top=false": {
"model": "create:block/creative_bottom_window_se"
},
"bottom=false,shape=plain,top=true": {
"model": "create:block/creative_top"
},
"bottom=true,shape=plain,top=true": {
"model": "create:block/creative_single"
},
"bottom=false,shape=window,top=true": {
"model": "create:block/creative_top_window"
},
"bottom=true,shape=window,top=true": {
"model": "create:block/creative_single_window"
},
"bottom=false,shape=window_nw,top=true": {
"model": "create:block/creative_top_window_nw"
},
"bottom=true,shape=window_nw,top=true": {
"model": "create:block/creative_single_window_nw"
},
"bottom=false,shape=window_sw,top=true": {
"model": "create:block/creative_top_window_sw"
},
"bottom=true,shape=window_sw,top=true": {
"model": "create:block/creative_single_window_sw"
},
"bottom=false,shape=window_ne,top=true": {
"model": "create:block/creative_top_window_ne"
},
"bottom=true,shape=window_ne,top=true": {
"model": "create:block/creative_single_window_ne"
},
"bottom=false,shape=window_se,top=true": {
"model": "create:block/creative_top_window_se"
},
"bottom=true,shape=window_se,top=true": {
"model": "create:block/creative_single_window_se"
}
}
}

View file

@ -0,0 +1,19 @@
{
"variants": {
"facing=north": {
"model": "create:block/hose_pulley/block"
},
"facing=south": {
"model": "create:block/hose_pulley/block",
"y": 180
},
"facing=west": {
"model": "create:block/hose_pulley/block",
"y": 270
},
"facing=east": {
"model": "create:block/hose_pulley/block",
"y": 90
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "create:block/item_drain"
}
}
}

View file

@ -57,6 +57,7 @@
"block.create.copper_tiles": "s\u01DD\u05DF\u0131\u27D8 \u0279\u01DDddo\u0186",
"block.create.copper_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u0279\u01DDddo\u0186",
"block.create.creative_crate": "\u01DD\u0287\u0250\u0279\u0186 \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186",
"block.create.creative_fluid_tank": "\u029Eu\u0250\u27D8 p\u0131n\u05DF\u2132 \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186",
"block.create.creative_motor": "\u0279o\u0287oW \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186",
"block.create.crushing_wheel": "\u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186",
"block.create.crushing_wheel_controller": "\u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186 \u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186",
@ -175,6 +176,8 @@
"block.create.hand_crank": "\u029Eu\u0250\u0279\u0186 pu\u0250H",
"block.create.horizontal_framed_glass": "ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0287uoz\u0131\u0279oH",
"block.create.horizontal_framed_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0287uoz\u0131\u0279oH",
"block.create.hose_pulley": "\u028E\u01DD\u05DF\u05DFn\u0500 \u01DDsoH",
"block.create.item_drain": "u\u0131\u0250\u0279\u15E1 \u026F\u01DD\u0287I",
"block.create.jungle_window": "\u028Dopu\u0131M \u01DD\u05DFbun\u017F",
"block.create.jungle_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u01DD\u05DFbun\u017F",
"block.create.large_cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186 \u01DDb\u0279\u0250\uA780",

View file

@ -60,6 +60,7 @@
"block.create.copper_tiles": "Copper Tiles",
"block.create.copper_valve_handle": "Copper Valve Handle",
"block.create.creative_crate": "Creative Crate",
"block.create.creative_fluid_tank": "Creative Fluid Tank",
"block.create.creative_motor": "Creative Motor",
"block.create.crushing_wheel": "Crushing Wheel",
"block.create.crushing_wheel_controller": "Crushing Wheel Controller",
@ -178,6 +179,8 @@
"block.create.hand_crank": "Hand Crank",
"block.create.horizontal_framed_glass": "Horizontal Framed Glass",
"block.create.horizontal_framed_glass_pane": "Horizontal Framed Glass Pane",
"block.create.hose_pulley": "Hose Pulley",
"block.create.item_drain": "Item Drain",
"block.create.jungle_window": "Jungle Window",
"block.create.jungle_window_pane": "Jungle Window Pane",
"block.create.large_cogwheel": "Large Cogwheel",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1021",
"_": "Missing Localizations: 1024",
"_": "->------------------------] Game Elements [------------------------<-",
@ -61,6 +61,7 @@
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
"block.create.creative_crate": "Bauplankanonenmacher",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
"block.create.creative_motor": "UNLOCALIZED: Creative Motor",
"block.create.crushing_wheel": "Mahlwerkrad",
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller",
@ -179,6 +180,8 @@
"block.create.hand_crank": "UNLOCALIZED: Hand Crank",
"block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass",
"block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane",
"block.create.hose_pulley": "UNLOCALIZED: Hose Pulley",
"block.create.item_drain": "UNLOCALIZED: Item Drain",
"block.create.jungle_window": "UNLOCALIZED: Jungle Window",
"block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane",
"block.create.large_cogwheel": "Großes Zahnrad",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 650",
"_": "Missing Localizations: 653",
"_": "->------------------------] Game Elements [------------------------<-",
@ -61,6 +61,7 @@
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
"block.create.creative_crate": "Créateur de schémacanon",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
"block.create.creative_motor": "Moteur",
"block.create.crushing_wheel": "Roue de concassage",
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller",
@ -179,6 +180,8 @@
"block.create.hand_crank": "Manivelle",
"block.create.horizontal_framed_glass": "Fenêtre en verre horizontale",
"block.create.horizontal_framed_glass_pane": "Vitre encadrée horizontale",
"block.create.hose_pulley": "UNLOCALIZED: Hose Pulley",
"block.create.item_drain": "UNLOCALIZED: Item Drain",
"block.create.jungle_window": "UNLOCALIZED: Jungle Window",
"block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane",
"block.create.large_cogwheel": "Grande roue dentée",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 634",
"_": "Missing Localizations: 637",
"_": "->------------------------] Game Elements [------------------------<-",
@ -61,6 +61,7 @@
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
"block.create.creative_crate": "Creatore Cannoneschematico",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
"block.create.creative_motor": "Motore",
"block.create.crushing_wheel": "Ruota di Frantumazione",
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller",
@ -179,6 +180,8 @@
"block.create.hand_crank": "Manovella",
"block.create.horizontal_framed_glass": "Finestra Orizzontale Vetro",
"block.create.horizontal_framed_glass_pane": "Pannello di Finestra Orizzontale Vetro",
"block.create.hose_pulley": "UNLOCALIZED: Hose Pulley",
"block.create.item_drain": "UNLOCALIZED: Item Drain",
"block.create.jungle_window": "UNLOCALIZED: Jungle Window",
"block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane",
"block.create.large_cogwheel": "Ruota Dentata Grande",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 633",
"_": "Missing Localizations: 636",
"_": "->------------------------] Game Elements [------------------------<-",
@ -61,6 +61,7 @@
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
"block.create.creative_crate": "概略図砲クリエティフィアー",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
"block.create.creative_motor": "モーター",
"block.create.crushing_wheel": "破砕ホイール",
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller",
@ -179,6 +180,8 @@
"block.create.hand_crank": "ハンドクランク",
"block.create.horizontal_framed_glass": "横型ガラス窓",
"block.create.horizontal_framed_glass_pane": "横型ガラス窓板",
"block.create.hose_pulley": "UNLOCALIZED: Hose Pulley",
"block.create.item_drain": "UNLOCALIZED: Item Drain",
"block.create.jungle_window": "UNLOCALIZED: Jungle Window",
"block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane",
"block.create.large_cogwheel": "大きな歯車",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 634",
"_": "Missing Localizations: 637",
"_": "->------------------------] Game Elements [------------------------<-",
@ -61,6 +61,7 @@
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
"block.create.creative_crate": "청사진 대포 지원기",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
"block.create.creative_motor": "모터",
"block.create.crushing_wheel": "분쇄 휠",
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller",
@ -179,6 +180,8 @@
"block.create.hand_crank": "핸드 크랭크",
"block.create.horizontal_framed_glass": "수평 유리",
"block.create.horizontal_framed_glass_pane": "수평 유리판",
"block.create.hose_pulley": "UNLOCALIZED: Hose Pulley",
"block.create.item_drain": "UNLOCALIZED: Item Drain",
"block.create.jungle_window": "UNLOCALIZED: Jungle Window",
"block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane",
"block.create.large_cogwheel": "큰 톱니바퀴",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 962",
"_": "Missing Localizations: 965",
"_": "->------------------------] Game Elements [------------------------<-",
@ -61,6 +61,7 @@
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
"block.create.creative_crate": "Bouwtekeningkannon Creatiefeerder",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
"block.create.creative_motor": "UNLOCALIZED: Creative Motor",
"block.create.crushing_wheel": "Verpulveraar",
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller",
@ -179,6 +180,8 @@
"block.create.hand_crank": "UNLOCALIZED: Hand Crank",
"block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass",
"block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane",
"block.create.hose_pulley": "UNLOCALIZED: Hose Pulley",
"block.create.item_drain": "UNLOCALIZED: Item Drain",
"block.create.jungle_window": "UNLOCALIZED: Jungle Window",
"block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane",
"block.create.large_cogwheel": "Groot Tandwiel",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1028",
"_": "Missing Localizations: 1031",
"_": "->------------------------] Game Elements [------------------------<-",
@ -61,6 +61,7 @@
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
"block.create.creative_crate": "Criativador Esquemaannon",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
"block.create.creative_motor": "UNLOCALIZED: Creative Motor",
"block.create.crushing_wheel": "Roda de Moer",
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller",
@ -179,6 +180,8 @@
"block.create.hand_crank": "UNLOCALIZED: Hand Crank",
"block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass",
"block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane",
"block.create.hose_pulley": "UNLOCALIZED: Hose Pulley",
"block.create.item_drain": "UNLOCALIZED: Item Drain",
"block.create.jungle_window": "UNLOCALIZED: Jungle Window",
"block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane",
"block.create.large_cogwheel": "Roda Dentada Grande",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 303",
"_": "Missing Localizations: 306",
"_": "->------------------------] Game Elements [------------------------<-",
@ -61,6 +61,7 @@
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
"block.create.creative_crate": "Творческий ящик",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
"block.create.creative_motor": "Творческий мотор",
"block.create.crushing_wheel": "Колесо дробления",
"block.create.crushing_wheel_controller": "Контроллер колеса дробления",
@ -179,6 +180,8 @@
"block.create.hand_crank": "Рукоятка",
"block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло",
"block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель",
"block.create.hose_pulley": "UNLOCALIZED: Hose Pulley",
"block.create.item_drain": "UNLOCALIZED: Item Drain",
"block.create.jungle_window": "Окно из тропического дерева",
"block.create.jungle_window_pane": "Панель окна из тропического дерева",
"block.create.large_cogwheel": "Большая шестерня",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 316",
"_": "Missing Localizations: 319",
"_": "->------------------------] Game Elements [------------------------<-",
@ -61,6 +61,7 @@
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
"block.create.creative_crate": "创造板条箱",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
"block.create.creative_motor": "创造马达",
"block.create.crushing_wheel": "粉碎轮",
"block.create.crushing_wheel_controller": "粉碎轮控制器",
@ -179,6 +180,8 @@
"block.create.hand_crank": "手摇曲柄",
"block.create.horizontal_framed_glass": "竖直边框玻璃",
"block.create.horizontal_framed_glass_pane": "竖直边框玻璃板",
"block.create.hose_pulley": "UNLOCALIZED: Hose Pulley",
"block.create.item_drain": "UNLOCALIZED: Item Drain",
"block.create.jungle_window": "丛林窗户",
"block.create.jungle_window_pane": "丛林窗户板",
"block.create.large_cogwheel": "大齿轮",

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_bottom",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_bottom_window",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_bottom_window_ne",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_bottom_window_nw",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_bottom_window_se",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_bottom_window_sw",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_middle",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_middle_window",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_middle_window_ne",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_middle_window_nw",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_middle_window_se",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_middle_window_sw",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_single",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_single_window",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_single_window_ne",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_single_window_nw",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_single_window_se",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_single_window_sw",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_top",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_top_window",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_top_window_ne",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_top_window_nw",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_top_window_se",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "create:block/fluid_tank/block_top_window_sw",
"textures": {
"0": "create:block/creative_casing",
"1": "create:block/creative_fluid_tank",
"3": "create:block/creative_fluid_tank_window",
"4": "create:block/creative_fluid_tank_window_single",
"particle": "create:block/creative_fluid_tank"
}
}

View file

@ -0,0 +1,8 @@
{
"parent": "create:block/fluid_tank/block_single_window",
"textures": {
"5": "create:block/creative_fluid_tank_window_single",
"1": "create:block/creative_fluid_tank",
"0": "create:block/creative_casing"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "create:block/hose_pulley/item"
}

View file

@ -0,0 +1,3 @@
{
"parent": "create:block/item_drain"
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/hose_pulley"
]
},
"criteria": {
"has_item": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "forge:ingots/copper"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/hose_pulley"
}
}
},
"requirements": [
[
"has_item",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "create:creative_fluid_tank"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "create:hose_pulley"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "create:item_drain"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,28 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
" B ",
"SCP",
" I "
],
"key": {
"S": {
"item": "create:shaft"
},
"P": {
"item": "create:fluid_pipe"
},
"B": {
"item": "create:copper_casing"
},
"C": {
"item": "minecraft:dried_kelp"
},
"I": {
"tag": "forge:plates/copper"
}
},
"result": {
"item": "create:hose_pulley"
}
}

View file

@ -68,8 +68,18 @@ public class AllBlockPartials {
FURNACE_GENERATOR_FRAME = get("furnace_engine/frame"), CUCKOO_MINUTE_HAND = get("cuckoo_clock/minute_hand"),
CUCKOO_HOUR_HAND = get("cuckoo_clock/hour_hand"), CUCKOO_LEFT_DOOR = get("cuckoo_clock/left_door"),
CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"),
CUCKOO_CREEPER = get("cuckoo_clock/creeper"), ROPE_COIL = get("rope_pulley/rope_coil"),
ROPE_HALF = get("rope_pulley/rope_half"), ROPE_HALF_MAGNET = get("rope_pulley/rope_half_magnet"),
CUCKOO_CREEPER = get("cuckoo_clock/creeper"),
ROPE_COIL = get("rope_pulley/rope_coil"),
ROPE_HALF = get("rope_pulley/rope_half"),
ROPE_HALF_MAGNET = get("rope_pulley/rope_half_magnet"),
HOSE_COIL = get("hose_pulley/rope_coil"),
HOSE = get("hose_pulley/rope"),
HOSE_MAGNET = get("hose_pulley/pulley_magnet"),
HOSE_HALF = get("hose_pulley/rope_half"),
HOSE_HALF_MAGNET = get("hose_pulley/rope_half_magnet"),
MILLSTONE_COG = get("millstone/inner"),
SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"),

View file

@ -65,6 +65,8 @@ import com.simibubi.create.content.contraptions.components.turntable.TurntableBl
import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlock;
import com.simibubi.create.content.contraptions.fluids.PipeAttachmentModel;
import com.simibubi.create.content.contraptions.fluids.PumpBlock;
import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyBlock;
import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainBlock;
import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.EncasedPipeBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock;
@ -549,17 +551,49 @@ public class AllBlocks {
}
}
public static final BlockEntry<FluidTankBlock> FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::new)
public static final BlockEntry<FluidTankBlock> FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::regular)
.initialProperties(SharedProperties::softMetal)
.properties(AbstractBlock.Properties::nonOpaque)
.blockstate(new FluidTankGenerator()::generate)
.onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::new))
.onRegister(CreateRegistrate
.blockModel(() -> m -> new FluidTankModel(m, AllSpriteShifts.FLUID_TANK, AllSpriteShifts.COPPER_CASING)))
.addLayer(() -> RenderType::getCutoutMipped)
.item(FluidTankItem::new)
.model(AssetLookup.<FluidTankItem>customItemModel("_", "block_single_window"))
.build()
.register();
public static final BlockEntry<FluidTankBlock> CREATIVE_FLUID_TANK =
REGISTRATE.block("creative_fluid_tank", FluidTankBlock::creative)
.initialProperties(SharedProperties::softMetal)
.properties(Block.Properties::nonOpaque)
.blockstate(new FluidTankGenerator("creative_")::generate)
.onRegister(CreateRegistrate.blockModel(
() -> m -> new FluidTankModel(m, AllSpriteShifts.CREATIVE_FLUID_TANK, AllSpriteShifts.CREATIVE_CASING)))
.addLayer(() -> RenderType::getCutoutMipped)
.item(FluidTankItem::new)
.model((c, p) -> p.withExistingParent(c.getName(), p.modLoc("block/fluid_tank/block_single_window"))
.texture("5", p.modLoc("block/creative_fluid_tank_window_single"))
.texture("1", p.modLoc("block/creative_fluid_tank"))
.texture("0", p.modLoc("block/creative_casing")))
.build()
.register();
public static final BlockEntry<HosePulleyBlock> HOSE_PULLEY = REGISTRATE.block("hose_pulley", HosePulleyBlock::new)
.initialProperties(SharedProperties::softMetal)
.blockstate(BlockStateGen.horizontalBlockProvider(true))
.transform(StressConfigDefaults.setImpact(4.0))
.item()
.transform(customItemModel())
.register();
public static final BlockEntry<ItemDrainBlock> ITEM_DRAIN = REGISTRATE.block("item_drain", ItemDrainBlock::new)
.initialProperties(SharedProperties::softMetal)
.addLayer(() -> RenderType::getCutoutMipped)
.blockstate((c, p) -> p.simpleBlock(c.get(), AssetLookup.standardModel(c, p)))
.simpleItem()
.register();
public static final BlockEntry<SpoutBlock> SPOUT = REGISTRATE.block("spout", SpoutBlock::new)
.initialProperties(SharedProperties::softMetal)
.blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.partialBaseModel(ctx, prov)))

View file

@ -25,6 +25,7 @@ public class AllShapes {
public static final VoxelShaper
CASING_14PX = shape(0, 0, 0, 16, 14, 16).forDirectional(),
CASING_13PX = shape(0, 0, 0, 16, 13, 16).forDirectional(),
CASING_12PX = shape(0, 0, 0, 16, 12, 16).forDirectional(),
CASING_11PX = shape(0, 0, 0, 16, 11, 16).forDirectional(),
MOTOR_BLOCK = shape(3, 0, 3, 13, 14, 13).forDirectional(),
@ -34,11 +35,12 @@ public class AllShapes {
.forHorizontal(Direction.SOUTH),
PORTABLE_STORAGE_INTERFACE = shape(0, 0, 0, 16, 14, 16).forDirectional(),
PULLEY = shape(0, 0, 0, 16, 16, 2).add(1, 1, 2, 15, 15, 14)
.add(2, 13, 2, 14, 16, 14)
.add(0, 0, 14, 16, 16, 16)
.forHorizontalAxis(),
SAIL_FRAME_COLLISION = shape(0, 5, 0, 16, 9, 16).erase(2, 0, 2, 14, 16, 14).forDirectional(),
SAIL_FRAME = shape(0, 5, 0, 16, 9, 16).forDirectional(),
SAIL = shape(0, 5, 0, 16, 10, 16).forDirectional(),
SAIL_FRAME_COLLISION = shape(0, 5, 0, 16, 9, 16).erase(2, 0, 2, 14, 16, 14)
.forDirectional(),
SAIL_FRAME = shape(0, 5, 0, 16, 9, 16).forDirectional(), SAIL = shape(0, 5, 0, 16, 10, 16).forDirectional(),
SPEED_CONTROLLER = shape(0, 0, 0, 16, 2, 16).add(1, 1, 1, 15, 15, 15)
.erase(0, 8, 5, 16, 16, 11)
.add(2, 9, 2, 14, 14, 14)
@ -121,9 +123,6 @@ public class AllShapes {
LOGISTICS_TABLE_SLOPE = shape(0, 10, 15, 16, 14, 10.667).add(0, 12, 10.667, 16, 16, 6.333)
.add(0, 14, 6.333, 16, 18, 2)
.build(),
SCHEMATICS_TABLE_SLOPE = shape(0, 10, 16, 16, 14, 11).add(0, 12, 11, 16, 16, 6)
.add(0, 14, 6, 16, 18, 1)
.build(),
TANK_BOTTOM_LID = shape(0, 0, 0, 16, 4, 16).build(), TANK_TOP_LID = shape(0, 12, 0, 16, 16, 16).build()
;
@ -196,7 +195,7 @@ public class AllShapes {
.withVerticalShapes(LOGISTICAL_CONTROLLER.get(UP)),
LOGISTICS_TABLE = shape(TABLE_POLE_SHAPE).add(LOGISTICS_TABLE_SLOPE)
.forHorizontal(SOUTH),
SCHEMATICS_TABLE = shape(TABLE_POLE_SHAPE).add(SCHEMATICS_TABLE_SLOPE)
SCHEMATICS_TABLE = shape(4, 0, 4, 12, 12, 12).add(0, 11, 2, 16, 14, 14)
.forDirectional(SOUTH),
CHUTE_SLOPE = shape(ChuteShapes.createSlope()).forHorizontal(SOUTH)

View file

@ -42,7 +42,8 @@ public class AllSpriteShifts {
BRASS_CASING = omni("brass_casing"),
COPPER_CASING = omni("copper_casing"),
SHADOW_STEEL_CASING = omni("shadow_steel_casing"),
REFINED_RADIANCE_CASING = omni("refined_radiance_casing");
REFINED_RADIANCE_CASING = omni("refined_radiance_casing"),
CREATIVE_CASING = getCT(CTType.CROSS, "creative_casing");
public static final CTSpriteShiftEntry
CHASSIS = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_end"),
@ -50,7 +51,8 @@ public class AllSpriteShifts {
public static final CTSpriteShiftEntry
BRASS_TUNNEL_TOP = vertical("brass_tunnel_top"),
FLUID_TANK = getCT(CTType.CROSS, "fluid_tank");
FLUID_TANK = getCT(CTType.CROSS, "fluid_tank"),
CREATIVE_FLUID_TANK = getCT(CTType.CROSS, "creative_fluid_tank");
public static final SpriteShiftEntry
BELT = SpriteShifter.get("block/belt", "block/belt_animated"),

View file

@ -48,6 +48,8 @@ import com.simibubi.create.content.contraptions.components.turntable.TurntableTi
import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelTileEntity;
import com.simibubi.create.content.contraptions.fluids.PumpRenderer;
import com.simibubi.create.content.contraptions.fluids.PumpTileEntity;
import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyRenderer;
import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyTileEntity;
import com.simibubi.create.content.contraptions.fluids.actors.SpoutRenderer;
import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeTileEntity;
@ -56,6 +58,7 @@ import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveTileEntit
import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeTileEntity;
import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity;
import com.simibubi.create.content.contraptions.fluids.pipes.TransparentStraightPipeRenderer;
import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankRenderer;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity;
import com.simibubi.create.content.contraptions.processing.BasinRenderer;
@ -120,7 +123,6 @@ public class AllTileEntities {
public static final TileEntityEntry<SchematicTableTileEntity> SCHEMATIC_TABLE = Create.registrate()
.tileEntity("schematic_table", SchematicTableTileEntity::new)
.validBlocks(AllBlocks.SCHEMATIC_TABLE)
// .renderer(() -> renderer)
.register();
// Kinetics
@ -202,7 +204,7 @@ public class AllTileEntities {
.validBlocks(AllBlocks.MECHANICAL_PUMP)
.renderer(() -> PumpRenderer::new)
.register();
public static final TileEntityEntry<SmartFluidPipeTileEntity> SMART_FLUID_PIPE = Create.registrate()
.tileEntity("smart_fluid_pipe", SmartFluidPipeTileEntity::new)
.validBlocks(AllBlocks.SMART_FLUID_PIPE)
@ -224,7 +226,7 @@ public class AllTileEntities {
.validBlocks(AllBlocks.GLASS_FLUID_PIPE)
.renderer(() -> TransparentStraightPipeRenderer::new)
.register();
public static final TileEntityEntry<FluidValveTileEntity> FLUID_VALVE = Create.registrate()
.tileEntity("fluid_valve", FluidValveTileEntity::new)
.validBlocks(AllBlocks.FLUID_VALVE)
@ -237,6 +239,18 @@ public class AllTileEntities {
.renderer(() -> FluidTankRenderer::new)
.register();
public static final TileEntityEntry<CreativeFluidTankTileEntity> CREATIVE_FLUID_TANK = Create.registrate()
.tileEntity("creative_fluid_tank", CreativeFluidTankTileEntity::new)
.validBlocks(AllBlocks.CREATIVE_FLUID_TANK)
.renderer(() -> FluidTankRenderer::new)
.register();
public static final TileEntityEntry<HosePulleyTileEntity> HOSE_PULLEY = Create.registrate()
.tileEntity("hose_pulley", HosePulleyTileEntity::new)
.validBlocks(AllBlocks.HOSE_PULLEY)
.renderer(() -> HosePulleyRenderer::new)
.register();
public static final TileEntityEntry<SpoutTileEntity> SPOUT = Create.registrate()
.tileEntity("spout", SpoutTileEntity::new)
.validBlocks(AllBlocks.SPOUT)
@ -284,7 +298,7 @@ public class AllTileEntities {
.validBlocks(AllBlocks.WINDMILL_BEARING)
.renderer(() -> BearingRenderer::new)
.register();
public static final TileEntityEntry<MechanicalBearingTileEntity> MECHANICAL_BEARING = Create.registrate()
.tileEntity("mechanical_bearing", MechanicalBearingTileEntity::new)
.validBlocks(AllBlocks.MECHANICAL_BEARING)

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.contraptions.base;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.item.BlockItemUseContext;
@ -26,18 +28,20 @@ public abstract class HorizontalKineticBlock extends KineticBlock {
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
return this.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite());
return this.getDefaultState()
.with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing()
.getOpposite());
}
public Direction getPreferredHorizontalFacing(BlockItemUseContext context) {
Direction prefferedSide = null;
for (Direction side : Direction.values()) {
if (side.getAxis().isVertical())
continue;
BlockState blockState = context.getWorld().getBlockState(context.getPos().offset(side));
for (Direction side : Iterate.horizontalDirections) {
BlockState blockState = context.getWorld()
.getBlockState(context.getPos()
.offset(side));
if (blockState.getBlock() instanceof IRotate) {
if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos().offset(side),
blockState, side.getOpposite()))
if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos()
.offset(side), blockState, side.getOpposite()))
if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) {
prefferedSide = null;
break;

View file

@ -1046,5 +1046,5 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD
public boolean isOnePlayerRiding() {
return false;
}
}

View file

@ -72,8 +72,11 @@ public class SailBlock extends ProperDirectionalBlock {
BlockPos offsetPos = pos.offset(offset);
if (!world.isRemote && world.getBlockState(offsetPos)
.getMaterial()
.isReplaceable())
.isReplaceable()) {
world.setBlockState(offsetPos, blockState);
if (!player.isCreative())
heldItem.shrink(1);
}
return ActionResultType.SUCCESS;
}

View file

@ -20,6 +20,7 @@ import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.IWorld;
import net.minecraft.world.World;
public class PulleyRenderer extends KineticTileEntityRenderer {
@ -38,6 +39,7 @@ public class PulleyRenderer extends KineticTileEntityRenderer {
super.renderSafe(te, partialTicks, ms, buffer, light, overlay);
PulleyTileEntity pulley = (PulleyTileEntity) te;
World world = te.getWorld();
BlockState blockState = te.getBlockState();
BlockPos pos = te.getPos();
@ -46,7 +48,8 @@ public class PulleyRenderer extends KineticTileEntityRenderer {
SuperByteBuffer magnet = CreateClient.bufferCache.renderBlock(AllBlocks.PULLEY_MAGNET.getDefaultState());
SuperByteBuffer rope = CreateClient.bufferCache.renderBlock(AllBlocks.ROPE.getDefaultState());
boolean moving = pulley.running && (pulley.movedContraption == null || !pulley.movedContraption.isStalled());
boolean running = pulley.running;
boolean moving = running && (pulley.movedContraption == null || !pulley.movedContraption.isStalled());
float offset = pulley.getInterpolatedOffset(moving ? partialTicks : 0.5f);
if (pulley.movedContraption != null) {
@ -56,23 +59,28 @@ public class PulleyRenderer extends KineticTileEntityRenderer {
offset = (float) -(entityPos - c.getAnchor().getY() - c.initialOffset);
}
renderPulleyRope(ms, buffer, world, pos, halfMagnet, halfRope, magnet, rope, running, offset);
}
public static void renderPulleyRope(MatrixStack ms, IRenderTypeBuffer buffer, World world, BlockPos pos,
SuperByteBuffer halfMagnet, SuperByteBuffer halfRope, SuperByteBuffer magnet, SuperByteBuffer rope,
boolean running, float offset) {
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
if (pulley.running || pulley.offset == 0)
renderAt(te.getWorld(), offset > .25f ? magnet : halfMagnet, offset, pos, ms, vb);
if (running || offset == 0)
renderAt(world, offset > .25f ? magnet : halfMagnet, offset, pos, ms, vb);
float f = offset % 1;
if (offset > .75f && (f < .25f || f > .75f))
renderAt(te.getWorld(), halfRope, f > .75f ? f - 1 : f, pos, ms, vb);
renderAt(world, halfRope, f > .75f ? f - 1 : f, pos, ms, vb);
if (!pulley.running)
if (!running)
return;
for (int i = 0; i < offset - 1.25f; i++)
renderAt(te.getWorld(), rope, offset - i - 1, pos, ms, vb);
renderAt(world, rope, offset - i - 1, pos, ms, vb);
}
public void renderAt(IWorld world, SuperByteBuffer partial, float offset, BlockPos pulleyPos,
public static void renderAt(IWorld world, SuperByteBuffer partial, float offset, BlockPos pulleyPos,
MatrixStack ms, IVertexBuilder buffer) {
BlockPos actualPos = pulleyPos.down((int) offset);
int light = WorldRenderer.getLightmapCoordinates(world, world.getBlockState(actualPos), actualPos);

View file

@ -0,0 +1,51 @@
package com.simibubi.create.content.contraptions.fluids;
import java.util.Random;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.Fluids;
import net.minecraft.fluid.IFluidState;
import net.minecraft.particles.BlockParticleData;
import net.minecraft.particles.IParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
public class FluidFX {
static Random r = new Random();
public static void splash(BlockPos pos, FluidStack fluidStack) {
Fluid fluid = fluidStack.getFluid();
if (fluid == Fluids.EMPTY)
return;
IFluidState defaultState = fluid.getDefaultState();
if (defaultState == null || defaultState.isEmpty()) {
return;
}
BlockParticleData blockParticleData = new BlockParticleData(ParticleTypes.BLOCK, defaultState.getBlockState());
Vec3d center = VecHelper.getCenterOf(pos);
for (int i = 0; i < 20; i++) {
Vec3d v = VecHelper.offsetRandomly(Vec3d.ZERO, r, .25f);
particle(blockParticleData, center.add(v), v);
}
}
private static void particle(IParticleData data, Vec3d pos, Vec3d motion) {
world().addParticle(data, pos.x, pos.y, pos.z, motion.x, motion.y, motion.z);
}
private static World world() {
return Minecraft.getInstance().world;
}
}

View file

@ -1,5 +1,6 @@
package com.simibubi.create.content.contraptions.fluids;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
@ -24,7 +25,8 @@ public class FluidPipeAttachmentBehaviour extends TileEntityBehaviour {
.getAxis() == direction.getAxis())
return AttachmentTypes.NONE;
if (FluidPropagator.hasFluidCapability(facingState, world, offsetPos, direction))
if (FluidPropagator.hasFluidCapability(facingState, world, offsetPos, direction)
&& !AllBlocks.HOSE_PULLEY.has(facingState))
return AttachmentTypes.DRAIN;
return AttachmentTypes.RIM;

View file

@ -0,0 +1,333 @@
package com.simibubi.create.content.contraptions.fluids.actors;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import javax.annotation.Nullable;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
import it.unimi.dsi.fastutil.PriorityQueue;
import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.FlowingFluidBlock;
import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.Fluids;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
public class FluidDrainingBehaviour extends FluidManipulationBehaviour {
Fluid fluid;
// Execution
Set<BlockPos> validationSet;
PriorityQueue<BlockPosEntry> queue;
boolean isValid;
// Validation
List<BlockPosEntry> validationFrontier;
Set<BlockPos> validationVisited;
Set<BlockPos> newValidationSet;
public FluidDrainingBehaviour(SmartTileEntity te) {
super(te);
validationVisited = new HashSet<>();
validationFrontier = new ArrayList<>();
validationSet = new HashSet<>();
newValidationSet = new HashSet<>();
queue = new ObjectHeapPriorityQueue<>(this::comparePositions);
}
@Nullable
public boolean pullNext(BlockPos root, boolean simulate) {
if (!frontier.isEmpty())
return false;
if (!Objects.equals(root, rootPos)) {
rebuildContext(root);
return false;
}
if (counterpartActed) {
counterpartActed = false;
softReset(root);
return false;
}
if (affectedArea == null)
affectedArea = new MutableBoundingBox(root, root);
World world = getWorld();
if (!queue.isEmpty() && !isValid) {
rebuildContext(root);
return false;
}
if (validationFrontier.isEmpty() && !queue.isEmpty() && !simulate && revalidateIn == 0)
revalidate(root);
while (!queue.isEmpty()) {
// Dont dequeue here, so we can decide not to dequeue a valid entry when
// simulating
BlockPos currentPos = queue.first().pos;
BlockState blockState = world.getBlockState(currentPos);
BlockState emptied = blockState;
Fluid fluid = Fluids.EMPTY;
if (blockState.has(BlockStateProperties.WATERLOGGED) && blockState.get(BlockStateProperties.WATERLOGGED)) {
emptied = blockState.with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(false));
fluid = Fluids.WATER;
} else if (blockState.getBlock() instanceof FlowingFluidBlock) {
FlowingFluidBlock flowingFluid = (FlowingFluidBlock) blockState.getBlock();
emptied = Blocks.AIR.getDefaultState();
if (blockState.get(FlowingFluidBlock.LEVEL) == 0)
fluid = flowingFluid.getFluid();
else {
affectedArea.expandTo(new MutableBoundingBox(currentPos, currentPos));
world.setBlockState(currentPos, emptied, 2 | 16);
queue.dequeue();
if (queue.isEmpty()) {
isValid = checkValid(world, rootPos);
reset();
}
continue;
}
} else if (blockState.getFluidState()
.getFluid() != Fluids.EMPTY
&& blockState.getCollisionShape(world, currentPos, ISelectionContext.dummy())
.isEmpty()) {
fluid = blockState.getFluidState()
.getFluid();
emptied = Blocks.AIR.getDefaultState();
}
if (this.fluid == null)
this.fluid = fluid;
if (!this.fluid.isEquivalentTo(fluid)) {
queue.dequeue();
if (queue.isEmpty()) {
isValid = checkValid(world, rootPos);
reset();
}
continue;
}
if (simulate)
return true;
playEffect(world, currentPos, fluid, true);
if (infinite)
return true;
world.setBlockState(currentPos, emptied, 2 | 16);
affectedArea.expandTo(new MutableBoundingBox(currentPos, currentPos));
queue.dequeue();
if (queue.isEmpty()) {
isValid = checkValid(world, rootPos);
reset();
} else if (!validationSet.contains(currentPos)) {
reset();
}
return true;
}
if (rootPos == null)
return false;
if (isValid)
rebuildContext(root);
return false;
}
protected void softReset(BlockPos root) {
queue.clear();
validationSet.clear();
newValidationSet.clear();
validationFrontier.clear();
validationVisited.clear();
visited.clear();
infinite = false;
setValidationTimer();
frontier.add(new BlockPosEntry(root, 0));
}
protected boolean checkValid(World world, BlockPos root) {
BlockPos currentPos = root;
for (int timeout = 1000; timeout > 0 && !root.equals(tileEntity.getPos()); timeout--) {
FluidBlockType canPullFluidsFrom = canPullFluidsFrom(world.getBlockState(currentPos), currentPos);
if (canPullFluidsFrom == FluidBlockType.FLOWING) {
currentPos = currentPos.up();
continue;
}
if (canPullFluidsFrom == FluidBlockType.SOURCE)
return true;
break;
}
return false;
}
enum FluidBlockType {
NONE, SOURCE, FLOWING;
}
@Override
public void read(CompoundNBT nbt, boolean clientPacket) {
super.read(nbt, clientPacket);
if (!clientPacket && affectedArea != null)
frontier.add(new BlockPosEntry(rootPos, 0));
}
protected FluidBlockType canPullFluidsFrom(BlockState blockState, BlockPos pos) {
if (blockState.has(BlockStateProperties.WATERLOGGED) && blockState.get(BlockStateProperties.WATERLOGGED))
return FluidBlockType.SOURCE;
if (blockState.getBlock() instanceof FlowingFluidBlock)
return blockState.get(FlowingFluidBlock.LEVEL) == 0 ? FluidBlockType.SOURCE : FluidBlockType.FLOWING;
if (blockState.getFluidState()
.getFluid() != Fluids.EMPTY && blockState.getCollisionShape(getWorld(), pos, ISelectionContext.dummy())
.isEmpty())
return FluidBlockType.SOURCE;
return FluidBlockType.NONE;
}
@Override
public void tick() {
super.tick();
if (rootPos != null)
isValid = checkValid(getWorld(), rootPos);
if (!frontier.isEmpty()) {
continueSearch();
return;
}
if (!validationFrontier.isEmpty()) {
continueValidation();
return;
}
if (revalidateIn > 0)
revalidateIn--;
}
@Override
public void lazyTick() {
super.lazyTick();
}
public void rebuildContext(BlockPos root) {
reset();
rootPos = root;
affectedArea = new MutableBoundingBox(rootPos, rootPos);
if (isValid)
frontier.add(new BlockPosEntry(root, 0));
}
public void revalidate(BlockPos root) {
validationFrontier.clear();
validationVisited.clear();
newValidationSet.clear();
validationFrontier.add(new BlockPosEntry(root, 0));
setValidationTimer();
}
private void continueSearch() {
search(fluid, frontier, visited, (e, d) -> {
queue.enqueue(new BlockPosEntry(e, d));
validationSet.add(e);
}, false);
World world = getWorld();
int maxBlocks = maxBlocks();
if (visited.size() > maxBlocks) {
infinite = true;
// Find first block with valid fluid
while (true) {
BlockPos first = queue.first().pos;
if (canPullFluidsFrom(world.getBlockState(first), first) != FluidBlockType.SOURCE) {
queue.dequeue();
continue;
}
break;
}
BlockPos firstValid = queue.first().pos;
frontier.clear();
visited.clear();
queue.clear();
queue.enqueue(new BlockPosEntry(firstValid, 0));
tileEntity.sendData();
return;
}
if (!frontier.isEmpty())
return;
tileEntity.sendData();
visited.clear();
}
private void continueValidation() {
search(fluid, validationFrontier, validationVisited, (e, d) -> newValidationSet.add(e), false);
int maxBlocks = maxBlocks();
if (validationVisited.size() > maxBlocks) {
if (!infinite) {
reset();
}
validationFrontier.clear();
setLongValidationTimer();
return;
}
if (!validationFrontier.isEmpty())
return;
if (infinite) {
reset();
return;
}
validationSet = newValidationSet;
newValidationSet = new HashSet<>();
validationVisited.clear();
}
@Override
public void reset() {
super.reset();
fluid = null;
rootPos = null;
queue.clear();
validationSet.clear();
newValidationSet.clear();
validationFrontier.clear();
validationVisited.clear();
}
public static BehaviourType<FluidDrainingBehaviour> TYPE = new BehaviourType<>();
@Override
public BehaviourType<?> getType() {
return TYPE;
}
protected boolean isSearching() {
return !frontier.isEmpty();
}
public FluidStack getDrainableFluid(BlockPos rootPos) {
return fluid == null || isSearching() || !pullNext(rootPos, true) ? FluidStack.EMPTY
: new FluidStack(fluid, 1000);
}
}

View file

@ -0,0 +1,259 @@
package com.simibubi.create.content.contraptions.fluids.actors;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
import com.simibubi.create.foundation.utility.Iterate;
import it.unimi.dsi.fastutil.PriorityQueue;
import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue;
import net.minecraft.block.BlockState;
import net.minecraft.block.FlowingFluidBlock;
import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.Fluids;
import net.minecraft.fluid.IFluidState;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.world.ITickList;
import net.minecraft.world.NextTickListEntry;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerTickList;
public class FluidFillingBehaviour extends FluidManipulationBehaviour {
PriorityQueue<BlockPosEntry> queue;
List<BlockPosEntry> infinityCheckFrontier;
Set<BlockPos> infinityCheckVisited;
public FluidFillingBehaviour(SmartTileEntity te) {
super(te);
queue = new ObjectHeapPriorityQueue<>((p, p2) -> -comparePositions(p, p2));
revalidateIn = 1;
infinityCheckFrontier = new ArrayList<>();
infinityCheckVisited = new HashSet<>();
}
@Override
public void tick() {
super.tick();
if (!infinityCheckFrontier.isEmpty() && rootPos != null) {
Fluid fluid = getWorld().getFluidState(rootPos)
.getFluid();
if (fluid != Fluids.EMPTY)
continueValidation(fluid);
}
if (revalidateIn > 0)
revalidateIn--;
}
protected void continueValidation(Fluid fluid) {
search(fluid, infinityCheckFrontier, infinityCheckVisited,
(p, d) -> infinityCheckFrontier.add(new BlockPosEntry(p, d)), true);
int maxBlocks = maxBlocks();
if (infinityCheckVisited.size() > maxBlocks) {
if (!infinite) {
reset();
infinite = true;
}
infinityCheckFrontier.clear();
setLongValidationTimer();
return;
}
if (!infinityCheckFrontier.isEmpty())
return;
if (infinite) {
reset();
return;
}
infinityCheckVisited.clear();
}
public boolean tryDeposit(Fluid fluid, BlockPos root, boolean simulate) {
if (!Objects.equals(root, rootPos)) {
reset();
rootPos = root;
queue.enqueue(new BlockPosEntry(root, 0));
affectedArea = new MutableBoundingBox(rootPos, rootPos);
return false;
}
if (counterpartActed) {
counterpartActed = false;
softReset(root);
return false;
}
if (affectedArea == null)
affectedArea = new MutableBoundingBox(root, root);
if (revalidateIn == 0) {
visited.clear();
infinityCheckFrontier.clear();
infinityCheckVisited.clear();
infinityCheckFrontier.add(new BlockPosEntry(root, 0));
setValidationTimer();
softReset(root);
}
World world = getWorld();
int maxRange = maxRange();
int maxRangeSq = maxRange * maxRange;
int maxBlocks = maxBlocks();
if (infinite) {
IFluidState fluidState = world.getFluidState(rootPos);
boolean equivalentTo = fluidState.getFluid()
.isEquivalentTo(fluid);
if (!equivalentTo)
return false;
if (simulate)
return true;
playEffect(world, BlockPos.ZERO, fluid, false);
return true;
}
boolean success = false;
for (int i = 0; !success && !queue.isEmpty() && i < searchedPerTick; i++) {
BlockPosEntry entry = queue.first();
BlockPos currentPos = entry.pos;
if (visited.contains(currentPos)) {
queue.dequeue();
continue;
}
if (!simulate)
visited.add(currentPos);
if (visited.size() >= maxBlocks) {
infinite = true;
visited.clear();
queue.clear();
return false;
}
SpaceType spaceType = getAtPos(world, currentPos, fluid);
if (spaceType == SpaceType.BLOCKING)
continue;
if (spaceType == SpaceType.FILLABLE) {
success = true;
if (!simulate) {
playEffect(world, currentPos, fluid, false);
BlockState blockState = world.getBlockState(currentPos);
if (blockState.has(BlockStateProperties.WATERLOGGED) && fluid.isEquivalentTo(Fluids.WATER)) {
world.setBlockState(currentPos, blockState.with(BlockStateProperties.WATERLOGGED, true),
2 | 16);
} else {
world.setBlockState(currentPos, fluid.getDefaultState()
.getBlockState(), 2 | 16);
}
ITickList<Fluid> pendingFluidTicks = world.getPendingFluidTicks();
if (pendingFluidTicks instanceof ServerTickList) {
ServerTickList<Fluid> serverTickList = (ServerTickList<Fluid>) pendingFluidTicks;
NextTickListEntry<Fluid> removedEntry = null;
for (NextTickListEntry<Fluid> nextTickListEntry : serverTickList.pendingTickListEntriesHashSet) {
if (nextTickListEntry.position.equals(currentPos)) {
removedEntry = nextTickListEntry;
break;
}
}
if (removedEntry != null) {
serverTickList.pendingTickListEntriesHashSet.remove(removedEntry);
serverTickList.pendingTickListEntriesTreeSet.remove(removedEntry);
}
}
affectedArea.expandTo(new MutableBoundingBox(currentPos, currentPos));
}
}
if (simulate && success)
return true;
visited.add(currentPos);
queue.dequeue();
for (Direction side : Iterate.directions) {
if (side == Direction.UP)
continue;
BlockPos offsetPos = currentPos.offset(side);
if (visited.contains(offsetPos))
continue;
if (offsetPos.distanceSq(rootPos) > maxRangeSq)
continue;
SpaceType nextSpaceType = getAtPos(world, offsetPos, fluid);
if (nextSpaceType != SpaceType.BLOCKING)
queue.enqueue(new BlockPosEntry(offsetPos, entry.distance + 1));
}
}
return success;
}
protected void softReset(BlockPos root) {
visited.clear();
queue.clear();
queue.enqueue(new BlockPosEntry(root, 0));
infinite = false;
setValidationTimer();
}
enum SpaceType {
FILLABLE, FILLED, BLOCKING
}
protected SpaceType getAtPos(World world, BlockPos pos, Fluid toFill) {
BlockState blockState = world.getBlockState(pos);
IFluidState fluidState = blockState.getFluidState();
if (blockState.has(BlockStateProperties.WATERLOGGED))
return toFill.isEquivalentTo(Fluids.WATER)
? blockState.get(BlockStateProperties.WATERLOGGED) ? SpaceType.FILLED : SpaceType.FILLABLE
: SpaceType.BLOCKING;
if (blockState.getBlock() instanceof FlowingFluidBlock)
return blockState.get(FlowingFluidBlock.LEVEL) == 0
? toFill.isEquivalentTo(fluidState.getFluid()) ? SpaceType.FILLED : SpaceType.BLOCKING
: SpaceType.FILLABLE;
if (fluidState.getFluid() != Fluids.EMPTY
&& blockState.getCollisionShape(getWorld(), pos, ISelectionContext.dummy())
.isEmpty())
return toFill.isEquivalentTo(fluidState.getFluid()) ? SpaceType.FILLED : SpaceType.BLOCKING;
return blockState.getMaterial()
.isReplaceable() ? SpaceType.FILLABLE : SpaceType.BLOCKING;
}
@Override
public void reset() {
super.reset();
queue.clear();
infinityCheckFrontier.clear();
infinityCheckVisited.clear();
}
public static BehaviourType<FluidFillingBehaviour> TYPE = new BehaviourType<>();
@Override
public BehaviourType<?> getType() {
return TYPE;
}
}

View file

@ -0,0 +1,222 @@
package com.simibubi.create.content.contraptions.fluids.actors;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
import com.simibubi.create.foundation.fluid.FluidHelper;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.IFluidState;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.tags.FluidTags;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.fluids.FluidStack;
public abstract class FluidManipulationBehaviour extends TileEntityBehaviour {
protected static class BlockPosEntry {
public BlockPos pos;
public int distance;
public BlockPosEntry(BlockPos pos, int distance) {
this.pos = pos;
this.distance = distance;
}
}
MutableBoundingBox affectedArea;
BlockPos rootPos;
boolean infinite;
protected boolean counterpartActed;
// Search
static final int searchedPerTick = 256;
List<BlockPosEntry> frontier;
Set<BlockPos> visited;
static final int validationTimer = 160;
int revalidateIn;
public FluidManipulationBehaviour(SmartTileEntity te) {
super(te);
setValidationTimer();
infinite = false;
visited = new HashSet<>();
frontier = new ArrayList<>();
}
public void counterpartActed() {
counterpartActed = true;
}
protected int setValidationTimer() {
return revalidateIn = validationTimer;
}
protected int setLongValidationTimer() {
return revalidateIn = validationTimer * 2;
}
protected int maxRange() {
return 128;
}
protected int maxBlocks() {
return 10000;
}
public void reset() {
if (affectedArea != null)
scheduleUpdatesInAffectedArea();
affectedArea = null;
setValidationTimer();
frontier.clear();
visited.clear();
infinite = false;
}
@Override
public void destroy() {
reset();
super.destroy();
}
protected void scheduleUpdatesInAffectedArea() {
World world = getWorld();
affectedArea = new MutableBoundingBox(affectedArea.minX - 1, affectedArea.minY - 1, affectedArea.minZ - 1,
affectedArea.maxX + 1, affectedArea.maxY + 1, affectedArea.maxZ + 1);
BlockPos.func_229383_a_(affectedArea)
.forEach(pos -> {
IFluidState nextFluidState = world.getFluidState(pos);
if (nextFluidState.isEmpty())
return;
world.getPendingFluidTicks()
.scheduleTick(pos, nextFluidState.getFluid(), world.getRandom()
.nextInt(5));
});
}
protected int comparePositions(BlockPosEntry e1, BlockPosEntry e2) {
Vec3d centerOfRoot = VecHelper.getCenterOf(rootPos);
BlockPos pos2 = e2.pos;
BlockPos pos1 = e1.pos;
if (pos1.getY() != pos2.getY())
return Integer.compare(pos2.getY(), pos1.getY());
int compareDistance = Integer.compare(e2.distance, e1.distance);
if (compareDistance != 0)
return compareDistance;
return Double.compare(VecHelper.getCenterOf(pos2)
.squareDistanceTo(centerOfRoot),
VecHelper.getCenterOf(pos1)
.squareDistanceTo(centerOfRoot));
}
protected void search(Fluid fluid, List<BlockPosEntry> frontier, Set<BlockPos> visited,
BiConsumer<BlockPos, Integer> add, boolean searchDownward) {
World world = getWorld();
int maxBlocks = maxBlocks();
int maxRange = maxRange();
int maxRangeSq = maxRange * maxRange;
int i;
for (i = 0; i < searchedPerTick && !frontier.isEmpty() && visited.size() <= maxBlocks; i++) {
BlockPosEntry entry = frontier.remove(0);
BlockPos currentPos = entry.pos;
if (visited.contains(currentPos))
continue;
visited.add(currentPos);
IFluidState fluidState = world.getFluidState(currentPos);
if (fluidState.isEmpty())
continue;
Fluid currentFluid = FluidHelper.convertToStill(fluidState.getFluid());
if (fluid == null)
fluid = currentFluid;
if (!currentFluid.isEquivalentTo(fluid))
continue;
add.accept(currentPos, entry.distance);
for (Direction side : Iterate.directions) {
if (!searchDownward && side == Direction.DOWN)
continue;
BlockPos offsetPos = currentPos.offset(side);
if (visited.contains(offsetPos))
continue;
if (offsetPos.distanceSq(rootPos) > maxRangeSq)
continue;
IFluidState nextFluidState = world.getFluidState(offsetPos);
if (nextFluidState.isEmpty())
continue;
Fluid nextFluid = nextFluidState.getFluid();
if (nextFluid == FluidHelper.convertToFlowing(nextFluid) && side == Direction.UP
&& !VecHelper.onSameAxis(rootPos, offsetPos, Axis.Y))
continue;
frontier.add(new BlockPosEntry(offsetPos, entry.distance + 1));
}
}
}
protected void playEffect(World world, BlockPos pos, Fluid fluid, boolean fillSound) {
BlockPos splooshPos = infinite ? tileEntity.getPos() : pos;
SoundEvent soundevent = fillSound ? fluid.getAttributes()
.getFillSound()
: fluid.getAttributes()
.getEmptySound();
if (soundevent == null)
soundevent = fluid.isIn(FluidTags.LAVA)
? fillSound ? SoundEvents.ITEM_BUCKET_FILL_LAVA : SoundEvents.ITEM_BUCKET_EMPTY_LAVA
: fillSound ? SoundEvents.ITEM_BUCKET_FILL : SoundEvents.ITEM_BUCKET_EMPTY;
world.playSound(null, splooshPos, soundevent, SoundCategory.BLOCKS, 0.3F, 1.0F);
if (world instanceof ServerWorld)
AllPackets.sendToNear(world, splooshPos, 10, new FluidSplashPacket(splooshPos, new FluidStack(fluid, 1)));
}
@Override
public void write(CompoundNBT nbt, boolean clientPacket) {
if (rootPos != null)
nbt.put("LastPos", NBTUtil.writeBlockPos(rootPos));
if (affectedArea != null) {
nbt.put("AffectedAreaFrom",
NBTUtil.writeBlockPos(new BlockPos(affectedArea.minX, affectedArea.minY, affectedArea.minZ)));
nbt.put("AffectedAreaTo",
NBTUtil.writeBlockPos(new BlockPos(affectedArea.maxX, affectedArea.maxY, affectedArea.maxZ)));
}
super.write(nbt, clientPacket);
}
@Override
public void read(CompoundNBT nbt, boolean clientPacket) {
if (nbt.contains("LastPos"))
rootPos = NBTUtil.readBlockPos(nbt.getCompound("LastPos"));
if (nbt.contains("AffectedAreaFrom") && nbt.contains("AffectedAreaTo"))
affectedArea = new MutableBoundingBox(NBTUtil.readBlockPos(nbt.getCompound("AffectedAreaFrom")),
NBTUtil.readBlockPos(nbt.getCompound("AffectedAreaTo")));
super.read(nbt, clientPacket);
}
}

View file

@ -0,0 +1,49 @@
package com.simibubi.create.content.contraptions.fluids.actors;
import java.util.function.Supplier;
import com.simibubi.create.content.contraptions.fluids.FluidFX;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.client.Minecraft;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.network.NetworkEvent.Context;
public class FluidSplashPacket extends SimplePacketBase {
private BlockPos pos;
private FluidStack fluid;
public FluidSplashPacket(BlockPos pos, FluidStack fluid) {
this.pos = pos;
this.fluid = fluid;
}
public FluidSplashPacket(PacketBuffer buffer) {
pos = buffer.readBlockPos();
fluid = buffer.readFluidStack();
}
public void write(PacketBuffer buffer) {
buffer.writeBlockPos(pos);
buffer.writeFluidStack(fluid);
}
public void handle(Supplier<Context> ctx) {
ctx.get()
.enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> {
if (Minecraft.getInstance().player.getPositionVector()
.distanceTo(new Vec3d(pos)) > 100)
return;
FluidFX.splash(pos, fluid);
}));
ctx.get()
.setPacketHandled(true);
}
}

View file

@ -0,0 +1,107 @@
package com.simibubi.create.content.contraptions.fluids.actors;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.BlockState;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
public class HosePulleyBlock extends HorizontalKineticBlock implements ITE<HosePulleyTileEntity> {
public HosePulleyBlock(Properties properties) {
super(properties);
}
@Override
public Axis getRotationAxis(BlockState state) {
return state.get(HORIZONTAL_FACING)
.rotateY()
.getAxis();
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
Direction preferredHorizontalFacing = getPreferredHorizontalFacing(context);
return this.getDefaultState()
.with(HORIZONTAL_FACING,
preferredHorizontalFacing != null ? preferredHorizontalFacing.rotateYCCW()
: context.getPlacementHorizontalFacing()
.getOpposite());
}
@Override
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return state.get(HORIZONTAL_FACING)
.rotateY() == face;
}
public static boolean hasPipeTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return state.get(HORIZONTAL_FACING)
.rotateYCCW() == face;
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.HOSE_PULLEY.create();
}
@Override
public Direction getPreferredHorizontalFacing(BlockItemUseContext context) {
Direction fromParent = super.getPreferredHorizontalFacing(context);
if (fromParent != null)
return fromParent;
Direction prefferedSide = null;
for (Direction facing : Iterate.horizontalDirections) {
BlockPos pos = context.getPos()
.offset(facing);
BlockState blockState = context.getWorld()
.getBlockState(pos);
if (FluidPipeBlock.canConnectTo(context.getWorld(), pos, blockState, facing))
if (prefferedSide != null && prefferedSide.getAxis() != facing.getAxis()) {
prefferedSide = null;
break;
} else
prefferedSide = facing;
}
return prefferedSide == null ? null : prefferedSide.getOpposite();
}
@Override
public void onReplaced(BlockState p_196243_1_, World world, BlockPos pos, BlockState p_196243_4_,
boolean p_196243_5_) {
if (p_196243_1_.hasTileEntity()
&& (p_196243_1_.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasTileEntity())) {
TileEntityBehaviour.destroy(world, pos, FluidDrainingBehaviour.TYPE);
TileEntityBehaviour.destroy(world, pos, FluidFillingBehaviour.TYPE);
world.removeTileEntity(pos);
}
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
return AllShapes.PULLEY.get(state.get(HORIZONTAL_FACING)
.rotateY()
.getAxis());
}
@Override
public Class<HosePulleyTileEntity> getTileEntityClass() {
return HosePulleyTileEntity.class;
}
}

View file

@ -0,0 +1,123 @@
package com.simibubi.create.content.contraptions.fluids.actors;
import java.util.function.Supplier;
import javax.annotation.Nullable;
import com.simibubi.create.foundation.fluid.SmartFluidTank;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler;
public class HosePulleyFluidHandler implements IFluidHandler {
// The dynamic interface
@Override
public int fill(FluidStack resource, FluidAction action) {
if (!internalTank.isEmpty() && !resource.isFluidEqual(internalTank.getFluid()))
return 0;
int diff = resource.getAmount();
int totalAmountAfterFill = diff + internalTank.getFluidAmount();
FluidStack remaining = resource.copy();
if (predicate.get() && totalAmountAfterFill >= 1000) {
if (filler.tryDeposit(resource.getFluid(), rootPosGetter.get(), action.simulate())) {
drainer.counterpartActed();
remaining.shrink(1000);
diff -= 1000;
}
}
if (action.simulate())
return diff <= 0 ? resource.getAmount() : internalTank.fill(remaining, action);
if (diff <= 0) {
internalTank.drain(-diff, FluidAction.EXECUTE);
return resource.getAmount();
}
return internalTank.fill(remaining, action);
}
@Override
public FluidStack getFluidInTank(int tank) {
if (internalTank.isEmpty())
return drainer.getDrainableFluid(rootPosGetter.get());
return internalTank.getFluidInTank(tank);
}
@Override
public FluidStack drain(FluidStack resource, FluidAction action) {
return drainInternal(resource.getAmount(), resource, action);
}
@Override
public FluidStack drain(int maxDrain, FluidAction action) {
return drainInternal(maxDrain, null, action);
}
private FluidStack drainInternal(int maxDrain, @Nullable FluidStack resource, FluidAction action) {
if (resource != null && !internalTank.isEmpty() && !resource.isFluidEqual(internalTank.getFluid()))
return FluidStack.EMPTY;
if (internalTank.getFluidAmount() >= 1000)
return internalTank.drain(maxDrain, action);
BlockPos pos = rootPosGetter.get();
FluidStack returned = drainer.getDrainableFluid(pos);
if (!predicate.get() || !drainer.pullNext(pos, action.simulate()))
return internalTank.drain(maxDrain, action);
filler.counterpartActed();
FluidStack leftover = returned.copy();
int available = 1000 + internalTank.getFluidAmount();
int drained;
if (!internalTank.isEmpty() && !internalTank.getFluid()
.isFluidEqual(returned) || returned.isEmpty())
return internalTank.drain(maxDrain, action);
if (resource != null && !returned.isFluidEqual(resource))
return FluidStack.EMPTY;
drained = Math.min(maxDrain, available);
returned.setAmount(drained);
leftover.setAmount(available - drained);
if (action.execute() && !leftover.isEmpty())
internalTank.setFluid(leftover);
return returned;
}
//
private SmartFluidTank internalTank;
private FluidFillingBehaviour filler;
private FluidDrainingBehaviour drainer;
private Supplier<BlockPos> rootPosGetter;
private Supplier<Boolean> predicate;
public HosePulleyFluidHandler(SmartFluidTank internalTank, FluidFillingBehaviour filler,
FluidDrainingBehaviour drainer, Supplier<BlockPos> rootPosGetter, Supplier<Boolean> predicate) {
this.internalTank = internalTank;
this.filler = filler;
this.drainer = drainer;
this.rootPosGetter = rootPosGetter;
this.predicate = predicate;
}
@Override
public int getTanks() {
return internalTank.getTanks();
}
@Override
public int getTankCapacity(int tank) {
return internalTank.getTankCapacity(tank);
}
@Override
public boolean isFluidValid(int tank, FluidStack stack) {
return internalTank.isFluidValid(tank, stack);
}
}

View file

@ -0,0 +1,70 @@
package com.simibubi.create.content.contraptions.fluids.actors;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyRenderer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.SuperByteBuffer;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class HosePulleyRenderer extends KineticTileEntityRenderer {
public HosePulleyRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@Override
public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) {
return true;
}
@Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
super.renderSafe(te, partialTicks, ms, buffer, light, overlay);
HosePulleyTileEntity pulley = (HosePulleyTileEntity) te;
float offset = pulley.getInterpolatedOffset(partialTicks);
Axis rotationAxis = ((IRotate) te.getBlockState()
.getBlock()).getRotationAxis(te.getBlockState());
kineticRotationTransform(getRotatedCoil(te), te, rotationAxis, AngleHelper.rad(offset * 180), light).renderInto(ms,
buffer.getBuffer(RenderType.getSolid()));
World world = te.getWorld();
BlockState blockState = te.getBlockState();
BlockPos pos = te.getPos();
SuperByteBuffer halfMagnet = AllBlockPartials.HOSE_HALF_MAGNET.renderOn(blockState);
SuperByteBuffer halfRope = AllBlockPartials.HOSE_HALF.renderOn(blockState);
SuperByteBuffer magnet = AllBlockPartials.HOSE_MAGNET.renderOn(blockState);
SuperByteBuffer rope = AllBlockPartials.HOSE.renderOn(blockState);
PulleyRenderer.renderPulleyRope(ms, buffer, world, pos, halfMagnet, halfRope, magnet, rope, true, offset);
}
@Override
protected BlockState getRenderedBlockState(KineticTileEntity te) {
return shaft(te.getBlockState()
.get(HosePulleyBlock.HORIZONTAL_FACING)
.rotateY()
.getAxis());
}
protected SuperByteBuffer getRotatedCoil(KineticTileEntity te) {
BlockState blockState = te.getBlockState();
return AllBlockPartials.HOSE_COIL.renderOnDirectionalSouth(blockState,
blockState.get(HosePulleyBlock.HORIZONTAL_FACING)
.rotateY());
}
}

View file

@ -0,0 +1,171 @@
package com.simibubi.create.content.contraptions.fluids.actors;
import java.util.List;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.foundation.fluid.SmartFluidTank;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler;
public class HosePulleyTileEntity extends KineticTileEntity {
LerpedFloat offset;
boolean isMoving;
private SmartFluidTank internalTank;
private LazyOptional<IFluidHandler> capability;
private FluidDrainingBehaviour drainer;
private FluidFillingBehaviour filler;
public HosePulleyTileEntity(TileEntityType<?> typeIn) {
super(typeIn);
offset = LerpedFloat.linear()
.startWithValue(0);
isMoving = true;
internalTank = new SmartFluidTank(1500, this::onTankContentsChanged);
IFluidHandler handler = new HosePulleyFluidHandler(internalTank, filler, drainer,
() -> pos.down((int) Math.ceil(offset.getValue())), () -> !this.isMoving);
capability = LazyOptional.of(() -> handler);
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
drainer = new FluidDrainingBehaviour(this);
filler = new FluidFillingBehaviour(this);
behaviours.add(drainer);
behaviours.add(filler);
super.addBehaviours(behaviours);
}
protected void onTankContentsChanged(FluidStack contents) {}
@Override
public void onSpeedChanged(float previousSpeed) {
isMoving = true;
if (getSpeed() == 0) {
offset.forceNextSync();
offset.setValue(Math.round(offset.getValue()));
isMoving = false;
}
if (isMoving) {
float newOffset = offset.getValue() + getMovementSpeed();
if (newOffset < 0)
isMoving = false;
if (!world.getBlockState(pos.down((int) Math.ceil(newOffset)))
.getMaterial()
.isReplaceable()) {
isMoving = false;
}
if (isMoving) {
drainer.reset();
filler.reset();
}
}
super.onSpeedChanged(previousSpeed);
}
@Override
@OnlyIn(Dist.CLIENT)
public AxisAlignedBB getRenderBoundingBox() {
return super.getRenderBoundingBox().expand(0, -offset.getValue(), 0);
}
@Override
@OnlyIn(Dist.CLIENT)
public double getMaxRenderDistanceSquared() {
return super.getMaxRenderDistanceSquared() + offset.getValue() * offset.getValue();
}
@Override
public void tick() {
super.tick();
float newOffset = offset.getValue() + getMovementSpeed();
if (newOffset < 0) {
newOffset = 0;
isMoving = false;
}
if (!world.getBlockState(pos.down((int) Math.ceil(newOffset)))
.getMaterial()
.isReplaceable()) {
newOffset = (int) newOffset;
isMoving = false;
}
if (getSpeed() == 0)
isMoving = false;
offset.setValue(newOffset);
}
@Override
public void lazyTick() {
super.lazyTick();
if (world.isRemote)
return;
if (isMoving)
return;
int ceil = (int) Math.ceil(offset.getValue() + getMovementSpeed());
if (getMovementSpeed() > 0 && world.getBlockState(pos.down(ceil))
.getMaterial()
.isReplaceable()) {
isMoving = true;
drainer.reset();
filler.reset();
return;
}
}
@Override
protected void write(CompoundNBT compound, boolean clientPacket) {
compound.put("Offset", offset.writeNBT());
compound.put("Tank", internalTank.writeToNBT(new CompoundNBT()));
super.write(compound, clientPacket);
}
@Override
protected void read(CompoundNBT compound, boolean clientPacket) {
offset.readNBT(compound.getCompound("Offset"), clientPacket);
internalTank.readFromNBT(compound.getCompound("Tank"));
super.read(compound, clientPacket);
}
@Override
public void remove() {
super.remove();
capability.invalidate();
}
public float getMovementSpeed() {
float movementSpeed = getSpeed() / 512f;
if (world.isRemote)
movementSpeed *= ServerSpeedProvider.get();
return movementSpeed;
}
public float getInterpolatedOffset(float pt) {
return offset.getValue(pt);
}
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
if (isFluidHandlerCap(cap)
&& (side == null || HosePulleyBlock.hasPipeTowards(world, pos, getBlockState(), side)))
return this.capability.cast();
return super.getCapability(cap, side);
}
}

View file

@ -0,0 +1,31 @@
package com.simibubi.create.content.contraptions.fluids.actors;
import com.simibubi.create.AllShapes;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
public class ItemDrainBlock extends Block {
public ItemDrainBlock(Properties p_i48440_1_) {
super(p_i48440_1_);
}
@Override
public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_,
ISelectionContext p_220053_4_) {
return AllShapes.CASING_13PX.get(Direction.UP);
}
@Override
public void fillItemGroup(ItemGroup p_149666_1_, NonNullList<ItemStack> p_149666_2_) {}
}

View file

@ -0,0 +1,56 @@
package com.simibubi.create.content.contraptions.fluids.tank;
import java.util.function.Consumer;
import com.simibubi.create.foundation.fluid.SmartFluidTank;
import net.minecraft.tileentity.TileEntityType;
import net.minecraftforge.fluids.FluidStack;
public class CreativeFluidTankTileEntity extends FluidTankTileEntity {
public CreativeFluidTankTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
}
@Override
protected SmartFluidTank createInventory() {
return new CreativeSmartFluidTank(getCapacityMultiplier(), this::onFluidStackChanged);
}
class CreativeSmartFluidTank extends SmartFluidTank {
public CreativeSmartFluidTank(int capacity, Consumer<FluidStack> updateCallback) {
super(capacity, updateCallback);
}
@Override
public int getFluidAmount() {
return getFluid().isEmpty() ? 0 : getTankCapacity(0);
}
public void setContainedFluid(FluidStack fluidStack) {
fluid = fluidStack.copy();
if (!fluidStack.isEmpty())
fluid.setAmount(getTankCapacity(0));
notifyUpdate();
}
@Override
public int fill(FluidStack resource, FluidAction action) {
return resource.getAmount();
}
@Override
public FluidStack drain(FluidStack resource, FluidAction action) {
return super.drain(resource, FluidAction.SIMULATE);
}
@Override
public FluidStack drain(int maxDrain, FluidAction action) {
return super.drain(maxDrain, FluidAction.SIMULATE);
}
}
}

View file

@ -1,6 +1,9 @@
package com.simibubi.create.content.contraptions.fluids.tank;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling;
import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity.CreativeSmartFluidTank;
import com.simibubi.create.content.contraptions.processing.EmptyingByBasin;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.fluid.FluidHelper;
@ -38,9 +41,7 @@ import net.minecraft.world.World;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidAttributes;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
public class FluidTankBlock extends Block implements IWrenchable, ITE<FluidTankTileEntity> {
@ -48,8 +49,19 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE<FluidTankT
public static final BooleanProperty BOTTOM = BooleanProperty.create("bottom");
public static final EnumProperty<Shape> SHAPE = EnumProperty.create("shape", Shape.class);
public FluidTankBlock(Properties p_i48440_1_) {
private boolean creative;
public static FluidTankBlock regular(Properties p_i48440_1_) {
return new FluidTankBlock(p_i48440_1_, false);
}
public static FluidTankBlock creative(Properties p_i48440_1_) {
return new FluidTankBlock(p_i48440_1_, true);
}
protected FluidTankBlock(Properties p_i48440_1_, boolean creative) {
super(p_i48440_1_);
this.creative = creative;
setDefaultState(getDefaultState().with(TOP, true)
.with(BOTTOM, true)
.with(SHAPE, Shape.WINDOW));
@ -73,7 +85,7 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE<FluidTankT
@Override
public int getLightValue(BlockState state, IBlockReader world, BlockPos pos) {
FluidTankTileEntity tankAt = FluidTankConnectivityHandler.tankAt(world, pos);
FluidTankTileEntity tankAt = FluidTankConnectivityHandler.anyTankAt(world, pos);
if (tankAt == null)
return 0;
FluidTankTileEntity controllerTE = tankAt.getControllerTE();
@ -92,45 +104,49 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE<FluidTankT
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult ray) {
ItemStack heldItem = player.getHeldItem(hand);
ItemStack copy = heldItem.copy();
copy.setCount(1);
LazyOptional<IFluidHandlerItem> capability =
copy.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY);
if (!capability.isPresent())
return ActionResultType.PASS;
if (!player.isCreative())
return ActionResultType.FAIL;
TileEntity te = world.getTileEntity(pos);
LazyOptional<IFluidHandler> tankCapability =
te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, ray.getFace());
if (!tankCapability.isPresent())
return ActionResultType.PASS;
boolean onClient = world.isRemote;
IFluidHandlerItem fluidItem = capability.orElse(null);
if (heldItem.isEmpty())
return ActionResultType.PASS;
if (!player.isCreative())
return ActionResultType.PASS;
FluidExchange exchange = null;
FluidTankTileEntity te = FluidTankConnectivityHandler.anyTankAt(world, pos);
if (te == null)
return ActionResultType.FAIL;
LazyOptional<IFluidHandler> tankCapability = te.fluidCapability;
if (!tankCapability.isPresent())
return ActionResultType.PASS;
IFluidHandler fluidTank = tankCapability.orElse(null);
FluidStack prevFluidInTank = fluidTank.getFluidInTank(0)
.copy();
FluidExchange exchange = FluidHelper.exchange(fluidTank, fluidItem, FluidExchange.TANK_TO_ITEM, 1000);
if (FluidHelper.tryEmptyItemIntoTE(world, player, hand, heldItem, te))
exchange = FluidExchange.ITEM_TO_TANK;
else if (FluidHelper.tryFillItemFromTE(world, player, hand, heldItem, te))
exchange = FluidExchange.TANK_TO_ITEM;
FluidStack fluidInTank = fluidTank.getFluidInTank(0);
if (!player.isCreative() && !onClient) {
if (heldItem.getCount() > 1) {
heldItem.shrink(1);
player.addItemStackToInventory(fluidItem.getContainer());
} else {
player.setHeldItem(hand, fluidItem.getContainer());
}
if (exchange == null) {
if (EmptyingByBasin.canItemBeEmptied(world, heldItem)
|| GenericItemFilling.canItemBeFilled(world, heldItem))
return ActionResultType.SUCCESS;
return ActionResultType.PASS;
}
SoundEvent soundevent = null;
BlockState fluidState = null;
FluidStack fluidInTank = tankCapability.map(fh -> fh.getFluidInTank(0))
.orElse(FluidStack.EMPTY);
if (exchange == FluidExchange.ITEM_TO_TANK) {
if (creative && !onClient) {
FluidStack fluidInItem = EmptyingByBasin.emptyItem(world, heldItem, true).getFirst();
if (!fluidInItem.isEmpty() && fluidTank instanceof CreativeSmartFluidTank)
((CreativeSmartFluidTank) fluidTank).setContainedFluid(fluidInItem);
}
Fluid fluid = fluidInTank.getFluid();
fluidState = fluid.getDefaultState()
.getBlockState();
@ -141,6 +157,10 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE<FluidTankT
fluid.isIn(FluidTags.LAVA) ? SoundEvents.ITEM_BUCKET_EMPTY_LAVA : SoundEvents.ITEM_BUCKET_EMPTY;
}
if (exchange == FluidExchange.TANK_TO_ITEM) {
if (creative && !onClient)
if (fluidTank instanceof CreativeSmartFluidTank)
((CreativeSmartFluidTank) fluidTank).setContainedFluid(FluidStack.EMPTY);
Fluid fluid = prevFluidInTank.getFluid();
fluidState = fluid.getDefaultState()
.getBlockState();
@ -213,7 +233,7 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE<FluidTankT
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.FLUID_TANK.create();
return creative ? AllTileEntities.CREATIVE_FLUID_TANK.create() : AllTileEntities.FLUID_TANK.create();
}
@Override

View file

@ -18,6 +18,7 @@ import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Direction.AxisDirection;
@ -33,10 +34,11 @@ public class FluidTankConnectivityHandler {
TankSearchCache cache = new TankSearchCache();
List<FluidTankTileEntity> frontier = new ArrayList<>();
frontier.add(te);
formTanks(te.getWorld(), cache, frontier);
formTanks(te.getType(), te.getWorld(), cache, frontier);
}
private static void formTanks(IBlockReader world, TankSearchCache cache, List<FluidTankTileEntity> frontier) {
private static void formTanks(TileEntityType<?> type, IBlockReader world, TankSearchCache cache,
List<FluidTankTileEntity> frontier) {
PriorityQueue<Pair<Integer, FluidTankTileEntity>> creationQueue = makeCreationQueue();
Set<BlockPos> visited = new HashSet<>();
@ -70,7 +72,7 @@ public class FluidTankConnectivityHandler {
continue;
if (visited.contains(next))
continue;
FluidTankTileEntity nextTank = tankAt(world, next);
FluidTankTileEntity nextTank = tankAt(type, world, next);
if (nextTank == null)
continue;
if (nextTank.isRemoved())
@ -142,6 +144,7 @@ public class FluidTankConnectivityHandler {
boolean simulate) {
int amount = 0;
int height = 0;
TileEntityType<?> type = te.getType();
World world = te.getWorld();
BlockPos origin = te.getPos();
FluidStack fluid = te.getTankInventory()
@ -154,7 +157,7 @@ public class FluidTankConnectivityHandler {
for (int zOffset = 0; zOffset < width; zOffset++) {
BlockPos pos = origin.add(xOffset, yOffset, zOffset);
Optional<FluidTankTileEntity> tank = cache.getOrCache(world, pos);
Optional<FluidTankTileEntity> tank = cache.getOrCache(type, world, pos);
if (!tank.isPresent())
break Search;
@ -194,15 +197,15 @@ public class FluidTankConnectivityHandler {
for (int xOffset = 0; xOffset < width; xOffset++) {
for (int zOffset = 0; zOffset < width; zOffset++) {
BlockPos pos = origin.add(xOffset, yOffset, zOffset);
FluidTankTileEntity tank = tankAt(world, pos);
FluidTankTileEntity tank = tankAt(type, world, pos);
if (tank == te)
continue;
if (tank.isController()) {
te.tankInventory.fill(tank.tankInventory.getFluid(), FluidAction.EXECUTE);
tank.tankInventory.setFluid(FluidStack.EMPTY);
}
splitTankAndInvalidate(tank, cache, false);
tank.setController(origin);
tank.updateConnectivity = false;
@ -248,7 +251,7 @@ public class FluidTankConnectivityHandler {
for (int zOffset = 0; zOffset < width; zOffset++) {
BlockPos pos = origin.add(xOffset, yOffset, zOffset);
FluidTankTileEntity tankAt = tankAt(world, pos);
FluidTankTileEntity tankAt = tankAt(te.getType(), world, pos);
if (tankAt == null)
continue;
if (!tankAt.getController()
@ -278,7 +281,7 @@ public class FluidTankConnectivityHandler {
te.fluidCapability.invalidate();
if (tryReconnect)
formTanks(world, cache == null ? new TankSearchCache() : cache, frontier);
formTanks(te.getType(), world, cache == null ? new TankSearchCache() : cache, frontier);
}
private static PriorityQueue<Pair<Integer, FluidTankTileEntity>> makeCreationQueue() {
@ -291,7 +294,15 @@ public class FluidTankConnectivityHandler {
}
@Nullable
public static FluidTankTileEntity tankAt(IBlockReader world, BlockPos pos) {
public static FluidTankTileEntity tankAt(TileEntityType<?> type, IBlockReader world, BlockPos pos) {
TileEntity te = world.getTileEntity(pos);
if (te instanceof FluidTankTileEntity && te.getType() == type)
return (FluidTankTileEntity) te;
return null;
}
@Nullable
public static FluidTankTileEntity anyTankAt(IBlockReader world, BlockPos pos) {
TileEntity te = world.getTileEntity(pos);
if (te instanceof FluidTankTileEntity)
return (FluidTankTileEntity) te;
@ -317,10 +328,10 @@ public class FluidTankConnectivityHandler {
return controllerMap.containsKey(pos);
}
Optional<FluidTankTileEntity> getOrCache(IBlockReader world, BlockPos pos) {
Optional<FluidTankTileEntity> getOrCache(TileEntityType<?> type, IBlockReader world, BlockPos pos) {
if (hasVisited(pos))
return controllerMap.get(pos);
FluidTankTileEntity tankAt = tankAt(world, pos);
FluidTankTileEntity tankAt = tankAt(type, world, pos);
if (tankAt == null) {
putEmpty(pos);
return Optional.empty();

View file

@ -12,6 +12,16 @@ import net.minecraftforge.client.model.generators.ModelFile;
public class FluidTankGenerator extends SpecialBlockStateGen {
private String prefix;
public FluidTankGenerator() {
this("");
}
public FluidTankGenerator(String prefix) {
this.prefix = prefix;
}
@Override
protected int getXRotation(BlockState state) {
return 0;
@ -37,8 +47,18 @@ public class FluidTankGenerator extends SpecialBlockStateGen {
else if (bottom)
shapeName = "bottom";
return AssetLookup.partialBaseModel(ctx, prov,
shapeName + (shape == Shape.PLAIN ? "" : "_" + shape.getString()));
String modelName = shapeName + (shape == Shape.PLAIN ? "" : "_" + shape.name());
if (!prefix.isEmpty())
return prov.models()
.withExistingParent(prefix + modelName, prov.modLoc("block/fluid_tank/block_" + modelName))
.texture("0", prov.modLoc("block/" + prefix + "casing"))
.texture("1", prov.modLoc("block/" + prefix + "fluid_tank"))
.texture("3", prov.modLoc("block/" + prefix + "fluid_tank_window"))
.texture("4", prov.modLoc("block/" + prefix + "fluid_tank_window_single"))
.texture("particle", prov.modLoc("block/" + prefix + "fluid_tank"));
return AssetLookup.partialBaseModel(ctx, prov, modelName);
}
}

View file

@ -44,7 +44,7 @@ public class FluidTankItem extends BlockItem {
if (!FluidTankBlock.isTank(placedOnState))
return;
FluidTankTileEntity tankAt = FluidTankConnectivityHandler.tankAt(world, placedOnPos);
FluidTankTileEntity tankAt = FluidTankConnectivityHandler.anyTankAt(world, placedOnPos);
if (tankAt == null)
return;
FluidTankTileEntity controllerTE = tankAt.getControllerTE();
@ -60,7 +60,7 @@ public class FluidTankItem extends BlockItem {
.down()
: controllerTE.getPos()
.up(controllerTE.height);
if (startPos.getY() != pos.getY())
return;
@ -87,9 +87,11 @@ public class FluidTankItem extends BlockItem {
if (FluidTankBlock.isTank(blockState))
continue;
BlockItemUseContext context = BlockItemUseContext.func_221536_a(ctx, offsetPos, face);
player.getPersistentData().putBoolean("SilenceTankSound", true);
player.getPersistentData()
.putBoolean("SilenceTankSound", true);
super.tryPlace(context);
player.getPersistentData().remove("SilenceTankSound");
player.getPersistentData()
.remove("SilenceTankSound");
}
}
}

View file

@ -6,9 +6,8 @@ import java.util.Collections;
import java.util.List;
import java.util.Random;
import com.simibubi.create.AllSpriteShifts;
import com.simibubi.create.foundation.block.connected.CTModel;
import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour;
import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.BlockState;
@ -23,11 +22,9 @@ import net.minecraftforge.client.model.data.ModelProperty;
public class FluidTankModel extends CTModel {
protected static ModelProperty<CullData> CULL_PROPERTY = new ModelProperty<>();
static ConnectedTextureBehaviour CT_BEHAVIOUR =
new FluidTankCTBehaviour(AllSpriteShifts.FLUID_TANK, AllSpriteShifts.COPPER_CASING);
public FluidTankModel(IBakedModel originalModel) {
super(originalModel, CT_BEHAVIOUR);
public FluidTankModel(IBakedModel originalModel, CTSpriteShiftEntry side, CTSpriteShiftEntry top) {
super(originalModel, new FluidTankCTBehaviour(side, top));
}
@Override

View file

@ -42,6 +42,9 @@ public class FluidTankRenderer extends SafeTileEntityRenderer<FluidTankTileEntit
FluidTank tank = te.tankInventory;
FluidStack fluidStack = tank.getFluid();
if (fluidStack.isEmpty())
return;
boolean top = fluidStack.getFluid()
.getAttributes()
.isLighterThanAir();

View file

@ -57,7 +57,7 @@ public class FluidTankTileEntity extends SmartTileEntity {
public FluidTankTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
tankInventory = new SmartFluidTank(getCapacityMultiplier(), this::onFluidStackChanged);
tankInventory = createInventory();
fluidCapability = LazyOptional.of(() -> tankInventory);
forceFluidLevelUpdate = true;
updateConnectivity = false;
@ -67,6 +67,10 @@ public class FluidTankTileEntity extends SmartTileEntity {
refreshCapability();
}
protected SmartFluidTank createInventory() {
return new SmartFluidTank(getCapacityMultiplier(), this::onFluidStackChanged);
}
protected void updateConnectivity() {
updateConnectivity = false;
if (world.isRemote)
@ -117,7 +121,7 @@ public class FluidTankTileEntity extends SmartTileEntity {
for (int xOffset = 0; xOffset < width; xOffset++) {
for (int zOffset = 0; zOffset < width; zOffset++) {
BlockPos pos = this.pos.add(xOffset, yOffset, zOffset);
FluidTankTileEntity tankAt = FluidTankConnectivityHandler.tankAt(world, pos);
FluidTankTileEntity tankAt = FluidTankConnectivityHandler.anyTankAt(world, pos);
if (tankAt == null)
continue;
if (tankAt.luminosity == actualLuminosity)
@ -284,7 +288,7 @@ public class FluidTankTileEntity extends SmartTileEntity {
int prevSize = width;
int prevHeight = height;
int prevLum = luminosity;
updateConnectivity = compound.contains("Uninitialized");
luminosity = compound.getInt("Luminosity");
controller = null;
@ -305,10 +309,10 @@ public class FluidTankTileEntity extends SmartTileEntity {
if (compound.contains("ForceFluidLevel") || fluidLevel == null)
fluidLevel = new InterpolatedChasingValue().start(getFillState())
.withSpeed(1 / 2f);
if (!clientPacket)
return;
boolean changeOfController =
controllerBefore == null ? controller != null : !controllerBefore.equals(controller);
if (changeOfController || prevSize != width || prevHeight != height) {
@ -325,9 +329,9 @@ public class FluidTankTileEntity extends SmartTileEntity {
}
if (luminosity != prevLum && hasWorld())
world.getChunkProvider()
.getLightManager()
.checkBlock(pos);
.getLightManager()
.checkBlock(pos);
if (compound.contains("LazySync"))
fluidLevel.withSpeed(compound.contains("LazySync") ? 1 / 8f : 1 / 2f);
}
@ -350,7 +354,7 @@ public class FluidTankTileEntity extends SmartTileEntity {
}
compound.putInt("Luminosity", luminosity);
super.write(compound, clientPacket);
if (!clientPacket)
return;
if (forceFluidLevelUpdate)
@ -365,7 +369,7 @@ public class FluidTankTileEntity extends SmartTileEntity {
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
if (!fluidCapability.isPresent())
refreshCapability();
if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
return fluidCapability.cast();
return super.getCapability(cap, side);
}

View file

@ -7,11 +7,11 @@ import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.fluid.FluidHelper;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
@ -34,11 +34,6 @@ import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
@ -80,9 +75,9 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
try {
BasinTileEntity te = getTileEntity(worldIn, pos);
if (!heldItem.isEmpty()) {
if (tryEmptyItemIntoBasin(worldIn, player, handIn, heldItem, te))
if (FluidHelper.tryEmptyItemIntoTE(worldIn, player, handIn, heldItem, te))
return ActionResultType.SUCCESS;
if (tryFillItemFromBasin(worldIn, player, handIn, heldItem, te))
if (FluidHelper.tryFillItemFromTE(worldIn, player, handIn, heldItem, te))
return ActionResultType.SUCCESS;
if (EmptyingByBasin.canItemBeEmptied(worldIn, heldItem)
@ -103,77 +98,6 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
return ActionResultType.SUCCESS;
}
protected boolean tryEmptyItemIntoBasin(World worldIn, PlayerEntity player, Hand handIn, ItemStack heldItem,
BasinTileEntity te) {
if (!EmptyingByBasin.canItemBeEmptied(worldIn, heldItem))
return false;
Pair<FluidStack, ItemStack> emptyingResult = EmptyingByBasin.emptyItem(worldIn, heldItem, true);
LazyOptional<IFluidHandler> capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY);
IFluidHandler tank = capability.orElse(null);
FluidStack fluidStack = emptyingResult.getFirst();
if (tank == null || fluidStack.getAmount() != tank.fill(fluidStack, FluidAction.SIMULATE))
return false;
if (worldIn.isRemote)
return true;
ItemStack copyOfHeld = heldItem.copy();
emptyingResult = EmptyingByBasin.emptyItem(worldIn, copyOfHeld, false);
tank.fill(fluidStack, FluidAction.EXECUTE);
if (!player.isCreative()) {
if (copyOfHeld.isEmpty())
player.setHeldItem(handIn, emptyingResult.getSecond());
else {
player.setHeldItem(handIn, copyOfHeld);
player.inventory.placeItemBackInInventory(worldIn, emptyingResult.getSecond());
}
}
return true;
}
protected boolean tryFillItemFromBasin(World world, PlayerEntity player, Hand handIn, ItemStack heldItem,
BasinTileEntity te) {
if (!GenericItemFilling.canItemBeFilled(world, heldItem))
return false;
LazyOptional<IFluidHandler> capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY);
IFluidHandler tank = capability.orElse(null);
if (tank == null)
return false;
for (int i = 0; i < tank.getTanks(); i++) {
FluidStack fluid = tank.getFluidInTank(i);
if (fluid.isEmpty())
continue;
int requiredAmountForItem = GenericItemFilling.getRequiredAmountForItem(world, heldItem, fluid.copy());
if (requiredAmountForItem == -1)
continue;
if (requiredAmountForItem > fluid.getAmount())
continue;
if (world.isRemote)
return true;
if (player.isCreative())
heldItem = heldItem.copy();
ItemStack out = GenericItemFilling.fillItem(world, requiredAmountForItem, heldItem, fluid.copy());
FluidStack copy = fluid.copy();
copy.setAmount(requiredAmountForItem);
tank.drain(copy, FluidAction.EXECUTE);
if (!player.isCreative())
player.inventory.placeItemBackInInventory(world, out);
te.notifyUpdate();
return true;
}
return false;
}
@Override
public void onLanded(IBlockReader worldIn, Entity entityIn) {
super.onLanded(worldIn, entityIn);
@ -203,7 +127,7 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
public VoxelShape getRaytraceShape(BlockState p_199600_1_, IBlockReader p_199600_2_, BlockPos p_199600_3_) {
return AllShapes.BASIN_RAYTRACE_SHAPE;
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
return AllShapes.BASIN_BLOCK_SHAPE;

View file

@ -171,7 +171,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
}
BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos);
if (belt == null || belt.getSpeed() == 0)
if (belt == null)
return;
if (entityIn instanceof ItemEntity && entityIn.isAlive()) {
if (worldIn.isRemote)

View file

@ -95,8 +95,6 @@ public class BeltTileEntity extends KineticTileEntity {
BeltBlock.initBelt(world, pos);
if (!AllBlocks.BELT.has(world.getBlockState(pos)))
return;
if (getSpeed() == 0)
return;
initializeItemHandler();
@ -104,6 +102,9 @@ public class BeltTileEntity extends KineticTileEntity {
if (!isController())
return;
getInventory().tick();
if (getSpeed() == 0)
return;
// Move Entities
if (passengers == null)

View file

@ -50,14 +50,6 @@ public class BeltInventory {
public void tick() {
// Reverse item collection if belt just reversed
if (beltMovementPositive != belt.getDirectionAwareBeltMovementSpeed() > 0) {
beltMovementPositive = !beltMovementPositive;
Collections.reverse(items);
belt.markDirty();
belt.sendData();
}
// Added/Removed items from previous cycle
if (!toInsert.isEmpty() || !toRemove.isEmpty()) {
toInsert.forEach(this::insert);
@ -67,6 +59,17 @@ public class BeltInventory {
belt.markDirty();
belt.sendData();
}
if (belt.getSpeed() == 0)
return;
// Reverse item collection if belt just reversed
if (beltMovementPositive != belt.getDirectionAwareBeltMovementSpeed() > 0) {
beltMovementPositive = !beltMovementPositive;
Collections.reverse(items);
belt.markDirty();
belt.sendData();
}
// Assuming the first entry is furthest on the belt
TransportedItemStack stackInFront = null;

View file

@ -492,6 +492,17 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("SCS")
.patternLine(" I ")),
HOSE_PULLEY = create(AllBlocks.HOSE_PULLEY).unlockedByTag(I::copper)
.viaShaped(b -> b
.key('S', I.shaft())
.key('P', AllBlocks.FLUID_PIPE.get())
.key('B', I.copperCasing())
.key('C', Items.DRIED_KELP)
.key('I', I.copperSheet())
.patternLine(" B ")
.patternLine("SCP")
.patternLine(" I ")),
EMPTY_BLAZE_BURNER = create(AllItems.EMPTY_BLAZE_BURNER).unlockedByTag(I::iron)
.viaShaped(b -> b.key('A', Blocks.IRON_BARS)
.key('I', I.ironSheet())

View file

@ -7,14 +7,24 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling;
import com.simibubi.create.content.contraptions.processing.EmptyingByBasin;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.JsonToNBT;
import net.minecraft.util.Hand;
import net.minecraft.util.JSONUtils;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.ForgeFlowingFluid;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
@ -74,9 +84,9 @@ public class FluidHelper {
int amount = JSONUtils.getInt(json, "amount");
FluidStack stack = new FluidStack(fluid, amount);
if (!json.has("nbt"))
if (!json.has("nbt"))
return stack;
try {
JsonElement element = json.get("nbt");
stack.setTag(JsonToNBT.getTagFromJson(
@ -89,6 +99,77 @@ public class FluidHelper {
return stack;
}
public static boolean tryEmptyItemIntoTE(World worldIn, PlayerEntity player, Hand handIn, ItemStack heldItem,
SmartTileEntity te) {
if (!EmptyingByBasin.canItemBeEmptied(worldIn, heldItem))
return false;
Pair<FluidStack, ItemStack> emptyingResult = EmptyingByBasin.emptyItem(worldIn, heldItem, true);
LazyOptional<IFluidHandler> capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY);
IFluidHandler tank = capability.orElse(null);
FluidStack fluidStack = emptyingResult.getFirst();
if (tank == null || fluidStack.getAmount() != tank.fill(fluidStack, FluidAction.SIMULATE))
return false;
if (worldIn.isRemote)
return true;
ItemStack copyOfHeld = heldItem.copy();
emptyingResult = EmptyingByBasin.emptyItem(worldIn, copyOfHeld, false);
tank.fill(fluidStack, FluidAction.EXECUTE);
if (!player.isCreative()) {
if (copyOfHeld.isEmpty())
player.setHeldItem(handIn, emptyingResult.getSecond());
else {
player.setHeldItem(handIn, copyOfHeld);
player.inventory.placeItemBackInInventory(worldIn, emptyingResult.getSecond());
}
}
return true;
}
public static boolean tryFillItemFromTE(World world, PlayerEntity player, Hand handIn, ItemStack heldItem,
SmartTileEntity te) {
if (!GenericItemFilling.canItemBeFilled(world, heldItem))
return false;
LazyOptional<IFluidHandler> capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY);
IFluidHandler tank = capability.orElse(null);
if (tank == null)
return false;
for (int i = 0; i < tank.getTanks(); i++) {
FluidStack fluid = tank.getFluidInTank(i);
if (fluid.isEmpty())
continue;
int requiredAmountForItem = GenericItemFilling.getRequiredAmountForItem(world, heldItem, fluid.copy());
if (requiredAmountForItem == -1)
continue;
if (requiredAmountForItem > fluid.getAmount())
continue;
if (world.isRemote)
return true;
if (player.isCreative())
heldItem = heldItem.copy();
ItemStack out = GenericItemFilling.fillItem(world, requiredAmountForItem, heldItem, fluid.copy());
FluidStack copy = fluid.copy();
copy.setAmount(requiredAmountForItem);
tank.drain(copy, FluidAction.EXECUTE);
if (!player.isCreative())
player.inventory.placeItemBackInInventory(world, out);
te.notifyUpdate();
return true;
}
return false;
}
@Nullable
public static FluidExchange exchange(IFluidHandler fluidTank, IFluidHandlerItem fluidItem, FluidExchange preferred,
int maxAmount) {

View file

@ -7,11 +7,10 @@ import com.mojang.blaze3d.platform.GlStateManager.SourceFactor;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.fluid.FluidRenderer;
import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.FireBlock;
@ -22,21 +21,16 @@ import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.model.ItemCameraTransforms;
import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.fluid.Fluid;
import net.minecraft.inventory.container.PlayerContainer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.IItemProvider;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraft.world.LightType;
import net.minecraft.world.World;
import net.minecraftforge.client.model.data.EmptyModelData;
import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class GuiGameElement {
@ -236,36 +230,13 @@ public class GuiGameElement {
.isEmpty())
return;
for (RenderType type : RenderType.getBlockLayers()) {
if (!RenderTypeLookup.canRenderInLayer(blockState.getFluidState(), type))
continue;
ms.push();
RenderHelper.disableStandardItemLighting();
ClientWorld world = Minecraft.getInstance().world;
if (renderWorld == null || renderWorld.getWrappedWorld() != world)
renderWorld = new FluidRenderWorld(world);
for (Direction d : Iterate.directions) {
vb = buffer.getBuffer(type);
if (d.getAxisDirection() == AxisDirection.POSITIVE)
continue;
ms.push();
ms.translate(.5, .5, .5);
ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AngleHelper.horizontalAngle(d)));
ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(AngleHelper.verticalAngle(d) - 90));
ms.translate(-.5, -.5, -.5);
blockRenderer.renderFluid(new BlockPos(0, 1, 0), renderWorld, vb, blockState.getFluidState());
buffer.draw(type);
ms.pop();
}
RenderHelper.enable();
ms.pop();
break;
}
RenderSystem.pushMatrix();
RenderHelper.disableStandardItemLighting();
FluidRenderer.renderTiledFluidBB(new FluidStack(blockState.getFluidState()
.getFluid(), 1000), 0, 0, 0, 1.0001f, 1.0001f, 1.0001f, buffer, ms, 0xf000f0, true);
buffer.draw(RenderType.getTranslucent());
RenderHelper.enable();
RenderSystem.popMatrix();
}
}
@ -297,6 +268,18 @@ public class GuiGameElement {
renderItemIntoGUI(matrixStack, stack);
cleanUpMatrix(matrixStack);
}
/*
public void render() {
prepare();
transform();
RenderSystem.scaled(1, -1, 1);
RenderSystem.translated(0, 0, -75);
Minecraft.getInstance()
.getItemRenderer()
.renderItemIntoGUI(stack, 0, 0);
cleanUp();
}
*/
public static void renderItemIntoGUI(MatrixStack matrixStack, ItemStack stack) {
ItemRenderer renderer = Minecraft.getInstance()
@ -340,24 +323,4 @@ public class GuiGameElement {
}
private static FluidRenderWorld renderWorld;
private static class FluidRenderWorld extends WrappedWorld {
public FluidRenderWorld(World world) {
super(world);
}
@Override
public int getLightLevel(@Nullable LightType p_226658_1_, @Nullable BlockPos p_226658_2_) {
return 15;
}
@Override
@Nonnull
public BlockState getBlockState(BlockPos pos) {
return Blocks.AIR.getDefaultState();
}
}
}

View file

@ -13,6 +13,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.syn
import com.simibubi.create.content.contraptions.components.structureMovement.sync.LimbSwingUpdatePacket;
import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingCreationPacket;
import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartControllerUpdatePacket;
import com.simibubi.create.content.contraptions.fluids.actors.FluidSplashPacket;
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.ConfigureSequencedGearshiftPacket;
import com.simibubi.create.content.curiosities.symmetry.SymmetryEffectPacket;
import com.simibubi.create.content.curiosities.tools.ExtendoGripInteractionPacket;
@ -32,8 +33,12 @@ import com.simibubi.create.foundation.utility.ServerSpeedProvider;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkEvent.Context;
import net.minecraftforge.fml.network.NetworkRegistry;
import net.minecraftforge.fml.network.PacketDistributor;
import net.minecraftforge.fml.network.PacketDistributor.TargetPoint;
import net.minecraftforge.fml.network.simple.SimpleChannel;
public enum AllPackets {
@ -66,7 +71,8 @@ public enum AllPackets {
CONTRAPTION_SEAT_MAPPING(ContraptionSeatMappingPacket.class, ContraptionSeatMappingPacket::new),
LIMBSWING_UPDATE(LimbSwingUpdatePacket.class, LimbSwingUpdatePacket::new),
MINECART_CONTROLLER(MinecartControllerUpdatePacket.class, MinecartControllerUpdatePacket::new),
FLUID_SPLASH(FluidSplashPacket.class, FluidSplashPacket::new),
;
public static final ResourceLocation CHANNEL_NAME = new ResourceLocation(Create.ID, "network");
@ -80,11 +86,20 @@ public enum AllPackets {
}
public static void registerPackets() {
channel = NetworkRegistry.ChannelBuilder.named(CHANNEL_NAME).serverAcceptedVersions(s -> true)
.clientAcceptedVersions(s -> true).networkProtocolVersion(() -> NETWORK_VERSION).simpleChannel();
channel = NetworkRegistry.ChannelBuilder.named(CHANNEL_NAME)
.serverAcceptedVersions(s -> true)
.clientAcceptedVersions(s -> true)
.networkProtocolVersion(() -> NETWORK_VERSION)
.simpleChannel();
for (AllPackets packet : values())
packet.packet.register();
}
public static void sendToNear(World world, BlockPos pos, int range, Object message) {
channel.send(
PacketDistributor.NEAR.with(TargetPoint.p(pos.getX(), pos.getY(), pos.getZ(), range, world.getDimension()
.getType())),
message);
}
private static class LoadedPacket<T extends SimplePacketBase> {
@ -102,7 +117,11 @@ public enum AllPackets {
}
private void register() {
channel.messageBuilder(type, index++).encoder(encoder).decoder(decoder).consumer(handler).add();
channel.messageBuilder(type, index++)
.encoder(encoder)
.decoder(decoder)
.consumer(handler)
.add();
}
}

View file

@ -27,3 +27,7 @@ public net.minecraft.client.renderer.ItemRenderer field_175057_n # textureManage
# Beacon
public net.minecraft.tileentity.BeaconTileEntity field_174909_f # beamSegments
# Server Tick List (For stopping placed fluids from spilling)
public net.minecraft.world.server.ServerTickList field_205374_d # pendingTickListEntriesHashSet
public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet

View file

@ -5,7 +5,7 @@
"0": "create:block/copper_casing",
"1": "create:block/fluid_tank",
"5": "create:block/fluid_tank_window_single",
"particle": "create:block/fluid_tank"
"particle": "#1"
},
"elements": [
{

View file

@ -0,0 +1,271 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"4": "create:block/copper_gearbox",
"8": "create:block/oxidized/copper_block_0",
"9": "create:block/fluid_pipe",
"particle": "create:block/oxidized/copper_block_0"
},
"elements": [
{
"name": "side",
"from": [14, 2, 2],
"to": [15, 14, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]},
"faces": {
"east": {"uv": [2, 2, 14, 14], "texture": "#4"},
"west": {"uv": [2, 2, 14, 14], "texture": "#4"},
"down": {"uv": [2, 11, 14, 12], "rotation": 90, "texture": "#4"}
}
},
{
"name": "side",
"from": [1, 2, 2],
"to": [2, 14, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]},
"faces": {
"east": {"uv": [14, 2, 2, 14], "texture": "#8"},
"west": {"uv": [14, 2, 2, 14], "texture": "#8"},
"down": {"uv": [2, 12, 14, 11], "rotation": 90, "texture": "#4"}
}
},
{
"name": "side",
"from": [-1.1, 2.9, 2.9],
"to": [1, 13.1, 13.1],
"rotation": {"angle": 0, "axis": "y", "origin": [7, -7, 7]},
"faces": {
"north": {"uv": [11, 5, 6, 6], "rotation": 90, "texture": "#9"},
"south": {"uv": [11, 5, 6, 6], "rotation": 270, "texture": "#9"},
"west": {"uv": [11, 0, 6, 5], "texture": "#9"},
"up": {"uv": [11, 5, 6, 6], "rotation": 270, "texture": "#9"},
"down": {"uv": [11, 5, 6, 6], "rotation": 270, "texture": "#9"}
}
},
{
"name": "side_frame",
"from": [14, 2, 14],
"to": [16, 14, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [0, 2, 2, 14], "texture": "#8"},
"east": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#8"},
"south": {"uv": [14, 2, 16, 14], "texture": "#8"},
"west": {"uv": [14, 2, 16, 14], "texture": "#8"},
"up": {"uv": [0, 14, 2, 16], "rotation": 270, "texture": "#8"},
"down": {"uv": [0, 0, 2, 2], "rotation": 90, "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [0, 2, 14],
"to": [2, 14, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [2, 2, 0, 14], "texture": "#8"},
"east": {"uv": [16, 2, 14, 14], "texture": "#8"},
"south": {"uv": [16, 2, 14, 14], "texture": "#8"},
"west": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#8"},
"up": {"uv": [0, 16, 2, 14], "rotation": 270, "texture": "#8"},
"down": {"uv": [0, 2, 2, 0], "rotation": 90, "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [14, 2, 0],
"to": [16, 14, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [16, 2, 14, 14], "texture": "#8"},
"east": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#8"},
"south": {"uv": [2, 2, 0, 14], "texture": "#8"},
"west": {"uv": [2, 2, 0, 14], "rotation": 180, "texture": "#8"},
"up": {"uv": [2, 14, 0, 16], "rotation": 270, "texture": "#8"},
"down": {"uv": [2, 0, 0, 2], "rotation": 90, "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [0, 2, 0],
"to": [2, 14, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [14, 2, 16, 14], "texture": "#8"},
"east": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#8"},
"south": {"uv": [0, 2, 2, 14], "texture": "#8"},
"west": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#8"},
"up": {"uv": [2, 16, 0, 14], "rotation": 270, "texture": "#8"},
"down": {"uv": [2, 2, 0, 0], "rotation": 90, "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [14, 0, 0],
"to": [16, 2, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [0, 14, 2, 16], "texture": "#8"},
"east": {"uv": [0, 14, 16, 16], "texture": "#8"},
"south": {"uv": [14, 14, 16, 16], "texture": "#8"},
"west": {"uv": [0, 14, 16, 16], "texture": "#8"},
"up": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#8"},
"down": {"uv": [0, 14, 16, 16], "rotation": 270, "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [14, 14, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]},
"faces": {
"north": {"uv": [0, 16, 2, 14], "texture": "#8"},
"east": {"uv": [0, 16, 16, 14], "texture": "#8"},
"south": {"uv": [14, 16, 16, 14], "texture": "#8"},
"west": {"uv": [0, 16, 16, 14], "texture": "#8"},
"up": {"uv": [0, 16, 16, 14], "rotation": 90, "texture": "#8"},
"down": {"uv": [0, 16, 16, 14], "rotation": 270, "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [0, 0, 0],
"to": [2, 2, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [2, 14, 0, 16], "texture": "#8"},
"east": {"uv": [16, 14, 0, 16], "texture": "#8"},
"south": {"uv": [16, 14, 14, 16], "texture": "#8"},
"west": {"uv": [16, 14, 0, 16], "texture": "#8"},
"up": {"uv": [0, 16, 16, 14], "rotation": 90, "texture": "#8"},
"down": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [0, 14, 0],
"to": [2, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]},
"faces": {
"north": {"uv": [2, 16, 0, 14], "texture": "#8"},
"east": {"uv": [16, 16, 0, 14], "texture": "#8"},
"south": {"uv": [16, 16, 14, 14], "texture": "#8"},
"west": {"uv": [16, 16, 0, 14], "texture": "#8"},
"up": {"uv": [0, 16, 16, 14], "rotation": 270, "texture": "#8"},
"down": {"uv": [0, 14, 16, 16], "rotation": 270, "texture": "#8"}
}
},
{
"name": "front",
"from": [2, 1, 13],
"to": [14, 3, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]},
"faces": {
"north": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#8"},
"east": {"uv": [0, 0, 0, 0], "texture": "#8"},
"south": {"uv": [2, 14, 14, 16], "texture": "#8"},
"west": {"uv": [0, 0, 0, 0], "texture": "#8"},
"up": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#8"},
"down": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#8"}
}
},
{
"name": "front",
"from": [2, 1, 1],
"to": [14, 3, 3],
"rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]},
"faces": {
"north": {"uv": [14, 14, 2, 16], "texture": "#8"},
"east": {"uv": [0, 0, 0, 0], "texture": "#8"},
"south": {"uv": [14, 14, 2, 16], "rotation": 180, "texture": "#8"},
"west": {"uv": [0, 0, 0, 0], "texture": "#8"},
"up": {"uv": [2, 2, 14, 0], "texture": "#8"},
"down": {"uv": [2, 16, 14, 14], "rotation": 180, "texture": "#8"}
}
},
{
"name": "front",
"from": [2, 13, 1],
"to": [14, 15, 3],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]},
"faces": {
"north": {"uv": [14, 16, 2, 14], "texture": "#8"},
"east": {"uv": [0, 0, 0, 0], "texture": "#8"},
"south": {"uv": [14, 2, 2, 0], "texture": "#8"},
"west": {"uv": [0, 0, 0, 0], "texture": "#8"},
"up": {"uv": [14, 15, 2, 13], "texture": "#8"},
"down": {"uv": [14, 2, 2, 0], "rotation": 180, "texture": "#8"}
}
},
{
"name": "front",
"from": [2, 13, 13],
"to": [14, 15, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]},
"faces": {
"north": {"uv": [2, 2, 14, 0], "texture": "#8"},
"east": {"uv": [0, 0, 0, 0], "texture": "#8"},
"south": {"uv": [2, 16, 14, 14], "texture": "#8"},
"west": {"uv": [0, 0, 0, 0], "texture": "#8"},
"up": {"uv": [14, 13, 2, 15], "texture": "#8"},
"down": {"uv": [14, 0, 2, 2], "texture": "#8"}
}
},
{
"name": "top",
"from": [2, 14, 2],
"to": [14, 16, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]},
"faces": {
"north": {"uv": [2, 1, 14, 3], "rotation": 180, "texture": "#8"},
"east": {"uv": [0, 0, 0, 0], "texture": "#8"},
"south": {"uv": [2, 13, 14, 15], "texture": "#8"},
"west": {"uv": [0, 0, 0, 0], "texture": "#8"},
"up": {"uv": [2, 2, 14, 14], "texture": "#8"},
"down": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#8"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 225, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
{
"name": "shaft",
"origin": [8, 8, 8],
"children": []
},
{
"name": "rope_half_magnet",
"origin": [8, 8, 8],
"children": []
}, 15]
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
{"meta":{"format_version":"3.2","model_format":"java_block","box_uv":false},"name":"rope","parent":"block/block","ambientocclusion":true,"front_gui_light":false,"resolution":{"width":16,"height":16},"elements":[{"name":"rope","from":[6,0,6],"to":[10,16,10],"autouv":0,"color":6,"locked":false,"origin":[7.75,0,8],"faces":{"north":{"uv":[0,0,4,16],"texture":0},"east":{"uv":[0,0,4,16],"texture":0},"south":{"uv":[0,0,4,16],"texture":0},"west":{"uv":[0,0,4,16],"texture":0},"up":{"uv":[0,0,4,4],"rotation":90,"texture":0},"down":{"uv":[0,0,4,4],"texture":0}},"uuid":"3f245b42-dde8-d34f-9f25-ae6eb2f322ae"}],"outliner":["3f245b42-dde8-d34f-9f25-ae6eb2f322ae"],"textures":[{"path":"C:\\Users\\krypp\\Documents\\Pixel Art\\Create Mod\\Pulley Pump\\copper_pulley_rope.png","name":"copper_pulley_rope.png","folder":"Pulley Pump","namespace":"create","id":"5","particle":true,"mode":"bitmap","saved":true,"uuid":"8ffc2f62-b5b6-1af9-ecc1-e22a9ae075aa","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAX0lEQVQ4T2M00tP4z8fLwfDp8w+GX7//MLCxsjCQwmfU0VT5r6IgwfDh0xe4IaTwGUddwEB5GLS1tf2Xl5dn0NDQYLhx4wbDw4cPGUjhMy5duvQ/uZpBlo2mgz/DIQwAKD7WmGK5ZIUAAAAASUVORK5CYII="}]}

View file

@ -0,0 +1,381 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "create:block/axis",
"1": "create:block/axis_top",
"4": "create:block/copper_gearbox",
"5": "create:block/hose_pulley_rope",
"6": "create:block/hose_pulley_magnet",
"8": "create:block/oxidized/copper_block_0",
"9": "create:block/fluid_pipe",
"particle": "create:block/oxidized/copper_block_0"
},
"elements": [
{
"name": "coil",
"from": [4, 4, 2],
"to": [12, 12, 14],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]},
"faces": {
"east": {"uv": [2, 1, 14, 9], "texture": "#5"},
"west": {"uv": [2, 1, 14, 9], "rotation": 180, "texture": "#5"},
"up": {"uv": [2, 1, 14, 9], "rotation": 270, "texture": "#5"},
"down": {"uv": [2, 1, 14, 9], "rotation": 90, "texture": "#5"}
}
},
{
"name": "coil",
"from": [3.5, 3.5, 3],
"to": [12.5, 12.5, 7],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -10]},
"faces": {
"north": {"uv": [0, 0, 1, 1], "texture": "#5"},
"east": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"},
"south": {"uv": [0, 0, 1, 1], "texture": "#5"},
"west": {"uv": [0, 3, 4, 12], "texture": "#5"},
"up": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"}
}
},
{
"name": "coil",
"from": [3.5, 3.5, 9],
"to": [12.5, 12.5, 13],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -4]},
"faces": {
"north": {"uv": [0, 0, 1, 1], "texture": "#5"},
"east": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"},
"south": {"uv": [0, 0, 1, 1], "texture": "#5"},
"west": {"uv": [0, 3, 4, 12], "texture": "#5"},
"up": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"}
}
},
{
"name": "side",
"from": [2, 2, 14],
"to": [14, 14, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]},
"faces": {
"north": {"uv": [2, 2, 14, 14], "texture": "#4"},
"south": {"uv": [2, 2, 14, 14], "texture": "#4"},
"down": {"uv": [2, 11, 14, 12], "texture": "#4"}
}
},
{
"name": "side",
"from": [2, 2, 1],
"to": [14, 14, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]},
"faces": {
"north": {"uv": [14, 2, 2, 14], "texture": "#8"},
"south": {"uv": [14, 2, 2, 14], "texture": "#8"},
"down": {"uv": [2, 12, 14, 11], "texture": "#4"}
}
},
{
"name": "side",
"from": [3, 3, -1],
"to": [13, 13, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [9, -7, 7]},
"faces": {
"north": {"uv": [11, 0, 6, 5], "texture": "#9"},
"east": {"uv": [11, 5, 6, 6], "rotation": 90, "texture": "#9"},
"west": {"uv": [11, 5, 6, 6], "rotation": 270, "texture": "#9"},
"up": {"uv": [11, 5, 6, 6], "texture": "#9"},
"down": {"uv": [11, 5, 6, 6], "rotation": 180, "texture": "#9"}
}
},
{
"name": "side_frame",
"from": [0, 2, 14],
"to": [2, 14, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [14, 2, 16, 14], "texture": "#8"},
"east": {"uv": [0, 2, 2, 14], "texture": "#8"},
"south": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#8"},
"west": {"uv": [14, 2, 16, 14], "texture": "#8"},
"up": {"uv": [0, 14, 2, 16], "texture": "#8"},
"down": {"uv": [0, 0, 2, 2], "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [0, 2, 0],
"to": [2, 14, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#8"},
"east": {"uv": [2, 2, 0, 14], "texture": "#8"},
"south": {"uv": [16, 2, 14, 14], "texture": "#8"},
"west": {"uv": [16, 2, 14, 14], "texture": "#8"},
"up": {"uv": [0, 16, 2, 14], "texture": "#8"},
"down": {"uv": [0, 2, 2, 0], "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [14, 2, 14],
"to": [16, 14, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [2, 2, 0, 14], "rotation": 180, "texture": "#8"},
"east": {"uv": [16, 2, 14, 14], "texture": "#8"},
"south": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#8"},
"west": {"uv": [2, 2, 0, 14], "texture": "#8"},
"up": {"uv": [2, 14, 0, 16], "texture": "#8"},
"down": {"uv": [2, 0, 0, 2], "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [14, 2, 0],
"to": [16, 14, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#8"},
"east": {"uv": [14, 2, 16, 14], "texture": "#8"},
"south": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#8"},
"west": {"uv": [0, 2, 2, 14], "texture": "#8"},
"up": {"uv": [2, 16, 0, 14], "texture": "#8"},
"down": {"uv": [2, 2, 0, 0], "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [0, 0, 14],
"to": [16, 2, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [0, 14, 16, 16], "texture": "#8"},
"east": {"uv": [0, 14, 2, 16], "texture": "#8"},
"south": {"uv": [0, 14, 16, 16], "texture": "#8"},
"west": {"uv": [14, 14, 16, 16], "texture": "#8"},
"up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#8"},
"down": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [0, 14, 14],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]},
"faces": {
"north": {"uv": [0, 16, 16, 14], "texture": "#8"},
"east": {"uv": [0, 16, 2, 14], "texture": "#8"},
"south": {"uv": [0, 16, 16, 14], "texture": "#8"},
"west": {"uv": [14, 16, 16, 14], "texture": "#8"},
"up": {"uv": [0, 16, 16, 14], "rotation": 180, "texture": "#8"},
"down": {"uv": [0, 16, 16, 14], "rotation": 180, "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [0, 0, 0],
"to": [16, 2, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
"faces": {
"north": {"uv": [16, 14, 0, 16], "texture": "#8"},
"east": {"uv": [2, 14, 0, 16], "texture": "#8"},
"south": {"uv": [16, 14, 0, 16], "texture": "#8"},
"west": {"uv": [16, 14, 14, 16], "texture": "#8"},
"up": {"uv": [0, 16, 16, 14], "rotation": 180, "texture": "#8"},
"down": {"uv": [0, 14, 16, 16], "texture": "#8"}
}
},
{
"name": "side_frame",
"from": [0, 14, 0],
"to": [16, 16, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]},
"faces": {
"north": {"uv": [16, 16, 0, 14], "texture": "#8"},
"east": {"uv": [2, 16, 0, 14], "texture": "#8"},
"south": {"uv": [16, 16, 0, 14], "texture": "#8"},
"west": {"uv": [16, 16, 14, 14], "texture": "#8"},
"up": {"uv": [0, 16, 16, 14], "texture": "#8"},
"down": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#8"}
}
},
{
"name": "front",
"from": [1, 1, 2],
"to": [3, 3, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]},
"faces": {
"north": {"uv": [0, 0, 0, 0], "texture": "#8"},
"east": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#8"},
"south": {"uv": [0, 0, 0, 0], "texture": "#8"},
"west": {"uv": [2, 14, 14, 16], "texture": "#8"},
"up": {"uv": [2, 0, 14, 2], "rotation": 270, "texture": "#8"},
"down": {"uv": [2, 14, 14, 16], "rotation": 90, "texture": "#8"}
}
},
{
"name": "front",
"from": [13, 1, 2],
"to": [15, 3, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]},
"faces": {
"north": {"uv": [0, 0, 0, 0], "texture": "#8"},
"east": {"uv": [14, 14, 2, 16], "texture": "#8"},
"south": {"uv": [0, 0, 0, 0], "texture": "#8"},
"west": {"uv": [14, 14, 2, 16], "rotation": 180, "texture": "#8"},
"up": {"uv": [2, 2, 14, 0], "rotation": 90, "texture": "#8"},
"down": {"uv": [2, 16, 14, 14], "rotation": 90, "texture": "#8"}
}
},
{
"name": "front",
"from": [13, 13, 2],
"to": [15, 15, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]},
"faces": {
"north": {"uv": [0, 0, 0, 0], "texture": "#8"},
"east": {"uv": [14, 16, 2, 14], "texture": "#8"},
"south": {"uv": [0, 0, 0, 0], "texture": "#8"},
"west": {"uv": [14, 2, 2, 0], "texture": "#8"},
"up": {"uv": [14, 15, 2, 13], "rotation": 90, "texture": "#8"},
"down": {"uv": [14, 2, 2, 0], "rotation": 90, "texture": "#8"}
}
},
{
"name": "front",
"from": [1, 13, 2],
"to": [3, 15, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]},
"faces": {
"north": {"uv": [0, 0, 0, 0], "texture": "#8"},
"east": {"uv": [2, 2, 14, 0], "texture": "#8"},
"south": {"uv": [0, 0, 0, 0], "texture": "#8"},
"west": {"uv": [2, 16, 14, 14], "texture": "#8"},
"up": {"uv": [14, 13, 2, 15], "rotation": 90, "texture": "#8"},
"down": {"uv": [14, 0, 2, 2], "rotation": 270, "texture": "#8"}
}
},
{
"name": "Axis",
"from": [6, 6, 8],
"to": [10, 10, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 16]},
"faces": {
"east": {"uv": [6, 8, 10, 16], "rotation": 90, "texture": "#0"},
"south": {"uv": [6, 6, 10, 10], "texture": "#1"},
"west": {"uv": [6, 8, 10, 16], "rotation": 270, "texture": "#0"},
"up": {"uv": [6, 8, 10, 16], "texture": "#0"},
"down": {"uv": [6, 8, 10, 16], "rotation": 180, "texture": "#0"}
}
},
{
"name": "rope",
"from": [6, 2, 6],
"to": [10, 8, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7.75, 13, 8]},
"faces": {
"north": {"uv": [12, 10, 16, 16], "texture": "#6"},
"east": {"uv": [12, 10, 16, 16], "texture": "#6"},
"south": {"uv": [12, 10, 16, 16], "texture": "#6"},
"west": {"uv": [12, 10, 16, 16], "texture": "#6"},
"up": {"uv": [12, 0, 16, 4], "rotation": 90, "texture": "#6"}
}
},
{
"name": "drain 1",
"from": [4.5, 0, 4.5],
"to": [11.5, 2, 11.5],
"rotation": {"angle": 0, "axis": "y", "origin": [6.75, 14, 6]},
"faces": {
"north": {"uv": [0, 0, 7, 2], "texture": "#6"},
"east": {"uv": [0, 0, 7, 2], "texture": "#6"},
"south": {"uv": [0, 0, 7, 2], "texture": "#6"},
"west": {"uv": [0, 0, 7, 2], "texture": "#6"},
"down": {"uv": [0, 2, 7, 9], "texture": "#6"}
}
},
{
"name": "drain 2",
"from": [4.5, 2, 4.5],
"to": [11.5, 3, 11.5],
"rotation": {"angle": 0, "axis": "y", "origin": [6.75, 16, 6]},
"faces": {
"north": {"uv": [0, 1, 7, 2], "texture": "#6"},
"east": {"uv": [0, 1, 7, 2], "texture": "#6"},
"south": {"uv": [0, 1, 7, 2], "texture": "#6"},
"west": {"uv": [0, 1, 7, 2], "texture": "#6"},
"up": {"uv": [0, 2, 7, 9], "rotation": 90, "texture": "#6"},
"down": {"uv": [0, 9, 7, 16], "texture": "#6"}
}
},
{
"name": "drain 3",
"from": [5.5, 2, 5.5],
"to": [10.5, 5, 10.5],
"rotation": {"angle": 0, "axis": "y", "origin": [7.75, 16, 7]},
"faces": {
"north": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"east": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"south": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"west": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"up": {"uv": [1, 3, 6, 8], "rotation": 90, "texture": "#6"}
}
},
{
"name": "top",
"from": [2, 14, 2],
"to": [14, 16, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]},
"faces": {
"north": {"uv": [0, 0, 0, 0], "texture": "#8"},
"east": {"uv": [2, 1, 14, 3], "rotation": 180, "texture": "#8"},
"south": {"uv": [0, 0, 0, 0], "texture": "#8"},
"west": {"uv": [2, 13, 14, 15], "texture": "#8"},
"up": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#8"},
"down": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#8"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 225, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
{
"name": "shaft",
"origin": [8, 8, 8],
"children": [18]
},
{
"name": "rope_half_magnet",
"origin": [8, 8, 8],
"children": [19, 20, 21, 22]
}, 23]
}

View file

@ -0,0 +1,101 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"6": "create:block/hose_pulley_magnet",
"particle": "create:block/oxidized/copper_block_0"
},
"elements": [
{
"name": "rope",
"from": [6, 2, 6],
"to": [10, 16, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7.75, 13, 8]},
"faces": {
"north": {"uv": [12, 2, 16, 16], "texture": "#6"},
"east": {"uv": [12, 2, 16, 16], "texture": "#6"},
"south": {"uv": [12, 2, 16, 16], "texture": "#6"},
"west": {"uv": [12, 2, 16, 16], "texture": "#6"},
"up": {"uv": [12, 0, 16, 4], "rotation": 90, "texture": "#6"}
}
},
{
"name": "drain 1",
"from": [4.5, 0, 4.5],
"to": [11.5, 2, 11.5],
"rotation": {"angle": 0, "axis": "y", "origin": [6.75, 14, 6]},
"faces": {
"north": {"uv": [0, 0, 7, 2], "texture": "#6"},
"east": {"uv": [0, 0, 7, 2], "texture": "#6"},
"south": {"uv": [0, 0, 7, 2], "texture": "#6"},
"west": {"uv": [0, 0, 7, 2], "texture": "#6"},
"down": {"uv": [0, 2, 7, 9], "texture": "#6"}
}
},
{
"name": "drain 2",
"from": [4.5, 2, 4.5],
"to": [11.5, 3, 11.5],
"rotation": {"angle": 0, "axis": "y", "origin": [6.75, 16, 6]},
"faces": {
"north": {"uv": [0, 1, 7, 2], "texture": "#6"},
"east": {"uv": [0, 1, 7, 2], "texture": "#6"},
"south": {"uv": [0, 1, 7, 2], "texture": "#6"},
"west": {"uv": [0, 1, 7, 2], "texture": "#6"},
"up": {"uv": [0, 2, 7, 9], "rotation": 90, "texture": "#6"},
"down": {"uv": [0, 9, 7, 16], "texture": "#6"}
}
},
{
"name": "drain 3",
"from": [5.5, 2, 5.5],
"to": [10.5, 5, 10.5],
"rotation": {"angle": 0, "axis": "y", "origin": [7.75, 16, 7]},
"faces": {
"north": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"east": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"south": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"west": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"up": {"uv": [1, 3, 6, 8], "rotation": 90, "texture": "#6"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 225, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "rope_half_magnet",
"origin": [8, 8, 8],
"children": [0, 1, 2, 3]
}
]
}

View file

@ -0,0 +1,7 @@
{
"parent": "create:block/rope_pulley/rope",
"textures": {
"5": "create:block/hose_pulley_rope",
"particle": "create:block/hose_pulley_rope"
}
}

View file

@ -0,0 +1,49 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"5": "create:block/hose_pulley_rope"
},
"elements": [
{
"name": "coil",
"from": [4, 4, 2],
"to": [12, 12, 14],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]},
"faces": {
"east": {"uv": [2, 1, 14, 9], "texture": "#5"},
"west": {"uv": [2, 1, 14, 9], "rotation": 180, "texture": "#5"},
"up": {"uv": [2, 1, 14, 9], "rotation": 270, "texture": "#5"},
"down": {"uv": [2, 1, 14, 9], "rotation": 90, "texture": "#5"}
}
},
{
"name": "coil",
"from": [3.5, 3.5, 3],
"to": [12.5, 12.5, 7],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -10]},
"faces": {
"north": {"uv": [0, 0, 1, 1], "texture": "#5"},
"east": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"},
"south": {"uv": [0, 0, 1, 1], "texture": "#5"},
"west": {"uv": [0, 3, 4, 12], "texture": "#5"},
"up": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"}
}
},
{
"name": "coil",
"from": [3.5, 3.5, 9],
"to": [12.5, 12.5, 13],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -4]},
"faces": {
"north": {"uv": [0, 0, 1, 1], "texture": "#5"},
"east": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"},
"south": {"uv": [0, 0, 1, 1], "texture": "#5"},
"west": {"uv": [0, 3, 4, 12], "texture": "#5"},
"up": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"}
}
}
]
}

View file

@ -0,0 +1,7 @@
{
"parent": "create:block/rope_pulley/rope_half",
"textures": {
"5": "create:block/hose_pulley_rope",
"particle": "create:block/hose_pulley_rope"
}
}

View file

@ -0,0 +1,101 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"6": "create:block/hose_pulley_magnet",
"particle": "create:block/oxidized/copper_block_0"
},
"elements": [
{
"name": "rope",
"from": [6, 2, 6],
"to": [10, 8, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7.75, 13, 8]},
"faces": {
"north": {"uv": [12, 10, 16, 16], "texture": "#6"},
"east": {"uv": [12, 10, 16, 16], "texture": "#6"},
"south": {"uv": [12, 10, 16, 16], "texture": "#6"},
"west": {"uv": [12, 10, 16, 16], "texture": "#6"},
"up": {"uv": [12, 0, 16, 4], "rotation": 90, "texture": "#6"}
}
},
{
"name": "drain 1",
"from": [4.5, 0, 4.5],
"to": [11.5, 2, 11.5],
"rotation": {"angle": 0, "axis": "y", "origin": [6.75, 14, 6]},
"faces": {
"north": {"uv": [0, 0, 7, 2], "texture": "#6"},
"east": {"uv": [0, 0, 7, 2], "texture": "#6"},
"south": {"uv": [0, 0, 7, 2], "texture": "#6"},
"west": {"uv": [0, 0, 7, 2], "texture": "#6"},
"down": {"uv": [0, 2, 7, 9], "texture": "#6"}
}
},
{
"name": "drain 2",
"from": [4.5, 2, 4.5],
"to": [11.5, 3, 11.5],
"rotation": {"angle": 0, "axis": "y", "origin": [6.75, 16, 6]},
"faces": {
"north": {"uv": [0, 1, 7, 2], "texture": "#6"},
"east": {"uv": [0, 1, 7, 2], "texture": "#6"},
"south": {"uv": [0, 1, 7, 2], "texture": "#6"},
"west": {"uv": [0, 1, 7, 2], "texture": "#6"},
"up": {"uv": [0, 2, 7, 9], "rotation": 90, "texture": "#6"},
"down": {"uv": [0, 9, 7, 16], "texture": "#6"}
}
},
{
"name": "drain 3",
"from": [5.5, 2, 5.5],
"to": [10.5, 5, 10.5],
"rotation": {"angle": 0, "axis": "y", "origin": [7.75, 16, 7]},
"faces": {
"north": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"east": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"south": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"west": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"},
"up": {"uv": [1, 3, 6, 8], "rotation": 90, "texture": "#6"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 225, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "rope_half_magnet",
"origin": [8, 8, 8],
"children": [0, 1, 2, 3]
}
]
}

View file

@ -0,0 +1,79 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "create:block/item_drain_side",
"1": "create:block/item_drain_top",
"2": "create:block/copper_casing",
"3": "create:block/pump",
"particle": "create:block/item_drain_side"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [0, 14, 16, 16], "texture": "#0"},
"east": {"uv": [0, 14, 16, 16], "texture": "#0"},
"south": {"uv": [0, 14, 16, 16], "texture": "#0"},
"west": {"uv": [0, 14, 16, 16], "texture": "#0"},
"up": {"uv": [0, 0, 16, 16], "texture": "#2"},
"down": {"uv": [0, 0, 16, 16], "texture": "#2"}
}
},
{
"from": [0, 2, 0],
"to": [16, 13, 2],
"faces": {
"north": {"uv": [0, 3, 16, 14], "texture": "#0"},
"east": {"uv": [14, 3, 16, 14], "texture": "#0"},
"south": {"uv": [0, 3, 16, 14], "texture": "#0"},
"west": {"uv": [0, 3, 2, 14], "texture": "#0"},
"up": {"uv": [0, 0, 16, 2], "texture": "#1"}
}
},
{
"from": [0, 2, 14],
"to": [16, 13, 16],
"faces": {
"north": {"uv": [0, 3, 16, 14], "texture": "#0"},
"east": {"uv": [0, 3, 2, 14], "texture": "#0"},
"south": {"uv": [0, 3, 16, 14], "texture": "#0"},
"west": {"uv": [14, 3, 16, 14], "texture": "#0"},
"up": {"uv": [0, 14, 16, 16], "texture": "#1"}
}
},
{
"from": [14, 2, 2],
"to": [16, 13, 14],
"faces": {
"east": {"uv": [2, 3, 14, 14], "texture": "#0"},
"west": {"uv": [2, 3, 14, 14], "texture": "#0"},
"up": {"uv": [14, 2, 16, 14], "texture": "#1"}
}
},
{
"from": [0, 2, 2],
"to": [2, 13, 14],
"faces": {
"east": {"uv": [2, 3, 14, 14], "texture": "#0"},
"west": {"uv": [2, 3, 14, 14], "texture": "#0"},
"up": {"uv": [0, 2, 2, 14], "texture": "#1"}
}
},
{
"from": [2, 12, 2],
"to": [14, 13, 14],
"faces": {
"up": {"uv": [2, 2, 14, 14], "texture": "#1"}
}
},
{
"from": [2, 4, 2],
"to": [14, 5, 14],
"faces": {
"up": {"uv": [0, 0, 12, 12], "texture": "#3"}
}
}
]
}

View file

@ -4,7 +4,7 @@
"textures": {
"3": "create:block/gearbox_top",
"4": "create:block/gearbox",
"5": "create:block/andesite_casing_short",
"6": "create:block/andesite_casing",
"particle": "create:block/pulley_rope"
},
"elements": [
@ -194,14 +194,14 @@
},
{
"name": "top",
"from": [3, 14, 2],
"to": [13, 16, 14],
"from": [2, 14, 2],
"to": [14, 16, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]},
"faces": {
"east": {"uv": [2, 14, 14, 16], "texture": "#3"},
"west": {"uv": [2, 14, 14, 16], "texture": "#3"},
"up": {"uv": [2, 5, 14, 15], "rotation": 90, "texture": "#5"},
"down": {"uv": [2, 5, 14, 15], "rotation": 90, "texture": "#5"}
"east": {"uv": [2, 1, 14, 3], "rotation": 180, "texture": "#6"},
"west": {"uv": [2, 13, 14, 15], "texture": "#6"},
"up": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#6"},
"down": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#6"}
}
}
]

View file

@ -8,8 +8,8 @@
"4": "create:block/gearbox",
"5": "create:block/pulley_rope",
"6": "create:block/pulley_magnet",
"7": "create:block/andesite_casing_short",
"particle": "create:block/pulley_magnet"
"8": "create:block/andesite_casing",
"particle": "create:block/andesite_casing"
},
"elements": [
{
@ -279,16 +279,14 @@
},
{
"name": "top",
"from": [3, 14, 2],
"to": [13, 16, 14],
"from": [2, 14, 2],
"to": [14, 16, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]},
"faces": {
"north": {"uv": [0, 0, 0, 0], "texture": "#7"},
"east": {"uv": [2, 14, 14, 16], "texture": "#7"},
"south": {"uv": [0, 0, 0, 0], "texture": "#7"},
"west": {"uv": [2, 14, 14, 16], "texture": "#7"},
"up": {"uv": [2, 5, 14, 15], "rotation": 90, "texture": "#7"},
"down": {"uv": [2, 5, 14, 15], "rotation": 90, "texture": "#7"}
"east": {"uv": [2, 1, 14, 3], "rotation": 180, "texture": "#8"},
"west": {"uv": [2, 13, 14, 15], "texture": "#8"},
"up": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#8"},
"down": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#8"}
}
}
],

View file

@ -1,77 +1,60 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "create:block/schematic_table_side",
"1": "create:block/schematic_table_top",
"textures": {
"0": "create:block/schematic_table_side",
"1": "create:block/schematic_table_top",
"particle": "create:block/schematic_table_side"
},
"elements": [
{
"name": "base",
"from": [ 5.0, 0.0, 5.0 ],
"to": [ 11.0, 12.0, 11.0 ],
"faces": {
"north": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] },
"east": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] },
"south": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] },
"west": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 6.0 ] },
"down": { "texture": "#0", "uv": [ 5.0, 6.0, 11.0, 12.0 ] }
}
},
{
"name": "Top",
"from": [ 0.0, 12.0, -2.0 ],
"to": [ 16.0, 15.0, 14.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 22.5 },
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }
}
},
{
"name": "Cube",
"from": [ 4.0, 11.0, 4.0 ],
"to": [ 12.0, 14.0, 11.0 ],
"faces": {
"north": { "texture": "#1", "uv": [ 4.0, 1.0, 12.0, 4.0 ] },
"east": { "texture": "#1", "uv": [ 4.0, 1.0, 11.0, 4.0 ] },
"south": { "texture": "#1", "uv": [ 4.0, 1.0, 12.0, 4.0 ] },
"west": { "texture": "#1", "uv": [ 4.0, 1.0, 11.0, 4.0 ] },
"down": { "texture": "#1", "uv": [ 4.0, 4.0, 12.0, 11.0 ] }
}
},
{
"name": "Cube",
"from": [ 1.0, 12.0, 15.0 ],
"to": [ 15.0, 13.0, 16.0 ],
"rotation": { "origin": [ 8.0, 14.0, 16.0 ], "axis": "x", "angle": 22.5 },
"faces": {
"north": { "texture": "#0", "uv": [ 1.0, 12.0, 15.0, 13.0 ] },
"east": { "texture": "#0", "uv": [ 6.0, 14.0, 7.0, 15.0 ] },
"south": { "texture": "#0", "uv": [ 1.0, 14.0, 15.0, 15.0 ] },
"west": { "texture": "#0", "uv": [ 7.0, 14.0, 8.0, 15.0 ] },
"up": { "texture": "#0", "uv": [ 1.0, 13.0, 15.0, 14.0 ] },
"down": { "texture": "#0", "uv": [ 1.0, 14.0, 15.0, 15.0 ] }
}
},
{
"name": "Cube",
"from": [ 4.0, 0.0, 4.0 ],
"to": [ 12.0, 2.0, 12.0 ],
"faces": {
"north": { "texture": "#0", "uv": [ 5.0, 14.0, 13.0, 16.0 ] },
"east": { "texture": "#0", "uv": [ 6.0, 14.0, 14.0, 16.0 ] },
"south": { "texture": "#0", "uv": [ 1.0, 14.0, 9.0, 16.0 ] },
"west": { "texture": "#0", "uv": [ 4.0, 14.0, 12.0, 16.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 5.0, 8.0, 13.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 5.0, 12.0, 13.0 ] }
}
}
]
},
"elements": [
{
"name": "base",
"from": [5, 0, 5],
"to": [11, 12, 11],
"faces": {
"north": {"uv": [0, 3, 6, 15], "texture": "#0"},
"east": {"uv": [0, 3, 6, 15], "texture": "#0"},
"south": {"uv": [0, 3, 6, 15], "texture": "#0"},
"west": {"uv": [0, 3, 6, 15], "texture": "#0"}
}
},
{
"name": "Top",
"from": [0, 11, 2],
"to": [16, 14, 14],
"faces": {
"north": {"uv": [0, 0, 16, 3], "texture": "#0"},
"east": {"uv": [0, 0, 12, 3], "texture": "#0"},
"south": {"uv": [0, 0, 16, 3], "texture": "#0"},
"west": {"uv": [0, 0, 12, 3], "texture": "#0"},
"up": {"uv": [0, 2, 16, 14], "texture": "#1"},
"down": {"uv": [0, 2, 16, 14], "texture": "#1"}
}
},
{
"name": "Cube",
"from": [4, 9, 4],
"to": [12, 11, 12],
"faces": {
"north": {"uv": [4, 2, 12, 4], "texture": "#1"},
"east": {"uv": [4, 2, 12, 4], "texture": "#1"},
"south": {"uv": [4, 2, 12, 4], "texture": "#1"},
"west": {"uv": [4, 2, 12, 4], "texture": "#1"},
"down": {"uv": [4, 4, 12, 12], "texture": "#1"}
}
},
{
"name": "Cube",
"from": [4, 0, 4],
"to": [12, 2, 12],
"faces": {
"north": {"uv": [5, 14, 13, 16], "texture": "#0"},
"east": {"uv": [6, 14, 14, 16], "texture": "#0"},
"south": {"uv": [1, 14, 9, 16], "texture": "#0"},
"west": {"uv": [4, 14, 12, 16], "texture": "#0"},
"up": {"uv": [6, 5, 14, 13], "texture": "#0"},
"down": {"uv": [6, 5, 14, 13], "texture": "#0"}
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1,004 B

After

Width:  |  Height:  |  Size: 821 B

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