Compare commits

...

28 commits

Author SHA1 Message Date
grimmauld 61d645c354 random touchups 2021-04-23 22:42:34 +02:00
grimmauld 0c89eb0279 Hopefully fix some weirdness 2021-04-23 21:35:01 +02:00
grimmauld a0f01b733d Fix aligners taking beams from sides they shouldn't take a beam from 2021-04-23 15:33:25 +02:00
grimmauld d2dc576644 Forgot some files 2021-04-23 09:36:59 +02:00
grimmauld 557a496929 Added radiant beacon in code 2021-04-23 09:26:55 +02:00
Daniel Amberson 589e4146dc andesite gay box!
gay andesite box!
2021-04-22 16:15:34 -05:00
grimmauld 68bc9c6921 Fix some instanced rendering 2021-04-22 22:47:43 +02:00
grimmauld 273fe8ebf1 Add the aligner
-> still needs some better color combination logic
2021-04-22 22:21:05 +02:00
grimmauld 352ad95a84 Add some more configurability and light emitter behaviour 2021-04-22 17:05:02 +02:00
grimmauld 0bc2d1f684 Basic instancing for the mirror 2021-04-21 11:55:03 +02:00
grimmauld 869d68ac27 Do some more shuffling and splitting, add LightAcceptingBehaviour 2021-04-21 09:39:51 +02:00
grimmauld 19fa27c54b Do some packaging for easier maintenance 2021-04-20 23:55:17 +02:00
grimmauld 838eeeee10 Declutter and distribute for easier new additions 2021-04-20 21:47:26 +02:00
grimmauld 4fa551b452 Merge sound stuff 2021-04-20 18:04:30 +02:00
grimmauld 0dd72c236b Move mirroring to tile entity behavior 2021-04-20 14:26:49 +02:00
grimmauld 8e33eade50 Add rotation mode selector 2021-04-20 13:23:40 +02:00
grimmauld a2e2e2a313 Fix weird recursions in specific setups, Fix normal calculation being broken on mirrors placed with axis y 2021-04-20 11:43:57 +02:00
grimmauld 19129c321f Do some reliability improvements 2021-04-20 01:15:38 +02:00
grimmauld 2b3fb358ad Fix a bunch of stuff, mirroring colors now works correctly 2021-04-19 18:27:53 +02:00
grimmauld 5d54ed4682 Fix some rendering, update model 2021-04-19 12:13:36 +02:00
grimmauld dbede41eba Finally, a properly working state (reflection maths is still of by a bit) 2021-04-19 09:58:11 +02:00
grimmauld 8fd59b17b9 Some rendering improvements, including beam flare 2021-04-18 20:37:07 +02:00
grimmauld ea75b310c4 Fancy beam flare 2021-04-18 18:58:57 +02:00
grimmauld 00e3286ad9 Finally, properly angled beams 2021-04-18 17:30:29 +02:00
grimmauld ff6b80ee9f Angle aligned rotation 2021-04-17 23:05:24 +02:00
grimmauld 53e1f0f416 VERY crude rendering of mirror beams (A LOT of things are broken!) 2021-04-17 21:24:38 +02:00
grimmauld 6326215fc5 Add mirror block to code 2021-04-17 14:31:07 +02:00
grimmauld 6f226f48eb Add models of mirror 2021-04-17 10:41:33 +02:00
68 changed files with 2593 additions and 91 deletions

View file

@ -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

View file

@ -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
}
}
}

View file

@ -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
}
}
}

View file

@ -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
}
}
}

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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": "赤色のバルブハンドル",

View file

@ -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": "빨간색 밸브 손잡이",

View file

@ -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",

View file

@ -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",

View file

@ -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": "Красный ручной вентиль",

View file

@ -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": "红色阀门手轮",

View file

@ -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": "紅色閥門開關",

View file

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

View file

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

View file

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

View file

@ -28,8 +28,8 @@
"trigger": "create:bracket_apply",
"conditions": {
"accepted_entries": [
"create:large_cogwheel",
"create:cogwheel"
"create:cogwheel",
"create:large_cogwheel"
]
}
},

View file

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

View file

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

View file

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

View file

@ -0,0 +1,13 @@
{
"type": "create:pressing",
"ingredients": [
{
"item": "minecraft:ghast_tear"
}
],
"results": [
{
"item": "minecraft:lily_pad"
}
]
}

View file

@ -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",

View file

@ -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"),

View file

@ -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"))))

View file

@ -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)

View file

@ -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;

View file

@ -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),

View file

@ -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);

View 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;
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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);
}

View file

@ -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);
}
}

View file

@ -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();
}
}

View file

@ -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());
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}

View file

@ -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();
}
}

View file

@ -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;
}
}

View file

@ -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);
}
}
}

View file

@ -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));
;

View file

@ -59,6 +59,7 @@ public class ItemDescription {
Red(DARK_RED, RED),
Purple(DARK_PURPLE, LIGHT_PURPLE),
Gray(DARK_GRAY, GRAY),
White(WHITE, AQUA)
;

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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();
}
}

View 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"}
}
}
]
}

View 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]
}
]
}

View 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]
}
]
}

View file

@ -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"}
}
}
]
}

View file

@ -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"}
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -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"
]
}