Compare commits
28 commits
mc1.18/dev
...
lastertag
Author | SHA1 | Date | |
---|---|---|---|
61d645c354 | |||
0c89eb0279 | |||
a0f01b733d | |||
d2dc576644 | |||
557a496929 | |||
589e4146dc | |||
68bc9c6921 | |||
273fe8ebf1 | |||
352ad95a84 | |||
0bc2d1f684 | |||
869d68ac27 | |||
19fa27c54b | |||
838eeeee10 | |||
4fa551b452 | |||
0dd72c236b | |||
8e33eade50 | |||
a2e2e2a313 | |||
19129c321f | |||
2b3fb358ad | |||
5d54ed4682 | |||
dbede41eba | |||
8fd59b17b9 | |||
ea75b310c4 | |||
00e3286ad9 | |||
ff6b80ee9f | |||
53e1f0f416 | |||
6326215fc5 | |||
6f226f48eb |
|
@ -4,6 +4,7 @@ f0d6baaabda94151134f569246d61a6e710c35a9 assets/create/blockstates/acacia_window
|
|||
55d57354040f4b5cefa2a9bfaf1cb777350fd699 assets/create/blockstates/adjustable_crate.json
|
||||
79c50afcea3a360783a5b3c73de9823511e9aed9 assets/create/blockstates/adjustable_pulse_repeater.json
|
||||
1d730df54c9eae94063e37396d224fb3c87517e0 assets/create/blockstates/adjustable_repeater.json
|
||||
beeb4a297a932efa0526496d237b0f885ad7868c assets/create/blockstates/aligner.json
|
||||
9dd79bf5430f674e7d3e3fc7d59edee3d66e241e assets/create/blockstates/analog_lever.json
|
||||
dd468657a73fc2ad6e1ac08ace2996b6997d33e0 assets/create/blockstates/andesite_belt_funnel.json
|
||||
585481e97c5066af63ea12fa5dd658798844d64c assets/create/blockstates/andesite_bricks.json
|
||||
|
@ -237,6 +238,7 @@ b7c4a0ff0c6f16e14d71fc0fb7fc66d032b65cf3 assets/create/blockstates/mechanical_pu
|
|||
94bbcb7e622471dbf418d78f9200ad321c7168de assets/create/blockstates/metal_bracket.json
|
||||
4e48ad0936647065c2322390e7c0fe115c853a98 assets/create/blockstates/millstone.json
|
||||
468202df0802e17c75fcad0993daf1bc5300ca91 assets/create/blockstates/minecart_anchor.json
|
||||
5e68c6a2af372a89677f1283875d8481c05d6004 assets/create/blockstates/mirror.json
|
||||
6a42f86aaff8ced70aaa6adb9460614ab40c21e5 assets/create/blockstates/mossy_andesite.json
|
||||
bd49d8df2c3b0e07f599026db5dc1e67f4fa6199 assets/create/blockstates/mossy_dark_scoria.json
|
||||
d1fad9fa7f6d948fd68a31a86fe1b952bf80817b assets/create/blockstates/mossy_diorite.json
|
||||
|
@ -340,6 +342,7 @@ d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.j
|
|||
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
|
||||
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json
|
||||
4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json
|
||||
5bcd9b6acc1c6c7224003ab443a3578024ac61c2 assets/create/blockstates/radiant_beacon.json
|
||||
45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json
|
||||
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
|
||||
722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json
|
||||
|
@ -406,20 +409,20 @@ 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
|
||||
97e9ee471ea650f6b7f3d3f39f00201cd5ad752d assets/create/lang/en_ud.json
|
||||
514ab1f6fa3d24dc575a5dcaaaa96a8009da7414 assets/create/lang/en_us.json
|
||||
7e45e9a69fb4d21d199174673f2ea6fe35ee6859 assets/create/lang/unfinished/de_de.json
|
||||
2af0dd8cd0776b8ed5110990405f3cd515abe8e8 assets/create/lang/unfinished/es_es.json
|
||||
90fc3a9475b957eebf10380a960416b072987541 assets/create/lang/unfinished/es_mx.json
|
||||
997cc00c6a9afbb142e25c5a1840908363afad41 assets/create/lang/unfinished/fr_fr.json
|
||||
6a9c89ff7a7c2df5f78a6a739a204744a4a5607a assets/create/lang/unfinished/it_it.json
|
||||
e21697e70444e3c8fb367b7a4fe867726157390d assets/create/lang/unfinished/ja_jp.json
|
||||
9f2d7b6fc84f6257837b4c517489f6ef31a4e1a5 assets/create/lang/unfinished/ko_kr.json
|
||||
5bcfe026f3bb3f0aa0ea415e54dedad4195bb70a assets/create/lang/unfinished/nl_nl.json
|
||||
bc60cb08266e8d13523d086cdb85aa12da78a47b assets/create/lang/unfinished/pt_br.json
|
||||
288e3e76a1aa090a676415aeb9f5383b3386e40d assets/create/lang/unfinished/ru_ru.json
|
||||
0b6852ca1cea71d24cfdee7004ab37fa7810a0fe assets/create/lang/unfinished/zh_cn.json
|
||||
619d82eba592f4ae88ddbc2c9dfae02627876300 assets/create/lang/unfinished/zh_tw.json
|
||||
622d141f3ae4cc48d3d19a92f4319fa6795cfa91 assets/create/lang/en_ud.json
|
||||
543b16f331f312c67c7f323f12830cc06f80102f assets/create/lang/en_us.json
|
||||
24a92fcb7ae563bab1e0df04de424297add1f904 assets/create/lang/unfinished/de_de.json
|
||||
61bdc0a3c084d32809a81a618c224fb7c0198dff assets/create/lang/unfinished/es_es.json
|
||||
0f2f1cb7c314996774bd5530893d26097f24653e assets/create/lang/unfinished/es_mx.json
|
||||
cc8ea4fd645af22df0cad910f2f3822932160ad8 assets/create/lang/unfinished/fr_fr.json
|
||||
f738ef9a9d51adbd048a9d3e409d204d73756857 assets/create/lang/unfinished/it_it.json
|
||||
aa2f66997784610e0e41e731fa626acbc9c5d947 assets/create/lang/unfinished/ja_jp.json
|
||||
5fb62186959c9ccbaeebfe32efc8e2279a853767 assets/create/lang/unfinished/ko_kr.json
|
||||
8250d4fffe2fbeae60fee3e3a6e905e305a38467 assets/create/lang/unfinished/nl_nl.json
|
||||
5f57f1d42d92ac7e0563a4705728bf6cbee2d1ae assets/create/lang/unfinished/pt_br.json
|
||||
de34ab7484b7e2cd3e3172849ab5504ee6643f3b assets/create/lang/unfinished/ru_ru.json
|
||||
2cac74584b63032fc5b7b51598ad3484b36f2a87 assets/create/lang/unfinished/zh_cn.json
|
||||
770321e8e6b12af4edb019491d18eb75f31b113b assets/create/lang/unfinished/zh_tw.json
|
||||
487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json
|
||||
b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json
|
||||
3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json
|
||||
|
@ -1204,6 +1207,7 @@ c695dab3964186a857767b2b4975aebffa86dcf9 assets/create/models/item/acacia_window
|
|||
06d8b6e8f050b8ec0bef88b7633f3741baad4571 assets/create/models/item/adjustable_crate.json
|
||||
96fcec285c0c26a8cb55e126f8c7053c70ad188b assets/create/models/item/adjustable_pulse_repeater.json
|
||||
30292e874dd36e45eaeebb8d0bb8c4867866a38b assets/create/models/item/adjustable_repeater.json
|
||||
9b392ed4704e42a7c6fdc98426c60c0b5c37e799 assets/create/models/item/aligner.json
|
||||
e7759d9b3cd64d2719a58dc35fc75ca65b9e14fa assets/create/models/item/analog_lever.json
|
||||
2e90c7abfcad12ca656ae253d834fbb799e15277 assets/create/models/item/andesite_alloy.json
|
||||
a513af38f164a48fd44693b70a93012f3546caff assets/create/models/item/andesite_bricks.json
|
||||
|
@ -1466,6 +1470,7 @@ f8d0d4b2a890ea7a69ab0c390947b48fe0478d3f assets/create/models/item/mechanical_pi
|
|||
0eb5726c8c0de462f432411c210d6132b2c446a4 assets/create/models/item/millstone.json
|
||||
363c5a2b8ac945b676c838cdf7b0494c3ab13599 assets/create/models/item/minecart_contraption.json
|
||||
01e3fda31e549a3b6a1e5e615b59478e8f06f16a assets/create/models/item/minecart_coupling.json
|
||||
05ecb758484f06ea809ae128d8a128c4cbd60696 assets/create/models/item/mirror.json
|
||||
dc43c88dc8ae1f425e1c10f422b09d97719af5bc assets/create/models/item/mossy_andesite.json
|
||||
4ce9aabf9fa9e9e6af6b4339291e635708bdbcdf assets/create/models/item/mossy_dark_scoria.json
|
||||
d084f03d068d0b8c3b7c4d00014c168f61836770 assets/create/models/item/mossy_diorite.json
|
||||
|
@ -1568,6 +1573,7 @@ d98a1d479dff88d7a6f084f2c9de8fbbf80961ef assets/create/models/item/polished_weat
|
|||
a598b2f5eb34b061e81efb8a55267a02f8e08a61 assets/create/models/item/purple_seat.json
|
||||
e5138f9e37ca4d24cda2eb7b24a021eb7c8ae21c assets/create/models/item/purple_valve_handle.json
|
||||
efbda15b53084acdac2d36b8e0a764a9ab34d723 assets/create/models/item/radial_chassis.json
|
||||
6a6cc0730a60efdbd65dc04f9d9d0fe345a15c5a assets/create/models/item/radiant_beacon.json
|
||||
fc05c4492da3d17add7e410323a47456c0d21e0e assets/create/models/item/red_sand_paper.json
|
||||
3e251514aa698076b73fdbfef720b78b21d3bd93 assets/create/models/item/red_seat.json
|
||||
b959a1b35105c2c21933418bd29ce12a090716f8 assets/create/models/item/red_valve_handle.json
|
||||
|
@ -1649,7 +1655,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear
|
|||
a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json
|
||||
b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json
|
||||
71739e613693c476e481dfcf38628a4f52f0f570 assets/create/sounds.json
|
||||
5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json
|
||||
0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json
|
||||
187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json
|
||||
0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json
|
||||
83c046bd200623933545c9e4326f782fb02c87fa data/create/advancements/arm_blaze_burner.json
|
||||
|
@ -2378,6 +2384,7 @@ d6b94fd499cb4fb0ae587b0e9e7088832f67fe01 data/create/advancements/windmill.json
|
|||
191b117d0a25940248ed54d419ea0bb0afb482d0 data/create/loot_tables/blocks/adjustable_crate.json
|
||||
417da41ebd0520ae22ddc3541eb490daf2af95dd data/create/loot_tables/blocks/adjustable_pulse_repeater.json
|
||||
d0ba402852cea164f6d279a9b37cc38ac3958574 data/create/loot_tables/blocks/adjustable_repeater.json
|
||||
01b6060e1426c53bd3101d8f5e99ed27dfa01a45 data/create/loot_tables/blocks/aligner.json
|
||||
0d139e302f4a11438b0acd664c0df15b41040f69 data/create/loot_tables/blocks/analog_lever.json
|
||||
d3202a337c15c8b8ec41fa5879bb94327bb75057 data/create/loot_tables/blocks/andesite_belt_funnel.json
|
||||
1d04146c468ce4bf898b596c171b3ba3146d7d66 data/create/loot_tables/blocks/andesite_bricks.json
|
||||
|
@ -2609,6 +2616,7 @@ e94a78187bcf7f235244b2c656732ba9a5821dd0 data/create/loot_tables/blocks/mechanic
|
|||
b13066b9e627db6954a30b115908602f1298576b data/create/loot_tables/blocks/metal_bracket.json
|
||||
efbd4689e7d6740b80357203d1e02196f0752efa data/create/loot_tables/blocks/millstone.json
|
||||
205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/minecart_anchor.json
|
||||
cc3f427bf7e0cac6d73c43fa75e712975522c233 data/create/loot_tables/blocks/mirror.json
|
||||
53215ac772bee2f88052266b82213aaf668660e9 data/create/loot_tables/blocks/mossy_andesite.json
|
||||
1bf4a13a44e5cc03d730b2aa537e60426062786e data/create/loot_tables/blocks/mossy_dark_scoria.json
|
||||
956e6cc0c6314c9c01610b643785eed48d2d9317 data/create/loot_tables/blocks/mossy_diorite.json
|
||||
|
@ -2712,6 +2720,7 @@ e8fb62c91226ac107dee45c5ebc54c8dd0aee224 data/create/loot_tables/blocks/pulse_re
|
|||
d7f6caa568e6508177a644fb78dc18ce26c9b2c0 data/create/loot_tables/blocks/purple_seat.json
|
||||
773e4dc856044dabfe9d2323cbda0460dfb626ee data/create/loot_tables/blocks/purple_valve_handle.json
|
||||
768420dab8785909891e52c4d77a182d99ba11d3 data/create/loot_tables/blocks/radial_chassis.json
|
||||
70627785de43c6002b14ce40d85e7bda70aa2721 data/create/loot_tables/blocks/radiant_beacon.json
|
||||
28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/red_sail.json
|
||||
71b0fa3b174efe94a2a735ab2426c376c0ef674a data/create/loot_tables/blocks/red_seat.json
|
||||
59ee0fd35978068fbce0882e0b207db7eeb202c0 data/create/loot_tables/blocks/red_valve_handle.json
|
||||
|
@ -3493,6 +3502,7 @@ eae06580a0a5f486cde35426716d50fcb3ba5bb3 data/create/recipes/polished_weathered_
|
|||
0fa8386648398724f6fd373178b706c6b11ddefc data/create/recipes/pressing/gold_ingot.json
|
||||
a104ef6eb8872a40ea7b2ef67ae54cec943162f0 data/create/recipes/pressing/iron_ingot.json
|
||||
7f9e72ec02a9926656744a95066f8aa304514565 data/create/recipes/pressing/lapis_block.json
|
||||
aa037e34fd64ce86fca4086601b5a4aee17da87b data/create/recipes/pressing/lily_pad.json
|
||||
654e274b07af172c22838d47e0974367c20101d4 data/create/recipes/pressing/path.json
|
||||
bd57ccc8eb4357b4a5af021db7b806b514cd2558 data/create/recipes/pressing/sugar_cane.json
|
||||
141173778757d87e7f2e9466bdab6ff1263c8e98 data/create/recipes/sandpaper_polishing/rose_quartz.json
|
||||
|
@ -3646,7 +3656,7 @@ eedf31af7134d03656c5fa57229982f9c5bed07c data/create/tags/blocks/brittle.json
|
|||
330bfb3850ba3964b10b1bccbc3cbb9b012cae54 data/create/tags/blocks/fan_heaters.json
|
||||
3bc64e3a1e7980237435b1770a9ba2102d57fcd4 data/create/tags/blocks/fan_transparent.json
|
||||
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/non_movable.json
|
||||
c81ea194e808985847159b201140d4aa4cbcca65 data/create/tags/blocks/safe_nbt.json
|
||||
74526e79d2b6ec06678559e4f79ed9a7fe38aed5 data/create/tags/blocks/safe_nbt.json
|
||||
c9ac7e3e5ec18554e7184168d65e9b8e44ef5610 data/create/tags/blocks/sails.json
|
||||
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json
|
||||
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"variants": {
|
||||
"facing=down": {
|
||||
"model": "create:block/aligner",
|
||||
"x": 180
|
||||
},
|
||||
"facing=up": {
|
||||
"model": "create:block/aligner"
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "create:block/aligner",
|
||||
"x": 90
|
||||
},
|
||||
"facing=south": {
|
||||
"model": "create:block/aligner",
|
||||
"x": 90,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "create:block/aligner",
|
||||
"x": 90,
|
||||
"y": 270
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "create:block/aligner",
|
||||
"x": 90,
|
||||
"y": 90
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"variants": {
|
||||
"axis=x": {
|
||||
"model": "create:block/mirror/block",
|
||||
"x": 90,
|
||||
"y": 90
|
||||
},
|
||||
"axis=y": {
|
||||
"model": "create:block/mirror/block"
|
||||
},
|
||||
"axis=z": {
|
||||
"model": "create:block/mirror/block",
|
||||
"x": 90,
|
||||
"y": 180
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"variants": {
|
||||
"facing=down": {
|
||||
"model": "create:block/radiant_beacon",
|
||||
"x": 180
|
||||
},
|
||||
"facing=up": {
|
||||
"model": "create:block/radiant_beacon"
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "create:block/radiant_beacon",
|
||||
"x": 90
|
||||
},
|
||||
"facing=south": {
|
||||
"model": "create:block/radiant_beacon",
|
||||
"x": 90,
|
||||
"y": 180
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "create:block/radiant_beacon",
|
||||
"x": 90,
|
||||
"y": 270
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "create:block/radiant_beacon",
|
||||
"x": 90,
|
||||
"y": 90
|
||||
}
|
||||
}
|
||||
}
|
|
@ -5,6 +5,7 @@
|
|||
"block.create.adjustable_crate": "\u01DD\u0287\u0250\u0279\u0186 \u01DD\u05DFq\u0250\u0287sn\u0638p\u2C6F",
|
||||
"block.create.adjustable_pulse_repeater": "\u0279\u01DD\u0287\u0250\u01DDd\u01DD\u1D1A \u01DDs\u05DFn\u0500 \u01DD\u05DFq\u0250\u0287sn\u0638p\u2C6F",
|
||||
"block.create.adjustable_repeater": "\u0279\u01DD\u0287\u0250\u01DDd\u01DD\u1D1A \u01DD\u05DFq\u0250\u0287sn\u0638p\u2C6F",
|
||||
"block.create.aligner": "\u0279\u01DDub\u0131\u05DF\u2C6F",
|
||||
"block.create.analog_lever": "\u0279\u01DD\u028C\u01DD\uA780 bo\u05DF\u0250u\u2C6F",
|
||||
"block.create.andesite_belt_funnel": "\u05DF\u01DDuun\u2132 \u0287\u05DF\u01DD\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F",
|
||||
"block.create.andesite_bricks": "s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F",
|
||||
|
@ -238,6 +239,7 @@
|
|||
"block.create.metal_bracket": "\u0287\u01DD\u029E\u0254\u0250\u0279\u15FA \u05DF\u0250\u0287\u01DDW",
|
||||
"block.create.millstone": "\u01DDuo\u0287s\u05DF\u05DF\u0131W",
|
||||
"block.create.minecart_anchor": "\u0279o\u0265\u0254u\u2C6F \u0287\u0279\u0250\u0254\u01DDu\u0131W",
|
||||
"block.create.mirror": "\u0279o\u0279\u0279\u0131W",
|
||||
"block.create.mossy_andesite": "\u01DD\u0287\u0131s\u01DDpu\u2C6F \u028EssoW",
|
||||
"block.create.mossy_dark_scoria": "\u0250\u0131\u0279o\u0254S \u029E\u0279\u0250\u15E1 \u028EssoW",
|
||||
"block.create.mossy_diorite": "\u01DD\u0287\u0131\u0279o\u0131\u15E1 \u028EssoW",
|
||||
|
@ -341,6 +343,7 @@
|
|||
"block.create.purple_seat": "\u0287\u0250\u01DDS \u01DD\u05DFd\u0279n\u0500",
|
||||
"block.create.purple_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u05DFd\u0279n\u0500",
|
||||
"block.create.radial_chassis": "s\u0131ss\u0250\u0265\u0186 \u05DF\u0250\u0131p\u0250\u1D1A",
|
||||
"block.create.radiant_beacon": "uo\u0254\u0250\u01DD\u15FA \u0287u\u0250\u0131p\u0250\u1D1A",
|
||||
"block.create.red_sail": "\u05DF\u0131\u0250S p\u01DD\u1D1A",
|
||||
"block.create.red_seat": "\u0287\u0250\u01DDS p\u01DD\u1D1A",
|
||||
"block.create.red_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B p\u01DD\u1D1A",
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
"block.create.adjustable_crate": "Adjustable Crate",
|
||||
"block.create.adjustable_pulse_repeater": "Adjustable Pulse Repeater",
|
||||
"block.create.adjustable_repeater": "Adjustable Repeater",
|
||||
"block.create.aligner": "Aligner",
|
||||
"block.create.analog_lever": "Analog Lever",
|
||||
"block.create.andesite_belt_funnel": "Andesite Belt Funnel",
|
||||
"block.create.andesite_bricks": "Andesite Bricks",
|
||||
|
@ -241,6 +242,7 @@
|
|||
"block.create.metal_bracket": "Metal Bracket",
|
||||
"block.create.millstone": "Millstone",
|
||||
"block.create.minecart_anchor": "Minecart Anchor",
|
||||
"block.create.mirror": "Mirror",
|
||||
"block.create.mossy_andesite": "Mossy Andesite",
|
||||
"block.create.mossy_dark_scoria": "Mossy Dark Scoria",
|
||||
"block.create.mossy_diorite": "Mossy Diorite",
|
||||
|
@ -344,6 +346,7 @@
|
|||
"block.create.purple_seat": "Purple Seat",
|
||||
"block.create.purple_valve_handle": "Purple Valve Handle",
|
||||
"block.create.radial_chassis": "Radial Chassis",
|
||||
"block.create.radiant_beacon": "Radiant Beacon",
|
||||
"block.create.red_sail": "Red Sail",
|
||||
"block.create.red_seat": "Red Seat",
|
||||
"block.create.red_valve_handle": "Red Valve Handle",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 921",
|
||||
"_": "Missing Localizations: 924",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "Verstellbare Kiste",
|
||||
"block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker",
|
||||
"block.create.adjustable_repeater": "Verstellbarer Verstärker",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "Analoger Schalter",
|
||||
"block.create.andesite_belt_funnel": "Riementrichter aus Andesit",
|
||||
"block.create.andesite_bricks": "Andesitziegel",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "Metallhalterung",
|
||||
"block.create.millstone": "Mahlstein",
|
||||
"block.create.minecart_anchor": "Lorenanker",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "Moosiger Andesit",
|
||||
"block.create.mossy_dark_scoria": "Moosige Dunkle Schlacke",
|
||||
"block.create.mossy_diorite": "Moosiger Diorit",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "Lila Sitz",
|
||||
"block.create.purple_valve_handle": "Lila Ventilgriff",
|
||||
"block.create.radial_chassis": "Drehgerüst",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "Rote Segel",
|
||||
"block.create.red_seat": "Roter Sitz",
|
||||
"block.create.red_valve_handle": "Roter Ventilgriff",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 614",
|
||||
"_": "Missing Localizations: 617",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "Caja ajustable",
|
||||
"block.create.adjustable_pulse_repeater": "Repetidor de pulso ajustable",
|
||||
"block.create.adjustable_repeater": "Repetidor ajustable",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "Palanca analógica",
|
||||
"block.create.andesite_belt_funnel": "Embudo de cinta de andesita",
|
||||
"block.create.andesite_bricks": "Ladrillos de andesita",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "Soporte de metal para ejes",
|
||||
"block.create.millstone": "Piedra de molino",
|
||||
"block.create.minecart_anchor": "Ancla de vagonetas",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "Andesita musgosa",
|
||||
"block.create.mossy_dark_scoria": "Escoria oscura musgosa",
|
||||
"block.create.mossy_diorite": "Diorita musgosa",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "Asiento morado",
|
||||
"block.create.purple_valve_handle": "Asa de válvula morada",
|
||||
"block.create.radial_chassis": "Chasis radial",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "Vela roja",
|
||||
"block.create.red_seat": "Asiento rojo",
|
||||
"block.create.red_valve_handle": "Asa de válvula roja",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1272",
|
||||
"_": "Missing Localizations: 1275",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "Caja Ajustable",
|
||||
"block.create.adjustable_pulse_repeater": "Repetidor de Pulso Ajustable",
|
||||
"block.create.adjustable_repeater": "Repetidor Ajustable",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "Palanca Analogica",
|
||||
"block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel",
|
||||
"block.create.andesite_bricks": "Ladrillos de Andesita",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "Soporte de Metal",
|
||||
"block.create.millstone": "Molino",
|
||||
"block.create.minecart_anchor": "Ancla de Vagonetas",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "Andesita Musgosa",
|
||||
"block.create.mossy_dark_scoria": "Escoria Oscura Musgosa",
|
||||
"block.create.mossy_diorite": "Diorita Musgosa",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "Asiento Morado",
|
||||
"block.create.purple_valve_handle": "Manija de Válvula Morada",
|
||||
"block.create.radial_chassis": "Chasis Radial",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "Vela Roja",
|
||||
"block.create.red_seat": "Asiento Rojo",
|
||||
"block.create.red_valve_handle": "Manija de Válvula Roja",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1171",
|
||||
"_": "Missing Localizations: 1174",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "Caisse ajustable",
|
||||
"block.create.adjustable_pulse_repeater": "Répéteur d'impulsions réglable",
|
||||
"block.create.adjustable_repeater": "Répéteur réglable",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "Levier analogique",
|
||||
"block.create.andesite_belt_funnel": "Entonnoir en andésite pour tapis roulant",
|
||||
"block.create.andesite_bricks": "Briques d'andésite",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "UNLOCALIZED: Metal Bracket",
|
||||
"block.create.millstone": "UNLOCALIZED: Millstone",
|
||||
"block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite",
|
||||
"block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria",
|
||||
"block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "UNLOCALIZED: Purple Seat",
|
||||
"block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle",
|
||||
"block.create.radial_chassis": "Châssis radial",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "UNLOCALIZED: Red Sail",
|
||||
"block.create.red_seat": "UNLOCALIZED: Red Seat",
|
||||
"block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 631",
|
||||
"_": "Missing Localizations: 634",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "Baule regolabile",
|
||||
"block.create.adjustable_pulse_repeater": "Ripetitore di impulsi regolabile",
|
||||
"block.create.adjustable_repeater": "Ripetitore regolabile",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "Leva analogica",
|
||||
"block.create.andesite_belt_funnel": "Imbuto per nastro di andesite",
|
||||
"block.create.andesite_bricks": "Mattoni di andesite",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "Supporto di metallo",
|
||||
"block.create.millstone": "Macina",
|
||||
"block.create.minecart_anchor": "Ancora per carrello da miniera",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "Andesite muschiosa",
|
||||
"block.create.mossy_dark_scoria": "Scoria scura muschiosa",
|
||||
"block.create.mossy_diorite": "Diorite muschiosa",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "Sedile viola",
|
||||
"block.create.purple_valve_handle": "Maniglia per valvola viola",
|
||||
"block.create.radial_chassis": "Telaio radiale",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "Vela rossa",
|
||||
"block.create.red_seat": "Sedile rosso",
|
||||
"block.create.red_valve_handle": "Maniglia per valvola rossa",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 613",
|
||||
"_": "Missing Localizations: 616",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "可変クレート",
|
||||
"block.create.adjustable_pulse_repeater": "可変パルスリピーター",
|
||||
"block.create.adjustable_repeater": "可変リピーター",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "アナログレバー",
|
||||
"block.create.andesite_belt_funnel": "安山岩のベルトファンネル",
|
||||
"block.create.andesite_bricks": "安山岩レンガ",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "金属ブラケット",
|
||||
"block.create.millstone": "石臼",
|
||||
"block.create.minecart_anchor": "トロッコアンカー",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "苔むした安山岩",
|
||||
"block.create.mossy_dark_scoria": "苔むしたダークスコリア",
|
||||
"block.create.mossy_diorite": "苔むした閃緑岩",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "紫色のシート",
|
||||
"block.create.purple_valve_handle": "紫色のバルブハンドル",
|
||||
"block.create.radial_chassis": "ラジアルシャーシ",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "赤色の帆",
|
||||
"block.create.red_seat": "赤色のシート",
|
||||
"block.create.red_valve_handle": "赤色のバルブハンドル",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 684",
|
||||
"_": "Missing Localizations: 687",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "가변 창고",
|
||||
"block.create.adjustable_pulse_repeater": "가변 펄스 리피터",
|
||||
"block.create.adjustable_repeater": "가변 리피터",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "아날로그 레버",
|
||||
"block.create.andesite_belt_funnel": "안산암 깔때기",
|
||||
"block.create.andesite_bricks": "안산암 벽돌",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "금속 지지대",
|
||||
"block.create.millstone": "맷돌",
|
||||
"block.create.minecart_anchor": "광산 수레 정박기",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "이끼 낀 안산암",
|
||||
"block.create.mossy_dark_scoria": "이끼 낀 짙은 스코리아",
|
||||
"block.create.mossy_diorite": "이끼 낀 섬록암",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "보라색 좌석",
|
||||
"block.create.purple_valve_handle": "보라색 밸브 손잡이",
|
||||
"block.create.radial_chassis": "원형 섀시",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "빨간색 날개",
|
||||
"block.create.red_seat": "빨간색 좌석",
|
||||
"block.create.red_valve_handle": "빨간색 밸브 손잡이",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1561",
|
||||
"_": "Missing Localizations: 1564",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "FlexKrat",
|
||||
"block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater",
|
||||
"block.create.adjustable_repeater": "FlexSterker",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "UNLOCALIZED: Analog Lever",
|
||||
"block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel",
|
||||
"block.create.andesite_bricks": "Andesietstenen",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "UNLOCALIZED: Metal Bracket",
|
||||
"block.create.millstone": "UNLOCALIZED: Millstone",
|
||||
"block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite",
|
||||
"block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria",
|
||||
"block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "UNLOCALIZED: Purple Seat",
|
||||
"block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle",
|
||||
"block.create.radial_chassis": "Rotation Frame",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "UNLOCALIZED: Red Sail",
|
||||
"block.create.red_seat": "UNLOCALIZED: Red Seat",
|
||||
"block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1615",
|
||||
"_": "Missing Localizations: 1618",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "adjustable_crate",
|
||||
"block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater",
|
||||
"block.create.adjustable_repeater": "Repetidor Flex",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "UNLOCALIZED: Analog Lever",
|
||||
"block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel",
|
||||
"block.create.andesite_bricks": "Tijolos de Andesite",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "UNLOCALIZED: Metal Bracket",
|
||||
"block.create.millstone": "UNLOCALIZED: Millstone",
|
||||
"block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite",
|
||||
"block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria",
|
||||
"block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "UNLOCALIZED: Purple Seat",
|
||||
"block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle",
|
||||
"block.create.radial_chassis": "Chassis de Rotação",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "UNLOCALIZED: Red Sail",
|
||||
"block.create.red_seat": "UNLOCALIZED: Red Seat",
|
||||
"block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 528",
|
||||
"_": "Missing Localizations: 531",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "Регулируемый ящик",
|
||||
"block.create.adjustable_pulse_repeater": "Регулируемый импульсный повторитель",
|
||||
"block.create.adjustable_repeater": "Регулируемый повторитель",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "Аналоговый рычаг",
|
||||
"block.create.andesite_belt_funnel": "Андезитовая конвейерная воронка",
|
||||
"block.create.andesite_bricks": "Андезитовый кирпич",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "Металлическая скоба",
|
||||
"block.create.millstone": "Жернов",
|
||||
"block.create.minecart_anchor": "Вагонеточный якорь",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "Замшелый андезит",
|
||||
"block.create.mossy_dark_scoria": "Замшелый тёмный пепел",
|
||||
"block.create.mossy_diorite": "Замшелый диорит",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "Фиолетовое сиденье",
|
||||
"block.create.purple_valve_handle": "Фиолетовый ручной вентиль",
|
||||
"block.create.radial_chassis": "Радиальное шасси",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "Красный парус",
|
||||
"block.create.red_seat": "Красное сиденье",
|
||||
"block.create.red_valve_handle": "Красный ручной вентиль",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 628",
|
||||
"_": "Missing Localizations: 631",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "可调节板条箱",
|
||||
"block.create.adjustable_pulse_repeater": "可调节脉冲中继器",
|
||||
"block.create.adjustable_repeater": "可调节中继器",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "可调节拉杆",
|
||||
"block.create.andesite_belt_funnel": "安山岩传送带漏斗",
|
||||
"block.create.andesite_bricks": "安山岩砖",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "金属支架",
|
||||
"block.create.millstone": "石磨",
|
||||
"block.create.minecart_anchor": "矿车锚",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "生苔安山岩",
|
||||
"block.create.mossy_dark_scoria": "生苔深色熔渣",
|
||||
"block.create.mossy_diorite": "生苔闪长岩",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "紫色坐垫",
|
||||
"block.create.purple_valve_handle": "紫色阀门手轮",
|
||||
"block.create.radial_chassis": "旋转底盘",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "红色风帆",
|
||||
"block.create.red_seat": "红色坐垫",
|
||||
"block.create.red_valve_handle": "红色阀门手轮",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 633",
|
||||
"_": "Missing Localizations: 636",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
|||
"block.create.adjustable_crate": "可調式板條箱",
|
||||
"block.create.adjustable_pulse_repeater": "可調式脈衝中繼器",
|
||||
"block.create.adjustable_repeater": "可調式中繼器",
|
||||
"block.create.aligner": "UNLOCALIZED: Aligner",
|
||||
"block.create.analog_lever": "可調式拉桿",
|
||||
"block.create.andesite_belt_funnel": "安山岩輸送帶漏斗",
|
||||
"block.create.andesite_bricks": "安山岩磚",
|
||||
|
@ -242,6 +243,7 @@
|
|||
"block.create.metal_bracket": "金屬支架",
|
||||
"block.create.millstone": "石磨",
|
||||
"block.create.minecart_anchor": "礦車錨",
|
||||
"block.create.mirror": "UNLOCALIZED: Mirror",
|
||||
"block.create.mossy_andesite": "青苔安山岩",
|
||||
"block.create.mossy_dark_scoria": "青苔黑火成岩",
|
||||
"block.create.mossy_diorite": "青苔閃長岩",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"block.create.purple_seat": "紫色坐墊",
|
||||
"block.create.purple_valve_handle": "紫色閥門開關",
|
||||
"block.create.radial_chassis": "旋轉底盤",
|
||||
"block.create.radiant_beacon": "UNLOCALIZED: Radiant Beacon",
|
||||
"block.create.red_sail": "紅色風帆",
|
||||
"block.create.red_seat": "紅色坐墊",
|
||||
"block.create.red_valve_handle": "紅色閥門開關",
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "create:block/aligner"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "create:block/mirror/item"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "create:block/radiant_beacon"
|
||||
}
|
|
@ -28,8 +28,8 @@
|
|||
"trigger": "create:bracket_apply",
|
||||
"conditions": {
|
||||
"accepted_entries": [
|
||||
"create:large_cogwheel",
|
||||
"create:cogwheel"
|
||||
"create:cogwheel",
|
||||
"create:large_cogwheel"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"type": "minecraft:block",
|
||||
"pools": [
|
||||
{
|
||||
"rolls": 1,
|
||||
"entries": [
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "create:aligner"
|
||||
}
|
||||
],
|
||||
"conditions": [
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"type": "minecraft:block",
|
||||
"pools": [
|
||||
{
|
||||
"rolls": 1,
|
||||
"entries": [
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "create:mirror"
|
||||
}
|
||||
],
|
||||
"conditions": [
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"type": "minecraft:block",
|
||||
"pools": [
|
||||
{
|
||||
"rolls": 1,
|
||||
"entries": [
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "create:radiant_beacon"
|
||||
}
|
||||
],
|
||||
"conditions": [
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"type": "create:pressing",
|
||||
"ingredients": [
|
||||
{
|
||||
"item": "minecraft:ghast_tear"
|
||||
}
|
||||
],
|
||||
"results": [
|
||||
{
|
||||
"item": "minecraft:lily_pad"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -15,6 +15,9 @@
|
|||
"create:radial_chassis",
|
||||
"create:sequenced_gearshift",
|
||||
"create:rotation_speed_controller",
|
||||
"create:mirror",
|
||||
"create:aligner",
|
||||
"create:radiant_beacon",
|
||||
"create:andesite_funnel",
|
||||
"create:andesite_belt_funnel",
|
||||
"create:brass_funnel",
|
||||
|
|
|
@ -83,6 +83,8 @@ public class AllBlockPartials {
|
|||
HOSE_MAGNET = get("hose_pulley/pulley_magnet"), HOSE_HALF = get("hose_pulley/rope_half"),
|
||||
HOSE_HALF_MAGNET = get("hose_pulley/rope_half_magnet"),
|
||||
|
||||
MIRROR_PLANE = get("mirror/mirror_plane"),
|
||||
|
||||
MILLSTONE_COG = get("millstone/inner"),
|
||||
|
||||
SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"),
|
||||
|
|
|
@ -154,6 +154,9 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock
|
|||
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock;
|
||||
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkGenerator;
|
||||
import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchBlock;
|
||||
import com.simibubi.create.content.optics.aligner.AlignerBlock;
|
||||
import com.simibubi.create.content.optics.mirror.MirrorBlock;
|
||||
import com.simibubi.create.content.optics.radiant_beacon.RadiantBeaconBlock;
|
||||
import com.simibubi.create.content.schematics.block.SchematicTableBlock;
|
||||
import com.simibubi.create.content.schematics.block.SchematicannonBlock;
|
||||
import com.simibubi.create.foundation.block.ItemUseOverrides;
|
||||
|
@ -488,7 +491,7 @@ public class AllBlocks {
|
|||
public static final BlockEntry<EjectorBlock> WEIGHTED_EJECTOR =
|
||||
REGISTRATE.block("weighted_ejector", EjectorBlock::new)
|
||||
.initialProperties(SharedProperties::stone)
|
||||
.properties(Block.Properties::nonOpaque)
|
||||
.properties(AbstractBlock.Properties::nonOpaque)
|
||||
.blockstate((c, p) -> p.horizontalBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p), 180))
|
||||
.transform(StressConfigDefaults.setImpact(2.0))
|
||||
.item(EjectorItem::new)
|
||||
|
@ -553,7 +556,7 @@ public class AllBlocks {
|
|||
public static final BlockEntry<EncasedPipeBlock> ENCASED_FLUID_PIPE =
|
||||
REGISTRATE.block("encased_fluid_pipe", EncasedPipeBlock::new)
|
||||
.initialProperties(SharedProperties::softMetal)
|
||||
.properties(Block.Properties::nonOpaque)
|
||||
.properties(AbstractBlock.Properties::nonOpaque)
|
||||
.blockstate(BlockStateGen.encasedPipe())
|
||||
.onRegister(CreateRegistrate.connectedTextures(new EncasedCTBehaviour(AllSpriteShifts.COPPER_CASING)))
|
||||
.onRegister(CreateRegistrate.casingConnectivity((block, cc) -> cc.make(block, AllSpriteShifts.COPPER_CASING,
|
||||
|
@ -639,7 +642,7 @@ public class AllBlocks {
|
|||
REGISTRATE.block("creative_fluid_tank", FluidTankBlock::creative)
|
||||
.initialProperties(SharedProperties::softMetal)
|
||||
.tag(AllBlockTags.SAFE_NBT.tag)
|
||||
.properties(Block.Properties::nonOpaque)
|
||||
.properties(AbstractBlock.Properties::nonOpaque)
|
||||
.blockstate(new FluidTankGenerator("creative_")::generate)
|
||||
.onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::creative))
|
||||
.addLayer(() -> RenderType::getCutoutMipped)
|
||||
|
@ -1099,6 +1102,44 @@ public class AllBlocks {
|
|||
.transform(customItemModel())
|
||||
.register();
|
||||
|
||||
// Optics
|
||||
|
||||
static {
|
||||
REGISTRATE.startSection(AllSections.OPTICS);
|
||||
}
|
||||
|
||||
public static final BlockEntry<MirrorBlock> MIRROR =
|
||||
REGISTRATE.block("mirror", MirrorBlock::new)
|
||||
.initialProperties(SharedProperties::softMetal)
|
||||
.properties(AbstractBlock.Properties::nonOpaque)
|
||||
.addLayer(() -> RenderType::getCutoutMipped)
|
||||
.tag(AllBlockTags.SAFE_NBT.tag)
|
||||
.blockstate(BlockStateGen.axisBlockProvider(true))
|
||||
.transform(StressConfigDefaults.setImpact(4.0))
|
||||
.item()
|
||||
.transform(customItemModel())
|
||||
.register();
|
||||
|
||||
public static final BlockEntry<AlignerBlock> ALIGNER =
|
||||
REGISTRATE.block("aligner", AlignerBlock::new)
|
||||
.initialProperties(SharedProperties::softMetal)
|
||||
.properties(AbstractBlock.Properties::nonOpaque)
|
||||
.addLayer(() -> RenderType::getTranslucent)
|
||||
.tag(AllBlockTags.SAFE_NBT.tag)
|
||||
.blockstate(BlockStateGen.directionalBlockProvider(false))
|
||||
.simpleItem()
|
||||
.register();
|
||||
|
||||
public static final BlockEntry<RadiantBeaconBlock> RADIANT_BEACON =
|
||||
REGISTRATE.block("radiant_beacon", RadiantBeaconBlock::new)
|
||||
.initialProperties(SharedProperties::softMetal)
|
||||
.properties(AbstractBlock.Properties::nonOpaque)
|
||||
.addLayer(() -> RenderType::getCutoutMipped)
|
||||
.tag(AllBlockTags.SAFE_NBT.tag)
|
||||
.blockstate(BlockStateGen.directionalBlockProvider(false))
|
||||
.simpleItem()
|
||||
.register();
|
||||
|
||||
// Logistics
|
||||
|
||||
static {
|
||||
|
@ -1324,7 +1365,7 @@ public class AllBlocks {
|
|||
.transform(oxidizedBlockstate())
|
||||
.register();
|
||||
|
||||
public static final BlockEntry<Block> ZINC_BLOCK = REGISTRATE.block("zinc_block", p -> new Block(p))
|
||||
public static final BlockEntry<Block> ZINC_BLOCK = REGISTRATE.block("zinc_block", Block::new)
|
||||
.initialProperties(() -> Blocks.IRON_BLOCK)
|
||||
.tag(Tags.Blocks.STORAGE_BLOCKS)
|
||||
.tag(BlockTags.BEACON_BASE_BLOCKS)
|
||||
|
@ -1334,7 +1375,7 @@ public class AllBlocks {
|
|||
.lang("Block of Zinc")
|
||||
.register();
|
||||
|
||||
public static final BlockEntry<Block> BRASS_BLOCK = REGISTRATE.block("brass_block", p -> new Block(p))
|
||||
public static final BlockEntry<Block> BRASS_BLOCK = REGISTRATE.block("brass_block", Block::new)
|
||||
.initialProperties(() -> Blocks.IRON_BLOCK)
|
||||
.blockstate((c, p) -> p.simpleBlock(c.get(), p.models()
|
||||
.cubeAll(c.getName(), p.modLoc("block/brass_storage_block"))))
|
||||
|
|
|
@ -149,6 +149,12 @@ import com.simibubi.create.content.logistics.block.redstone.NixieTubeRenderer;
|
|||
import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity;
|
||||
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity;
|
||||
import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity;
|
||||
import com.simibubi.create.content.optics.LightHandlerRenderer;
|
||||
import com.simibubi.create.content.optics.aligner.AlignerTileEntity;
|
||||
import com.simibubi.create.content.optics.mirror.MirrorInstance;
|
||||
import com.simibubi.create.content.optics.mirror.MirrorRenderer;
|
||||
import com.simibubi.create.content.optics.mirror.MirrorTileEntity;
|
||||
import com.simibubi.create.content.optics.radiant_beacon.RadiantBeaconTileEntity;
|
||||
import com.simibubi.create.content.schematics.block.SchematicTableTileEntity;
|
||||
import com.simibubi.create.content.schematics.block.SchematicannonInstance;
|
||||
import com.simibubi.create.content.schematics.block.SchematicannonRenderer;
|
||||
|
@ -582,6 +588,26 @@ public class AllTileEntities {
|
|||
// .renderer(() -> renderer)
|
||||
.register();
|
||||
|
||||
// Optics
|
||||
public static final TileEntityEntry<MirrorTileEntity> MIRROR = Create.registrate()
|
||||
.tileEntity("mirror", MirrorTileEntity::new)
|
||||
.instance(() -> MirrorInstance::new)
|
||||
.validBlocks(AllBlocks.MIRROR)
|
||||
.renderer(() -> MirrorRenderer::new)
|
||||
.register();
|
||||
|
||||
public static final TileEntityEntry<AlignerTileEntity> ALIGNER = Create.registrate()
|
||||
.tileEntity("aligner", AlignerTileEntity::new)
|
||||
.validBlocks(AllBlocks.ALIGNER)
|
||||
.renderer(() -> LightHandlerRenderer::new)
|
||||
.register();
|
||||
|
||||
public static final TileEntityEntry<RadiantBeaconTileEntity> RADIANT_BEACON = Create.registrate()
|
||||
.tileEntity("radiant_beacon", RadiantBeaconTileEntity::new)
|
||||
.validBlocks(AllBlocks.RADIANT_BEACON)
|
||||
.renderer(() -> LightHandlerRenderer::new)
|
||||
.register();
|
||||
|
||||
// Logistics
|
||||
public static final TileEntityEntry<RedstoneLinkTileEntity> REDSTONE_LINK = Create.registrate()
|
||||
.tileEntity("redstone_link", RedstoneLinkTileEntity::new)
|
||||
|
|
|
@ -50,12 +50,14 @@ import com.simibubi.create.foundation.config.ConfigBase.ConfigBool;
|
|||
|
||||
import mezz.jei.api.IModPlugin;
|
||||
import mezz.jei.api.JeiPlugin;
|
||||
import mezz.jei.api.recipe.IRecipeManager;
|
||||
import mezz.jei.api.registration.IGuiHandlerRegistration;
|
||||
import mezz.jei.api.registration.IRecipeCatalystRegistration;
|
||||
import mezz.jei.api.registration.IRecipeCategoryRegistration;
|
||||
import mezz.jei.api.registration.IRecipeRegistration;
|
||||
import mezz.jei.api.registration.ISubtypeRegistration;
|
||||
import mezz.jei.api.runtime.IIngredientManager;
|
||||
import mezz.jei.api.runtime.IJeiRuntime;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
|
@ -240,6 +242,17 @@ public class CreateJEI implements IModPlugin {
|
|||
registration.addGhostIngredientHandler(AbstractFilterScreen.class, new FilterGhostIngredientHandler());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRuntimeAvailable(IJeiRuntime jeiRuntime) {
|
||||
IRecipeManager manager = jeiRuntime.getRecipeManager();
|
||||
ResourceLocation rl = new ResourceLocation(Create.ID + ":pressing/lily_pad");
|
||||
manager.getRecipes(pressing)
|
||||
.stream()
|
||||
.filter(iRecipe -> iRecipe.getId().equals(rl))
|
||||
.findFirst()
|
||||
.ifPresent(r -> manager.hideRecipe(r, pressing.getUid()));
|
||||
}
|
||||
|
||||
private class CategoryBuilder<T extends IRecipe<?>> {
|
||||
CreateRecipeCategory<T> category;
|
||||
private Predicate<CRecipes> pred;
|
||||
|
|
|
@ -16,6 +16,9 @@ public enum AllSections {
|
|||
/** Item transport and other Utility */
|
||||
LOGISTICS(Palette.Yellow),
|
||||
|
||||
/** Beacon tech */
|
||||
OPTICS(Palette.White),
|
||||
|
||||
/** Tools for strucuture movement and replication */
|
||||
SCHEMATICS(Palette.Blue),
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ import java.util.Random;
|
|||
import com.simibubi.create.AllItems;
|
||||
import com.simibubi.create.foundation.config.AllConfigs;
|
||||
import com.simibubi.create.foundation.config.CRecipes;
|
||||
import com.simibubi.create.foundation.utility.BeaconHelper;
|
||||
import com.simibubi.create.foundation.utility.ColorHelper;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
|
@ -15,17 +16,12 @@ import net.minecraft.item.Item;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.particles.ParticleTypes;
|
||||
import net.minecraft.tileentity.BeaconTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.RayTraceContext;
|
||||
import net.minecraft.util.math.RayTraceContext.BlockMode;
|
||||
import net.minecraft.util.math.RayTraceContext.FluidMode;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.gen.Heightmap;
|
||||
|
||||
public class ChromaticCompoundItem extends Item {
|
||||
|
||||
|
@ -114,35 +110,7 @@ public class ChromaticCompoundItem extends Item {
|
|||
}
|
||||
|
||||
// Is inside beacon beam?
|
||||
boolean isOverBeacon = false;
|
||||
int entityX = MathHelper.floor(entity.getX());
|
||||
int entityZ = MathHelper.floor(entity.getZ());
|
||||
int localWorldHeight = world.getHeight(Heightmap.Type.WORLD_SURFACE, entityX, entityZ);
|
||||
|
||||
BlockPos.Mutable testPos =
|
||||
new BlockPos.Mutable(entityX, Math.min(MathHelper.floor(entity.getY()), localWorldHeight), entityZ);
|
||||
|
||||
while (testPos.getY() > 0) {
|
||||
testPos.move(Direction.DOWN);
|
||||
BlockState state = world.getBlockState(testPos);
|
||||
if (state.getOpacity(world, testPos) >= 15 && state.getBlock() != Blocks.BEDROCK)
|
||||
break;
|
||||
if (state.getBlock() == Blocks.BEACON) {
|
||||
TileEntity te = world.getTileEntity(testPos);
|
||||
|
||||
if (!(te instanceof BeaconTileEntity))
|
||||
break;
|
||||
|
||||
BeaconTileEntity bte = (BeaconTileEntity) te;
|
||||
|
||||
if (bte.getLevels() != 0 && !bte.beamSegments.isEmpty())
|
||||
isOverBeacon = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isOverBeacon) {
|
||||
if (BeaconHelper.isAboveActiveBeacon(entity.getPositionVec(), world)) {
|
||||
ItemStack newStack = AllItems.REFINED_RADIANCE.asStack();
|
||||
newStack.setCount(stack.getCount());
|
||||
data.putBoolean("JustCreated", true);
|
||||
|
|
159
src/main/java/com/simibubi/create/content/optics/Beam.java
Normal file
159
src/main/java/com/simibubi/create/content/optics/Beam.java
Normal file
|
@ -0,0 +1,159 @@
|
|||
package com.simibubi.create.content.optics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.simibubi.create.foundation.utility.Iterate;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||
import net.minecraft.item.DyeColor;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class Beam extends ArrayList<BeamSegment> {
|
||||
private final transient Set<ILightHandler> lightEventListeners;
|
||||
@Nullable
|
||||
private final Beam parent;
|
||||
private final long createdAt;
|
||||
@Nullable
|
||||
private final transient World world;
|
||||
private boolean removed = false;
|
||||
|
||||
public Beam(@Nullable Beam parent) {
|
||||
super();
|
||||
this.parent = parent;
|
||||
this.createdAt = 0;
|
||||
this.world = null;
|
||||
lightEventListeners = new HashSet<>();
|
||||
}
|
||||
|
||||
public Beam(@Nullable Beam parent, @Nullable World world) {
|
||||
super();
|
||||
this.parent = parent;
|
||||
this.world = world;
|
||||
this.createdAt = world == null ? -1 : this.world.getGameTime();
|
||||
lightEventListeners = new HashSet<>();
|
||||
}
|
||||
|
||||
public void onCreated() {
|
||||
lightEventListeners.stream()
|
||||
.flatMap(handler -> handler.constructSubBeams(this))
|
||||
.forEach(Beam::onCreated);
|
||||
}
|
||||
|
||||
public void render(MatrixStack ms, IRenderTypeBuffer buffer, float partialTicks) {
|
||||
forEach(beamSegment -> beamSegment.renderSegment(ms, buffer, partialTicks));
|
||||
}
|
||||
|
||||
public void addListener(@Nullable ILightHandler tile) {
|
||||
if (tile != null)
|
||||
lightEventListeners.add(tile);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Vector3d getDirection() {
|
||||
return isEmpty() ? null : get(0).getNormalized();
|
||||
}
|
||||
|
||||
public void onRemoved() {
|
||||
removed = true;
|
||||
lightEventListeners.stream()
|
||||
.filter(handler -> handler != this.getHandler())
|
||||
.forEach(ILightHandler::updateBeams);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public ILightHandler getHandler() {
|
||||
return size() == 0 ? null : get(0).getHandler();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
if (!super.equals(o)) return false;
|
||||
Beam beam = (Beam) o;
|
||||
return createdAt == beam.createdAt && removed == beam.removed && lightEventListeners.equals(beam.lightEventListeners);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(super.hashCode(), lightEventListeners, createdAt, removed);
|
||||
}
|
||||
|
||||
public boolean isRemoved() {
|
||||
removed = isRemovedSimple() || (parent != null && parent.isRemovedSimple());
|
||||
return removed;
|
||||
}
|
||||
|
||||
private boolean isRemovedSimple() {
|
||||
ILightHandler handler = getHandler();
|
||||
removed = removed || isEmpty() || handler == null || handler.getTile()
|
||||
.isRemoved();
|
||||
return removed;
|
||||
}
|
||||
|
||||
public float[] getColorAt(BlockPos testBlockPos) {
|
||||
float[] out = DyeColor.WHITE.getColorComponentValues();
|
||||
for (BeamSegment segment : this) {
|
||||
if (VecHelper.getCenterOf(testBlockPos)
|
||||
.subtract(segment.getStart())
|
||||
.dotProduct(segment.getNormalized()) > 0)
|
||||
out = segment.getColors();
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
public boolean isNew() {
|
||||
return world != null && world.getGameTime() == createdAt;
|
||||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
public Beam getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Direction getBlockEnterFace(BlockPos blockPos) {
|
||||
Vector3d beamDir = getDirection();
|
||||
if (beamDir == null)
|
||||
return null;
|
||||
Vector3d pos = VecHelper.getCenterOf(blockPos);
|
||||
|
||||
Direction minDir = null;
|
||||
double lambda = Double.MAX_VALUE;
|
||||
|
||||
for (Direction testDir : Iterate.directions) {
|
||||
Vector3d faceNormal = Vector3d.of(testDir.getDirectionVec());
|
||||
Vector3d posOnSide = faceNormal.scale(.5)
|
||||
.add(pos);
|
||||
double dotProd = faceNormal.dotProduct(beamDir);
|
||||
if (dotProd == 0)
|
||||
continue;
|
||||
|
||||
double newLambda = (faceNormal.dotProduct(posOnSide) - faceNormal.dotProduct(get(0)
|
||||
.getStart())) / dotProd;
|
||||
Vector3d offset = get(0).getStart()
|
||||
.add(beamDir.scale(newLambda))
|
||||
.subtract(posOnSide);
|
||||
if (newLambda < lambda && (Math.abs(offset.x) < .5 && Math.abs(offset.y) < .5 && Math.abs(offset.z) < .5)) {
|
||||
lambda = newLambda;
|
||||
minDir = testDir;
|
||||
}
|
||||
|
||||
}
|
||||
return minDir;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,160 @@
|
|||
package com.simibubi.create.content.optics;
|
||||
|
||||
import static com.simibubi.create.foundation.utility.VecHelper.UP;
|
||||
import static net.minecraft.client.renderer.tileentity.BeaconTileEntityRenderer.TEXTURE_BEACON_BEAM;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.mojang.blaze3d.vertex.IVertexBuilder;
|
||||
import com.simibubi.create.foundation.utility.MatrixStacker;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import net.minecraft.util.LazyValue;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.vector.Matrix3f;
|
||||
import net.minecraft.util.math.vector.Matrix4f;
|
||||
import net.minecraft.util.math.vector.Quaternion;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.util.math.vector.Vector3f;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class BeamSegment {
|
||||
public final float[] colors;
|
||||
private final Vector3d direction;
|
||||
private final Vector3d start;
|
||||
private final LazyValue<Vector3d> normalized;
|
||||
private final LazyValue<Float> totalSectionLength;
|
||||
private final ILightHandler handler;
|
||||
@Nullable
|
||||
private Quaternion beaconBeamModifier;
|
||||
private double length;
|
||||
|
||||
public BeamSegment(ILightHandler handler, @Nonnull float[] color, Vector3d start, Vector3d direction) {
|
||||
this.handler = handler;
|
||||
this.colors = color;
|
||||
this.direction = direction;
|
||||
this.start = start;
|
||||
this.length = 1;
|
||||
this.normalized = new LazyValue<>(direction::normalize);
|
||||
beaconBeamModifier = null;
|
||||
totalSectionLength = new LazyValue<>(() -> (float) getDirection().scale(getLength())
|
||||
.length());
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
private static void renderBeam(MatrixStack ms, IVertexBuilder builder, float[] colors, float alpha, float segmentLength, float p_228840_9_, float p_228840_10_, float p_228840_11_, float p_228840_12_, float p_228840_13_, float p_228840_14_, float p_228840_15_, float p_228840_18_, float p_228840_19_) {
|
||||
MatrixStack.Entry entry = ms.peek();
|
||||
Matrix4f model = entry.getModel();
|
||||
Matrix3f normal = entry.getNormal();
|
||||
putVertices(model, normal, builder, colors, alpha, segmentLength, 0F, p_228840_9_, p_228840_10_, p_228840_11_, p_228840_18_, p_228840_19_);
|
||||
putVertices(model, normal, builder, colors, alpha, segmentLength, p_228840_14_, p_228840_15_, p_228840_12_, p_228840_13_, p_228840_18_, p_228840_19_);
|
||||
putVertices(model, normal, builder, colors, alpha, segmentLength, p_228840_10_, p_228840_11_, p_228840_14_, p_228840_15_, p_228840_18_, p_228840_19_);
|
||||
putVertices(model, normal, builder, colors, alpha, segmentLength, p_228840_12_, p_228840_13_, 0F, p_228840_9_, p_228840_18_, p_228840_19_);
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
private static void putVertices(Matrix4f model, Matrix3f normal, IVertexBuilder builder, float[] colors, float alpha, float segmentLength, float p_228839_9_, float p_228839_10_, float p_228839_11_, float p_228839_12_, float p_228839_15_, float p_228839_16_) {
|
||||
putVertex(model, normal, builder, colors, alpha, segmentLength, p_228839_9_, p_228839_10_, 1F, p_228839_15_);
|
||||
putVertex(model, normal, builder, colors, alpha, 0F, p_228839_9_, p_228839_10_, 1F, p_228839_16_);
|
||||
putVertex(model, normal, builder, colors, alpha, 0F, p_228839_11_, p_228839_12_, 0F, p_228839_16_);
|
||||
putVertex(model, normal, builder, colors, alpha, segmentLength, p_228839_11_, p_228839_12_, 0F, p_228839_15_);
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
private static void putVertex(Matrix4f model, Matrix3f normal, IVertexBuilder builder, float[] colors, float alpha, float vertexY, float vertexX, float vertexZ, float textureX, float textureY) {
|
||||
builder.vertex(model, vertexX, vertexY, vertexZ)
|
||||
.color(colors[0], colors[1], colors[2], alpha)
|
||||
.texture(textureX, textureY)
|
||||
.overlay(OverlayTexture.DEFAULT_UV)
|
||||
.light(15728880)
|
||||
.normal(normal, 0.0F, 1.0F, 0.0F)
|
||||
.endVertex();
|
||||
}
|
||||
|
||||
public void incrementLength() {
|
||||
++this.length;
|
||||
}
|
||||
|
||||
public float[] getColors() {
|
||||
return this.colors;
|
||||
}
|
||||
|
||||
public double getLength() {
|
||||
return this.length;
|
||||
}
|
||||
|
||||
public Vector3d getDirection() {
|
||||
return direction;
|
||||
}
|
||||
|
||||
public Vector3d getStart() {
|
||||
return start;
|
||||
}
|
||||
|
||||
public Vector3d getNormalized() {
|
||||
return normalized.getValue();
|
||||
}
|
||||
|
||||
public ILightHandler getHandler() {
|
||||
return handler;
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@Nonnull
|
||||
public Quaternion getBeaconBeamModifier() {
|
||||
if (beaconBeamModifier == null) {
|
||||
Vector3d axis = UP.crossProduct(getDirection())
|
||||
.normalize();
|
||||
if (axis.equals(Vector3d.ZERO))
|
||||
axis = new Vector3d(1, 0, 0);
|
||||
beaconBeamModifier = new Vector3f(axis).getRadialQuaternion((float) Math.acos(getNormalized()
|
||||
.dotProduct(UP)));
|
||||
}
|
||||
return beaconBeamModifier;
|
||||
}
|
||||
|
||||
public long getWorldTick() {
|
||||
World world = getHandler()
|
||||
.getHandlerWorld();
|
||||
if (world == null)
|
||||
return 0;
|
||||
return world.getGameTime();
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void renderSegment(MatrixStack ms, IRenderTypeBuffer buffer, float partialTicks) {
|
||||
float adjustedGameTime = (float) Math.floorMod(getWorldTick(), 40L) + partialTicks;
|
||||
float textureOffset1 = MathHelper.fractionalPart(-adjustedGameTime * 0.2F - (float) MathHelper.floor(-adjustedGameTime * 0.1F)) - 1;
|
||||
float textureOffset2 = (float) this.getLength() * 2.5f + textureOffset1;
|
||||
|
||||
MatrixStacker stacker = MatrixStacker.of(ms)
|
||||
.push()
|
||||
.translate(getStart().subtract(VecHelper.getCenterOf(getHandler().getBlockPos())))
|
||||
.push()
|
||||
.translate(VecHelper.CENTER_OF_ORIGIN)
|
||||
.multiply(getBeaconBeamModifier())
|
||||
.push()
|
||||
.multiply(Vector3f.POSITIVE_Y, adjustedGameTime * 2.25F - 45.0F);
|
||||
|
||||
renderBeam(stacker.unwrap(), buffer.getBuffer(RenderType.getBeaconBeam(TEXTURE_BEACON_BEAM, false)), this.colors, 1F,
|
||||
totalSectionLength.getValue(), 0.2F, .2F, 0F, -.2f,
|
||||
0f, 0f, -.2f, textureOffset2, textureOffset1);
|
||||
stacker.pop();
|
||||
renderBeam(stacker.unwrap(), buffer.getBuffer(RenderType.getBeaconBeam(TEXTURE_BEACON_BEAM, true)), this.colors, 0.125F,
|
||||
totalSectionLength.getValue(), -.25f, .25f, -.25f, -.25f,
|
||||
.25f, .25f, .25f, textureOffset2, textureOffset1);
|
||||
stacker.pop()
|
||||
.pop();
|
||||
}
|
||||
|
||||
public void setLength(double length) {
|
||||
this.length = length;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,133 @@
|
|||
package com.simibubi.create.content.optics;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
import com.simibubi.create.foundation.utility.BeaconHelper;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.item.DyeColor;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.RayTraceContext;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public interface ILightHandler {
|
||||
default Beam constructOutBeam(Vector3d beamDirection) {
|
||||
return constructOutBeam(null, beamDirection);
|
||||
}
|
||||
|
||||
default Beam constructOutBeam(@Nullable Beam parent, Vector3d beamDirection) {
|
||||
return constructOutBeam(parent, beamDirection, getBlockPos(), DyeColor.WHITE.getColorComponentValues());
|
||||
}
|
||||
|
||||
default Beam constructOutBeam(@Nullable Beam parent, Vector3d beamDirection, BlockPos testBlockPos, float[] colorComponentValues) {
|
||||
Beam beam = new Beam(parent, getHandlerWorld());
|
||||
World world = getHandlerWorld();
|
||||
if (world == null)
|
||||
return beam;
|
||||
|
||||
float[] segmentColor = parent == null ? colorComponentValues : parent.getColorAt(testBlockPos);
|
||||
Vector3d direction = VecHelper.step(beamDirection).normalize();
|
||||
Vector3d testPos = VecHelper.getCenterOf(testBlockPos);
|
||||
|
||||
|
||||
BeamSegment segment = new BeamSegment(this, segmentColor, testPos, direction);
|
||||
beam.add(segment);
|
||||
|
||||
BlockPos lastChecked = testBlockPos;
|
||||
Vector3d rayEnd = testPos.add(direction.scale(getMaxScanRange()));
|
||||
|
||||
for (int i = 0; i < getMaxScanRange(); i++) {
|
||||
testPos = testPos.add(direction); // check next block
|
||||
|
||||
BlockRayTraceResult raytrace = world
|
||||
.rayTraceBlocks(new RayTraceContext(testPos, rayEnd, RayTraceContext.BlockMode.OUTLINE, RayTraceContext.FluidMode.NONE, null));
|
||||
|
||||
testBlockPos = raytrace.getPos();
|
||||
if (raytrace.getType() == RayTraceResult.Type.MISS || !world.isBlockPresent(testBlockPos)) {
|
||||
segment.setLength(getMaxScanRange());
|
||||
break;
|
||||
}
|
||||
|
||||
double scale =Math.sqrt(lastChecked.distanceSq(testBlockPos.getX(), testBlockPos.getY(), testBlockPos.getZ(), false));
|
||||
testPos = testPos.add(direction.scale(Math.max(0, scale - 1)));
|
||||
segment.setLength(segment.getLength() + Math.max(scale / direction.length() - 1, 0));
|
||||
|
||||
lastChecked = testBlockPos;
|
||||
|
||||
BlockState testState = world.getBlockState(testBlockPos);
|
||||
Block testBlock = testState.getBlock();
|
||||
float[] newColor = BeaconHelper.getBeaconColorFor(testState.getBlock());
|
||||
|
||||
ILightHandler lightHandler = null;
|
||||
|
||||
// if possible, don't read for tile entities as often. Only read TEs that we actually know exist and are relevant.
|
||||
if (testBlock instanceof ITE && ILightHandlerProvider.class.isAssignableFrom(((ITE<?>) testBlock).getTileEntityClass())) {
|
||||
TileEntity te = world.getTileEntity(testBlockPos);
|
||||
if (te instanceof ILightHandlerProvider)
|
||||
lightHandler = ((ILightHandlerProvider) te).getHandler();
|
||||
}
|
||||
|
||||
if (lightHandler != this)
|
||||
beam.addListener(lightHandler);
|
||||
|
||||
if (newColor == null) {
|
||||
if (testState.getOpacity(world, testBlockPos) >= 15 && testBlock != Blocks.BEDROCK || (lightHandler != null && lightHandler.absorbsLight())) {
|
||||
break;
|
||||
}
|
||||
} else if (!Arrays.equals(segmentColor, newColor)) {
|
||||
segmentColor = new float[]{(segment.colors[0] + newColor[0]) / 2.0F, (segment.colors[1] + newColor[1]) / 2.0F, (segment.colors[2] + newColor[2]) / 2.0F};
|
||||
segment = new BeamSegment(this, newColor, segment.getStart().add(segment.getDirection().scale(segment.getLength())), direction);
|
||||
beam.add(segment);
|
||||
continue;
|
||||
}
|
||||
segment.incrementLength();
|
||||
}
|
||||
return beam;
|
||||
}
|
||||
|
||||
default int getMaxScanRange() {
|
||||
return 128;
|
||||
}
|
||||
|
||||
default World getHandlerWorld() {
|
||||
return getTile().getWorld();
|
||||
}
|
||||
|
||||
default BlockPos getBlockPos() {
|
||||
return getTile().getPos();
|
||||
}
|
||||
|
||||
TileEntity getTile();
|
||||
|
||||
default Stream<Beam> constructSubBeams(Beam beam) {
|
||||
return Stream.empty();
|
||||
}
|
||||
|
||||
default Iterator<Beam> getRenderBeams() {
|
||||
return Collections.emptyIterator();
|
||||
}
|
||||
|
||||
default boolean absorbsLight() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void updateBeams();
|
||||
|
||||
@FunctionalInterface
|
||||
interface ILightHandlerProvider {
|
||||
ILightHandler getHandler();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package com.simibubi.create.content.optics;
|
||||
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
|
||||
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
@ParametersAreNonnullByDefault
|
||||
public class LightHandlerRenderer<T extends TileEntity & ILightHandler.ILightHandlerProvider> extends SafeTileEntityRenderer<T> {
|
||||
public LightHandlerRenderer(TileEntityRendererDispatcher dispatcher) {
|
||||
super(dispatcher);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void renderSafe(T te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) {
|
||||
te.getHandler()
|
||||
.getRenderBeams()
|
||||
.forEachRemaining(beam -> beam.render(ms, buffer, partialTicks));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isGlobalRenderer(T te) {
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,113 @@
|
|||
package com.simibubi.create.content.optics.aligner;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.google.common.collect.Iterators;
|
||||
import com.google.common.util.concurrent.AtomicDouble;
|
||||
import com.simibubi.create.content.optics.Beam;
|
||||
import com.simibubi.create.content.optics.behaviour.AbstractLightHandlingBehaviour;
|
||||
import com.simibubi.create.content.optics.behaviour.LightHandlingBehaviourProperties;
|
||||
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
|
||||
import com.simibubi.create.foundation.utility.AngleHelper;
|
||||
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
|
||||
public class AlignerBehaviour extends AbstractLightHandlingBehaviour<AlignerTileEntity> {
|
||||
public static final BehaviourType<AlignerBehaviour> TYPE = new BehaviourType<>();
|
||||
@Nullable
|
||||
protected Beam collectedBeam = null;
|
||||
boolean updating = false;
|
||||
|
||||
protected AlignerBehaviour(AlignerTileEntity te) {
|
||||
super(te, LightHandlingBehaviourProperties.create()
|
||||
.withScansBeacons(true)
|
||||
.withAbsorbsLight(true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBeams() {
|
||||
super.updateBeams();
|
||||
if (updating)
|
||||
return;
|
||||
updating = true;
|
||||
|
||||
AtomicDouble r = new AtomicDouble();
|
||||
AtomicDouble g = new AtomicDouble();
|
||||
AtomicDouble b = new AtomicDouble();
|
||||
|
||||
beams = beams.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.filter(((Predicate<Beam>) Beam::isRemoved).negate())
|
||||
.peek(beam -> {
|
||||
float[] localColor = beam.getColorAt(getBlockPos());
|
||||
r.addAndGet(localColor[0] * localColor[0]);
|
||||
g.addAndGet(localColor[1] * localColor[1]);
|
||||
b.addAndGet(localColor[2] * localColor[2]);
|
||||
})
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
if (collectedBeam != null) {
|
||||
collectedBeam.onRemoved();
|
||||
collectedBeam = null;
|
||||
}
|
||||
|
||||
if (!beams.isEmpty()) {
|
||||
collectedBeam = constructOutBeam(null, getFacingVec(), getBlockPos(), new float[]{(float) Math.sqrt(r.get() / beams.size()), (float) Math.sqrt(g.get() / beams.size()), (float) Math.sqrt(b.get() / beams.size())});
|
||||
if (collectedBeam != null && !collectedBeam.isEmpty()) {
|
||||
collectedBeam.addListener(this);
|
||||
collectedBeam.onCreated();
|
||||
}
|
||||
}
|
||||
|
||||
updating = false;
|
||||
}
|
||||
|
||||
protected Direction getFacing() {
|
||||
return tileEntity.getBlockState()
|
||||
.get(BlockStateProperties.FACING);
|
||||
}
|
||||
|
||||
private Vector3d getFacingVec() {
|
||||
return Vector3d.of(getFacing().getDirectionVec());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Beam> constructSubBeams(Beam beam) {
|
||||
if (beam == collectedBeam)
|
||||
return Stream.empty();
|
||||
Vector3d beamDir = beam.getDirection();
|
||||
if (!beam.isRemoved() && beamDir != null && AngleHelper.deg(Math.cos(beamDir.dotProduct(getFacingVec()))) < 60
|
||||
&& getFacing().getOpposite()
|
||||
.equals(beam.getBlockEnterFace(getBlockPos()))) {
|
||||
beams.add(beam);
|
||||
requestBeamUpdate();
|
||||
}
|
||||
|
||||
return Stream.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BehaviourType<?> getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Beam> getRenderBeams() {
|
||||
return Iterators.concat(super.getRenderBeams(), collectedBeam == null ? Collections.emptyIterator() : Collections.singleton(collectedBeam)
|
||||
.iterator());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canUpdateFast() {
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package com.simibubi.create.content.optics.aligner;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.simibubi.create.AllTileEntities;
|
||||
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
import com.simibubi.create.foundation.block.ProperDirectionalBlock;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
|
||||
public class AlignerBlock extends ProperDirectionalBlock implements IWrenchable, ITE<AlignerTileEntity> {
|
||||
public AlignerBlock(Properties properties) {
|
||||
super(properties);
|
||||
setDefaultState(getDefaultState().with(FACING, Direction.DOWN));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<AlignerTileEntity> getTileEntityClass() {
|
||||
return AlignerTileEntity.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasTileEntity(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
return AllTileEntities.ALIGNER.create();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
package com.simibubi.create.content.optics.aligner;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.simibubi.create.content.optics.ILightHandler;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
|
||||
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
|
||||
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class AlignerTileEntity extends SmartTileEntity implements ILightHandler.ILightHandlerProvider, ITE<AlignerTileEntity> {
|
||||
protected AlignerBehaviour aligner;
|
||||
|
||||
public AlignerTileEntity(TileEntityType<?> tileEntityTypeIn) {
|
||||
super(tileEntityTypeIn);
|
||||
setLazyTickRate(20);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
|
||||
aligner = new AlignerBehaviour(this);
|
||||
behaviours.add(aligner);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ILightHandler getHandler() {
|
||||
return aligner;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AxisAlignedBB getRenderBoundingBox() {
|
||||
return INFINITE_EXTENT_AABB;
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public double getMaxRenderDistanceSquared() {
|
||||
return 256.0D;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<AlignerTileEntity> getTileEntityClass() {
|
||||
return AlignerTileEntity.class;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,122 @@
|
|||
package com.simibubi.create.content.optics.behaviour;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.simibubi.create.content.optics.Beam;
|
||||
import com.simibubi.create.content.optics.ILightHandler;
|
||||
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
|
||||
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
|
||||
import com.simibubi.create.foundation.utility.BeaconHelper;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
import net.minecraft.item.DyeColor;
|
||||
import net.minecraft.tileentity.BeaconTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
public abstract class AbstractLightHandlingBehaviour<T extends SmartTileEntity & ILightHandler.ILightHandlerProvider> extends TileEntityBehaviour implements ILightHandler {
|
||||
protected final T handler;
|
||||
private final LightHandlingBehaviourProperties properties;
|
||||
protected Set<Beam> beams;
|
||||
@Nullable
|
||||
protected Beam beaconBeam = null;
|
||||
@Nullable
|
||||
protected BeaconTileEntity beacon;
|
||||
boolean needsBeamUpdate = false;
|
||||
|
||||
protected AbstractLightHandlingBehaviour(T te, LightHandlingBehaviourProperties properties) {
|
||||
super(te);
|
||||
this.handler = te;
|
||||
this.properties = properties;
|
||||
beams = new HashSet<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
if (properties.scansBeacon && beacon != null && beacon.isRemoved())
|
||||
updateBeaconState();
|
||||
if (needsBeamUpdate && canUpdateFast())
|
||||
updateBeams();
|
||||
}
|
||||
|
||||
|
||||
protected void updateBeaconState() {
|
||||
beacon = BeaconHelper.getBeaconTE(getBlockPos(), getHandlerWorld())
|
||||
.orElse(null);
|
||||
|
||||
if (beaconBeam != null) {
|
||||
beaconBeam.clear();
|
||||
beaconBeam = null;
|
||||
requestBeamUpdate();
|
||||
}
|
||||
|
||||
if (beacon != null) {
|
||||
beaconBeam = constructOutBeam(null, VecHelper.UP, beacon.getPos(), DyeColor.WHITE.getColorComponentValues());
|
||||
if (beaconBeam != null && !beaconBeam.isEmpty()) {
|
||||
beaconBeam.addListener(this);
|
||||
beaconBeam.onCreated();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity getTile() {
|
||||
return tileEntity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void lazyTick() {
|
||||
super.lazyTick();
|
||||
if (properties.scansBeacon)
|
||||
updateBeaconState();
|
||||
if (canUpdateFast())
|
||||
requestBeamUpdate();
|
||||
else
|
||||
updateBeams();
|
||||
}
|
||||
|
||||
public void requestBeamUpdate() {
|
||||
needsBeamUpdate = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBeams() {
|
||||
needsBeamUpdate = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Beam> getRenderBeams() {
|
||||
return beaconBeam == null ? Collections.emptyIterator() : Collections.singleton(beaconBeam)
|
||||
.iterator();
|
||||
}
|
||||
|
||||
public Set<Beam> getBeams() {
|
||||
return beams;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
beams.forEach(Beam::onRemoved);
|
||||
if (beaconBeam != null)
|
||||
beaconBeam.onRemoved();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean absorbsLight() {
|
||||
return properties.absorbsLight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxScanRange() {
|
||||
return properties.scanRange;
|
||||
}
|
||||
|
||||
protected boolean canUpdateFast() {
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
package com.simibubi.create.content.optics.behaviour;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.google.common.collect.Iterators;
|
||||
import com.simibubi.create.content.optics.Beam;
|
||||
import com.simibubi.create.content.optics.ILightHandler;
|
||||
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
|
||||
|
||||
public abstract class AbstractLightRelayBehaviour<T extends SmartTileEntity & ILightHandler.ILightHandlerProvider> extends AbstractLightHandlingBehaviour<T> {
|
||||
private boolean isUpdating;
|
||||
|
||||
protected AbstractLightRelayBehaviour(T te, LightHandlingBehaviourProperties properties) {
|
||||
super(te, properties);
|
||||
isUpdating = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBeams() {
|
||||
super.updateBeams();
|
||||
if (isUpdating)
|
||||
return;
|
||||
isUpdating = true;
|
||||
|
||||
Set<Beam> oldBeams = new HashSet<>(beams);
|
||||
beams.clear();
|
||||
for (Beam child : oldBeams) {
|
||||
if (child.isNew()) {
|
||||
beams.add(child);
|
||||
continue;
|
||||
}
|
||||
Beam parent = child.getParent();
|
||||
child.onRemoved();
|
||||
if (parent != null && !parent.isRemoved())
|
||||
constructSubBeams(parent).forEach(Beam::onCreated);
|
||||
}
|
||||
isUpdating = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Beam> constructSubBeams(Beam beam) {
|
||||
if (beams.stream()
|
||||
.map(Beam::getParent)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(((Predicate<Beam>) Beam::isRemoved).negate())
|
||||
.map(Beam::getDirection)
|
||||
.filter(Objects::nonNull)
|
||||
.anyMatch(b -> b.equals(beam.getDirection())))
|
||||
return Stream.empty();
|
||||
return constructSubBeams(beam, beams);
|
||||
}
|
||||
|
||||
public Stream<Beam> constructSubBeams(Beam beam, Set<Beam> beamListing) {
|
||||
return safeConstructSubBeamsFor(beam)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(((Predicate<Beam>) Beam::isEmpty).negate())
|
||||
.peek(beamListing::add);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Beam> getRenderBeams() {
|
||||
return Iterators.concat(beams.iterator(), super.getRenderBeams());
|
||||
}
|
||||
|
||||
protected abstract Stream<Beam> safeConstructSubBeamsFor(Beam beam);
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
package com.simibubi.create.content.optics.behaviour;
|
||||
|
||||
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.content.optics.ILightHandler;
|
||||
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
|
||||
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
|
||||
public abstract class AbstractRotatedLightRelayBehaviour<T extends KineticTileEntity & ILightHandler.ILightHandlerProvider & RotationMode.RotationModeProvider> extends AbstractLightRelayBehaviour<T> {
|
||||
protected float angle;
|
||||
protected float clientAngleDiff;
|
||||
private float prevAngle;
|
||||
|
||||
protected AbstractRotatedLightRelayBehaviour(T te, LightHandlingBehaviourProperties properties) {
|
||||
super(te, properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(CompoundNBT nbt, boolean clientPacket) {
|
||||
nbt.putFloat("Angle", angle);
|
||||
super.write(nbt, clientPacket);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(CompoundNBT nbt, boolean clientPacket) {
|
||||
angle = nbt.getFloat("Angle");
|
||||
super.read(nbt, clientPacket);
|
||||
}
|
||||
|
||||
public float getInterpolatedAngle(float partialTicks) {
|
||||
if (tileEntity.isVirtual())
|
||||
return MathHelper.lerp(partialTicks + .5f, prevAngle, angle);
|
||||
if (handler.getMode() == RotationMode.ROTATE_LIMITED && Math.abs(angle) == 90)
|
||||
return angle;
|
||||
return MathHelper.lerp(partialTicks, angle, angle + getAngularSpeed());
|
||||
}
|
||||
|
||||
public float getAngularSpeed() {
|
||||
float speed = handler.getSpeed() * 3 / 10f;
|
||||
if (handler.getSpeed() == 0)
|
||||
speed = 0;
|
||||
if (getHandlerWorld() != null && getHandlerWorld().isRemote) {
|
||||
speed *= ServerSpeedProvider.get();
|
||||
speed += clientAngleDiff / 3f;
|
||||
}
|
||||
return speed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
|
||||
prevAngle = angle;
|
||||
if (getHandlerWorld() != null && getHandlerWorld().isRemote)
|
||||
clientAngleDiff /= 2;
|
||||
|
||||
float angularSpeed = getAngularSpeed();
|
||||
float newAngle = angle + angularSpeed;
|
||||
angle = newAngle % 360;
|
||||
|
||||
if (handler.getMode() == RotationMode.ROTATE_LIMITED)
|
||||
angle = MathHelper.clamp(angle, -90, 90);
|
||||
if (handler.getMode() == RotationMode.ROTATE_45 && angle == prevAngle) // don't snap while still rotating
|
||||
angle = 45F * Math.round(Math.round(angle) / 45F);
|
||||
|
||||
|
||||
if (angle != prevAngle) {
|
||||
onAngleChanged();
|
||||
}
|
||||
}
|
||||
|
||||
protected void onAngleChanged() {
|
||||
updateBeams();
|
||||
}
|
||||
|
||||
protected Direction.Axis getAxis() {
|
||||
return tileEntity.getBlockState()
|
||||
.get(BlockStateProperties.AXIS);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
package com.simibubi.create.content.optics.behaviour;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.simibubi.create.content.optics.Beam;
|
||||
import com.simibubi.create.content.optics.ILightHandler;
|
||||
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
|
||||
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
|
||||
|
||||
public class LightAcceptingBehaviour<T extends SmartTileEntity & ILightHandler.ILightHandlerProvider> extends AbstractLightHandlingBehaviour<T> {
|
||||
public static final BehaviourType<LightAcceptingBehaviour<? extends SmartTileEntity>> TYPE = new BehaviourType<>();
|
||||
boolean isUpdating = false;
|
||||
|
||||
public LightAcceptingBehaviour(T te, LightHandlingBehaviourProperties properties) {
|
||||
super(te, properties);
|
||||
}
|
||||
|
||||
public LightAcceptingBehaviour(T te) {
|
||||
super(te, LightHandlingBehaviourProperties.create()
|
||||
.withAbsorbsLight(true)
|
||||
.withScansBeacons(true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBeams() {
|
||||
super.updateBeams();
|
||||
if (isUpdating)
|
||||
return;
|
||||
isUpdating = true;
|
||||
|
||||
beams = beams.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.filter(((Predicate<Beam>) Beam::isRemoved).negate())
|
||||
.collect(Collectors.toSet());
|
||||
isUpdating = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BehaviourType<?> getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Beam> constructSubBeams(Beam beam) {
|
||||
if (beams.stream()
|
||||
.map(Beam::getParent)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(((Predicate<Beam>) Beam::isRemoved).negate())
|
||||
.map(Beam::getDirection)
|
||||
.filter(Objects::nonNull)
|
||||
.noneMatch(b -> b.equals(beam.getDirection())))
|
||||
beams.add(beam);
|
||||
return Stream.empty();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
package com.simibubi.create.content.optics.behaviour;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.google.common.collect.Iterators;
|
||||
import com.simibubi.create.content.optics.Beam;
|
||||
import com.simibubi.create.content.optics.ILightHandler;
|
||||
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
|
||||
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
|
||||
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
|
||||
public class LightEmittingBehaviour<T extends SmartTileEntity & ILightHandler.ILightHandlerProvider> extends AbstractLightHandlingBehaviour<T> {
|
||||
public static final BehaviourType<LightEmittingBehaviour<? extends SmartTileEntity>> TYPE = new BehaviourType<>();
|
||||
|
||||
boolean updating = false;
|
||||
|
||||
|
||||
public LightEmittingBehaviour(T te, LightHandlingBehaviourProperties properties) {
|
||||
super(te, properties);
|
||||
}
|
||||
|
||||
public LightEmittingBehaviour(T te) {
|
||||
super(te, LightHandlingBehaviourProperties.create()
|
||||
.withScansBeacons(false)
|
||||
.withAbsorbsLight(true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBeams() {
|
||||
super.updateBeams();
|
||||
if (updating)
|
||||
return;
|
||||
updating = true;
|
||||
|
||||
beams.forEach(Beam::onRemoved);
|
||||
beams.clear();
|
||||
getOutBeamDirections().map(this::constructOutBeam)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(((Predicate<Beam>) Beam::isEmpty).negate())
|
||||
.peek(beams::add)
|
||||
.forEach(Beam::onCreated);
|
||||
|
||||
updating = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BehaviourType<?> getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
public Stream<Vector3d> getOutBeamDirections() {
|
||||
return Stream.of(Vector3d.of(tileEntity.getBlockState()
|
||||
.method_28500(BlockStateProperties.FACING)
|
||||
.orElse(Direction.UP)
|
||||
.getDirectionVec()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Beam> getRenderBeams() {
|
||||
return Iterators.concat(beams.iterator(), super.getRenderBeams());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
package com.simibubi.create.content.optics.behaviour;
|
||||
|
||||
public class LightHandlingBehaviourProperties {
|
||||
int scanRange;
|
||||
boolean absorbsLight;
|
||||
boolean scansBeacon;
|
||||
|
||||
private LightHandlingBehaviourProperties() {
|
||||
scanRange = 128;
|
||||
absorbsLight = true;
|
||||
scansBeacon = true;
|
||||
}
|
||||
|
||||
public static LightHandlingBehaviourProperties create() {
|
||||
return new LightHandlingBehaviourProperties();
|
||||
}
|
||||
|
||||
public LightHandlingBehaviourProperties withScanRange(int scanRange) {
|
||||
this.scanRange = scanRange;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LightHandlingBehaviourProperties withAbsorbsLight(boolean absorbsLight) {
|
||||
this.absorbsLight = absorbsLight;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LightHandlingBehaviourProperties withScansBeacons(boolean scansBeacon) {
|
||||
this.scansBeacon = scansBeacon;
|
||||
return this;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.simibubi.create.content.optics.behaviour;
|
||||
|
||||
import com.simibubi.create.foundation.gui.AllIcons;
|
||||
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
|
||||
public enum RotationMode implements INamedIconOptions {
|
||||
|
||||
// FIXME: Add proper icons
|
||||
ROTATE_FREE(AllIcons.I_ROTATE_PLACE),
|
||||
ROTATE_45(AllIcons.I_ROTATE_PLACE_RETURNED),
|
||||
ROTATE_LIMITED(AllIcons.I_ROTATE_NEVER_PLACE);
|
||||
|
||||
|
||||
private final String translationKey;
|
||||
private final AllIcons icon;
|
||||
|
||||
RotationMode(AllIcons icon) {
|
||||
this.icon = icon;
|
||||
translationKey = "optics.mirror.movement_mode." + Lang.asId(name());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AllIcons getIcon() {
|
||||
return icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTranslationKey() {
|
||||
return translationKey;
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface RotationModeProvider {
|
||||
RotationMode getMode();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
package com.simibubi.create.content.optics.mirror;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.simibubi.create.content.optics.Beam;
|
||||
import com.simibubi.create.content.optics.behaviour.AbstractRotatedLightRelayBehaviour;
|
||||
import com.simibubi.create.content.optics.behaviour.LightHandlingBehaviourProperties;
|
||||
import com.simibubi.create.foundation.collision.Matrix3d;
|
||||
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
|
||||
import com.simibubi.create.foundation.utility.AngleHelper;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.vector.Quaternion;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.util.math.vector.Vector3f;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
|
||||
public class MirrorBehaviour extends AbstractRotatedLightRelayBehaviour<MirrorTileEntity> {
|
||||
public static final BehaviourType<MirrorBehaviour> TYPE = new BehaviourType<>();
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@Nullable
|
||||
Quaternion bufferedRotationQuaternion = null;
|
||||
|
||||
public MirrorBehaviour(MirrorTileEntity te) {
|
||||
super(te, LightHandlingBehaviourProperties.create()
|
||||
.withAbsorbsLight(true)
|
||||
.withScansBeacons(true));
|
||||
}
|
||||
|
||||
private Vector3d getReflectionAngle(Vector3d inputAngle) {
|
||||
inputAngle = inputAngle.normalize();
|
||||
Direction.Axis axis = handler.getAxis();
|
||||
Vector3d normal;
|
||||
if (axis.isHorizontal())
|
||||
normal = new Matrix3d().asIdentity()
|
||||
.asAxisRotation(axis, AngleHelper.rad(angle))
|
||||
.transform(VecHelper.UP);
|
||||
else
|
||||
normal = new Matrix3d().asIdentity()
|
||||
.asAxisRotation(axis, AngleHelper.rad(-angle))
|
||||
.transform(VecHelper.SOUTH);
|
||||
|
||||
return inputAngle.subtract(normal.scale(2 * inputAngle.dotProduct(normal)));
|
||||
}
|
||||
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@Nonnull
|
||||
public Quaternion getBufferedRotationQuaternion() {
|
||||
if (bufferedRotationQuaternion == null) {
|
||||
bufferedRotationQuaternion = getMirrorAxis().getUnitVector()
|
||||
.getDegreesQuaternion(getInterpolatedAngle(AnimationTickHolder.getPartialTicks() - 1));
|
||||
bufferedRotationQuaternion.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AngleHelper.horizontalAngle(getMirrorAxis())));
|
||||
bufferedRotationQuaternion.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(AngleHelper.verticalAngle(getMirrorAxis())));
|
||||
}
|
||||
return bufferedRotationQuaternion;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(CompoundNBT nbt, boolean clientPacket) {
|
||||
super.read(nbt, clientPacket);
|
||||
bufferedRotationQuaternion = null;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public Direction getMirrorAxis() {
|
||||
return Direction.getFacingFromAxisDirection(getAxis(), Direction.AxisDirection.POSITIVE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BehaviourType<?> getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Stream<Beam> safeConstructSubBeamsFor(Beam beam) {
|
||||
Vector3d inDir = beam.getDirection();
|
||||
if (inDir == null)
|
||||
return Stream.empty();
|
||||
|
||||
return Stream.of(constructOutBeam(beam, getReflectionAngle(inDir).normalize()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onAngleChanged() {
|
||||
super.onAngleChanged();
|
||||
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> bufferedRotationQuaternion = null);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
package com.simibubi.create.content.optics.mirror;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
import com.simibubi.create.AllTileEntities;
|
||||
import com.simibubi.create.content.contraptions.base.IRotate;
|
||||
import com.simibubi.create.content.contraptions.relays.encased.AbstractEncasedShaftBlock;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
|
||||
import mcp.MethodsReturnNonnullByDefault;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
|
||||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
public class MirrorBlock extends AbstractEncasedShaftBlock implements IRotate, ITE<MirrorTileEntity> {
|
||||
public MirrorBlock(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
return AllTileEntities.MIRROR.create();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Class<MirrorTileEntity> getTileEntityClass() {
|
||||
return MirrorTileEntity.class;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
package com.simibubi.create.content.optics.mirror;
|
||||
|
||||
import com.simibubi.create.AllBlockPartials;
|
||||
import com.simibubi.create.content.contraptions.base.KineticTileInstance;
|
||||
import com.simibubi.create.foundation.render.backend.core.OrientedData;
|
||||
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
|
||||
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
|
||||
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.vector.Vector3f;
|
||||
|
||||
public class MirrorInstance extends KineticTileInstance<MirrorTileEntity> implements IDynamicInstance {
|
||||
final Vector3f rotationAxis;
|
||||
final OrientedData instance;
|
||||
|
||||
public MirrorInstance(InstancedTileRenderer<?> modelManager, MirrorTileEntity tile) {
|
||||
super(modelManager, tile);
|
||||
|
||||
rotationAxis = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis)
|
||||
.getUnitVector();
|
||||
instance = getOrientedMaterial().getModel(AllBlockPartials.MIRROR_PLANE, tile.getBlockState())
|
||||
.createInstance();
|
||||
instance.setPosition(getInstancePosition());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beginFrame() {
|
||||
instance.setRotation(tile.getHandler()
|
||||
.getBufferedRotationQuaternion());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLight() {
|
||||
super.updateLight();
|
||||
relight(pos, instance);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
instance.delete();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
package com.simibubi.create.content.optics.mirror;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.simibubi.create.AllBlockPartials;
|
||||
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
|
||||
import com.simibubi.create.foundation.render.SuperByteBuffer;
|
||||
import com.simibubi.create.foundation.render.backend.FastRenderDispatcher;
|
||||
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.Direction;
|
||||
|
||||
@ParametersAreNonnullByDefault
|
||||
public class MirrorRenderer extends KineticTileEntityRenderer {
|
||||
public MirrorRenderer(TileEntityRendererDispatcher dispatcher) {
|
||||
super(dispatcher);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
||||
int light, int overlay) {
|
||||
|
||||
if (!FastRenderDispatcher.available(te.getWorld()))
|
||||
renderMirror((MirrorTileEntity) te, partialTicks, ms, buffer, light);
|
||||
((MirrorTileEntity) te).getHandler()
|
||||
.getRenderBeams()
|
||||
.forEachRemaining(beam -> beam.render(ms, buffer, partialTicks));
|
||||
}
|
||||
|
||||
private void renderMirror(MirrorTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light) {
|
||||
|
||||
final Direction.Axis facing = te.getBlockState()
|
||||
.get(BlockStateProperties.AXIS);
|
||||
SuperByteBuffer superBuffer = AllBlockPartials.MIRROR_PLANE.renderOnDirectionalSouth(te.getBlockState(), te.getHandler()
|
||||
.getMirrorAxis());
|
||||
|
||||
float interpolatedAngle = te.getHandler()
|
||||
.getInterpolatedAngle(partialTicks - 1);
|
||||
kineticRotationTransform(superBuffer, te, facing, (float) (interpolatedAngle / 180 * Math.PI), light);
|
||||
superBuffer.renderInto(ms, buffer.getBuffer(RenderType.getTranslucent()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isGlobalRenderer(KineticTileEntity tileEntity) {
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
package com.simibubi.create.content.optics.mirror;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.content.optics.ILightHandler;
|
||||
import com.simibubi.create.content.optics.behaviour.RotationMode;
|
||||
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
|
||||
import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform;
|
||||
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
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;
|
||||
|
||||
public class MirrorTileEntity extends KineticTileEntity implements ILightHandler.ILightHandlerProvider, RotationMode.RotationModeProvider {
|
||||
protected ScrollOptionBehaviour<RotationMode> movementMode;
|
||||
protected MirrorBehaviour mirror;
|
||||
|
||||
public MirrorTileEntity(TileEntityType<?> typeIn) {
|
||||
super(typeIn);
|
||||
setLazyTickRate(20);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
|
||||
super.addBehaviours(behaviours);
|
||||
movementMode = new ScrollOptionBehaviour<>(RotationMode.class, Lang.translate("optics.mirror.movement_mode"),
|
||||
this, new CenteredSideValueBoxTransform((state, d) -> getAxis() != d.getAxis()));
|
||||
movementMode.requiresWrench();
|
||||
behaviours.add(movementMode);
|
||||
|
||||
mirror = new MirrorBehaviour(this);
|
||||
behaviours.add(mirror);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldRenderAsTE() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AxisAlignedBB getRenderBoundingBox() {
|
||||
return INFINITE_EXTENT_AABB;
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public double getMaxRenderDistanceSquared() {
|
||||
return 256.0D;
|
||||
}
|
||||
|
||||
|
||||
Direction.Axis getAxis() {
|
||||
return getBlockState().get(BlockStateProperties.AXIS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MirrorBehaviour getHandler() {
|
||||
return mirror;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RotationMode getMode() {
|
||||
return movementMode.get();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
package com.simibubi.create.content.optics.radiant_beacon;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.simibubi.create.AllTileEntities;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
import com.simibubi.create.foundation.block.ProperDirectionalBlock;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
|
||||
public class RadiantBeaconBlock extends ProperDirectionalBlock implements ITE<RadiantBeaconTileEntity> {
|
||||
public RadiantBeaconBlock(Properties properties) {
|
||||
super(properties);
|
||||
setDefaultState(getDefaultState().with(FACING, Direction.UP));
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
return getDefaultState().with(FACING, context.getNearestLookingDirection()
|
||||
.getOpposite());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<RadiantBeaconTileEntity> getTileEntityClass() {
|
||||
return RadiantBeaconTileEntity.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasTileEntity(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLightValue(BlockState state, IBlockReader world, BlockPos pos) {
|
||||
return world.getMaxLightLevel();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
return AllTileEntities.RADIANT_BEACON.create();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
package com.simibubi.create.content.optics.radiant_beacon;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.simibubi.create.content.optics.ILightHandler;
|
||||
import com.simibubi.create.content.optics.behaviour.LightEmittingBehaviour;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
|
||||
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
|
||||
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class RadiantBeaconTileEntity extends SmartTileEntity implements ILightHandler.ILightHandlerProvider, ITE<RadiantBeaconTileEntity> {
|
||||
LightEmittingBehaviour<RadiantBeaconTileEntity> lightEmittingBehaviour;
|
||||
|
||||
public RadiantBeaconTileEntity(TileEntityType<?> tileEntityTypeIn) {
|
||||
super(tileEntityTypeIn);
|
||||
setLazyTickRate(20);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
|
||||
lightEmittingBehaviour = new LightEmittingBehaviour<>(this);
|
||||
behaviours.add(lightEmittingBehaviour);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ILightHandler getHandler() {
|
||||
return lightEmittingBehaviour;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AxisAlignedBB getRenderBoundingBox() {
|
||||
return INFINITE_EXTENT_AABB;
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public double getMaxRenderDistanceSquared() {
|
||||
return 256.0D;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<RadiantBeaconTileEntity> getTileEntityClass() {
|
||||
return RadiantBeaconTileEntity.class;
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package com.simibubi.create.foundation.collision;
|
||||
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.vector.Matrix4f;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
|
@ -144,4 +145,14 @@ public class Matrix3d {
|
|||
return new Matrix4f(conversionBuffer);
|
||||
}
|
||||
|
||||
public Matrix3d asAxisRotation(Direction.Axis axis, float rad) {
|
||||
switch (axis) {
|
||||
case X:
|
||||
return asXRotation(rad);
|
||||
case Y:
|
||||
return asYRotation(rad);
|
||||
default:
|
||||
return asZRotation(rad);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,7 +26,9 @@ public class PressingRecipeGen extends ProcessingRecipeGen {
|
|||
LAPIS = create("lapis_block", b -> b.require(Blocks.LAPIS_BLOCK)
|
||||
.output(AllItems.LAPIS_SHEET.get())),
|
||||
BRASS = create("brass_ingot", b -> b.require(I.brass())
|
||||
.output(AllItems.BRASS_SHEET.get()))
|
||||
.output(AllItems.BRASS_SHEET.get())),
|
||||
LILY_PAD = create("lily_pad", b -> b.require(Ingredient.fromItems(Items.GHAST_TEAR))
|
||||
.output(Items.LILY_PAD));
|
||||
|
||||
;
|
||||
|
||||
|
|
|
@ -59,6 +59,7 @@ public class ItemDescription {
|
|||
Red(DARK_RED, RED),
|
||||
Purple(DARK_PURPLE, LIGHT_PURPLE),
|
||||
Gray(DARK_GRAY, GRAY),
|
||||
White(WHITE, AQUA)
|
||||
|
||||
;
|
||||
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
package com.simibubi.create.foundation.mixin;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
import com.simibubi.create.foundation.utility.BeaconHelper;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.tileentity.BeaconTileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
|
||||
@Mixin(BeaconTileEntity.class)
|
||||
public abstract class LightHandlersAreSolidToBeaconsMixin {
|
||||
@Redirect(at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getOpacity(Lnet/minecraft/world/IBlockReader;Lnet/minecraft/util/math/BlockPos;)I"), method = "tick()V")
|
||||
private int getCorrectedOpacity(BlockState state, IBlockReader world, BlockPos pos) {
|
||||
return BeaconHelper.getCorrectedOpacity(state, world, pos);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
package com.simibubi.create.foundation.utility;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.simibubi.create.content.optics.ILightHandler;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.IBeaconBeamColorProvider;
|
||||
import net.minecraft.tileentity.BeaconTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.gen.Heightmap;
|
||||
|
||||
public class BeaconHelper {
|
||||
private BeaconHelper() {
|
||||
}
|
||||
|
||||
public static Optional<BeaconTileEntity> getBeaconTE(@Nullable BlockPos testPos, @Nullable IBlockReader world) {
|
||||
if (testPos == null || world == null)
|
||||
return Optional.empty();
|
||||
while (testPos.getY() > 0) {
|
||||
testPos = testPos.down();
|
||||
BlockState state = world.getBlockState(testPos);
|
||||
if (getCorrectedOpacity(state, world, testPos) >= 15 && state.getBlock() != Blocks.BEDROCK)
|
||||
break;
|
||||
if (state.getBlock() == Blocks.BEACON) {
|
||||
TileEntity te = world.getTileEntity(testPos);
|
||||
|
||||
if (!(te instanceof BeaconTileEntity))
|
||||
break;
|
||||
return Optional.of((BeaconTileEntity) te);
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<BeaconTileEntity> getBeaconTE(Vector3d pos, World world) {
|
||||
int testX = MathHelper.floor(pos.getX());
|
||||
int testZ = MathHelper.floor(pos.getZ());
|
||||
int localWorldHeight = world.getHeight(Heightmap.Type.WORLD_SURFACE, testX, testZ);
|
||||
return getBeaconTE(new BlockPos(testX, Math.min(MathHelper.floor(pos.getY()), localWorldHeight), testZ), world);
|
||||
}
|
||||
|
||||
public static boolean isAboveActiveBeacon(Vector3d pos, World world) {
|
||||
return getBeaconTE(pos, world).filter(bte -> bte.getLevels() != 0 && !bte.beamSegments.isEmpty())
|
||||
.isPresent();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static float[] getBeaconColorFor(Block block) {
|
||||
if (!(block instanceof IBeaconBeamColorProvider))
|
||||
return null;
|
||||
return ((IBeaconBeamColorProvider) block).getColor()
|
||||
.getColorComponentValues();
|
||||
}
|
||||
|
||||
public static int getCorrectedOpacity(BlockState state, IBlockReader world, BlockPos pos) {
|
||||
try {
|
||||
if (state.getBlock() instanceof ITE) {
|
||||
TileEntity te = ((ITE<?>) state.getBlock()).getTileEntity(world, pos);
|
||||
if (te instanceof ILightHandler.ILightHandlerProvider && ((ILightHandler.ILightHandlerProvider) te).getHandler()
|
||||
.absorbsLight())
|
||||
return 15;
|
||||
}
|
||||
} catch (ITE.TileEntityException ignored) {
|
||||
}
|
||||
return state.getOpacity(world, pos);
|
||||
}
|
||||
}
|
|
@ -22,6 +22,8 @@ import net.minecraft.util.math.vector.Vector3i;
|
|||
public class VecHelper {
|
||||
|
||||
public static final Vector3d CENTER_OF_ORIGIN = new Vector3d(.5, .5, .5);
|
||||
public static final Vector3d UP = new Vector3d(0, 1, 0);
|
||||
public static final Vector3d SOUTH = new Vector3d(1, 0, 0);
|
||||
|
||||
public static Vector3d rotate(Vector3d vec, Vector3d rotationVec) {
|
||||
return rotate(vec, rotationVec.x, rotationVec.y, rotationVec.z);
|
||||
|
@ -214,4 +216,19 @@ public class VecHelper {
|
|||
return new Vector3d(-result3f.getX() * scale_factor, result3f.getY() * scale_factor, result3f.getZ());
|
||||
}
|
||||
|
||||
public static Vector3d step(Vector3d direction) {
|
||||
return direction.scale(1 / varMax(Math.abs(direction.x), Math.abs(direction.y), Math.abs(direction.z)));
|
||||
}
|
||||
|
||||
private static double varMax(double n, double ... numbers) {
|
||||
for (double test : numbers) {
|
||||
if (test > n)
|
||||
n = test;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
public static Vector3d getRandom() {
|
||||
return new Vector3d(Math.random(), Math.random(), Math.random()).normalize();
|
||||
}
|
||||
}
|
||||
|
|
22
src/main/resources/assets/create/models/block/aligner.json
Normal file
22
src/main/resources/assets/create/models/block/aligner.json
Normal file
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"0": "create:block/aligner",
|
||||
"particle": "create:block/aligner"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [0, 0, 0],
|
||||
"to": [16, 16, 16],
|
||||
"faces": {
|
||||
"north": {"uv": [8, 0, 16, 8], "rotation": 180, "texture": "#0"},
|
||||
"east": {"uv": [8, 0, 16, 8], "rotation": 180, "texture": "#0"},
|
||||
"south": {"uv": [8, 0, 16, 8], "rotation": 180, "texture": "#0"},
|
||||
"west": {"uv": [8, 0, 16, 8], "rotation": 180, "texture": "#0"},
|
||||
"up": {"uv": [0, 0, 8, 8], "texture": "#0"},
|
||||
"down": {"uv": [0, 8, 8, 16], "texture": "#0"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
172
src/main/resources/assets/create/models/block/mirror/block.json
Normal file
172
src/main/resources/assets/create/models/block/mirror/block.json
Normal file
|
@ -0,0 +1,172 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/cube_all",
|
||||
"textures": {
|
||||
"3": "create:block/gearbox_top",
|
||||
"4": "create:block/gearbox",
|
||||
"particle": "create:item/refined_radiance",
|
||||
"all": "block/glass"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "side",
|
||||
"from": [2, 1, 2],
|
||||
"to": [14, 2, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, -10, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 11, 14, 12], "rotation": 180, "texture": "#4"},
|
||||
"south": {"uv": [0, 0, 1, 12], "rotation": 270, "texture": "#3"},
|
||||
"up": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#4"},
|
||||
"down": {"uv": [2, 2, 14, 14], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "side",
|
||||
"from": [2, 14, 2],
|
||||
"to": [14, 15, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, -10, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 12, 14, 11], "rotation": 180, "texture": "#4"},
|
||||
"south": {"uv": [1, 0, 0, 12], "rotation": 270, "texture": "#3"},
|
||||
"up": {"uv": [14, 2, 2, 14], "rotation": 180, "texture": "#4"},
|
||||
"down": {"uv": [14, 2, 2, 14], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "side_frame",
|
||||
"from": [0, 0, 2],
|
||||
"to": [2, 2, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, -1, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 2, 2], "rotation": 180, "texture": "#4"},
|
||||
"east": {"uv": [0, 2, 2, 14], "rotation": 270, "texture": "#4"},
|
||||
"south": {"uv": [0, 14, 2, 16], "texture": "#4"},
|
||||
"west": {"uv": [14, 2, 16, 14], "rotation": 90, "texture": "#4"},
|
||||
"up": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#4"},
|
||||
"down": {"uv": [0, 2, 2, 14], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "side_frame",
|
||||
"from": [0, 14, 2],
|
||||
"to": [2, 16, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, -1, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 2, 2, 0], "rotation": 180, "texture": "#4"},
|
||||
"east": {"uv": [2, 2, 0, 14], "rotation": 270, "texture": "#4"},
|
||||
"south": {"uv": [0, 16, 2, 14], "texture": "#4"},
|
||||
"west": {"uv": [16, 2, 14, 14], "rotation": 90, "texture": "#4"},
|
||||
"up": {"uv": [2, 2, 0, 14], "rotation": 180, "texture": "#4"},
|
||||
"down": {"uv": [16, 2, 14, 14], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "side_frame",
|
||||
"from": [14, 0, 2],
|
||||
"to": [16, 2, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, -1, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 0, 0, 2], "rotation": 180, "texture": "#4"},
|
||||
"east": {"uv": [2, 2, 0, 14], "rotation": 90, "texture": "#3"},
|
||||
"south": {"uv": [2, 14, 0, 16], "texture": "#4"},
|
||||
"west": {"uv": [2, 2, 0, 14], "rotation": 90, "texture": "#4"},
|
||||
"up": {"uv": [2, 2, 0, 14], "texture": "#4"},
|
||||
"down": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "side_frame",
|
||||
"from": [14, 14, 2],
|
||||
"to": [16, 16, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, -1, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 2, 0, 0], "rotation": 180, "texture": "#4"},
|
||||
"east": {"uv": [0, 2, 2, 14], "rotation": 90, "texture": "#3"},
|
||||
"south": {"uv": [2, 16, 0, 14], "texture": "#4"},
|
||||
"west": {"uv": [0, 2, 2, 14], "rotation": 90, "texture": "#4"},
|
||||
"up": {"uv": [14, 2, 16, 14], "texture": "#4"},
|
||||
"down": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "side_frame",
|
||||
"from": [0, 0, 0],
|
||||
"to": [16, 2, 2],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, -1, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 14, 16, 16], "texture": "#3"},
|
||||
"east": {"uv": [0, 14, 2, 16], "rotation": 270, "texture": "#4"},
|
||||
"south": {"uv": [0, 0, 12, 2], "texture": "#4"},
|
||||
"west": {"uv": [14, 14, 16, 16], "rotation": 90, "texture": "#4"},
|
||||
"up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#4"},
|
||||
"down": {"uv": [0, 14, 16, 16], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "side_frame",
|
||||
"from": [0, 14, 0],
|
||||
"to": [16, 16, 2],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 13, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 2, 12, 0], "rotation": 180, "texture": "#4"},
|
||||
"east": {"uv": [0, 16, 2, 14], "rotation": 270, "texture": "#4"},
|
||||
"south": {"uv": [0, 16, 16, 14], "rotation": 180, "texture": "#3"},
|
||||
"west": {"uv": [14, 16, 16, 14], "rotation": 90, "texture": "#4"},
|
||||
"up": {"uv": [0, 16, 16, 14], "rotation": 180, "texture": "#4"},
|
||||
"down": {"uv": [0, 16, 16, 14], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "side_frame",
|
||||
"from": [0, 14, 14],
|
||||
"to": [16, 16, 16],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, -1, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#3"},
|
||||
"east": {"uv": [2, 14, 0, 16], "rotation": 270, "texture": "#4"},
|
||||
"south": {"uv": [0, 2, 12, 0], "texture": "#4"},
|
||||
"west": {"uv": [16, 14, 14, 16], "rotation": 90, "texture": "#4"},
|
||||
"up": {"uv": [16, 14, 0, 16], "rotation": 180, "texture": "#4"},
|
||||
"down": {"uv": [16, 14, 0, 16], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "side_frame",
|
||||
"from": [0, 0, 14],
|
||||
"to": [16, 2, 16],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 13, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 12, 2], "rotation": 180, "texture": "#4"},
|
||||
"east": {"uv": [2, 16, 0, 14], "rotation": 270, "texture": "#4"},
|
||||
"south": {"uv": [0, 2, 16, 0], "rotation": 180, "texture": "#3"},
|
||||
"west": {"uv": [16, 16, 14, 14], "rotation": 90, "texture": "#4"},
|
||||
"up": {"uv": [16, 16, 0, 14], "rotation": 180, "texture": "#4"},
|
||||
"down": {"uv": [16, 16, 0, 14], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 2, 0],
|
||||
"to": [16, 14, 16],
|
||||
"faces": {
|
||||
"north": {"uv": [0, 2, 16, 14], "texture": "#all"},
|
||||
"east": {"uv": [0, 2, 16, 14], "texture": "#all"},
|
||||
"south": {"uv": [0, 2, 16, 14], "texture": "#all"},
|
||||
"west": {"uv": [0, 2, 16, 14], "texture": "#all"},
|
||||
"up": {"uv": [0, 0, 16, 16], "texture": "#missing"},
|
||||
"down": {"uv": [0, 0, 16, 16], "texture": "#missing"}
|
||||
}
|
||||
}
|
||||
],
|
||||
"groups": [
|
||||
{
|
||||
"name": "group",
|
||||
"origin": [8, 8, 8],
|
||||
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
},
|
||||
{
|
||||
"name": "glass",
|
||||
"origin": [8, 8, 8],
|
||||
"children": [10]
|
||||
}
|
||||
]
|
||||
}
|
234
src/main/resources/assets/create/models/block/mirror/item.json
Normal file
234
src/main/resources/assets/create/models/block/mirror/item.json
Normal file
|
@ -0,0 +1,234 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"0": "create:block/axis",
|
||||
"1": "create:block/axis_top",
|
||||
"3": "create:block/gearbox_top",
|
||||
"4": "create:block/gearbox",
|
||||
"2_0": "create:block/symmetry_mirror",
|
||||
"particle": "create:item/refined_radiance"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "Mirror",
|
||||
"from": [2, 9.5, 2],
|
||||
"to": [14, 10.5, 14],
|
||||
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#2_0"},
|
||||
"east": {"uv": [3, 1, 4, 15], "rotation": 270, "texture": "#2_0"},
|
||||
"south": {"uv": [4, 1, 12, 2], "texture": "#2_0"},
|
||||
"west": {"uv": [12, 1, 13, 15], "rotation": 90, "texture": "#2_0"},
|
||||
"up": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#2_0"},
|
||||
"down": {"uv": [4, 1, 12, 15], "texture": "#2_0"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Axis",
|
||||
"from": [6, 6, 0],
|
||||
"to": [10, 10, 16],
|
||||
"shade": false,
|
||||
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1"},
|
||||
"east": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"},
|
||||
"south": {"uv": [6, 6, 10, 10], "texture": "#1"},
|
||||
"west": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"},
|
||||
"up": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"},
|
||||
"down": {"uv": [6, 0, 10, 16], "texture": "#0"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"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"},
|
||||
"up": {"uv": [0, 0, 1, 12], "rotation": 270, "texture": "#3"},
|
||||
"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": "#4"},
|
||||
"south": {"uv": [14, 2, 2, 14], "texture": "#4"},
|
||||
"up": {"uv": [1, 0, 0, 12], "rotation": 270, "texture": "#3"},
|
||||
"down": {"uv": [2, 12, 14, 11], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"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": "#4"},
|
||||
"east": {"uv": [0, 2, 2, 14], "texture": "#4"},
|
||||
"south": {"uv": [0, 2, 2, 14], "texture": "#4"},
|
||||
"west": {"uv": [14, 2, 16, 14], "texture": "#4"},
|
||||
"up": {"uv": [0, 14, 2, 16], "texture": "#4"},
|
||||
"down": {"uv": [0, 0, 2, 2], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "side_frame",
|
||||
"from": [0, 2, 0],
|
||||
"to": [2, 14, 2],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 2, 0, 14], "texture": "#4"},
|
||||
"east": {"uv": [2, 2, 0, 14], "texture": "#4"},
|
||||
"south": {"uv": [16, 2, 14, 14], "texture": "#4"},
|
||||
"west": {"uv": [16, 2, 14, 14], "texture": "#4"},
|
||||
"up": {"uv": [0, 16, 2, 14], "texture": "#4"},
|
||||
"down": {"uv": [0, 2, 2, 0], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"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": "#4"},
|
||||
"east": {"uv": [2, 2, 0, 14], "rotation": 180, "texture": "#3"},
|
||||
"south": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#4"},
|
||||
"west": {"uv": [2, 2, 0, 14], "texture": "#4"},
|
||||
"up": {"uv": [2, 14, 0, 16], "texture": "#4"},
|
||||
"down": {"uv": [2, 0, 0, 2], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"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": "#4"},
|
||||
"east": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#3"},
|
||||
"south": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#4"},
|
||||
"west": {"uv": [0, 2, 2, 14], "texture": "#4"},
|
||||
"up": {"uv": [2, 16, 0, 14], "texture": "#4"},
|
||||
"down": {"uv": [2, 2, 0, 0], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"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": "#4"},
|
||||
"east": {"uv": [0, 14, 2, 16], "texture": "#4"},
|
||||
"south": {"uv": [0, 14, 16, 16], "texture": "#4"},
|
||||
"west": {"uv": [14, 14, 16, 16], "texture": "#4"},
|
||||
"up": {"uv": [0, 0, 12, 2], "texture": "#4"},
|
||||
"down": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"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": "#4"},
|
||||
"east": {"uv": [0, 16, 2, 14], "texture": "#4"},
|
||||
"south": {"uv": [0, 16, 16, 14], "texture": "#4"},
|
||||
"west": {"uv": [14, 16, 16, 14], "texture": "#4"},
|
||||
"up": {"uv": [0, 16, 16, 14], "rotation": 180, "texture": "#3"},
|
||||
"down": {"uv": [0, 2, 12, 0], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"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": "#4"},
|
||||
"east": {"uv": [2, 14, 0, 16], "texture": "#4"},
|
||||
"south": {"uv": [16, 14, 0, 16], "texture": "#4"},
|
||||
"west": {"uv": [16, 14, 14, 16], "texture": "#4"},
|
||||
"up": {"uv": [0, 2, 12, 0], "texture": "#4"},
|
||||
"down": {"uv": [0, 14, 16, 16], "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"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": "#4"},
|
||||
"east": {"uv": [2, 16, 0, 14], "texture": "#4"},
|
||||
"south": {"uv": [16, 16, 0, 14], "texture": "#4"},
|
||||
"west": {"uv": [16, 16, 14, 14], "texture": "#4"},
|
||||
"up": {"uv": [0, 2, 16, 0], "rotation": 180, "texture": "#3"},
|
||||
"down": {"uv": [0, 0, 12, 2], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "front",
|
||||
"from": [1, 1, 2],
|
||||
"to": [3, 3, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]},
|
||||
"faces": {
|
||||
"east": {"uv": [2, 0, 14, 2], "texture": "#3"},
|
||||
"west": {"uv": [2, 14, 14, 16], "texture": "#3"},
|
||||
"up": {"uv": [2, 0, 14, 2], "rotation": 90, "texture": "#3"},
|
||||
"down": {"uv": [2, 14, 14, 16], "rotation": 90, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "front",
|
||||
"from": [13, 1, 2],
|
||||
"to": [15, 3, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]},
|
||||
"faces": {
|
||||
"east": {"uv": [14, 14, 2, 16], "texture": "#3"},
|
||||
"west": {"uv": [14, 0, 2, 2], "texture": "#3"},
|
||||
"up": {"uv": [2, 2, 14, 0], "rotation": 90, "texture": "#3"},
|
||||
"down": {"uv": [2, 16, 14, 14], "rotation": 90, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "front",
|
||||
"from": [13, 13, 2],
|
||||
"to": [15, 15, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]},
|
||||
"faces": {
|
||||
"east": {"uv": [14, 16, 2, 14], "texture": "#3"},
|
||||
"west": {"uv": [14, 2, 2, 0], "texture": "#3"},
|
||||
"up": {"uv": [14, 16, 2, 14], "rotation": 90, "texture": "#3"},
|
||||
"down": {"uv": [14, 2, 2, 0], "rotation": 90, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "front",
|
||||
"from": [1, 13, 2],
|
||||
"to": [3, 15, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]},
|
||||
"faces": {
|
||||
"east": {"uv": [2, 2, 14, 0], "texture": "#3"},
|
||||
"west": {"uv": [2, 16, 14, 14], "texture": "#3"},
|
||||
"up": {"uv": [14, 14, 2, 16], "rotation": 90, "texture": "#3"},
|
||||
"down": {"uv": [14, 0, 2, 2], "rotation": 90, "texture": "#3"}
|
||||
}
|
||||
}
|
||||
],
|
||||
"groups": [0, 1,
|
||||
{
|
||||
"name": "block",
|
||||
"origin": [8, 8, 8],
|
||||
"children": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"0": "create:block/axis",
|
||||
"1": "create:block/axis_top",
|
||||
"particle": "create:block/axis",
|
||||
"2_0": "create:block/symmetry_mirror"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "Mirror",
|
||||
"from": [2, 7.5, 2],
|
||||
"to": [14, 8.5, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [4, 1, 12, 2], "rotation": 180, "texture": "#2_0"},
|
||||
"east": {"uv": [3, 1, 4, 15], "rotation": 90, "texture": "#2_0"},
|
||||
"south": {"uv": [2, 2, 14, 14], "texture": "#2_0"},
|
||||
"west": {"uv": [12, 1, 13, 15], "rotation": 270, "texture": "#2_0"},
|
||||
"up": {"uv": [4, 1, 12, 15], "texture": "#2_0"},
|
||||
"down": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#2_0"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Axis",
|
||||
"from": [6, 6, 0],
|
||||
"to": [10, 10, 3],
|
||||
"shade": false,
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1"},
|
||||
"east": {"uv": [6, 0, 10, 3], "rotation": 90, "texture": "#0"},
|
||||
"south": {"uv": [6, 6, 10, 10], "texture": "#1"},
|
||||
"west": {"uv": [6, 0, 10, 3], "rotation": 270, "texture": "#0"},
|
||||
"up": {"uv": [6, 0, 10, 3], "texture": "#0"},
|
||||
"down": {"uv": [6, 0, 10, 3], "rotation": 180, "texture": "#0"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Axis",
|
||||
"from": [6, 6, 13],
|
||||
"to": [10, 10, 16],
|
||||
"shade": false,
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1"},
|
||||
"east": {"uv": [6, 13, 10, 16], "rotation": 90, "texture": "#0"},
|
||||
"south": {"uv": [6, 6, 10, 10], "texture": "#1"},
|
||||
"west": {"uv": [6, 13, 10, 16], "rotation": 270, "texture": "#0"},
|
||||
"up": {"uv": [6, 13, 10, 16], "texture": "#0"},
|
||||
"down": {"uv": [6, 13, 10, 16], "rotation": 180, "texture": "#0"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"texture_size": [32, 32],
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"0": "create:block/andesite_casing",
|
||||
"1": "create:block/beacon",
|
||||
"particle": "create:block/andesite_casing"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [3, 4, 3],
|
||||
"to": [13, 15, 13],
|
||||
"faces": {
|
||||
"north": {"uv": [9.5, 0.5, 14.5, 6], "texture": "#1"},
|
||||
"east": {"uv": [9.5, 0.5, 14.5, 6], "texture": "#1"},
|
||||
"south": {"uv": [9.5, 0.5, 14.5, 6], "texture": "#1"},
|
||||
"west": {"uv": [9.5, 0.5, 14.5, 6], "texture": "#1"},
|
||||
"up": {"uv": [1.5, 1.5, 6.5, 6.5], "texture": "#1"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [1, 4, 1],
|
||||
"to": [7, 16, 7],
|
||||
"faces": {
|
||||
"north": {"uv": [12.5, 0, 15.5, 6], "texture": "#1"},
|
||||
"east": {"uv": [3.5, 8, 0.5, 14], "texture": "#1"},
|
||||
"south": {"uv": [0.5, 8, 3.5, 14], "texture": "#1"},
|
||||
"west": {"uv": [8.5, 0, 11.5, 6], "texture": "#1"},
|
||||
"up": {"uv": [0.5, 0.5, 3.5, 3.5], "texture": "#1", "cullface": "up"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [9, 4, 1],
|
||||
"to": [15, 16, 7],
|
||||
"faces": {
|
||||
"north": {"uv": [8.5, 0, 11.5, 6], "texture": "#1"},
|
||||
"east": {"uv": [12.5, 0, 15.5, 6], "texture": "#1"},
|
||||
"south": {"uv": [3.5, 8, 0.5, 14], "texture": "#1"},
|
||||
"west": {"uv": [0.5, 8, 3.5, 14], "texture": "#1"},
|
||||
"up": {"uv": [4.5, 0.5, 7.5, 3.5], "texture": "#1", "cullface": "up"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [1, 4, 9],
|
||||
"to": [7, 16, 15],
|
||||
"faces": {
|
||||
"north": {"uv": [3.5, 8, 0.5, 14], "texture": "#1"},
|
||||
"east": {"uv": [0.5, 8, 3.5, 14], "texture": "#1"},
|
||||
"south": {"uv": [8.5, 0, 11.5, 6], "texture": "#1"},
|
||||
"west": {"uv": [12.5, 0, 15.5, 6], "texture": "#1"},
|
||||
"up": {"uv": [0.5, 4.5, 3.5, 7.5], "texture": "#1", "cullface": "up"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [9, 4, 9],
|
||||
"to": [15, 16, 15],
|
||||
"faces": {
|
||||
"north": {"uv": [0.5, 8, 3.5, 14], "texture": "#1"},
|
||||
"east": {"uv": [8.5, 0, 11.5, 6], "texture": "#1"},
|
||||
"south": {"uv": [12.5, 0, 15.5, 6], "texture": "#1"},
|
||||
"west": {"uv": [3.5, 8, 0.5, 14], "texture": "#1"},
|
||||
"up": {"uv": [4.5, 4.5, 7.5, 7.5], "texture": "#1", "cullface": "up"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 0, 0],
|
||||
"to": [16, 4, 16],
|
||||
"faces": {
|
||||
"north": {"uv": [8, 6, 16, 8], "texture": "#1", "cullface": "north"},
|
||||
"east": {"uv": [8, 6, 16, 8], "texture": "#1", "cullface": "east"},
|
||||
"south": {"uv": [8, 6, 16, 8], "texture": "#1", "cullface": "south"},
|
||||
"west": {"uv": [8, 6, 16, 8], "texture": "#1", "cullface": "west"},
|
||||
"up": {"uv": [8, 8, 16, 16], "texture": "#1"},
|
||||
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
BIN
src/main/resources/assets/create/textures/block/aligner.png
Normal file
BIN
src/main/resources/assets/create/textures/block/aligner.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.1 KiB |
BIN
src/main/resources/assets/create/textures/block/beacon.png
Normal file
BIN
src/main/resources/assets/create/textures/block/beacon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1 KiB |
|
@ -1,23 +1,26 @@
|
|||
{
|
||||
"required": true,
|
||||
"priority": 1100,
|
||||
"package": "com.simibubi.create.foundation.mixin",
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"refmap": "create.refmap.json",
|
||||
"client": [
|
||||
"TileWorldHookMixin",
|
||||
"CancelTileEntityRenderMixin",
|
||||
"FogColorTrackerMixin",
|
||||
"LightUpdateMixin",
|
||||
"NetworkLightUpdateMixin",
|
||||
"RenderHooksMixin",
|
||||
"ShaderCloseMixin",
|
||||
"TileRemoveMixin",
|
||||
"EntityContraptionInteractionMixin",
|
||||
"StoreProjectionMatrixMixin"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
},
|
||||
"minVersion": "0.8"
|
||||
"required": true,
|
||||
"priority": 1100,
|
||||
"package": "com.simibubi.create.foundation.mixin",
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"refmap": "create.refmap.json",
|
||||
"client": [
|
||||
"CancelTileEntityRenderMixin",
|
||||
"EntityContraptionInteractionMixin",
|
||||
"FogColorTrackerMixin",
|
||||
"LightUpdateMixin",
|
||||
"NetworkLightUpdateMixin",
|
||||
"RenderHooksMixin",
|
||||
"ShaderCloseMixin",
|
||||
"StoreProjectionMatrixMixin",
|
||||
"TileRemoveMixin",
|
||||
"TileWorldHookMixin"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
},
|
||||
"minVersion": "0.8",
|
||||
"mixins": [
|
||||
"LightHandlersAreSolidToBeaconsMixin"
|
||||
]
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue