Playtest V

- Reduced minimum break speed of drills on trains
- Rollers no longer break blocks beneath the track when no pave material is set or present
- Belts printed instantly or via cannon now retain the correct type of casing
- Scheduled trains no longer slow down for slight ascends/descents on a straight track
- Fixed saplings and other non-collidables sticking to chassis or super glue
- Encased Fluid Pipes no longer z-fight on open pipe faces
- Fixed brass encased cogwheels using andesite particle and gearbox texture
- Fixed filter items having unusual item camera transforms
- Tweaked placement assist of rollers and copycat steps to match shafts and piston poles
- Valve handles now turn twice as quickly
- Bearings no longer have the angle-indicating nook on their block
- Steam engines no longer have their value input on all faces
- Adjusted weighted ejector value slots to match the model
- Depot hitbox is now a simple cuboid
- Fixed Gearshift and Clutch models looking a little toasted
- Fixed belts encased with andesite briefly showing brass textures
This commit is contained in:
simibubi 2023-04-19 18:39:56 +02:00
parent 98a08d667e
commit c7b0c11abc
59 changed files with 307 additions and 319 deletions

View file

@ -607,14 +607,14 @@ eddf206f5fffbf9446461538da9fea70f5d22f0e assets/create/models/block/andesite_bel
8d53939d0e5fbeaace7800ac055719fd24b8314f assets/create/models/block/andesite_cap.json
d497453840a05b0b958890676b819215f3a118b3 assets/create/models/block/andesite_cap_alt.json
4e44ccdc5e396c4380a7e59408db50553fa25226 assets/create/models/block/andesite_casing.json
762509cfb8602c6d0d3f959c08ad4934c2b5d8fa assets/create/models/block/andesite_encased_cogwheel.json
314489582d1cde98bc5e4fd4d2f0c9ab3cb731d3 assets/create/models/block/andesite_encased_cogwheel_bottom.json
650fa63c126652c8501a657e1b89d0ef42a8b4be assets/create/models/block/andesite_encased_cogwheel_top.json
c8f215c191f46ff1ea6f098ab32c7d27d04cb017 assets/create/models/block/andesite_encased_cogwheel_top_bottom.json
41d4e8fd8ccdf915bd4d00b97cb87be87de33486 assets/create/models/block/andesite_encased_large_cogwheel.json
f8f131a53664faa5bd84b61e83d62ed5b367bf1d assets/create/models/block/andesite_encased_large_cogwheel_bottom.json
77b3bbcb47e83f985d68b0ed0344e9f79999e797 assets/create/models/block/andesite_encased_large_cogwheel_top.json
01189fb179863ce1ef524bd5ddd5b4bebd5bbc6b assets/create/models/block/andesite_encased_large_cogwheel_top_bottom.json
27d6d8f523a2f3bc4ee44c8529d7dff216ec6903 assets/create/models/block/andesite_encased_cogwheel.json
33e2a5d0e63bf02af40d4e4de75e907f40e21f3b assets/create/models/block/andesite_encased_cogwheel_bottom.json
73c54c91549d06ebf1fe766ad43b5bc22874f8d7 assets/create/models/block/andesite_encased_cogwheel_top.json
53a57b61452de201f27b5414584f79d77ddc7f63 assets/create/models/block/andesite_encased_cogwheel_top_bottom.json
692a529fd4aa2a5efa00461ea650ae92ceb6a994 assets/create/models/block/andesite_encased_large_cogwheel.json
62ec35ed30bff5be9897dbc09eb251aceddac708 assets/create/models/block/andesite_encased_large_cogwheel_bottom.json
4f220c0c6a904434a92816653217facea53ee8ed assets/create/models/block/andesite_encased_large_cogwheel_top.json
2d0a835ed0ad9f8cfc20c6c43eb3a0126e1817cb assets/create/models/block/andesite_encased_large_cogwheel_top_bottom.json
a51ef8eb258251ecd4313d6997ce607b79a23850 assets/create/models/block/andesite_funnel_horizontal_pull_powered.json
fd19670a4504617fcd0ee0a1fb6ebeca9b30cc82 assets/create/models/block/andesite_funnel_horizontal_pull_unpowered.json
aa22be9799a91810fa0068e525dd6961d7af4900 assets/create/models/block/andesite_funnel_horizontal_push_powered.json
@ -678,14 +678,14 @@ e0958b94c40e4aabbcbabd70be8a368eb877dcf9 assets/create/models/block/brass_belt_f
a094db3862d765e185c4849ce0a50967ee95d7c1 assets/create/models/block/brass_cap.json
2dbb68d4917cac90fd6fe05abf5f7432288fdbed assets/create/models/block/brass_cap_alt.json
2e67c147d7c69aabd9ab9f7aa80f60671d5a03aa assets/create/models/block/brass_casing.json
8cb0039684377c27a7fe20bdcacf24f871221478 assets/create/models/block/brass_encased_cogwheel.json
c735917634c87b3d289bd912c7ceb465a3cc65b6 assets/create/models/block/brass_encased_cogwheel_bottom.json
c2199a633597a73a1c2d508e5dfe0a7589b02329 assets/create/models/block/brass_encased_cogwheel_top.json
69ea566328350c282878de2ef6aa197037c5e5de assets/create/models/block/brass_encased_cogwheel_top_bottom.json
7ab46e52da9ef474f38e5b9eefbed9ba9dc53b78 assets/create/models/block/brass_encased_large_cogwheel.json
ed150a9e18889217b7f010412e4317af04af7dc1 assets/create/models/block/brass_encased_large_cogwheel_bottom.json
bb4155627c1f189e2e3bc07822d227bb0fc64bc4 assets/create/models/block/brass_encased_large_cogwheel_top.json
421cbc9bcb6511c66ff7122d1800bcd8ab866b2b assets/create/models/block/brass_encased_large_cogwheel_top_bottom.json
e174c6cafde3bee9722b5eb641951fa403e2aeec assets/create/models/block/brass_encased_cogwheel.json
056576d83c9948e48841dd8f0009f00012473826 assets/create/models/block/brass_encased_cogwheel_bottom.json
682fa110a8ba91952d070d7ef58289f7d9a9f7ca assets/create/models/block/brass_encased_cogwheel_top.json
439d3612159957f39de24d33b86edd32a0a4dc97 assets/create/models/block/brass_encased_cogwheel_top_bottom.json
78699147c95a250cf1d58b57823a53e84be79893 assets/create/models/block/brass_encased_large_cogwheel.json
675ca543c06b48de9d9b4cb43cfb937c6e1f2e4a assets/create/models/block/brass_encased_large_cogwheel_bottom.json
86f692c36bbf12b5f53178f0d761a5c4ba75656c assets/create/models/block/brass_encased_large_cogwheel_top.json
6d33641780f18d9915695e6e9789f7058b362aec assets/create/models/block/brass_encased_large_cogwheel_top_bottom.json
68f57bccd8a7ec0a997ab65aab74103338b0ade0 assets/create/models/block/brass_funnel_horizontal_pull_powered.json
327643126b6b4a93523354ac70b0148d36176c75 assets/create/models/block/brass_funnel_horizontal_pull_unpowered.json
49c2cf87fb273d7e557cfde908e319f7810e333d assets/create/models/block/brass_funnel_horizontal_push_powered.json
@ -709,7 +709,7 @@ a276726447e4c22a259d224f8124ea863cb36b3c assets/create/models/block/brass_scaffo
3fd5c08a6fe54d38383c8bd92ff7331218ca396c assets/create/models/block/calcite_pillar.json
c4d1e1b6e195c0b71c0b96546978cd24c4a4bfc4 assets/create/models/block/calcite_pillar_horizontal.json
4156227e18c0896ce83f260f71b939abbbf4f01e assets/create/models/block/chocolate.json
30fe120af3cb32faf0729df4d2cdf868f804be17 assets/create/models/block/clockwork_bearing.json
f9a3f0939ea43b404eb2826b94211a25fca5ebc2 assets/create/models/block/clockwork_bearing.json
4db08101a5d03303506e89adc9ff394ed26cd2e6 assets/create/models/block/copper_cap.json
06447f3c1e3f6d53d3887cedc20c322b146bdb1f assets/create/models/block/copper_cap_alt.json
1f01a4b6608f75145734b60ddf4a33ce318425ff assets/create/models/block/copper_casing.json
@ -1176,7 +1176,7 @@ ec6b5f636e163ff5e361d486cf628ca1af4849a1 assets/create/models/block/magenta_sail
cbee001cd1bb1125a97d1bb2d1e6e5a68f129303 assets/create/models/block/magenta_seat.json
fa56f9bec902e6fea9cc25e6f474ee00c3dc558d assets/create/models/block/magenta_toolbox.json
bc5a03a5552eb4a518abefe5e8615f14ee13ca29 assets/create/models/block/magenta_valve_handle.json
2e67f27a895c9163a5d1be62897d5e66b119767a assets/create/models/block/mechanical_bearing.json
0492070642fda75b943080022368505f2d065730 assets/create/models/block/mechanical_bearing.json
71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/nixie_tube.json
e3cd8b33b8c5f0543e4f6728a5b3e05642f9efe1 assets/create/models/block/oak_window.json
54a3b3158f8c914788812aa44515b798b2a9e2f3 assets/create/models/block/oak_window_pane_noside.json
@ -1652,7 +1652,7 @@ ef1e719dc94d0b3ab37239467631be3aa877173b assets/create/models/block/weathered_co
1377e12f56dce1466ce44078d7154870c5cf7b2a assets/create/models/block/white_seat.json
94f882c4bf1664a9acfe57e1eccfd8129134aaaa assets/create/models/block/white_toolbox.json
899f33d51cf36cb1c283bc7e6363f9d451e5736e assets/create/models/block/white_valve_handle.json
f2bee22fe03ac047fbe73ca2c5c759f09bf646df assets/create/models/block/windmill_bearing.json
0b9bfba48d1f249d70508df8c51fa9f9f3003dd7 assets/create/models/block/windmill_bearing.json
71cd22dc2d847d317f19afb4b21802fbf5347e0b assets/create/models/block/yellow_nixie_tube.json
071ca07daceea4d0db7ed41e815d47589fdb14b7 assets/create/models/block/yellow_sail.json
0a0e2cc973e35586ae00ed17b919383868e992e8 assets/create/models/block/yellow_seat.json
@ -1668,8 +1668,8 @@ e7759d9b3cd64d2719a58dc35fc75ca65b9e14fa assets/create/models/item/analog_lever.
2e7cf267efb66404721ac8bf08802de0eb134159 assets/create/models/item/andesite_alloy_block.json
946756a1a498ccd2e61b33ef317c5ec9e30afebf assets/create/models/item/andesite_bars.json
174c9705d25f149052835fdcf7c85626afead90b assets/create/models/item/andesite_casing.json
420020284d01c72a7fb3387750fe1dd2dcfb9550 assets/create/models/item/andesite_encased_cogwheel.json
6e246e91b4ebffd5c45311057feb5d26d1cb8aec assets/create/models/item/andesite_encased_large_cogwheel.json
7d421377a50b4986626bedbd517aebe39a81247d assets/create/models/item/andesite_encased_cogwheel.json
1a18f605be05b9031f3a4bdbd3de8103b2783e0c assets/create/models/item/andesite_encased_large_cogwheel.json
bc6e7469744604e578200ea87690e4dd3b25e447 assets/create/models/item/andesite_encased_shaft.json
105a9946b9e4d5e949f6d557cfde750227463bff assets/create/models/item/andesite_funnel.json
4c9232a6249ad1ef51a7978a8e642a8c88dda0ab assets/create/models/item/andesite_ladder.json
@ -1678,6 +1678,7 @@ bc6e7469744604e578200ea87690e4dd3b25e447 assets/create/models/item/andesite_enca
473be56fe1f44809ffecbb3eb86107af3ca7a569 assets/create/models/item/andesite_tunnel.json
bbe56a2eb84835f26ed3beb0313ddd8be7a53ead assets/create/models/item/asurine.json
840a34731a823e185a180bef029dd16ee3f78541 assets/create/models/item/asurine_pillar.json
c0beeec7ae0ac2f8dcef6c704935c9fef3c47836 assets/create/models/item/attribute_filter.json
cf9e35bfea0b0a324e1c6384990425b3d359792c assets/create/models/item/bar_of_chocolate.json
421e481b7fbca4c4a1080ed703401eb25375e087 assets/create/models/item/basin.json
ffdb36349fa2e50451c208585162b6a8386ec494 assets/create/models/item/belt_connector.json
@ -1695,8 +1696,8 @@ bec96ebf3369d3cffa9bb1b8bf9f2a5cd5d0ef96 assets/create/models/item/blue_valve_ha
5afa91abed387b3dfa39c39c7feae5f8f02a4bd9 assets/create/models/item/brass_bars.json
17d340c3678bd24cb085ba49490b2b4cb341a9e7 assets/create/models/item/brass_block.json
f5a18f4279c2e845a5967b1c2f9e807c2bb77afb assets/create/models/item/brass_casing.json
099179a466a2f370dd2c4fea0d841517fa3a558b assets/create/models/item/brass_encased_cogwheel.json
6e60b5939747835b2247cbc4907d633b017abc79 assets/create/models/item/brass_encased_large_cogwheel.json
e462012b46bb628a17874abc75282849f6511211 assets/create/models/item/brass_encased_cogwheel.json
4c3e5e94a4c4027246f09c5a0c7ed6d020cde565 assets/create/models/item/brass_encased_large_cogwheel.json
c723011e09203821b6b59cff9de22454c5e4395a assets/create/models/item/brass_encased_shaft.json
8de90ceb9997f61efc544304fcd919a54db47d41 assets/create/models/item/brass_funnel.json
965f3f992fde899719506fd584f3fbbbf69af93c assets/create/models/item/brass_hand.json
@ -1913,6 +1914,7 @@ d455c713ef442632db1556a1c84d56b09b23754f assets/create/models/item/exposed_coppe
2b1de143ed0dfb42f4414d085ded1e0d3154866a assets/create/models/item/exposed_copper_tile_stairs.json
492e6b68180bc2a7be052b9a1acb2b685d8295aa assets/create/models/item/exposed_copper_tiles.json
68833e2a7836c73776551565783a1d175b715c66 assets/create/models/item/extendo_grip.json
088032cabf5f93606fbdf76625f16e4d5b0f166c assets/create/models/item/filter.json
e5e6fb6eb182b85b977e1025a7fe84d46de59320 assets/create/models/item/fluid_pipe.json
e7d2097256fed545064a37d233e7b810b04c26a4 assets/create/models/item/fluid_tank.json
f4727119b75ab632c3ad295be4d398b1919d782f assets/create/models/item/fluid_valve.json
@ -2262,7 +2264,7 @@ c6253e0f8db3c3992d3f78fe5045e276d39d5b22 assets/create/models/item/white_sail.js
69328eb4f91c4407fbcad5e3c4b88363f1a9572c assets/create/models/item/white_seat.json
29d8e92edf11c79091e49689a97ab700121cdeb3 assets/create/models/item/white_toolbox.json
be7a2d59d43083d7f2427193dcb9d68004224dd3 assets/create/models/item/white_valve_handle.json
d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bearing.json
49b0ba1bb71e244f7de23f3a6fb322c77cd3be03 assets/create/models/item/windmill_bearing.json
500abf752654a904d78a967f6c6d29a75a4821ab assets/create/models/item/wooden_bracket.json
2527b52413965a3e84b4718e08a9b8bb30a741ea assets/create/models/item/wrench.json
4b49bc2418410cded5f0b7da3430f1a22e049f18 assets/create/models/item/yellow_seat.json

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_cogwheel/block",
"textures": {
"casing": "create:block/andesite_casing",
"particle": "create:block/andesite_casing",
"4": "create:block/gearbox",
"1": "minecraft:block/stripped_spruce_log_top",
"side": "create:block/andesite_encased_cogwheel_side"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_cogwheel/block_bottom",
"textures": {
"casing": "create:block/andesite_casing",
"particle": "create:block/andesite_casing",
"4": "create:block/gearbox",
"1": "minecraft:block/stripped_spruce_log_top",
"side": "create:block/andesite_encased_cogwheel_side"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_cogwheel/block_top",
"textures": {
"casing": "create:block/andesite_casing",
"particle": "create:block/andesite_casing",
"4": "create:block/gearbox",
"1": "minecraft:block/stripped_spruce_log_top",
"side": "create:block/andesite_encased_cogwheel_side"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_cogwheel/block_top_bottom",
"textures": {
"casing": "create:block/andesite_casing",
"particle": "create:block/andesite_casing",
"4": "create:block/gearbox",
"1": "minecraft:block/stripped_spruce_log_top",
"side": "create:block/andesite_encased_cogwheel_side"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_large_cogwheel/block",
"textures": {
"casing": "create:block/andesite_casing",
"particle": "create:block/andesite_casing",
"4": "create:block/gearbox",
"1": "minecraft:block/stripped_spruce_log_top",
"side": "create:block/andesite_encased_cogwheel_side_connected"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_large_cogwheel/block_bottom",
"textures": {
"casing": "create:block/andesite_casing",
"particle": "create:block/andesite_casing",
"4": "create:block/gearbox",
"1": "minecraft:block/stripped_spruce_log_top",
"side": "create:block/andesite_encased_cogwheel_side_connected"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_large_cogwheel/block_top",
"textures": {
"casing": "create:block/andesite_casing",
"particle": "create:block/andesite_casing",
"4": "create:block/gearbox",
"1": "minecraft:block/stripped_spruce_log_top",
"side": "create:block/andesite_encased_cogwheel_side_connected"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_large_cogwheel/block_top_bottom",
"textures": {
"casing": "create:block/andesite_casing",
"particle": "create:block/andesite_casing",
"4": "create:block/gearbox",
"1": "minecraft:block/stripped_spruce_log_top",
"side": "create:block/andesite_encased_cogwheel_side_connected"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_cogwheel/block",
"textures": {
"casing": "create:block/brass_casing",
"particle": "create:block/brass_casing",
"4": "create:block/brass_gearbox",
"1": "minecraft:block/stripped_dark_oak_log_top",
"side": "create:block/brass_encased_cogwheel_side"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_cogwheel/block_bottom",
"textures": {
"casing": "create:block/brass_casing",
"particle": "create:block/brass_casing",
"4": "create:block/brass_gearbox",
"1": "minecraft:block/stripped_dark_oak_log_top",
"side": "create:block/brass_encased_cogwheel_side"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_cogwheel/block_top",
"textures": {
"casing": "create:block/brass_casing",
"particle": "create:block/brass_casing",
"4": "create:block/brass_gearbox",
"1": "minecraft:block/stripped_dark_oak_log_top",
"side": "create:block/brass_encased_cogwheel_side"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_cogwheel/block_top_bottom",
"textures": {
"casing": "create:block/brass_casing",
"particle": "create:block/brass_casing",
"4": "create:block/brass_gearbox",
"1": "minecraft:block/stripped_dark_oak_log_top",
"side": "create:block/brass_encased_cogwheel_side"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_large_cogwheel/block",
"textures": {
"casing": "create:block/brass_casing",
"particle": "create:block/brass_casing",
"4": "create:block/brass_gearbox",
"1": "minecraft:block/stripped_dark_oak_log_top",
"side": "create:block/brass_encased_cogwheel_side_connected"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_large_cogwheel/block_bottom",
"textures": {
"casing": "create:block/brass_casing",
"particle": "create:block/brass_casing",
"4": "create:block/brass_gearbox",
"1": "minecraft:block/stripped_dark_oak_log_top",
"side": "create:block/brass_encased_cogwheel_side_connected"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_large_cogwheel/block_top",
"textures": {
"casing": "create:block/brass_casing",
"particle": "create:block/brass_casing",
"4": "create:block/brass_gearbox",
"1": "minecraft:block/stripped_dark_oak_log_top",
"side": "create:block/brass_encased_cogwheel_side_connected"
}

View file

@ -2,6 +2,8 @@
"parent": "create:block/encased_large_cogwheel/block_top_bottom",
"textures": {
"casing": "create:block/brass_casing",
"particle": "create:block/brass_casing",
"4": "create:block/brass_gearbox",
"1": "minecraft:block/stripped_dark_oak_log_top",
"side": "create:block/brass_encased_cogwheel_side_connected"
}

View file

@ -2,7 +2,6 @@
"parent": "create:block/bearing/block",
"textures": {
"side": "create:block/clockwork_bearing_side",
"nook": "create:block/brass_casing",
"back": "create:block/brass_gearbox"
}
}

View file

@ -2,7 +2,6 @@
"parent": "create:block/bearing/block",
"textures": {
"side": "create:block/mechanical_bearing_side",
"nook": "create:block/brass_casing",
"back": "create:block/gearbox"
}
}

View file

@ -2,7 +2,6 @@
"parent": "create:block/bearing/block",
"textures": {
"side": "create:block/windmill_bearing_side",
"nook": "create:block/andesite_casing",
"back": "create:block/gearbox"
}
}

View file

@ -2,6 +2,7 @@
"parent": "create:block/encased_cogwheel/item",
"textures": {
"casing": "create:block/andesite_casing",
"particle": "create:block/andesite_casing",
"1": "minecraft:block/stripped_spruce_log_top",
"side": "create:block/andesite_encased_cogwheel_side"
}

View file

@ -2,6 +2,7 @@
"parent": "create:block/encased_large_cogwheel/item",
"textures": {
"casing": "create:block/andesite_casing",
"particle": "create:block/andesite_casing",
"1": "minecraft:block/stripped_spruce_log_top",
"side": "create:block/andesite_encased_cogwheel_side_connected"
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "create:item/attribute_filter"
}
}

View file

@ -2,6 +2,7 @@
"parent": "create:block/encased_cogwheel/item",
"textures": {
"casing": "create:block/brass_casing",
"particle": "create:block/brass_casing",
"1": "minecraft:block/stripped_dark_oak_log_top",
"side": "create:block/brass_encased_cogwheel_side"
}

View file

@ -2,6 +2,7 @@
"parent": "create:block/encased_large_cogwheel/item",
"textures": {
"casing": "create:block/brass_casing",
"particle": "create:block/brass_casing",
"1": "minecraft:block/stripped_dark_oak_log_top",
"side": "create:block/brass_encased_cogwheel_side_connected"
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "create:item/filter"
}
}

View file

@ -1,7 +1,7 @@
{
"parent": "create:block/bearing/item",
"textures": {
"top": "create:block/bearing_top_wooden",
"top": "create:block/bearing_top",
"side": "create:block/windmill_bearing_side",
"back": "create:block/gearbox"
}

View file

@ -443,9 +443,9 @@ public class AllBlocks {
public static final BlockEntry<ClutchBlock> CLUTCH = REGISTRATE.block("clutch", ClutchBlock::new)
.initialProperties(SharedProperties::stone)
.addLayer(() -> RenderType::cutoutMipped)
.properties(BlockBehaviour.Properties::noOcclusion)
.properties(p -> p.color(MaterialColor.PODZOL))
.addLayer(() -> RenderType::cutoutMipped)
.transform(BlockStressDefaults.setNoImpact())
.transform(axeOrPickaxe())
.blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p)))
@ -455,9 +455,9 @@ public class AllBlocks {
public static final BlockEntry<GearshiftBlock> GEARSHIFT = REGISTRATE.block("gearshift", GearshiftBlock::new)
.initialProperties(SharedProperties::stone)
.addLayer(() -> RenderType::cutoutMipped)
.properties(BlockBehaviour.Properties::noOcclusion)
.properties(p -> p.color(MaterialColor.PODZOL))
.addLayer(() -> RenderType::cutoutMipped)
.transform(BlockStressDefaults.setNoImpact())
.transform(axeOrPickaxe())
.blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p)))
@ -467,7 +467,6 @@ public class AllBlocks {
public static final BlockEntry<EncasedBeltBlock> ENCASED_CHAIN_DRIVE =
REGISTRATE.block("encased_chain_drive", EncasedBeltBlock::new)
.addLayer(() -> RenderType::cutoutMipped)
.initialProperties(SharedProperties::stone)
.properties(BlockBehaviour.Properties::noOcclusion)
.properties(p -> p.color(MaterialColor.PODZOL))
@ -475,7 +474,6 @@ public class AllBlocks {
.transform(axeOrPickaxe())
.blockstate((c, p) -> new EncasedBeltGenerator((state, suffix) -> p.models()
.getExistingFile(p.modLoc("block/" + c.getName() + "/" + suffix))).generate(c, p))
.addLayer(() -> RenderType::cutoutMipped)
.item()
.transform(customItemModel())
.register();
@ -1139,7 +1137,7 @@ public class AllBlocks {
REGISTRATE.block("windmill_bearing", WindmillBearingBlock::new)
.transform(axeOrPickaxe())
.properties(p -> p.color(MaterialColor.PODZOL))
.transform(BuilderTransformers.bearing("windmill", "gearbox", true))
.transform(BuilderTransformers.bearing("windmill", "gearbox"))
.transform(BlockStressDefaults.setCapacity(512.0))
.transform(BlockStressDefaults.setGeneratorSpeed(WindmillBearingBlock::getSpeedRange))
.tag(AllBlockTags.SAFE_NBT.tag)
@ -1149,7 +1147,7 @@ public class AllBlocks {
REGISTRATE.block("mechanical_bearing", MechanicalBearingBlock::new)
.properties(p -> p.color(MaterialColor.PODZOL))
.transform(axeOrPickaxe())
.transform(BuilderTransformers.bearing("mechanical", "gearbox", false))
.transform(BuilderTransformers.bearing("mechanical", "gearbox"))
.transform(BlockStressDefaults.setImpact(4.0))
.tag(AllBlockTags.SAFE_NBT.tag)
.onRegister(movementBehaviour(new StabilizedBearingMovementBehaviour()))
@ -1159,7 +1157,7 @@ public class AllBlocks {
REGISTRATE.block("clockwork_bearing", ClockworkBearingBlock::new)
.properties(p -> p.color(MaterialColor.TERRACOTTA_BROWN))
.transform(axeOrPickaxe())
.transform(BuilderTransformers.bearing("clockwork", "brass_gearbox", false))
.transform(BuilderTransformers.bearing("clockwork", "brass_gearbox"))
.transform(BlockStressDefaults.setImpact(4.0))
.tag(AllBlockTags.SAFE_NBT.tag)
.register();

View file

@ -340,13 +340,9 @@ public class AllItems {
// Logistics
public static final ItemEntry<FilterItem> FILTER = REGISTRATE.item("filter", FilterItem::regular)
.model(AssetLookup.existingItemModel())
.register();
public static final ItemEntry<FilterItem> ATTRIBUTE_FILTER =
REGISTRATE.item("attribute_filter", FilterItem::attribute)
.model(AssetLookup.existingItemModel())
.register();
.register(), ATTRIBUTE_FILTER =
REGISTRATE.item("attribute_filter", FilterItem::attribute)
.register();
public static final ItemEntry<ScheduleItem> SCHEDULE = REGISTRATE.item("schedule", ScheduleItem::new)
.lang("Train Schedule")

View file

@ -225,7 +225,7 @@ public class BlockBreakingMovementBehaviour implements MovementBehaviour {
if (context.contraption instanceof MountedContraption)
lowerLimit = 1f;
if (context.contraption instanceof CarriageContraption)
lowerLimit = 4f;
lowerLimit = 2f;
return Mth.clamp(Math.abs(context.getAnimationSpeed()) / 500f, lowerLimit, 16f);
}

View file

@ -5,12 +5,10 @@ import java.util.function.Predicate;
import com.simibubi.create.AllBlockEntityTypes;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.content.curiosities.tools.ExtendoGripItem;
import com.simibubi.create.foundation.block.IBE;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.utility.placement.IPlacementHelper;
import com.simibubi.create.foundation.utility.placement.PlacementHelpers;
import com.simibubi.create.foundation.utility.placement.PlacementOffset;
import com.simibubi.create.foundation.utility.placement.util.PoleHelper;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
@ -18,7 +16,6 @@ import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.AttributeInstance;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
@ -31,7 +28,6 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.common.ForgeMod;
public class RollerBlock extends AttachedActorBlock implements IBE<RollerBlockEntity> {
@ -93,68 +89,19 @@ public class RollerBlock extends AttachedActorBlock implements IBE<RollerBlockEn
return InteractionResult.PASS;
}
private static class PlacementHelper implements IPlacementHelper {
private static class PlacementHelper extends PoleHelper<Direction> {
public PlacementHelper() {
super(AllBlocks.MECHANICAL_ROLLER::has, state -> state.getValue(FACING)
.getClockWise()
.getAxis(), FACING);
}
@Override
public Predicate<ItemStack> getItemPredicate() {
return AllBlocks.MECHANICAL_ROLLER::isIn;
}
@Override
public Predicate<BlockState> getStatePredicate() {
return AllBlocks.MECHANICAL_ROLLER::has;
}
public int attachedSteps(Level world, BlockPos pos, Direction direction) {
BlockPos checkPos = pos.relative(direction);
BlockState state = world.getBlockState(checkPos);
int count = 0;
while (getStatePredicate().test(state)) {
count++;
checkPos = checkPos.relative(direction);
state = world.getBlockState(checkPos);
}
return count;
}
@Override
public PlacementOffset getOffset(Player player, Level world, BlockState state, BlockPos pos,
BlockHitResult ray) {
Direction dir = null;
Direction facing = state.getValue(FACING);
for (Direction nearest : Direction.orderedByNearest(player)) {
if (nearest.getAxis() != facing.getClockWise()
.getAxis())
continue;
dir = nearest;
break;
}
int range = AllConfigs.server().curiosities.placementAssistRange.get();
if (player != null) {
AttributeInstance reach = player.getAttribute(ForgeMod.REACH_DISTANCE.get());
if (reach != null && reach.hasModifier(ExtendoGripItem.singleRangeAttributeModifier))
range += 4;
}
int row = attachedSteps(world, pos, dir);
if (row >= range)
return PlacementOffset.fail();
BlockPos newPos = pos.relative(dir, row + 1);
BlockState newState = world.getBlockState(newPos);
if (!state.canSurvive(world, newPos))
return PlacementOffset.fail();
if (newState.getMaterial()
.isReplaceable())
return PlacementOffset.success(newPos, bState -> bState.setValue(FACING, facing));
return PlacementOffset.fail();
}
}
}

View file

@ -127,7 +127,7 @@ public class RollerMovementBehaviour extends BlockBreakingMovementBehaviour {
}
BlockPos argMax = null;
double max = Double.MIN_VALUE;
double max = -1;
for (BlockPos toBreak : positionsToBreak) {
float hardness = context.world.getBlockState(toBreak)
.getDestroySpeed(world, toBreak);
@ -136,6 +136,11 @@ public class RollerMovementBehaviour extends BlockBreakingMovementBehaviour {
max = hardness;
argMax = toBreak;
}
if (argMax == null) {
triggerPaver(context, pos);
return;
}
context.data.put("ReferencePos", NbtUtils.writeBlockPos(pos));
context.data.put("BreakingPos", NbtUtils.writeBlockPos(argMax));
@ -181,6 +186,16 @@ public class RollerMovementBehaviour extends BlockBreakingMovementBehaviour {
if (mode != RollingMode.TUNNEL_PAVE)
return positions;
int startingY = 1;
if (!getStateToPaveWith(context).isAir()) {
ItemStack filter = ItemStack.of(context.blockEntityData.getCompound("Filter"));
if (!ItemHelper
.extract(context.contraption.getSharedInventory(),
stack -> FilterItem.test(context.world, stack, filter), 1, true)
.isEmpty())
startingY = 0;
}
// Train
PaveTask profileForTracks = createHeightProfileForTracks(context);
if (profileForTracks != null) {
@ -188,7 +203,11 @@ public class RollerMovementBehaviour extends BlockBreakingMovementBehaviour {
float height = profileForTracks.get(coords);
BlockPos targetPosition = new BlockPos(coords.getFirst(), height, coords.getSecond());
boolean shouldPlaceSlab = height > Math.floor(height) + .45;
for (int i = 0; i <= (shouldPlaceSlab ? 3 : 2); i++)
if (startingY == 1 && shouldPlaceSlab && context.world.getBlockState(targetPosition.above())
.getOptionalValue(SlabBlock.TYPE)
.orElse(SlabType.DOUBLE) == SlabType.BOTTOM)
startingY = 2;
for (int i = startingY; i <= (shouldPlaceSlab ? 3 : 2); i++)
if (testBreakerTarget(context, targetPosition.above(i), i))
positions.add(targetPosition.above(i));
}
@ -196,7 +215,7 @@ public class RollerMovementBehaviour extends BlockBreakingMovementBehaviour {
}
// Otherwise
for (int i = 0; i <= 2; i++)
for (int i = startingY; i <= 2; i++)
if (testBreakerTarget(context, visitedPos.above(i), i))
positions.add(visitedPos.above(i));

View file

@ -89,7 +89,7 @@ public class ValveHandleBlock extends HandCrankBlock {
}
onBlockEntityUse(level, pos,
hcbe -> (hcbe instanceof ValveHandleBlockEntity vhbe) && vhbe.activate(player.isCrouching())
hcbe -> (hcbe instanceof ValveHandleBlockEntity vhbe) && vhbe.activate(player.isSteppingCarefully())
? InteractionResult.SUCCESS
: InteractionResult.PASS);
return true;
@ -115,11 +115,11 @@ public class ValveHandleBlock extends HandCrankBlock {
@Override
public int getRotationSpeed() {
return 16;
return 32;
}
public static Couple<Integer> getSpeedRange() {
return Couple.create(16, 16);
return Couple.create(32, 32);
}
}

View file

@ -133,7 +133,7 @@ public class ValveHandleBlockEntity extends HandCrankBlockEntity {
sequenceContext = SequenceContext.fromGearshift(SequencerInstructions.TURN_ANGLE, rotationSpeed, target);
updateGeneratedRotation();
cooldown = 5;
cooldown = 4;
return true;
}

View file

@ -15,9 +15,24 @@ import net.minecraft.world.phys.Vec3;
public class SteamEngineValueBox extends ValueBoxTransform.Sided {
@Override
protected boolean isSideActive(BlockState state, Direction direction) {
return SteamEngineBlock.getFacing(state)
.getAxis() != direction.getAxis();
protected boolean isSideActive(BlockState state, Direction side) {
Direction engineFacing = SteamEngineBlock.getFacing(state);
if (engineFacing.getAxis() == side.getAxis())
return false;
float roll = 0;
for (Pointing p : Pointing.values())
if (p.getCombinedDirection(engineFacing) == side)
roll = p.getXRotation();
if (engineFacing == Direction.UP)
roll += 180;
boolean recessed = roll % 180 == 0;
if (engineFacing.getAxis() == Axis.Y)
recessed ^= state.getValue(SteamEngineBlock.FACING)
.getAxis() == Axis.X;
return !recessed;
}
@Override
@ -26,21 +41,15 @@ public class SteamEngineValueBox extends ValueBoxTransform.Sided {
Direction engineFacing = SteamEngineBlock.getFacing(state);
float roll = 0;
for (Pointing p : Pointing.values()) {
for (Pointing p : Pointing.values())
if (p.getCombinedDirection(engineFacing) == side)
roll = p.getXRotation();
}
if (engineFacing == Direction.UP)
roll += 180;
float horizontalAngle = AngleHelper.horizontalAngle(engineFacing);
float verticalAngle = AngleHelper.verticalAngle(engineFacing);
boolean recessed = roll % 180 == 0;
if (engineFacing.getAxis() == Axis.Y)
recessed ^= state.getValue(SteamEngineBlock.FACING).getAxis() == Axis.X;
Vec3 local = VecHelper.voxelSpace(8, recessed ? 12.5 : 14.5, 9);
Vec3 local = VecHelper.voxelSpace(8, 14.5, 9);
local = VecHelper.rotateCentered(local, roll, Axis.Z);
local = VecHelper.rotateCentered(local, horizontalAngle, Axis.Y);
@ -59,10 +68,9 @@ public class SteamEngineValueBox extends ValueBoxTransform.Sided {
}
float roll = 0;
for (Pointing p : Pointing.values()) {
for (Pointing p : Pointing.values())
if (p.getCombinedDirection(facing) == getSide())
roll = p.getXRotation();
}
float yRot = AngleHelper.horizontalAngle(facing) + (facing == Direction.DOWN ? 180 : 0);
TransformStack.cast(ms)

View file

@ -173,13 +173,15 @@ public class BlockMovementChecks {
private static boolean isMovementNecessaryFallback(BlockState state, Level world, BlockPos pos) {
if (isBrittle(state))
return true;
if (!state.getMaterial()
.isReplaceable())
if (AllBlockTags.MOVABLE_EMPTY_COLLIDER.matches(state))
return true;
if (!state.getCollisionShape(world, pos)
if (state.getCollisionShape(world, pos)
.isEmpty())
return true;
return AllBlockTags.MOVABLE_EMPTY_COLLIDER.matches(state);
return false;
if (state.getMaterial()
.isReplaceable())
return false;
return true;
}
private static boolean isMovementAllowedFallback(BlockState state, Level world, BlockPos pos) {

View file

@ -62,6 +62,9 @@ public class FluidPipeBlockEntity extends SmartBlockEntity implements ITransform
BlockPos offsetPos = pos.relative(direction);
BlockState otherState = world.getBlockState(offsetPos);
if (state.getBlock() instanceof EncasedPipeBlock && attachment != AttachmentTypes.DRAIN)
return AttachmentTypes.NONE;
if (attachment == AttachmentTypes.RIM && !FluidPipeBlock.isPipe(otherState)
&& !AllBlocks.MECHANICAL_PUMP.has(otherState) && !AllBlocks.ENCASED_FLUID_PIPE.has(otherState)) {
FluidTransportBehaviour pipeBehaviour =

View file

@ -298,15 +298,11 @@ public class BeltBlock extends HorizontalKineticBlock implements IBE<BeltBlockEn
}
if (AllBlocks.BRASS_CASING.isIn(heldItem)) {
if (world.isClientSide)
return InteractionResult.SUCCESS;
withBlockEntityDo(world, pos, be -> be.setCasingType(CasingType.BRASS));
return InteractionResult.SUCCESS;
}
if (AllBlocks.ANDESITE_CASING.isIn(heldItem)) {
if (world.isClientSide)
return InteractionResult.SUCCESS;
withBlockEntityDo(world, pos, be -> be.setCasingType(CasingType.ANDESITE));
return InteractionResult.SUCCESS;
}

View file

@ -429,16 +429,26 @@ public class BeltBlockEntity extends KineticBlockEntity {
public void setCasingType(CasingType type) {
if (casing == type)
return;
BlockState blockState = getBlockState();
boolean shouldBlockHaveCasing = type != CasingType.NONE;
if (level.isClientSide) {
casing = type;
level.setBlock(worldPosition, blockState.setValue(BeltBlock.CASING, shouldBlockHaveCasing), 0);
requestModelDataUpdate();
level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 16);
return;
}
if (casing != CasingType.NONE)
level.levelEvent(2001, worldPosition,
Block.getId(casing == CasingType.ANDESITE ? AllBlocks.ANDESITE_CASING.getDefaultState()
: AllBlocks.BRASS_CASING.getDefaultState()));
casing = type;
boolean shouldBlockHaveCasing = type != CasingType.NONE;
BlockState blockState = getBlockState();
if (blockState.getValue(BeltBlock.CASING) != shouldBlockHaveCasing)
KineticBlockEntity.switchToBlockState(level, worldPosition,
blockState.setValue(BeltBlock.CASING, shouldBlockHaveCasing));
casing = type;
setChanged();
sendData();
}

View file

@ -4,20 +4,17 @@ import java.util.function.Predicate;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.content.curiosities.tools.ExtendoGripItem;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.VoxelShaper;
import com.simibubi.create.foundation.utility.placement.IPlacementHelper;
import com.simibubi.create.foundation.utility.placement.PlacementHelpers;
import com.simibubi.create.foundation.utility.placement.PlacementOffset;
import com.simibubi.create.foundation.utility.placement.util.PoleHelper;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.ai.attributes.AttributeInstance;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
@ -38,7 +35,6 @@ import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.common.ForgeMod;
public class CopycatStepBlock extends WaterloggedCopycatBlock {
@ -217,71 +213,19 @@ public class CopycatStepBlock extends WaterloggedCopycatBlock {
return pState.rotate(pMirror.getRotation(pState.getValue(FACING)));
}
private static class PlacementHelper implements IPlacementHelper {
private static class PlacementHelper extends PoleHelper<Direction> {
public PlacementHelper() {
super(AllBlocks.COPYCAT_STEP::has, state -> state.getValue(FACING)
.getClockWise()
.getAxis(), FACING);
}
@Override
public Predicate<ItemStack> getItemPredicate() {
return AllBlocks.COPYCAT_STEP::isIn;
}
@Override
public Predicate<BlockState> getStatePredicate() {
return AllBlocks.COPYCAT_STEP::has;
}
public int attachedSteps(Level world, BlockPos pos, Direction direction) {
BlockPos checkPos = pos.relative(direction);
BlockState state = world.getBlockState(checkPos);
int count = 0;
while (getStatePredicate().test(state)) {
count++;
checkPos = checkPos.relative(direction);
state = world.getBlockState(checkPos);
}
return count;
}
@Override
public PlacementOffset getOffset(Player player, Level world, BlockState state, BlockPos pos,
BlockHitResult ray) {
Direction dir = null;
Direction facing = state.getValue(FACING);
for (Direction nearest : Direction.orderedByNearest(player)) {
if (nearest.getAxis() != facing.getClockWise()
.getAxis())
continue;
dir = nearest;
break;
}
int range = AllConfigs.server().curiosities.placementAssistRange.get();
if (player != null) {
AttributeInstance reach = player.getAttribute(ForgeMod.REACH_DISTANCE.get());
if (reach != null && reach.hasModifier(ExtendoGripItem.singleRangeAttributeModifier))
range += 4;
}
int row = attachedSteps(world, pos, dir);
if (row >= range)
return PlacementOffset.fail();
BlockPos newPos = pos.relative(dir, row + 1);
BlockState newState = world.getBlockState(newPos);
if (!state.canSurvive(world, newPos))
return PlacementOffset.fail();
if (newState.getMaterial()
.isReplaceable())
return PlacementOffset.success(newPos, bState -> {
return bState.setValue(FACING, facing)
.setValue(HALF, state.getValue(HALF));
});
return PlacementOffset.fail();
}
}
}

View file

@ -9,6 +9,7 @@ import com.simibubi.create.foundation.block.IBE;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
@ -34,7 +35,7 @@ public class DepotBlock extends Block implements IBE<DepotBlockEntity>, IWrencha
@Override
public VoxelShape getShape(BlockState p_220053_1_, BlockGetter p_220053_2_, BlockPos p_220053_3_,
CollisionContext p_220053_4_) {
return AllShapes.DEPOT;
return AllShapes.CASING_13PX.get(Direction.UP);
}
@Override

View file

@ -42,7 +42,7 @@ public class EjectorBlock extends HorizontalKineticBlock implements IBE<EjectorB
@Override
public VoxelShape getShape(BlockState p_220053_1_, BlockGetter p_220053_2_, BlockPos p_220053_3_,
CollisionContext p_220053_4_) {
return AllShapes.DEPOT;
return AllShapes.CASING_13PX.get(Direction.UP);
}
@Override

View file

@ -102,10 +102,10 @@ public class EjectorBlockEntity extends KineticBlockEntity {
super.addBehaviours(behaviours);
behaviours.add(depotBehaviour = new DepotBehaviour(this));
maxStackSize = new ScrollValueBehaviour(Lang.translateDirect("weighted_ejector.stack_size"), this, new EjectorSlot())
.between(0, 64)
.withFormatter(i -> i == 0 ? "*" : String.valueOf(i))
.onlyActiveWhen(() -> state == State.CHARGED);
maxStackSize =
new ScrollValueBehaviour(Lang.translateDirect("weighted_ejector.stack_size"), this, new EjectorSlot())
.between(0, 64)
.withFormatter(i -> i == 0 ? "*" : String.valueOf(i));
behaviours.add(maxStackSize);
depotBehaviour.maxStackSize = () -> maxStackSize.getValue();
@ -167,7 +167,8 @@ public class EjectorBlockEntity extends KineticBlockEntity {
if (launcher.getHorizontalDistance() * launcher.getHorizontalDistance()
+ launcher.getVerticalDistance() * launcher.getVerticalDistance() >= 25 * 25)
AllPackets.getChannel().sendToServer(new EjectorAwardPacket(worldPosition));
AllPackets.getChannel()
.sendToServer(new EjectorAwardPacket(worldPosition));
if (!(playerEntity.getItemBySlot(EquipmentSlot.CHEST)
.getItem() instanceof ElytraItem))
@ -178,7 +179,8 @@ public class EjectorBlockEntity extends KineticBlockEntity {
playerEntity.setDeltaMovement(playerEntity.getDeltaMovement()
.scale(.75f));
deployElytra(playerEntity);
AllPackets.getChannel().sendToServer(new EjectorElytraPacket(worldPosition));
AllPackets.getChannel()
.sendToServer(new EjectorElytraPacket(worldPosition));
}
if (doLogic) {
@ -469,7 +471,7 @@ public class EjectorBlockEntity extends KineticBlockEntity {
return launcher.getGlobalVelocity(time, getFacing().getOpposite(), worldPosition)
.scale(.5f);
}
@Override
public void destroy() {
super.destroy();
@ -613,15 +615,21 @@ public class EjectorBlockEntity extends KineticBlockEntity {
}
private static class EjectorSlot extends ValueBoxTransform.Sided {
private class EjectorSlot extends ValueBoxTransform.Sided {
@Override
protected Vec3 getLocalOffset(BlockState state) {
return new Vec3(.5, 13 / 16f, .5).add(VecHelper.rotate(new Vec3(0, 0, -.3), angle(state), Axis.Y));
if (direction != Direction.UP)
return super.getLocalOffset(state);
return new Vec3(.5, 10.5 / 16f, .5).add(VecHelper.rotate(VecHelper.voxelSpace(0, 0, -5), angle(state), Axis.Y));
}
@Override
protected void rotate(BlockState state, PoseStack ms) {
if (direction != Direction.UP) {
super.rotate(state, ms);
return;
}
TransformStack.cast(ms)
.rotateY(angle(state))
.rotateX(90);
@ -636,17 +644,14 @@ public class EjectorBlockEntity extends KineticBlockEntity {
@Override
protected boolean isSideActive(BlockState state, Direction direction) {
return direction == Direction.UP;
}
@Override
protected float getScale() {
return 0.2f;
return direction.getAxis() == state.getValue(EjectorBlock.HORIZONTAL_FACING)
.getAxis()
|| direction == Direction.UP && EjectorBlockEntity.this.state != EjectorBlockEntity.State.CHARGED;
}
@Override
protected Vec3 getSouthLocation() {
return Vec3.ZERO;
return direction == Direction.UP ? Vec3.ZERO : VecHelper.voxelSpace(8, 6, 15.5);
}
}

View file

@ -18,6 +18,7 @@ import org.apache.commons.lang3.mutable.MutableDouble;
import org.apache.commons.lang3.mutable.MutableObject;
import com.simibubi.create.Create;
import com.simibubi.create.content.logistics.trains.BezierConnection;
import com.simibubi.create.content.logistics.trains.DimensionPalette;
import com.simibubi.create.content.logistics.trains.TrackEdge;
import com.simibubi.create.content.logistics.trains.TrackGraph;
@ -200,6 +201,20 @@ public class Navigation {
return false;
}, (distance, edge) -> {
BezierConnection turn = edge.getTurn();
double vDistance = Math.abs(turn.starts.getFirst().y - turn.starts.getSecond().y);
// ignore turn if its a straight & mild slope
if (turn != null && vDistance > 1 / 16f) {
if (turn.axes.getFirst()
.multiply(1, 0, 1)
.distanceTo(turn.axes.getSecond()
.multiply(1, 0, 1)
.scale(-1)) < 1 / 64f
&& vDistance / turn.getLength() < .225f)
return;
}
float current = curveDistanceTracker.floatValue();
if (current == -1 || distance < current)
curveDistanceTracker.setValue(distance);
@ -251,7 +266,7 @@ public class Navigation {
return;
}
}
topSpeed *= train.throttle;
double turnTopSpeed = Math.min(topSpeed, train.maxTurnSpeed());
@ -579,7 +594,7 @@ public class Navigation {
.get(initialNode2);
if (initialEdge == null)
return;
double distanceToNode2 = forward ? initialEdge.getLength() - startingPoint.position : startingPoint.position;
frontier.add(new FrontierEntry(distanceToNode2, 0, initialNode1, initialNode2, initialEdge));

View file

@ -1,9 +1,12 @@
package com.simibubi.create.content.schematics.block;
import java.util.Arrays;
import java.util.Optional;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlockEntity;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlockEntity.CasingType;
import com.simibubi.create.content.contraptions.relays.belt.BeltPart;
import com.simibubi.create.content.contraptions.relays.belt.BeltSlope;
import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorItem;
@ -15,6 +18,7 @@ import net.minecraft.core.Direction.Axis;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.nbt.Tag;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.ItemStack;
@ -126,6 +130,7 @@ public abstract class LaunchedItem {
public static class ForBelt extends ForBlockState {
public int length;
public CasingType[] casings;
public ForBelt() {}
@ -133,18 +138,27 @@ public abstract class LaunchedItem {
public CompoundTag serializeNBT() {
CompoundTag serializeNBT = super.serializeNBT();
serializeNBT.putInt("Length", length);
serializeNBT.putIntArray("Casing", Arrays.stream(casings)
.map(CasingType::ordinal)
.toList());
return serializeNBT;
}
@Override
void readNBT(CompoundTag nbt) {
length = nbt.getInt("Length");
int[] intArray = nbt.getIntArray("Casing");
casings = new CasingType[length];
for (int i = 0; i < casings.length; i++)
casings[i] = i >= intArray.length ? CasingType.NONE
: CasingType.values()[Mth.clamp(intArray[i], 0, CasingType.values().length - 1)];
super.readNBT(nbt);
}
public ForBelt(BlockPos start, BlockPos target, ItemStack stack, BlockState state, int length) {
public ForBelt(BlockPos start, BlockPos target, ItemStack stack, BlockState state, CasingType[] casings) {
super(start, target, stack, state, null);
this.length = length;
this.casings = casings;
this.length = casings.length;
}
@Override
@ -160,6 +174,15 @@ public abstract class LaunchedItem {
.setValue(AbstractSimpleShaftBlock.AXIS, axis));
BeltConnectorItem.createBelts(world, target,
target.offset(offset.getX() * i, offset.getY() * i, offset.getZ() * i));
for (int segment = 0; segment < length; segment++) {
if (casings[segment] == CasingType.NONE)
continue;
BlockPos casingTarget =
target.offset(offset.getX() * segment, offset.getY() * segment, offset.getZ() * segment);
if (world.getBlockEntity(casingTarget) instanceof BeltBlockEntity bbe)
bbe.setCasingType(casings[segment]);
}
}
}

View file

@ -1,5 +1,6 @@
package com.simibubi.create.content.schematics.block;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
@ -12,6 +13,8 @@ import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlockEntity;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlockEntity.CasingType;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.BeltPart;
import com.simibubi.create.content.contraptions.relays.belt.BeltSlope;
import com.simibubi.create.content.contraptions.relays.elementary.AbstractSimpleShaftBlock;
@ -741,38 +744,55 @@ public class SchematicannonBlockEntity extends SmartBlockEntity implements MenuP
return blockState;
return AllBlocks.SHAFT.getDefaultState()
.setValue(AbstractSimpleShaftBlock.AXIS, slope == BeltSlope.SIDEWAYS ? Axis.Y :
facing.getClockWise()
.setValue(AbstractSimpleShaftBlock.AXIS, slope == BeltSlope.SIDEWAYS ? Axis.Y
: facing.getClockWise()
.getAxis());
}
protected void launchBlockOrBelt(BlockPos target, ItemStack icon, BlockState blockState, BlockEntity blockEntity) {
if (AllBlocks.BELT.has(blockState)) {
blockState = stripBeltIfNotLast(blockState);
if (blockEntity instanceof BeltBlockEntity && AllBlocks.BELT.has(blockState))
launchBelt(target, blockState, ((BeltBlockEntity) blockEntity).beltLength);
else if (blockState != Blocks.AIR.defaultBlockState())
launchBlock(target, icon, blockState, null);
} else {
CompoundTag data = null;
if (blockEntity != null) {
if (AllBlockTags.SAFE_NBT.matches(blockState)) {
data = blockEntity.saveWithFullMetadata();
data = NBTProcessors.process(blockEntity, data, true);
} else if (blockEntity instanceof IPartialSafeNBT) {
data = new CompoundTag();
((IPartialSafeNBT) blockEntity).writeSafe(data);
data = NBTProcessors.process(blockEntity, data, true);
if (blockEntity instanceof BeltBlockEntity bbe && AllBlocks.BELT.has(blockState)) {
CasingType[] casings = new CasingType[bbe.beltLength];
Arrays.fill(casings, CasingType.NONE);
BlockPos currentPos = target;
for (int i = 0; i < bbe.beltLength; i++) {
BlockState currentState = bbe.getLevel()
.getBlockState(currentPos);
if (!(currentState.getBlock() instanceof BeltBlock))
break;
if (!(bbe.getLevel()
.getBlockEntity(currentPos) instanceof BeltBlockEntity beltAtSegment))
break;
casings[i] = beltAtSegment.casing;
currentPos = BeltBlock.nextSegmentPosition(currentState, currentPos,
blockState.getValue(BeltBlock.PART) != BeltPart.END);
}
}
launchBlock(target, icon, blockState, data);
launchBelt(target, blockState, bbe.beltLength, casings);
} else if (blockState != Blocks.AIR.defaultBlockState())
launchBlock(target, icon, blockState, null);
return;
}
CompoundTag data = null;
if (blockEntity != null) {
if (AllBlockTags.SAFE_NBT.matches(blockState)) {
data = blockEntity.saveWithFullMetadata();
data = NBTProcessors.process(blockEntity, data, true);
} else if (blockEntity instanceof IPartialSafeNBT) {
data = new CompoundTag();
((IPartialSafeNBT) blockEntity).writeSafe(data);
data = NBTProcessors.process(blockEntity, data, true);
}
}
launchBlock(target, icon, blockState, data);
}
protected void launchBelt(BlockPos target, BlockState state, int length) {
protected void launchBelt(BlockPos target, BlockState state, int length, CasingType[] casings) {
blocksPlaced++;
ItemStack connector = AllItems.BELT_CONNECTOR.asStack();
flyingBlocks.add(new LaunchedItem.ForBelt(this.getBlockPos(), target, connector, state, length));
flyingBlocks.add(new LaunchedItem.ForBelt(this.getBlockPos(), target, connector, state, casings));
playFiringSound();
}

View file

@ -180,6 +180,7 @@ public class BuilderTransformers {
String encasedSuffix = "_encased_cogwheel_side" + (large ? "_connected" : "");
String blockFolder = large ? "encased_large_cogwheel" : "encased_cogwheel";
String wood = casing.equals("brass") ? "dark_oak" : "spruce";
String gearbox = casing.equals("brass") ? "brass_gearbox" : "gearbox";
return encasedBase(b, drop).addLayer(() -> RenderType::cutoutMipped)
.onRegister(CreateRegistrate.casingConnectivity((block, cc) -> cc.make(block, casingShift.get(),
(s, f) -> f.getAxis() == s.getValue(EncasedCogwheelBlock.AXIS)
@ -192,12 +193,15 @@ public class BuilderTransformers {
return p.models()
.withExistingParent(modelName, p.modLoc("block/" + blockFolder + "/block" + suffix))
.texture("casing", Create.asResource("block/" + casing + "_casing"))
.texture("particle", Create.asResource("block/" + casing + "_casing"))
.texture("4", Create.asResource("block/" + gearbox))
.texture("1", new ResourceLocation("block/stripped_" + wood + "_log_top"))
.texture("side", Create.asResource("block/" + casing + encasedSuffix));
}, false))
.item()
.model((c, p) -> p.withExistingParent(c.getName(), p.modLoc("block/" + blockFolder + "/item"))
.texture("casing", Create.asResource("block/" + casing + "_casing"))
.texture("particle", Create.asResource("block/" + casing + "_casing"))
.texture("1", new ResourceLocation("block/stripped_" + wood + "_log_top"))
.texture("side", Create.asResource("block/" + casing + encasedSuffix)))
.build();
@ -365,12 +369,10 @@ public class BuilderTransformers {
}
public static <B extends Block, P> NonNullUnaryOperator<BlockBuilder<B, P>> bearing(String prefix,
String backTexture, boolean woodenTop) {
String backTexture) {
ResourceLocation baseBlockModelLocation = Create.asResource("block/bearing/block");
ResourceLocation baseItemModelLocation = Create.asResource("block/bearing/item");
ResourceLocation topTextureLocation = Create.asResource("block/bearing_top" + (woodenTop ? "_wooden" : ""));
ResourceLocation nookTextureLocation =
Create.asResource("block/" + (woodenTop ? "andesite" : "brass") + "_casing");
ResourceLocation topTextureLocation = Create.asResource("block/bearing_top");
ResourceLocation sideTextureLocation = Create.asResource("block/" + prefix + "_bearing_side");
ResourceLocation backTextureLocation = Create.asResource("block/" + backTexture);
return b -> b.initialProperties(SharedProperties::stone)
@ -378,7 +380,6 @@ public class BuilderTransformers {
.blockstate((c, p) -> p.directionalBlock(c.get(), p.models()
.withExistingParent(c.getName(), baseBlockModelLocation)
.texture("side", sideTextureLocation)
.texture("nook", nookTextureLocation)
.texture("back", backTextureLocation)))
.item()
.model((c, p) -> p.withExistingParent(c.getName(), baseItemModelLocation)

View file

@ -245,10 +245,7 @@ public class BlockHelper {
if (state.hasProperty(BlockStateProperties.WATERLOGGED))
state = state.setValue(BlockStateProperties.WATERLOGGED, Boolean.FALSE);
if (AllBlocks.BELT.has(state)) {
world.setBlock(target, state, 2);
return;
} else if (state.getBlock() == Blocks.COMPOSTER)
if (state.getBlock() == Blocks.COMPOSTER)
state = Blocks.COMPOSTER.defaultBlockState();
else if (state.getBlock() != Blocks.SEA_PICKLE && state.getBlock() instanceof IPlantable)
state = ((IPlantable) state.getBlock()).getPlant(world, target);
@ -273,6 +270,8 @@ public class BlockHelper {
if (state.getBlock() instanceof BaseRailBlock) {
placeRailWithoutUpdate(world, state, target);
} else if (AllBlocks.BELT.has(state)) {
world.setBlock(target, state, 2);
} else {
world.setBlock(target, state, 18);
}

View file

@ -2,23 +2,9 @@
"textures": {
"particle": "#side",
"gearbox": "#back",
"bearing_side": "#side",
"brass_casing": "#nook"
"bearing_side": "#side"
},
"elements": [
{
"name": "Indicator",
"from": [ 6, 10, 16 ],
"to": [ 10, 12, 17 ],
"faces": {
"north": { "texture": "#brass_casing", "uv": [ 3, 0, 7, 2 ] },
"east": { "texture": "#brass_casing", "uv": [ 7, 14, 8, 16 ] },
"south": { "texture": "#brass_casing", "uv": [ 6, 14, 10, 16 ] },
"west": { "texture": "#brass_casing", "uv": [ 8, 14, 9, 16 ] },
"up": { "texture": "#brass_casing", "uv": [ 6, 1, 10, 2 ] },
"down": { "texture": "#brass_casing", "uv": [ 6, 0, 10, 1 ] }
}
},
{
"name": "Side",
"from": [ 0, 0, 0 ],

View file

@ -3,22 +3,9 @@
"textures": {
"bearing_top": "create:block/bearing_top",
"particle": "create:block/mechanical_bearing_side",
"bearing_side": "create:block/mechanical_bearing_side",
"brass_casing": "create:block/brass_block"
"bearing_side": "create:block/mechanical_bearing_side"
},
"elements": [
{
"name": "Cube",
"from": [6, 12, 16],
"to": [10, 14, 17],
"faces": {
"east": {"uv": [10, 9, 11, 11], "texture": "#brass_casing"},
"south": {"uv": [6, 9, 10, 11], "texture": "#brass_casing"},
"west": {"uv": [5, 9, 6, 11], "texture": "#brass_casing"},
"up": {"uv": [6, 8, 10, 9], "texture": "#brass_casing"},
"down": {"uv": [6, 11, 10, 12], "texture": "#brass_casing"}
}
},
{
"name": "Top",
"from": [0, 12, 0],

View file

@ -4,7 +4,6 @@
"textures": {
"bearing_top": "create:block/bearing_top",
"particle": "create:block/windmill_bearing_side",
"bearing_side": "create:block/windmill_bearing_side",
"brass_casing": "create:block/andesite_casing"
"bearing_side": "create:block/windmill_bearing_side"
}
}

View file

@ -2,7 +2,7 @@
"credit": "Made with Blockbench",
"textures": {
"1": "block/stripped_spruce_log_top",
"3": "create:block/gearbox",
"4": "create:block/gearbox",
"particle": "create:block/andesite_casing",
"casing": "create:block/andesite_casing",
"side": "create:block/andesite_encased_cogwheel_side_connected"
@ -17,7 +17,7 @@
"south": {"uv": [8, 13, 16, 15.5], "texture": "#side"},
"west": {"uv": [8, 13, 16, 15.5], "texture": "#side"},
"up": {"uv": [0, 0, 16, 16], "texture": "#1"},
"down": {"uv": [0, 0, 16, 16], "texture": "#3"}
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
},
{

View file

@ -2,7 +2,7 @@
"credit": "Made with Blockbench",
"textures": {
"1": "block/stripped_spruce_log_top",
"3": "create:block/gearbox",
"4": "create:block/gearbox",
"particle": "create:block/andesite_casing",
"casing": "create:block/andesite_casing",
"side": "create:block/andesite_encased_cogwheel_side_connected"
@ -28,7 +28,7 @@
"east": {"uv": [8, 8.5, 16, 11], "texture": "#side"},
"south": {"uv": [8, 8.5, 16, 11], "texture": "#side"},
"west": {"uv": [8, 8.5, 16, 11], "texture": "#side"},
"up": {"uv": [0, 0, 16, 16], "texture": "#3"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#1"}
}
},

View file

@ -2,7 +2,7 @@
"credit": "Made with Blockbench",
"textures": {
"1": "block/stripped_spruce_log_top",
"3": "create:block/gearbox",
"4": "create:block/gearbox",
"particle": "create:block/andesite_casing",
"casing": "create:block/andesite_casing",
"side": "create:block/andesite_encased_cogwheel_side_connected"
@ -17,7 +17,7 @@
"south": {"uv": [8, 13, 16, 15.5], "texture": "#side"},
"west": {"uv": [8, 13, 16, 15.5], "texture": "#side"},
"up": {"uv": [0, 0, 16, 16], "texture": "#1"},
"down": {"uv": [0, 0, 16, 16], "texture": "#3"}
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
},
{
@ -28,7 +28,7 @@
"east": {"uv": [8, 8.5, 16, 11], "texture": "#side"},
"south": {"uv": [8, 8.5, 16, 11], "texture": "#side"},
"west": {"uv": [8, 8.5, 16, 11], "texture": "#side"},
"up": {"uv": [0, 0, 16, 16], "texture": "#3"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#1"}
}
},

View file

@ -8,10 +8,21 @@
"particle": "create:block/gearshift_off"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"},
"east": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"},
"south": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"},
"west": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"},
"up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#2"},
"down": {"uv": [0, 0, 16, 16], "texture": "#2"}
}
},
{
"from": [1.95, 16, 1.95],
"to": [14.05, 15, 14.05],
"rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [2, 15, 14, 16], "texture": "#1"},
"east": {"uv": [0, 2, 1, 14], "rotation": 270, "texture": "#1"},
@ -23,7 +34,6 @@
{
"from": [1.95, 1, 1.95],
"to": [14.05, 0, 14.05],
"rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [2, 15, 14, 16], "rotation": 180, "texture": "#1"},
"east": {"uv": [15, 2, 16, 14], "rotation": 270, "texture": "#1"},
@ -31,19 +41,6 @@
"west": {"uv": [0, 2, 1, 14], "rotation": 90, "texture": "#1"},
"down": {"uv": [2, 2, 14, 14], "texture": "#1"}
}
},
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"},
"east": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"},
"south": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"},
"west": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#0"},
"up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#2"},
"down": {"uv": [0, 0, 16, 16], "texture": "#2"}
}
}
]
}

View file

@ -1,7 +0,0 @@
{
"parent": "create:item/filter",
"textures": {
"layer0": "create:item/brass_filter",
"particle": "create:item/brass_filter"
}
}

View file

@ -1,8 +0,0 @@
{
"credit": "Made with Blockbench",
"parent": "builtin/generated",
"textures": {
"particle": "create:item/andesite_filter",
"layer0": "create:item/andesite_filter"
}
}

View file

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 279 B

View file

Before

Width:  |  Height:  |  Size: 298 B

After

Width:  |  Height:  |  Size: 298 B