From 273fe8ebf19307ed919f056ff63b4725bb7387f2 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Thu, 22 Apr 2021 22:21:05 +0200 Subject: [PATCH] Add the aligner -> still needs some better color combination logic --- src/generated/resources/.cache/cache | 35 +++--- .../assets/create/blockstates/aligner.json | 30 +++++ .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../assets/create/lang/unfinished/de_de.json | 3 +- .../assets/create/lang/unfinished/es_es.json | 3 +- .../assets/create/lang/unfinished/es_mx.json | 3 +- .../assets/create/lang/unfinished/fr_fr.json | 3 +- .../assets/create/lang/unfinished/it_it.json | 3 +- .../assets/create/lang/unfinished/ja_jp.json | 3 +- .../assets/create/lang/unfinished/ko_kr.json | 3 +- .../assets/create/lang/unfinished/nl_nl.json | 3 +- .../assets/create/lang/unfinished/pt_br.json | 3 +- .../assets/create/lang/unfinished/ru_ru.json | 3 +- .../assets/create/lang/unfinished/zh_cn.json | 3 +- .../assets/create/lang/unfinished/zh_tw.json | 3 +- .../assets/create/models/item/aligner.json | 3 + .../data/create/advancements/aesthetics.json | 4 +- .../create/loot_tables/blocks/aligner.json | 19 +++ .../data/create/tags/blocks/safe_nbt.json | 1 + .../java/com/simibubi/create/AllBlocks.java | 12 ++ .../com/simibubi/create/AllTileEntities.java | 8 ++ .../simibubi/create/content/optics/Beam.java | 4 +- .../create/content/optics/ILightHandler.java | 6 +- .../optics/aligner/AlignerBehaviour.java | 111 ++++++++++++++++++ .../content/optics/aligner/AlignerBlock.java | 36 ++++++ .../optics/aligner/AlignerRenderer.java | 20 ++++ .../optics/aligner/AlignerTileEntity.java | 29 +++++ .../AbstractLightHandlingBehaviour.java | 21 +++- .../AbstractLightRelayBehaviour.java | 1 + .../behaviour/LightAcceptingBehaviour.java | 4 +- .../behaviour/LightEmittingBehaviour.java | 4 +- .../assets/create/models/block/aligner.json | 22 ++++ .../assets/create/textures/block/aligner.png | Bin 0 -> 9345 bytes 34 files changed, 365 insertions(+), 43 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/aligner.json create mode 100644 src/generated/resources/assets/create/models/item/aligner.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/aligner.json create mode 100644 src/main/java/com/simibubi/create/content/optics/aligner/AlignerBehaviour.java create mode 100644 src/main/java/com/simibubi/create/content/optics/aligner/AlignerBlock.java create mode 100644 src/main/java/com/simibubi/create/content/optics/aligner/AlignerRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/optics/aligner/AlignerTileEntity.java create mode 100644 src/main/resources/assets/create/models/block/aligner.json create mode 100644 src/main/resources/assets/create/textures/block/aligner.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index fc19ea682..b840aaa5c 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -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 @@ -407,20 +408,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 -4ab580b05eecdd48750cb873b7c7ef98a048915b assets/create/lang/en_ud.json -304611e751ede140c40f1bd6aabe5deedb1a972d assets/create/lang/en_us.json -8a5eabaddf94e00aba82aefb2589dfbbeca256aa assets/create/lang/unfinished/de_de.json -8f517f0bf301df8bbd4e593c8d01988a84b5f347 assets/create/lang/unfinished/es_es.json -72228d3f96a2b64e7659fe3e074818565fc7c5ab assets/create/lang/unfinished/es_mx.json -a4dfe786b3a3b8fbc7b2b8f5f7e0ae651aba8b68 assets/create/lang/unfinished/fr_fr.json -1043d68f4cdf0e3bae33a0fdc1c674abe31957f2 assets/create/lang/unfinished/it_it.json -2ffbf79be01436647b5baacb80bce6fc83c5f972 assets/create/lang/unfinished/ja_jp.json -9ab33a11eaa36e4abb4be64421067160ee276ff0 assets/create/lang/unfinished/ko_kr.json -9c73e2832455a07bc65e5a8c52894085ffa5a59e assets/create/lang/unfinished/nl_nl.json -ad1f915a8caeebc2f1c2e3224b1ff3a244922da9 assets/create/lang/unfinished/pt_br.json -d1421f69f733e2fedf16817a02d222775ef450a1 assets/create/lang/unfinished/ru_ru.json -c1b8459be62f7656d8f8d63066f4a5c3ea68f187 assets/create/lang/unfinished/zh_cn.json -ed026aacde00bfb9da6ae50b0778d166a6b84152 assets/create/lang/unfinished/zh_tw.json +b3733c1c460f4d2b4fddff0212681be767de1921 assets/create/lang/en_ud.json +f8405603b4fa68aaeab35f6ef49a9c176c5eef84 assets/create/lang/en_us.json +ce8d5dd6e8d6b75e2e843c601ecebb71d9453b7a assets/create/lang/unfinished/de_de.json +e9b570d56c072066839af8f1e506fe49339efccf assets/create/lang/unfinished/es_es.json +a0d535713a3706eb423981b5fa1cd045ad8ccc25 assets/create/lang/unfinished/es_mx.json +737755d8092eb2080834740523275fcfeeb95641 assets/create/lang/unfinished/fr_fr.json +94b87d5209f7cf41ce351974ee3b7dfcc350c2ee assets/create/lang/unfinished/it_it.json +08c52b18c705b90df4a60003e22d9e06234d98a3 assets/create/lang/unfinished/ja_jp.json +ec8840b32956f5b24417a12b301b911aab840093 assets/create/lang/unfinished/ko_kr.json +6b479c419f686af54d1d26bc12b3d001440e470e assets/create/lang/unfinished/nl_nl.json +f575ce2953234532321b8eabfd56f479bd96ce54 assets/create/lang/unfinished/pt_br.json +5ae527b03c101aca3f09f4ff5121cc17ccb2c789 assets/create/lang/unfinished/ru_ru.json +597454ac322e5298b845cf96c2b58954eebfe5ae assets/create/lang/unfinished/zh_cn.json +645e15ab013c7fc7d92052f9e79ea721d8d5b90d 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 @@ -1205,6 +1206,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 @@ -1651,7 +1653,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 -0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json +5d0cc4c0255dc241e61c173b31ddca70c88d08e4 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 @@ -2380,6 +2382,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 @@ -3650,7 +3653,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 -834b0ba683dac15d2decb80c34214b98cb2be67f data/create/tags/blocks/safe_nbt.json +0476240204d2a82ab9cba82649b7261a89c3acbe 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 diff --git a/src/generated/resources/assets/create/blockstates/aligner.json b/src/generated/resources/assets/create/blockstates/aligner.json new file mode 100644 index 000000000..cc27ede1b --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/aligner.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/aligner", + "x": 180 + }, + "facing=up": { + "model": "create:block/aligner" + }, + "facing=north": { + "model": "create:block/aligner", + "x": 90 + }, + "facing=south": { + "model": "create:block/aligner", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/aligner", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/aligner", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index c3788c0ae..30d4ae1d8 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -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", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f7f0cb2f5..467e77c60 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -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", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 3e93d2d93..d869a91a4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 922", + "_": "Missing Localizations: 923", "_": "->------------------------] 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", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index d5bd33b6e..5b17474c9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 615", + "_": "Missing Localizations: 616", "_": "->------------------------] 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", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index c857f2dde..04806fdf5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1273", + "_": "Missing Localizations: 1274", "_": "->------------------------] 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", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 50101e239..37ec06752 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1172", + "_": "Missing Localizations: 1173", "_": "->------------------------] 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", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 076425b77..229f597c7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 632", + "_": "Missing Localizations: 633", "_": "->------------------------] 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", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index f56ed8491..0c5e4dee5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 614", + "_": "Missing Localizations: 615", "_": "->------------------------] 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": "安山岩レンガ", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 3c60747e3..7e439320e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 685", + "_": "Missing Localizations: 686", "_": "->------------------------] 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": "안산암 벽돌", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index d270049f9..e7da42894 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1562", + "_": "Missing Localizations: 1563", "_": "->------------------------] 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", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 4c03ebdcb..c1d6efe37 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1616", + "_": "Missing Localizations: 1617", "_": "->------------------------] 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", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index a015dd818..12809365a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 529", + "_": "Missing Localizations: 530", "_": "->------------------------] 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": "Андезитовый кирпич", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 878836994..47e704e78 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 629", + "_": "Missing Localizations: 630", "_": "->------------------------] 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": "安山岩砖", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index fadeabd97..b037a8f84 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 634", + "_": "Missing Localizations: 635", "_": "->------------------------] 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": "安山岩磚", diff --git a/src/generated/resources/assets/create/models/item/aligner.json b/src/generated/resources/assets/create/models/item/aligner.json new file mode 100644 index 000000000..cbb21a4a8 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/aligner.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/aligner" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index d723cbe38..59a86f429 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:cogwheel", - "create:large_cogwheel" + "create:large_cogwheel", + "create:cogwheel" ] } }, diff --git a/src/generated/resources/data/create/loot_tables/blocks/aligner.json b/src/generated/resources/data/create/loot_tables/blocks/aligner.json new file mode 100644 index 000000000..4881e9b97 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/aligner.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:aligner" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/safe_nbt.json b/src/generated/resources/data/create/tags/blocks/safe_nbt.json index beda7fb53..0e86c5c10 100644 --- a/src/generated/resources/data/create/tags/blocks/safe_nbt.json +++ b/src/generated/resources/data/create/tags/blocks/safe_nbt.json @@ -16,6 +16,7 @@ "create:sequenced_gearshift", "create:rotation_speed_controller", "create:mirror", + "create:aligner", "create:andesite_funnel", "create:andesite_belt_funnel", "create:brass_funnel", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index cad54fe69..2a996c94c 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -154,6 +154,7 @@ 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.schematics.block.SchematicTableBlock; import com.simibubi.create.content.schematics.block.SchematicannonBlock; @@ -1118,6 +1119,17 @@ public class AllBlocks { .transform(customItemModel()) .register(); + public static final BlockEntry 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(); + + // Logistics static { diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 51996b25a..5838ec672 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -149,6 +149,8 @@ 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.aligner.AlignerRenderer; +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; @@ -593,6 +595,12 @@ public class AllTileEntities { .renderer(() -> MirrorRenderer::new) .register(); + public static final TileEntityEntry ALIGNER = Create.registrate() + .tileEntity("aligner", AlignerTileEntity::new) + .validBlocks(AllBlocks.ALIGNER) + .renderer(() -> AlignerRenderer::new) + .register(); + // Logistics public static final TileEntityEntry REDSTONE_LINK = Create.registrate() .tileEntity("redstone_link", RedstoneLinkTileEntity::new) diff --git a/src/main/java/com/simibubi/create/content/optics/Beam.java b/src/main/java/com/simibubi/create/content/optics/Beam.java index 7eddb2ee7..c5b62c805 100644 --- a/src/main/java/com/simibubi/create/content/optics/Beam.java +++ b/src/main/java/com/simibubi/create/content/optics/Beam.java @@ -88,9 +88,7 @@ public class Beam extends ArrayList { } public boolean isRemoved() { - ILightHandler handler = getHandler(); - removed = removed || isEmpty() || handler == null || handler.getTile() - .isRemoved() || (parent != null && parent.isRemovedSimple()); + removed = isRemovedSimple() || (parent != null && parent.isRemovedSimple()); return removed; } diff --git a/src/main/java/com/simibubi/create/content/optics/ILightHandler.java b/src/main/java/com/simibubi/create/content/optics/ILightHandler.java index f50847e8f..d7ea5ca53 100644 --- a/src/main/java/com/simibubi/create/content/optics/ILightHandler.java +++ b/src/main/java/com/simibubi/create/content/optics/ILightHandler.java @@ -25,16 +25,16 @@ public interface ILightHandler { } default Beam constructOutBeam(@Nullable Beam parent, Vector3d beamDirection) { - return constructOutBeam(parent, beamDirection, getBlockPos()); + return constructOutBeam(parent, beamDirection, getBlockPos(), DyeColor.WHITE.getColorComponentValues()); } - default Beam constructOutBeam(@Nullable Beam parent, Vector3d beamDirection, BlockPos testBlockPos) { + 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 ? DyeColor.WHITE.getColorComponentValues() : parent.getColorAt(testBlockPos); + float[] segmentColor = parent == null ? colorComponentValues : parent.getColorAt(testBlockPos); Vector3d direction = VecHelper.step(beamDirection); Vector3d testPos = VecHelper.getCenterOf(testBlockPos); diff --git a/src/main/java/com/simibubi/create/content/optics/aligner/AlignerBehaviour.java b/src/main/java/com/simibubi/create/content/optics/aligner/AlignerBehaviour.java new file mode 100644 index 000000000..02c60de88 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/optics/aligner/AlignerBehaviour.java @@ -0,0 +1,111 @@ +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.Nonnull; +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 { + public static final BehaviourType 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::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; + } + + @Nonnull + @Override + public Direction getBeamRotationAround() { + return Direction.getFacingFromAxisDirection(getFacing().getAxis(), Direction.AxisDirection.POSITIVE); + } + + private Direction getFacing() { + return tileEntity.getBlockState() + .get(BlockStateProperties.FACING); + } + + private Vector3d getFacingVec() { + return Vector3d.of(getFacing().getDirectionVec()); + } + + @Override + public Stream constructSubBeams(Beam beam) { + Vector3d beamDir = beam.getDirection(); + if (!beam.isRemoved() && beamDir != null && AngleHelper.deg(Math.cos(beamDir.dotProduct(getFacingVec()))) < 60) { + beams.add(beam); + requestBeamUpdate(); + } + + return Stream.empty(); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + + @Override + public Iterator getRenderBeams() { + return Iterators.concat(super.getRenderBeams(), collectedBeam == null ? Collections.emptyIterator() : Collections.singleton(collectedBeam) + .iterator()); + } +} diff --git a/src/main/java/com/simibubi/create/content/optics/aligner/AlignerBlock.java b/src/main/java/com/simibubi/create/content/optics/aligner/AlignerBlock.java new file mode 100644 index 000000000..0d35b5b1c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/optics/aligner/AlignerBlock.java @@ -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 { + public AlignerBlock(Properties properties) { + super(properties); + setDefaultState(getDefaultState().with(FACING, Direction.DOWN)); + } + + @Override + public Class 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(); + } +} diff --git a/src/main/java/com/simibubi/create/content/optics/aligner/AlignerRenderer.java b/src/main/java/com/simibubi/create/content/optics/aligner/AlignerRenderer.java new file mode 100644 index 000000000..3b9d7ce92 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/optics/aligner/AlignerRenderer.java @@ -0,0 +1,20 @@ +package com.simibubi.create.content.optics.aligner; + +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; + +public class AlignerRenderer extends SafeTileEntityRenderer { + public AlignerRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(AlignerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + te.getHandler() + .getRenderBeams() + .forEachRemaining(beam -> beam.render(ms, buffer, partialTicks)); + } +} diff --git a/src/main/java/com/simibubi/create/content/optics/aligner/AlignerTileEntity.java b/src/main/java/com/simibubi/create/content/optics/aligner/AlignerTileEntity.java new file mode 100644 index 000000000..b6d2b840b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/optics/aligner/AlignerTileEntity.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.optics.aligner; + +import java.util.List; + +import com.simibubi.create.content.optics.ILightHandler; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; + +import net.minecraft.tileentity.TileEntityType; + +public class AlignerTileEntity extends SmartTileEntity implements ILightHandler.ILightHandlerProvider { + protected AlignerBehaviour aligner; + + public AlignerTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + setLazyTickRate(20); + } + + @Override + public void addBehaviours(List behaviours) { + aligner = new AlignerBehaviour(this); + behaviours.add(aligner); + } + + @Override + public ILightHandler getHandler() { + return aligner; + } +} diff --git a/src/main/java/com/simibubi/create/content/optics/behaviour/AbstractLightHandlingBehaviour.java b/src/main/java/com/simibubi/create/content/optics/behaviour/AbstractLightHandlingBehaviour.java index af069d0af..eb9af8dd0 100644 --- a/src/main/java/com/simibubi/create/content/optics/behaviour/AbstractLightHandlingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/optics/behaviour/AbstractLightHandlingBehaviour.java @@ -14,6 +14,7 @@ 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; @@ -21,9 +22,11 @@ public abstract class AbstractLightHandlingBehaviour beams; + @Nullable protected Beam beaconBeam = null; @Nullable protected BeaconTileEntity beacon; + boolean needsBeamUpdate = false; protected AbstractLightHandlingBehaviour(T te, LightHandlingbehaviourProperties properties) { super(te); @@ -37,6 +40,8 @@ public abstract class AbstractLightHandlingBehaviour getRenderBeams() { @@ -87,6 +100,8 @@ public abstract class AbstractLightHandlingBehaviour extends AbstractLightHandlingBehaviour { - public static final BehaviourType TYPE = new BehaviourType<>(); + public static final BehaviourType> TYPE = new BehaviourType<>(); boolean isUpdating = false; public LightAcceptingBehaviour(T te, LightHandlingbehaviourProperties properties) { @@ -27,6 +26,7 @@ public class LightAcceptingBehaviour extends AbstractLightHandlingBehaviour { - public static final BehaviourType TYPE = new BehaviourType<>(); + public static final BehaviourType> TYPE = new BehaviourType<>(); boolean updating = false; @@ -34,6 +33,7 @@ public class LightEmittingBehaviour+n-Sojj!cdnmLLNBvVLEcmfVc^C9DaIB&cY0N~w|e;a?p z7PdR|`{Eud%S@w3sa_NJ=*pr*%8~fIj~M+^@jbr#4{u3?b1aA5_JzwF1`3hL% zmW>cruYi>LV7Xsbr@r=fdq1B|2}BI8Wv`DeR#A_WceUc03+HFoXXLA?<4Jer1m3Rt zf&&8D2HiH-i0SXNG=&->mJ@O+k8*DM^q&)0a<)}^V)M)$^?9uHlWK0OMn>Uhf{)Rc zif_|!p^7K`Q!KM|a`nP=O7?-}*4u5c@bim77i1M$v?b4Hx1EdYzwWTw5b)sj`KZ@p zO&iS{Bu$RhGE(V$vHarLO5?ihM$hW#)0M{8sDLw@6Pr?A0evm&eXzU)>X+j3gYvS? zg+`T6D6PUOWS`PPoO)Pb_##E)nu%g6oqyq_Z%8Yx*{6nLM{D$?e|T0marCI(bN_+y zjU%Q{t+eNxTOGMQBGyWWxcF?-_@5)anduvKLiBe;df9|Dmt38}?5!rLK|P1>wPU1X zaQ$bVEnQKCMU7mcx6xRRvdBt2FY2h{g;wXDb6Yg_ zpx-yyEaP_OySxV)ZW(J{E3HN7&#vXX=*uaU6+@BE&5HBAxJG#mi)|+!xqMf=_QjlNj^1e@vSNP z&6OFWq)dgP^Xaeh?p9=z({EQ?>fU*wZ1Axue*H+;48W7Do+F}YZ+?8-m-R( zUd_1my?2~)I_a<2gwKOMTQ~D^gLv?j8dT2eoUl=_gWS(d%~RL1$&7GSWG)jqzPs`w z%D*6(*?G)JW8W**^ecWhyiUb<3pZ%VOw#9HKJ1KAVl$rgGnXpkd$h}K_kCQ$U25O@ z(<}9a7eZ$Z1uFHs?4|mad(PCf)uhgSP^KO_J`H8Jy|PF+s>WYhGXN8zAe zh)U?iSXHl;$im43qNb5I(6b<69tu1WL=X!b=u(kN^8b*;@%aMVr9(9{Blkro<9HzP z6To3kAli@Cv8QvR$8Qqt^UD%-pvBm8cho~ zGk5#Nlzl-8KertqjPbv(7boOpS0dS+K4jzNQ(qQ}R)2+;Bu&&Po&69%;a3EIdH$#sj(|){N(-<=ikb6o$evp-mrhU6#eKdR-9crnm>EV;#K(J!t+{Z zUoSpb8#KNr%whiSb1@$qiHqg=hl9;B7p_ZA3u%SH_>E<+8zYWbUp=;_GA}pxz))A! zFLY%Gb7w1e8-^IkqWGCfrxfAVfq%4DvGk^n%~f{wINzkY+>LZlEiAa1S>45+Y0e_(4l=q;o??_Lwy&c0c2sVRj0BSAd&nn%Uph7WIKl{Z1cXL`u? zGVy7w@mNXE5Jg^1%Djp#w^bT@zW%Vnr0-$wny~R6pchWO$-6@=!6%dXsYB`ahpg;D z%*x2(y)~eUohxp@&T@&11tiIP%XJ$C-u`(}frm=lFMGj7Y zrs79&ve|NN<#}QUxIdIs@A=Go@l=VL<%`h~DL}1( zjn#$6d4s#7>&LmSCyi!Z2nJk>IF{qn-W*-53kO@FzNLyVC4&c&h5_zfwDFZm2ZHt+ zAk$-+hgXIw93BuCYu47Z3MU4X{G`SxRwCk}-wcdTZ0`CR?}@esiGtN%Dg)Sk(GD3( zE=#rE0!N&2jaqLG%}NSmBV)CjqUS!h9A7>S%i&OT-&HeogC*M{XF_Z!DdvPB48r>` zo_(5YEdnEW+JaylfaM@)u zg`Q^$y%(fy*d)g~sDzIWn7Dh3?wMc2Wj%GNFJtgwdp(y6?>pBhee=5mHiq3sku3CL zV&J~gWmjOvYiRj9L0=P4SAYc(T9H3@)?8^#QhG^&X--yprw@Dfa&-7E>pQy&E~v#! z5?{%5GY4uDZ2>p;Mk_bHJQyM*G;gmcU(By-e668|mGy1=rOfEQI3Gt7J6hqnh87uv zhXW2b`^)f!7x%}VUlP-%|^7gzzM~3 z`5J!IEy1?0bi%<`=D5kpGdyQ@Hl9D7yfX&Owdbg!WN!ETkw+!f?I-u^;h&a|+b_75 zF7U@L=#(6;5GwxiRL~?9_gKduSTARx_~eax1FgoBH*6*%j1Jg&ioG+t;M&1+j56Fq zPKw|CR_MZw=tJI%=hS+xt!2AT)%qQ?J^jjI>W+*(y=|^4e$F}nn(V&3Gk~J;W#)oO zaq*|DhP~1Et{cj(#4d2g`ZXIB=K+w?xg#kw7%t!i_A zY_~KPt7b(VH=CHB(}PyKnGb26UyozjcjWFDP1iuLN6$Ww3(23 zM=||r7<*Ty*($&C{Bq>V4%qjE0rk0QVYzEcW634?9a8hYYOdA6Az{O^iMn}a!N{gO z&tOUBiH~jf%#{^!HHGRY!jN{k%Dn!eoOx5$5zyZ>ftk(5qQ4K zQ-6U1NmQ}Ag1~qPJ(j)fl7T?T%J55lWhnT2rprvb!HTP1Ci||EjITQ-1f0G&gv#6_ zb*A_erI}?C+}kSHZ)OTg2lG0bHB8UHXcT4l67f{=`>JmbAy<_2M-6cow_hzoxcfhJ zykwH7_fdCe(yjSU{k-&JUoFc5^B=!W6OzxXk(5MS8BLljeD{c_#%>SMytBZC*cw`P zi|u{Sf%SWNrD@3;k9Ya#iGF*LY-YK}g((1y9s-Z{paU>Xwr-R0*1)@fykt%0pr?a& zpt&8T6aA7&pWn#DwMkUVihRr2(9{+ZSxT%Ak#;})I-fp3jrVQbby4ZTRa%Ar#R~_A zja=BD3EP~%M!0Yh&pKz)8Ig6(xxG@t#$s~s+lW*Va#WtX$jNSl(-W5x+yz~C*rFe{ z?&dqeHq(}R9rV!cw3AjZ0_k{A`|&#-rE8W6X>SwRT7}BjxNUt_J@@Xfxd*Z;$MIkv-dF_N|q@wIo_L+;xDvvV&4q% zieUfgwUjwYyv@!Sg=y7Et`=>B!(zO72&uE40bZm>8&GwRrcGO6hXHfpStb87RY{Mc zEWKjKdY4|dWmVQ}KL3JUE+5Yid#vKgCMjx?5tP*-#oF1~ala}n%-mqq%j}bHXIQfQ znsPju95~Cgn618&%+-{#)=!rO2Tq3cl~q+em;gn$M_G@@9K4%mMJ>8tTWKl#ac!g0 zbU6r}`h7sGU1Mqgq4aigT7dA#=ZMkh^cb(M*Z}Wxo3e0|%s7ea{F}Ebj$hJ$d&BPK zit5fahvyWIo=L~j_JWUA&bG%giaX|By9Qk|uZVL=Z&Ygs^H$SZ(5Dw2{JuvW#w4FM z1ps!0;Isdm&ef3w9R-16Otoj*e!Ii%V?ENjJhJsoJsHAy)hAE74OA8%ar5c5|u8W3lFowPNT8@2e?n#W&LU zO$06pp3XQgHubQ^=Ss0n?t?DGDp!aPQKH#1A>%TJgX4&pmL50G(oxJXPcI^T&vc#I zx5JSdNZH$VI50&fl~eG>5Zm{VzK;oExkzOxVdkgj2N4hfEOlDu?CUD*;0ErtJe4VTkICD*y;Q3!zY_{ z6@LKq&D#ZTGMW9Vpp@Uop^u2<$_>A)w|zXGXDB%_^G}Zf0K9&9#_95`(J45FM3hBg zNobs`H<8RZeF6Y#8s20S#tlaUqH)f6cZB$C`Ezj~9*YpSQZxb^k+pFycmrPw&cfH& z665QJfnmip)H&6>;S2&Ij)nqy6AA8AxHm$4n-|Ww-V)1+1GgbGH-z|EBU7L@iGl+v z$STN!LAu^}FQ~XWCs2)ob%LAg=>4Q%j1b~3G#VK$Cr78#W$E&=B#N^f1O|i2fuV9x zD2RaoQGMKLC~uHE_3#$O4-Oq16+^+3X?T)5aElX#CVA2j;^K^X;7@YKEJoLxA^d4z zYrIWQrD5fejDZ4UJq&;x6bx1YfuSHMOzu~G#;lRi@7nIvpHXDQQ_dSjmV?NG<%q;T zX;5jpUVqs8ry5jC#vxzM97iR2QZP7OFPuB=@UKS61W)R(Ha)4hEz!2$1gw)B!>Mh{ zzv}2CjZA;n*$SgGo=D!-*h2q`#A1HOkv%DdZ44G8ha=#K3`eL8X2_rLG`!Ov3HsA| zwr2jp5r(DA3pzvQ&3bvfidzZ$S+h#cPb6#j=^nFG00`{3?5}PSYF;q83$riFB+tP zk;j2lU|0wUtmLGCLE~@=FnQcB6ebirqZ3esU%lF*!ZN5ZPAbYcG!6q&QHClpyio)* zuD}=&1O%H;@INqFxRB`X|2v*Ppue+dQfPD%#m$6bf_BAWX#bk$pMig8 zGH2{|R2szx`EM5W-*9R_3f6$3OQQJvV&4Mi@niI3OCsR6Lj?qGZv$`?=12IcC@&m# zI|Yn5{+PnJpxm8tjQ#d!v;8K=|C2(7s=#nCWefxaRg#B+6r6DKAee%(Jfp4^Vah5v z6jn*)M@9V3P9-_f=qL(K)0t5Nj65@%YdgSme75|a#pV|MGccTKUiJ{@<4e zgUc(!6=Aen<t zw&1^0{}uK_Tbo4oVQf+^G!we}zcl|(fIk>c;W0ROD(PRj{ww51Sbn+BGJO6aW8A+P zj{|bQKM(wDf~|exKlu6CT>n7}4C=p){H6H*9j?E_^_L>>m%x8l*Wcm#OA+`>;J>Tu z|1Dgcf4ot^xicPX>5TUU#QhLe#=8bq^htdkz>}?SOHo=iL&8Beu%-e4yKA<7I|L;S zgBU_K8q!FYZG=ULUqbcNa#bq;uu}@DqiK2eMSeVzbU=4cUEuU5=U2tvO)3{vRJhm; zw9$mN3?259b;?ACy!|(HsuN_LVw@tMcm{K=1Il&dajDcL6NmC*|bwf+JoRL!)5jZr09D;C_5Gc#$y?7(vey_beKOg~znUo$$H~Q2; zuHk!Ss3g7%;+d=x*`O*GR-u{iTHO6Py4Z-&n`J7hOL&}nnsC5j@XB?A3*Cddk~1j* zX=OTMDTmp$o6@fxlZdT|1-QI<*KR53U@)0~@Nrhh``w+1r)Eqoa-aAn1wIR9&p0(V z5zaXsdGcxvR|!;{-K@M?%t3nC=;*zST8}{rs19@g)=7Zn@u6?~b@wc=J~s8ie~C(@ zbPZ32@>CUaa}mwv-VM4v0i3dbxy&+RxGxZKqIF_e=CH-%kFMI&pLYNd`u$ge+LQEv zf~Vy5TcE{py)MMm8=OhWO>#UIyy0(=|918ehem`qrMmJIdU(V~3Ti`tcKaiD&QH?8|;; z?Yz|fRVC6#E|72G#57qY@XLZ~_sZVDur_X~QBS?svCxjMIYPVcguOE405?B8)XW9A zuTER}RQCPN#)jGjOW}z}s)Q#`O!w?;Je9uiB+JtU^F1Lqj}2|d9)E+Q1RWVR+JT9c zQ;08BL)>ZR1{upZ+Gd2Bqg^-vL^Cp-TYNx(Bc(7bK8Ujp`5j9IXVQ=*k8y+w{yM8uHuf^P_sC(q4 z%|1TEJ-R3~CBnG;g5?+3WT;zJ`FVsO`Bd1k~>nsj(_xFSj00qxj_Fe zdt5=Ci@sbd^`;x^J-Db>fgkV>)|2g;LKZ< z(9ByL`!X^|R&qujr98Kjvgo_7VfM-q_UCACDy}l= z^WRyuT=q6`VPiP5)kvZ*uB&0;Mbu*F6Tqj-dgA6);wM;0mdA0Lv6yYCBZJm zw(>T7u*gl7KSsTAO^Zl$)QGR>fohAG; z4{@RTZl|u$UB3PzksEyJpooot{>=3LmTyb>n!FQ!rmM-T6Se|3EskL>YzCwrs{N>V zd1x3pmb-xZ?yoO_n;9xw>3G?wzgA}VEHG-7G!|vWP3#@5)(AW_&NjKc>^#F3dGb5+ Y$U;|{Mm&gxv5x|fy2d&MT8_d01rUjPDgXcg literal 0 HcmV?d00001