From e203801aadea530a3aa1a20a5d2a343ebb31a28a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 5 Jun 2022 17:02:33 +0200 Subject: [PATCH] Trains detected - Added the Train Observer --- src/generated/resources/.cache/cache | 43 ++++--- .../create/blockstates/track_observer.json | 10 ++ .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 2 + .../assets/create/lang/unfinished/de_de.json | 4 +- .../assets/create/lang/unfinished/es_cl.json | 4 +- .../assets/create/lang/unfinished/es_es.json | 4 +- .../assets/create/lang/unfinished/fr_fr.json | 4 +- .../assets/create/lang/unfinished/it_it.json | 4 +- .../assets/create/lang/unfinished/ja_jp.json | 4 +- .../assets/create/lang/unfinished/ko_kr.json | 4 +- .../assets/create/lang/unfinished/nl_nl.json | 4 +- .../assets/create/lang/unfinished/pl_pl.json | 4 +- .../assets/create/lang/unfinished/pt_br.json | 4 +- .../assets/create/lang/unfinished/pt_pt.json | 4 +- .../assets/create/lang/unfinished/ro_ro.json | 4 +- .../assets/create/lang/unfinished/ru_ru.json | 4 +- .../assets/create/lang/unfinished/zh_cn.json | 4 +- .../assets/create/lang/unfinished/zh_tw.json | 4 +- .../create/models/item/track_observer.json | 3 + .../crafting/kinetics/track_observer.json | 34 ++++++ .../track_observer_from_other_plates.json | 34 ++++++ .../loot_tables/blocks/track_observer.json | 20 +++ .../crafting/kinetics/track_observer.json | 15 +++ .../track_observer_from_other_plates.json | 26 ++++ .../tags/blocks/mineable/pickaxe.json | 1 + .../com/simibubi/create/AllBlockPartials.java | 9 +- .../java/com/simibubi/create/AllBlocks.java | 21 +++- .../com/simibubi/create/AllTileEntities.java | 8 ++ .../source/ObservedTrainNameSource.java | 47 +++++++ .../content/logistics/trains/TrackGraph.java | 7 +- .../logistics/trains/entity/Train.java | 102 +++++++++++++++- .../management/edgePoint/EdgePointType.java | 3 + .../edgePoint/TrackTargetingBehaviour.java | 2 +- .../edgePoint/TrackTargetingBlockItem.java | 19 ++- .../edgePoint/TrackTargetingClient.java | 9 +- .../edgePoint/observer/TrackObserver.java | 111 +++++++++++++++++ .../observer/TrackObserverBlock.java | 67 ++++++++++ .../observer/TrackObserverRenderer.java | 46 +++++++ .../observer/TrackObserverTileEntity.java | 115 ++++++++++++++++++ .../edgePoint/signal/SignalBlock.java | 5 - .../logistics/trains/track/TrackBlock.java | 14 ++- .../data/recipe/StandardRecipeGen.java | 12 ++ .../assets/create/lang/default/interface.json | 1 + .../models/block/track_observer/block.json | 23 ++++ .../block/track_observer/block_powered.json | 23 ++++ .../models/block/track_overlay/observer.json | 7 ++ .../create/textures/block/observer_box.png | Bin 0 -> 6135 bytes .../textures/block/observer_box_powered.png | Bin 0 -> 6216 bytes .../textures/block/observer_indicator.png | Bin 0 -> 2954 bytes 50 files changed, 838 insertions(+), 62 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/track_observer.json create mode 100644 src/generated/resources/assets/create/models/item/track_observer.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/track_observer.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/track_observer_from_other_plates.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/track_observer.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/track_observer.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/track_observer_from_other_plates.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/display/source/ObservedTrainNameSource.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserver.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverTileEntity.java create mode 100644 src/main/resources/assets/create/models/block/track_observer/block.json create mode 100644 src/main/resources/assets/create/models/block/track_observer/block_powered.json create mode 100644 src/main/resources/assets/create/models/block/track_overlay/observer.json create mode 100644 src/main/resources/assets/create/textures/block/observer_box.png create mode 100644 src/main/resources/assets/create/textures/block/observer_box_powered.png create mode 100644 src/main/resources/assets/create/textures/block/observer_indicator.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index e240cc4ea..70d612a1b 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -492,6 +492,7 @@ e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/stressometer. 8b0c2c7ac72529565b3339aa8df7565858100afa assets/create/blockstates/tiled_glass.json a2454400b1cf9889f70aebdc89c52a1be25f543c assets/create/blockstates/tiled_glass_pane.json 96c45abe7a5d9273feaf5f747d14cee8e04b58da assets/create/blockstates/track.json +98b936d72da49ee02eacd0b3244fe133e5575bb1 assets/create/blockstates/track_observer.json 408ae1009ee8bb2f2b83753d5909c53744f7865f assets/create/blockstates/track_signal.json 60609cfbcc9be6f7e41fb493ef3147beb9750b60 assets/create/blockstates/track_station.json b000a6cde143f8a12fc8996d1ac8b5164f75253b assets/create/blockstates/train_door.json @@ -550,23 +551,23 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -c7b048548ba737df7efee5731a064c8ee960bdaa assets/create/lang/en_ud.json -0870bf282b75f8126166ed6f9a5ece80dd71b64b assets/create/lang/en_us.json -cc9ca507f0679d21193d3e9ea38ea2da63690538 assets/create/lang/unfinished/de_de.json -ac841d318a6df832c6de0daf4f9309c11aa46a3e assets/create/lang/unfinished/es_cl.json -2874f436add4c9ff52f6cce5180cb8c30c2dd203 assets/create/lang/unfinished/es_es.json -b1a3ae3a464bd5f2321a53666fe124e6cdee7bba assets/create/lang/unfinished/fr_fr.json -adcc4aab4338cc21e89fd92208d0d50cd00be109 assets/create/lang/unfinished/it_it.json -7cab2dd7377cc08087ecefd94f20d169f11ad7ed assets/create/lang/unfinished/ja_jp.json -cc00931dba01292bf0d407ba958bafa0add11128 assets/create/lang/unfinished/ko_kr.json -143a9297fc06a5e5d6ef5b458b8d4d7f888ebf42 assets/create/lang/unfinished/nl_nl.json -46495cff5c50b4f81b8075a90d85da06f55153bb assets/create/lang/unfinished/pl_pl.json -33de68ff95c6c281a530101160086e9367fac086 assets/create/lang/unfinished/pt_br.json -a1b28b1203acca0ea3d4a84c2945e25aed073eba assets/create/lang/unfinished/pt_pt.json -89a8daa6b5665bd1f63855fc07c3dbe238bf2995 assets/create/lang/unfinished/ro_ro.json -6744c0236c63458700c7a70607c00ca57e0a8473 assets/create/lang/unfinished/ru_ru.json -faad944cb89c9dce81cfabaaaa3fb53e354c64e2 assets/create/lang/unfinished/zh_cn.json -6176afefd864926e69f5e6a7935527674f535a77 assets/create/lang/unfinished/zh_tw.json +ecf25701623f13a101e5e9ce673022ba3be59958 assets/create/lang/en_ud.json +96f38bd8b9ee491b39ee060230ba16cbfadafd63 assets/create/lang/en_us.json +2508bb467d14a3eccc2c9bc06e7c6ce9b86ced5e assets/create/lang/unfinished/de_de.json +d9ed3f02a3ecb05c066a8bc6be726e878e5603e7 assets/create/lang/unfinished/es_cl.json +4994369b0f203e9be357d0f09d9c0dd69b25966d assets/create/lang/unfinished/es_es.json +2a45ff494d9b59deff77d80ea4ab88aa7031ea65 assets/create/lang/unfinished/fr_fr.json +7b7d097d466936203775cf1ae598445c99e316e3 assets/create/lang/unfinished/it_it.json +d01d2d62e93ea46d842517f8d23613ef0b83f263 assets/create/lang/unfinished/ja_jp.json +a6553b41cf67ec58ae8fe4ad4fe1d7fae31a8ec4 assets/create/lang/unfinished/ko_kr.json +1d3976dd8af0980104f477b7b3d8903991b37ec3 assets/create/lang/unfinished/nl_nl.json +e4ceb3f1dd76cbfa584f97f4df13eb40278c232b assets/create/lang/unfinished/pl_pl.json +19520e67836fc085224ca44a83fbe69e6621f581 assets/create/lang/unfinished/pt_br.json +a8ddeed7d64567cadf006caef7869fe5456b84ce assets/create/lang/unfinished/pt_pt.json +157fcd051324b3fa59fb6a3dbd5f104f9b38a48a assets/create/lang/unfinished/ro_ro.json +067cdf63461c178e31be57e8b2ce5e1dd9eea467 assets/create/lang/unfinished/ru_ru.json +d7cc4cdb02e41b7e6363ec9600be5f7600366051 assets/create/lang/unfinished/zh_cn.json +5ab965a636cd6ee50c815892fadc418c9c37c3a2 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 @@ -2125,6 +2126,7 @@ bab8f78c319b2a79ed55c5d2a94b521ddaa44996 assets/create/models/item/stressometer. b1d3d00ff05908feacad06a86800da96cc9bc65d assets/create/models/item/tiled_glass.json a7d0b746637897209bd86b1a6501ecbfb46d8270 assets/create/models/item/tiled_glass_pane.json 6b5569f25fa2d905729a3f18deb56b6c67c5dfa4 assets/create/models/item/track.json +c7beb7db3e00ff2475e53ef163376b94bb4022be assets/create/models/item/track_observer.json c317adb86ee47765dd7716539c65f31f329deb85 assets/create/models/item/track_signal.json 447b472ee2e4796dde9e96a2be3c12e015756845 assets/create/models/item/track_station.json c802b2ba62dca48eaad28dafbe67961f44697696 assets/create/models/item/train_door.json @@ -2480,6 +2482,8 @@ e8bea7022c2d36276922a59eca0e9364efe9ee03 data/create/advancements/recipes/create f14d533b42261bd4c5366cd6afaf44bf184a9f03 data/create/advancements/recipes/create.base/crafting/kinetics/sticky_mechanical_piston.json f640ded44cb4cf4c31e49deb0fc14e3495cd2edf data/create/advancements/recipes/create.base/crafting/kinetics/stressometerfrom_conversion.json f3fc3d4fee0712906f833aa17185f0bacb21922f data/create/advancements/recipes/create.base/crafting/kinetics/super_glue.json +78a36489e5295d5bd53619e7f1e42edb6ba7116a data/create/advancements/recipes/create.base/crafting/kinetics/track_observer.json +e7df922cf9c6b39ee866d224d1812288073c7907 data/create/advancements/recipes/create.base/crafting/kinetics/track_observer_from_other_plates.json 23c1ecff946d41c74d4fb78e2bbc5e348c4487f5 data/create/advancements/recipes/create.base/crafting/kinetics/track_signal.json da30636ca7e77f2947d0d28542c0b99747c9939e data/create/advancements/recipes/create.base/crafting/kinetics/track_station.json 050b8c527083e624a01f38ea8b34771a19ed2bc5 data/create/advancements/recipes/create.base/crafting/kinetics/train_door.json @@ -3842,6 +3846,7 @@ da3ceb80799d349b91781b0dd43a02e548045c66 data/create/loot_tables/blocks/stressom 811674fd816503cd78fc4df267dc23f760940e8f data/create/loot_tables/blocks/tiled_glass.json 313344ef4ee67ffd0f7fd44adcb3ad08de571c92 data/create/loot_tables/blocks/tiled_glass_pane.json e2846b8823918bce402eb361f703ecdc14251ccc data/create/loot_tables/blocks/track.json +749a2f82cc5315d10447d644b13c1c1e9a7673a6 data/create/loot_tables/blocks/track_observer.json f589afc404f98c42d2d9b0b03bcac87f7f6444cc data/create/loot_tables/blocks/track_signal.json 4617a11e220dcd0094c29d204fe90c01495c4e9b data/create/loot_tables/blocks/track_station.json 7f337ebb7f9a6ec83af12f3cf99517762689ac25 data/create/loot_tables/blocks/train_door.json @@ -4126,6 +4131,8 @@ e532a5c405e48b415e3fcd4f7c6183ea335cb915 data/create/recipes/crafting/kinetics/s 3be40664acfd150d0617bc138dc2dd9d54a21b3a data/create/recipes/crafting/kinetics/sticky_mechanical_piston.json af5854ee2fa3be195ad9abcdeebe6ed7306b651c data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json 21f885a674603367b67e1e993c175638cbda9ea3 data/create/recipes/crafting/kinetics/super_glue.json +ea173b87f9a8c86abcf7f662a7b1d510b8a13f83 data/create/recipes/crafting/kinetics/track_observer.json +a6d074a4a400e82223211badfd923bb28c3c0bd0 data/create/recipes/crafting/kinetics/track_observer_from_other_plates.json 456d59d0fff2b042e1e886ebbe46b84fbd212c40 data/create/recipes/crafting/kinetics/track_signal.json 3c8fd3b5fe4d264cfe405c8d222b451769c816d5 data/create/recipes/crafting/kinetics/track_station.json c38984c432bd410261aaf6a6f30744c58481b325 data/create/recipes/crafting/kinetics/train_door.json @@ -5397,7 +5404,7 @@ dea0b54b33b1ae3b4fa8091dfcc4ad5687978ab1 data/minecraft/tags/blocks/climbable.js 69f596fcb065e26b02ce246760432b5174191b76 data/minecraft/tags/blocks/impermeable.json 2db7759fe036160c14c6ed19a68604ca16f4de60 data/minecraft/tags/blocks/lush_ground_replaceable.json 1472ec62e43355273f0699743ccdb65324c02475 data/minecraft/tags/blocks/mineable/axe.json -b4942c1fc4d3f55eb5f603ebd5c6f4bad62a3cb4 data/minecraft/tags/blocks/mineable/pickaxe.json +09044f5b96f6f17747f1e3849425006090ed8c09 data/minecraft/tags/blocks/mineable/pickaxe.json 2db7759fe036160c14c6ed19a68604ca16f4de60 data/minecraft/tags/blocks/moss_replaceable.json e157c1d3af30e409e34bbefbe15a037e6e1c8daa data/minecraft/tags/blocks/needs_iron_tool.json a08f67865337f62601c5e333b4011382d10020e4 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/track_observer.json b/src/generated/resources/assets/create/blockstates/track_observer.json new file mode 100644 index 000000000..3d6778afb --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/track_observer.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "create:block/track_observer/block" + }, + "powered=true": { + "model": "create:block/track_observer/block_powered" + } + } +} \ 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 93c478d3c..8b928ac51 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -494,6 +494,7 @@ "block.create.tiled_glass": "ss\u0250\u05DF\u2141 p\u01DD\u05DF\u0131\u27D8", "block.create.tiled_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u05DF\u0131\u27D8", "block.create.track": "\u029E\u0254\u0250\u0279\u27D8 u\u0131\u0250\u0279\u27D8", + "block.create.track_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO u\u0131\u0250\u0279\u27D8", "block.create.track_signal": "\u05DF\u0250ub\u0131S u\u0131\u0250\u0279\u27D8", "block.create.track_station": "uo\u0131\u0287\u0250\u0287S u\u0131\u0250\u0279\u27D8", "block.create.train_door": "\u0279oo\u15E1 u\u0131\u0250\u0279\u27D8", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c77626d63..72d720738 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -497,6 +497,7 @@ "block.create.tiled_glass": "Tiled Glass", "block.create.tiled_glass_pane": "Tiled Glass Pane", "block.create.track": "Train Track", + "block.create.track_observer": "Train Observer", "block.create.track_signal": "Train Signal", "block.create.track_station": "Train Station", "block.create.train_door": "Train Door", @@ -1544,6 +1545,7 @@ "create.display_source.station_summary.now": "now", "create.display_source.station_summary.minutes": " min", "create.display_source.station_summary.seconds": "%1$ss", + "create.display_source.observed_train_name": "Detected Train Name", "create.display_target.line": "Line %1$s", "create.display_target.page": "Page %1$s", 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 00d886933..27c8c311c 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: 938", + "_": "Missing Localizations: 940", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Glasfliesen", "block.create.tiled_glass_pane": "Glasfliesenscheibe", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_cl.json b/src/generated/resources/assets/create/lang/unfinished/es_cl.json index 035912153..935fadac7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_cl.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_cl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 588", + "_": "Missing Localizations: 590", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Vidrio Baldosa", "block.create.tiled_glass_pane": "Panel de Vidrio Baldosa", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", 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 74c6c888b..6fbc6482f 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: 252", + "_": "Missing Localizations: 254", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Vidrio esmaltado", "block.create.tiled_glass_pane": "Panel de vidrio esmaltado", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", 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 818e071ad..128b2e4dc 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: 1826", + "_": "Missing Localizations: 1828", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Verre carrelé", "block.create.tiled_glass_pane": "Vitre carrelé", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", 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 270ffda71..5479dcc3d 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: 1515", + "_": "Missing Localizations: 1517", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Vetro piastrellato", "block.create.tiled_glass_pane": "Pannello di vetro piastrellato", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", 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 c5ab57767..9674cdb64 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: 254", + "_": "Missing Localizations: 256", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "タイルガラス", "block.create.tiled_glass_pane": "タイル板ガラス", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", 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 f6a17dbef..89afe8a66 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: 254", + "_": "Missing Localizations: 256", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "타일 유리", "block.create.tiled_glass_pane": "타일 유리판", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", 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 21a78e558..9e850246f 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: 2178", + "_": "Missing Localizations: 2180", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Getegeld Glas", "block.create.tiled_glass_pane": "Getegeld Glazen Paneel", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index 21fe4d5b0..dda460eed 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 627", + "_": "Missing Localizations: 629", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Kafelkowane szkło", "block.create.tiled_glass_pane": "Kafelkowana szyba", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", 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 bdd49e822..109ade11c 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: 1122", + "_": "Missing Localizations: 1124", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Vidro Entalhado", "block.create.tiled_glass_pane": "Vidraça Entalhada", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json index c516c5b38..b93484b52 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1800", + "_": "Missing Localizations: 1802", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Vidro Entalhado", "block.create.tiled_glass_pane": "Vidraça Entalhada", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", diff --git a/src/generated/resources/assets/create/lang/unfinished/ro_ro.json b/src/generated/resources/assets/create/lang/unfinished/ro_ro.json index c14a00023..b8cf01d9f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ro_ro.json +++ b/src/generated/resources/assets/create/lang/unfinished/ro_ro.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 255", + "_": "Missing Localizations: 257", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Sticlă De Țiglă", "block.create.tiled_glass_pane": "Fereastră De Țiglă", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", 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 51fbe3d15..34f1692f8 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: 632", + "_": "Missing Localizations: 634", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "Плиточное стекло", "block.create.tiled_glass_pane": "Плиточная стеклянная панель", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", 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 380e84553..b61fd030a 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: 252", + "_": "Missing Localizations: 254", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "十字玻璃窗", "block.create.tiled_glass_pane": "十字玻璃窗户板", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", 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 bd3a15967..1b072487c 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: 646", + "_": "Missing Localizations: 648", "_": "->------------------------] Game Elements [------------------------<-", @@ -498,6 +498,7 @@ "block.create.tiled_glass": "十字玻璃窗", "block.create.tiled_glass_pane": "十字玻璃窗戶片", "block.create.track": "UNLOCALIZED: Train Track", + "block.create.track_observer": "UNLOCALIZED: Train Observer", "block.create.track_signal": "UNLOCALIZED: Train Signal", "block.create.track_station": "UNLOCALIZED: Train Station", "block.create.train_door": "UNLOCALIZED: Train Door", @@ -1545,6 +1546,7 @@ "create.display_source.station_summary.now": "UNLOCALIZED: now", "create.display_source.station_summary.minutes": "UNLOCALIZED: min", "create.display_source.station_summary.seconds": "UNLOCALIZED: %1$ss", + "create.display_source.observed_train_name": "UNLOCALIZED: Detected Train Name", "create.display_target.line": "UNLOCALIZED: Line %1$s", "create.display_target.page": "UNLOCALIZED: Page %1$s", diff --git a/src/generated/resources/assets/create/models/item/track_observer.json b/src/generated/resources/assets/create/models/item/track_observer.json new file mode 100644 index 000000000..d04fc1b18 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/track_observer.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/track_observer/block" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/track_observer.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/track_observer.json new file mode 100644 index 000000000..dc16424aa --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/track_observer.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/track_observer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "create:railway_casing" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/track_observer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/track_observer_from_other_plates.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/track_observer_from_other_plates.json new file mode 100644 index 000000000..0610e5f23 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/track_observer_from_other_plates.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/track_observer_from_other_plates" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "create:railway_casing" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/track_observer_from_other_plates" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/track_observer.json b/src/generated/resources/data/create/loot_tables/blocks/track_observer.json new file mode 100644 index 000000000..e62925f38 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/track_observer.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "create:track_observer" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/track_observer.json b/src/generated/resources/data/create/recipes/crafting/kinetics/track_observer.json new file mode 100644 index 000000000..4f3e90611 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/track_observer.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:railway_casing" + }, + { + "tag": "minecraft:wooden_pressure_plates" + } + ], + "result": { + "item": "create:track_observer", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/track_observer_from_other_plates.json b/src/generated/resources/data/create/recipes/crafting/kinetics/track_observer_from_other_plates.json new file mode 100644 index 000000000..c3c32d245 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/track_observer_from_other_plates.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "create:railway_casing" + }, + [ + { + "item": "minecraft:stone_pressure_plate" + }, + { + "item": "minecraft:polished_blackstone_pressure_plate" + }, + { + "item": "minecraft:heavy_weighted_pressure_plate" + }, + { + "item": "minecraft:light_weighted_pressure_plate" + } + ] + ], + "result": { + "item": "create:track_observer", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index ccceb268e..5ef3b2823 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -116,6 +116,7 @@ "create:railway_casing", "create:track_station", "create:track_signal", + "create:track_observer", "create:small_bogey", "create:large_bogey", "create:controls", diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index f2e6c1647..a6ba9ddc5 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -110,6 +110,7 @@ public class AllBlockPartials { TRACK_STATION_OVERLAY = block("track_overlay/station"), TRACK_SIGNAL_OVERLAY = block("track_overlay/signal"), TRACK_ASSEMBLING_OVERLAY = block("track_overlay/assembling"), TRACK_SIGNAL_DUAL_OVERLAY = block("track_overlay/signal_dual"), + TRACK_OBSERVER_OVERLAY = block("track_overlay/observer"), BOGEY_FRAME = block("track/bogey/bogey_frame"), SMALL_BOGEY_WHEELS = block("track/bogey/bogey_wheel"), BOGEY_PIN = block("track/bogey/bogey_drive_wheel_pin"), BOGEY_PISTON = block("track/bogey/bogey_drive_piston"), @@ -136,10 +137,10 @@ public class AllBlockPartials { SIGNAL_RED = block("track_signal/red_tube"), SIGNAL_YELLOW_CUBE = block("track_signal/yellow_cube"), SIGNAL_YELLOW_GLOW = block("track_signal/yellow_glow"), SIGNAL_YELLOW = block("track_signal/yellow_tube"), - BLAZE_GOGGLES = block("blaze_burner/goggles"), - BLAZE_IDLE = block("blaze_burner/blaze/idle"), BLAZE_ACTIVE = block("blaze_burner/blaze/active"), - BLAZE_SUPER = block("blaze_burner/blaze/super"), BLAZE_BURNER_FLAME = block("blaze_burner/flame"), - BLAZE_BURNER_RODS = block("blaze_burner/rods_small"), BLAZE_BURNER_RODS_2 = block("blaze_burner/rods_large"), + BLAZE_GOGGLES = block("blaze_burner/goggles"), BLAZE_IDLE = block("blaze_burner/blaze/idle"), + BLAZE_ACTIVE = block("blaze_burner/blaze/active"), BLAZE_SUPER = block("blaze_burner/blaze/super"), + BLAZE_BURNER_FLAME = block("blaze_burner/flame"), BLAZE_BURNER_RODS = block("blaze_burner/rods_small"), + BLAZE_BURNER_RODS_2 = block("blaze_burner/rods_large"), BLAZE_BURNER_SUPER_RODS = block("blaze_burner/superheated_rods_small"), BLAZE_BURNER_SUPER_RODS_2 = block("blaze_burner/superheated_rods_large"), diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 3088dd535..8fa26a2a4 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -170,6 +170,7 @@ import com.simibubi.create.content.logistics.block.display.source.ItemCountDispl import com.simibubi.create.content.logistics.block.display.source.ItemListDisplaySource; import com.simibubi.create.content.logistics.block.display.source.ItemNameDisplaySource; import com.simibubi.create.content.logistics.block.display.source.ItemThoughputDisplaySource; +import com.simibubi.create.content.logistics.block.display.source.ObservedTrainNameSource; import com.simibubi.create.content.logistics.block.display.source.StationSummaryDisplaySource; import com.simibubi.create.content.logistics.block.display.source.StopWatchDisplaySource; import com.simibubi.create.content.logistics.block.display.source.TimeOfDayDisplaySource; @@ -198,7 +199,9 @@ import com.simibubi.create.content.logistics.block.vault.ItemVaultCTBehaviour; import com.simibubi.create.content.logistics.block.vault.ItemVaultItem; import com.simibubi.create.content.logistics.item.LecternControllerBlock; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayBlock; +import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBlockItem; +import com.simibubi.create.content.logistics.trains.management.edgePoint.observer.TrackObserverBlock; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBlock; import com.simibubi.create.content.logistics.trains.management.edgePoint.station.StationBlock; import com.simibubi.create.content.logistics.trains.track.FakeTrackBlock; @@ -1510,7 +1513,7 @@ public class AllBlocks { .blockstate((c, p) -> p.simpleBlock(c.get(), AssetLookup.partialBaseModel(c, p))) .onRegister(assignDataBehaviour(new StationSummaryDisplaySource(), "station_summary")) .lang("Train Station") - .item(TrackTargetingBlockItem::new) + .item(TrackTargetingBlockItem.ofType(EdgePointType.STATION)) .transform(customItemModel()) .register(); @@ -1526,10 +1529,24 @@ public class AllBlocks { .getSerializedName())) .build())) .lang("Train Signal") - .item(TrackTargetingBlockItem::new) + .item(TrackTargetingBlockItem.ofType(EdgePointType.SIGNAL)) .transform(customItemModel()) .register(); + public static final BlockEntry TRACK_OBSERVER = + REGISTRATE.block("track_observer", TrackObserverBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.color(MaterialColor.PODZOL)) + .properties(p -> p.noOcclusion()) + .properties(p -> p.sound(SoundType.NETHERITE_BLOCK)) + .blockstate((c, p) -> BlockStateGen.simpleBlock(c, p, AssetLookup.forPowered(c, p))) + .transform(pickaxeOnly()) + .onRegister(assignDataBehaviour(new ObservedTrainNameSource(), "observed_train_name")) + .lang("Train Observer") + .item(TrackTargetingBlockItem.ofType(EdgePointType.OBSERVER)) + .transform(customItemModel("_", "block")) + .register(); + public static final BlockEntry SMALL_BOGEY = REGISTRATE.block("small_bogey", p -> new StandardBogeyBlock(p, false)) .properties(p -> p.color(MaterialColor.PODZOL)) diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 56ea0d071..5781dc4c8 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -182,6 +182,8 @@ import com.simibubi.create.content.logistics.item.LecternControllerTileEntity; import com.simibubi.create.content.logistics.trains.IBogeyTileEntityRenderer; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayRenderer; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayTileEntity; +import com.simibubi.create.content.logistics.trains.management.edgePoint.observer.TrackObserverRenderer; +import com.simibubi.create.content.logistics.trains.management.edgePoint.observer.TrackObserverTileEntity; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalRenderer; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity; import com.simibubi.create.content.logistics.trains.management.edgePoint.station.StationRenderer; @@ -814,6 +816,12 @@ public class AllTileEntities { .renderer(() -> SignalRenderer::new) .validBlocks(AllBlocks.TRACK_SIGNAL) .register(); + + public static final BlockEntityEntry TRACK_OBSERVER = Create.registrate() + .tileEntity("track_observer", TrackObserverTileEntity::new) + .renderer(() -> TrackObserverRenderer::new) + .validBlocks(AllBlocks.TRACK_OBSERVER) + .register(); public static void register() {} } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/ObservedTrainNameSource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ObservedTrainNameSource.java new file mode 100644 index 000000000..e58916197 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ObservedTrainNameSource.java @@ -0,0 +1,47 @@ +package com.simibubi.create.content.logistics.block.display.source; + +import java.util.UUID; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; +import com.simibubi.create.content.logistics.block.display.target.DisplayTargetStats; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.management.edgePoint.observer.TrackObserver; +import com.simibubi.create.content.logistics.trains.management.edgePoint.observer.TrackObserverTileEntity; + +import net.minecraft.network.chat.MutableComponent; + +public class ObservedTrainNameSource extends SingleLineDisplaySource { + + @Override + protected MutableComponent provideLine(DisplayLinkContext context, DisplayTargetStats stats) { + if (!(context.getSourceTE() instanceof TrackObserverTileEntity observerTE)) + return EMPTY_LINE; + TrackObserver observer = observerTE.getObserver(); + if (observer == null) + return EMPTY_LINE; + UUID currentTrain = observer.getCurrentTrain(); + if (currentTrain == null) + return EMPTY_LINE; + Train train = Create.RAILWAYS.trains.get(currentTrain); + if (train == null) + return EMPTY_LINE; + return train.name.copy(); + } + + @Override + public int getPassiveRefreshTicks() { + return 400; + } + + @Override + protected String getTranslationKey() { + return "observed_train_name"; + } + + @Override + protected boolean allowsLabeling(DisplayLinkContext context) { + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java index f97a3adad..1ab75e236 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java @@ -355,11 +355,16 @@ public class TrackGraph { } public Map getConnectionsFrom(TrackNode node) { + if (node == null) + return null; return connectionsByNode.getOrDefault(node, new HashMap<>()); } public TrackEdge getConnection(Couple nodes) { - return getConnectionsFrom(nodes.getFirst()).get(nodes.getSecond()); + Map connectionsFrom = getConnectionsFrom(nodes.getFirst()); + if (connectionsFrom == null) + return null; + return connectionsFrom.get(nodes.getSecond()); } public void connectNodes(LevelAccessor reader, TrackNodeLocation location, TrackNodeLocation location2, diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java index 40bb4e800..185f309b9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java @@ -22,6 +22,7 @@ import org.apache.commons.lang3.mutable.MutableObject; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.content.logistics.trains.DimensionPalette; import com.simibubi.create.content.logistics.trains.GraphLocation; import com.simibubi.create.content.logistics.trains.TrackEdge; @@ -33,6 +34,7 @@ import com.simibubi.create.content.logistics.trains.entity.TravellingPoint.ITrac import com.simibubi.create.content.logistics.trains.entity.TravellingPoint.SteerDirection; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgeData; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; +import com.simibubi.create.content.logistics.trains.management.edgePoint.observer.TrackObserver; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBlock.SignalType; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBoundary; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalEdgeGroup; @@ -63,6 +65,9 @@ import net.minecraft.world.level.Explosion.BlockInteraction; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.network.PacketDistributor; @@ -102,6 +107,9 @@ public class Train { public Map occupiedSignalBlocks; public Set reservedSignalBlocks; + public Set occupiedObservers; + public Map> cachedObserverFiltering; + List migratingPoints; public int migrationCooldown; public boolean derailed; @@ -135,6 +143,8 @@ public class Train { manualSteer = SteerDirection.NONE; occupiedSignalBlocks = new HashMap<>(); reservedSignalBlocks = new HashSet<>(); + occupiedObservers = new HashSet<>(); + cachedObserverFiltering = new HashMap<>(); tickOffset = Create.RANDOM.nextInt(100); } @@ -154,6 +164,73 @@ public class Train { addToSignalGroups(occupiedSignalBlocks.keySet()); addToSignalGroups(reservedSignalBlocks); + + if (occupiedObservers.isEmpty()) + return; + + tickOccupiedObservers(level); + } + + private void tickOccupiedObservers(Level level) { + int storageVersion = 0; + for (Carriage carriage : carriages) + storageVersion += carriage.storage.getVersion(); + + for (UUID uuid : occupiedObservers) { + TrackObserver observer = graph.getPoint(EdgePointType.OBSERVER, uuid); + if (observer == null) + continue; + + ItemStack filter = observer.getFilter(); + if (filter.isEmpty()) { + observer.keepAlive(this); + continue; + } + + Pair cachedMatch = cachedObserverFiltering.computeIfAbsent(uuid, $ -> Pair.of(-1, false)); + boolean shouldActivate = cachedMatch.getSecond(); + + if (cachedMatch.getFirst() == storageVersion) { + if (shouldActivate) + observer.keepAlive(this); + continue; + } + + shouldActivate = false; + for (Carriage carriage : carriages) { + if (shouldActivate) + break; + + IItemHandlerModifiable inv = carriage.storage.getItems(); + if (inv != null) { + for (int slot = 0; slot < inv.getSlots(); slot++) { + if (shouldActivate) + break; + ItemStack extractItem = inv.extractItem(slot, 1, true); + if (extractItem.isEmpty()) + continue; + shouldActivate |= FilterItem.test(level, extractItem, filter); + } + } + + IFluidHandler tank = carriage.storage.getFluids(); + if (tank != null) { + for (int slot = 0; slot < tank.getTanks(); slot++) { + if (shouldActivate) + break; + FluidStack drain = tank.drain(1, FluidAction.SIMULATE); + if (drain.isEmpty()) + continue; + shouldActivate |= FilterItem.test(level, drain, filter); + } + } + } + + cachedObserverFiltering.put(uuid, Pair.of(storageVersion, shouldActivate)); + + if (shouldActivate) + observer.keepAlive(this); + } } private void addToSignalGroups(Collection groups) { @@ -338,10 +415,15 @@ public class Train { return true; } + if (couple.getFirst() instanceof TrackObserver observer) { + occupiedObservers.add(observer.getId()); + return false; + } + if (!(couple.getFirst() instanceof SignalBoundary signal)) return false; if (navigation.waitingForSignal != null && navigation.waitingForSignal.getFirst() - .equals(signal.id)) { + .equals(signal.getId())) { speed = 0; navigation.distanceToSignal = 0; return true; @@ -383,6 +465,11 @@ public class Train { public IEdgePointListener backSignalListener() { return (distance, couple) -> { + if (couple.getFirst() instanceof TrackObserver observer) { + occupiedObservers.remove(observer.getId()); + cachedObserverFiltering.remove(observer.getId()); + return false; + } if (!(couple.getFirst() instanceof SignalBoundary signal)) return false; UUID groupId = signal.getGroup(couple.getSecond() @@ -821,6 +908,8 @@ public class Train { occupiedSignalBlocks.clear(); reservedSignalBlocks.clear(); + occupiedObservers.clear(); + cachedObserverFiltering.clear(); TravellingPoint signalScout = new TravellingPoint(node1, node2, edge, position); Map allGroups = Create.RAILWAYS.signalEdgeGroups; @@ -863,6 +952,10 @@ public class Train { forEachTravellingPointBackwards((tp, d) -> { signalScout.travel(graph, d, signalScout.follow(tp), (distance, couple) -> { + if (couple.getFirst() instanceof TrackObserver observer) { + occupiedObservers.add(observer.getId()); + return false; + } if (!(couple.getFirst() instanceof SignalBoundary signal)) return false; couple.getSecond() @@ -991,6 +1084,11 @@ public class Train { compoundTag.putUUID("Id", uid); return compoundTag; })); + tag.put("OccupiedObservers", NBTHelper.writeCompoundList(occupiedObservers, uid -> { + CompoundTag compoundTag = new CompoundTag(); + compoundTag.putUUID("Id", uid); + return compoundTag; + })); tag.put("MigratingPoints", NBTHelper.writeCompoundList(migratingPoints, tm -> tm.write(dimensions))); tag.put("Runtime", runtime.write()); @@ -1031,6 +1129,8 @@ public class Train { .put(c.getUUID("Id"), c.contains("Boundary") ? c.getUUID("Boundary") : null)); NBTHelper.iterateCompoundList(tag.getList("ReservedSignalBlocks", Tag.TAG_COMPOUND), c -> train.reservedSignalBlocks.add(c.getUUID("Id"))); + NBTHelper.iterateCompoundList(tag.getList("OccupiedObservers", Tag.TAG_COMPOUND), + c -> train.occupiedObservers.add(c.getUUID("Id"))); NBTHelper.iterateCompoundList(tag.getList("MigratingPoints", Tag.TAG_COMPOUND), c -> train.migratingPoints.add(TrainMigration.read(c, dimensions))); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/EdgePointType.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/EdgePointType.java index 69e3a98db..306ad68ba 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/EdgePointType.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/EdgePointType.java @@ -6,6 +6,7 @@ import java.util.function.Supplier; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.DimensionPalette; +import com.simibubi.create.content.logistics.trains.management.edgePoint.observer.TrackObserver; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBoundary; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.TrackEdgePoint; import com.simibubi.create.content.logistics.trains.management.edgePoint.station.GlobalStation; @@ -23,6 +24,8 @@ public class EdgePointType { register(Create.asResource("signal"), SignalBoundary::new); public static final EdgePointType STATION = register(Create.asResource("station"), GlobalStation::new); + public static final EdgePointType OBSERVER = + register(Create.asResource("observer"), TrackObserver::new); public static EdgePointType register(ResourceLocation id, Supplier factory) { EdgePointType type = new EdgePointType<>(id, factory); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java index f4e09b955..4becad387 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java @@ -305,7 +305,7 @@ public class TrackTargetingBehaviour extends TileEntit } public static enum RenderedTrackOverlayType { - STATION, SIGNAL, DUAL_SIGNAL; + STATION, SIGNAL, DUAL_SIGNAL, OBSERVER; } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBlockItem.java index 404c7aaf6..006a97a91 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBlockItem.java @@ -5,7 +5,6 @@ import java.util.function.BiConsumer; import org.apache.commons.lang3.mutable.MutableObject; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.trains.GraphLocation; import com.simibubi.create.content.logistics.trains.ITrackBlock; @@ -19,6 +18,7 @@ import com.simibubi.create.content.logistics.trains.track.TrackTileEntity; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Lang; +import com.tterrag.registrate.util.nullness.NonNullBiFunction; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -30,6 +30,7 @@ import net.minecraft.nbt.NbtUtils; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; @@ -41,8 +42,16 @@ import net.minecraftforge.api.distmarker.OnlyIn; public class TrackTargetingBlockItem extends BlockItem { - public TrackTargetingBlockItem(Block pBlock, Properties pProperties) { + private EdgePointType type; + + public static NonNullBiFunction ofType( + EdgePointType type) { + return (b, p) -> new TrackTargetingBlockItem(b, p, type); + } + + public TrackTargetingBlockItem(Block pBlock, Properties pProperties, EdgePointType type) { super(pBlock, pProperties); + this.type = type; } @Override @@ -134,8 +143,8 @@ public class TrackTargetingBlockItem extends BlockItem { return useOn; } - protected EdgePointType getType(ItemStack stack) { - return AllBlocks.TRACK_SIGNAL.isIn(stack) ? EdgePointType.SIGNAL : EdgePointType.STATION; + public EdgePointType getType(ItemStack stack) { + return type; } @OnlyIn(Dist.CLIENT) @@ -200,7 +209,7 @@ public class TrackTargetingBlockItem extends BlockItem { TrackEdge edge = location.graph.getConnection(nodes); if (edge == null) return; - + EdgeData edgeData = edge.getEdgeData(); double edgePosition = location.position; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java index 0b0293aeb..94f629068 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java @@ -48,7 +48,7 @@ public class TrackTargetingClient { BezierTrackPointLocation hoveredBezier = null; ItemStack stack = player.getMainHandItem(); - if (stack.getItem()instanceof TrackTargetingBlockItem ttbi) + if (stack.getItem() instanceof TrackTargetingBlockItem ttbi) type = ttbi.getType(stack); if (type == EdgePointType.SIGNAL) @@ -83,7 +83,7 @@ public class TrackTargetingClient { BlockHitResult blockHitResult = (BlockHitResult) hitResult; BlockPos pos = blockHitResult.getBlockPos(); BlockState blockState = mc.level.getBlockState(pos); - if (blockState.getBlock()instanceof ITrackBlock track) { + if (blockState.getBlock() instanceof ITrackBlock track) { direction = track.getNearestTrackAxis(mc.level, pos, blockState, lookAngle) .getSecond() == AxisDirection.POSITIVE; hovered = pos; @@ -124,8 +124,9 @@ public class TrackTargetingClient { BlockPos pos = lastHovered; int light = LevelRenderer.getLightColor(mc.level, pos); AxisDirection direction = lastDirection ? AxisDirection.POSITIVE : AxisDirection.NEGATIVE; - RenderedTrackOverlayType type = - lastType == EdgePointType.SIGNAL ? RenderedTrackOverlayType.SIGNAL : RenderedTrackOverlayType.STATION; + + RenderedTrackOverlayType type = lastType == EdgePointType.SIGNAL ? RenderedTrackOverlayType.SIGNAL + : lastType == EdgePointType.OBSERVER ? RenderedTrackOverlayType.OBSERVER : RenderedTrackOverlayType.STATION; TrackTargetingBehaviour.render(mc.level, pos, direction, lastHoveredBezierSegment, ms, buffer, light, OverlayTexture.NO_OVERLAY, type, 1 + 1 / 16f); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserver.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserver.java new file mode 100644 index 000000000..62ad747bb --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserver.java @@ -0,0 +1,111 @@ +package com.simibubi.create.content.logistics.trains.management.edgePoint.observer; + +import java.util.UUID; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.DimensionPalette; +import com.simibubi.create.content.logistics.trains.TrackEdge; +import com.simibubi.create.content.logistics.trains.TrackGraph; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalPropagator; +import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SingleTileEdgePoint; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; + +public class TrackObserver extends SingleTileEdgePoint { + + private int activated; + private ItemStack filter; + private UUID currentTrain; + + public TrackObserver() { + activated = 0; + filter = ItemStack.EMPTY; + currentTrain = null; + } + + @Override + public void tileAdded(BlockEntity tile, boolean front) { + super.tileAdded(tile, front); + FilteringBehaviour filteringBehaviour = TileEntityBehaviour.get(tile, FilteringBehaviour.TYPE); + if (filteringBehaviour != null) + setFilterAndNotify(tile.getLevel(), filteringBehaviour.getFilter()); + } + + @Override + public void tick(TrackGraph graph, boolean preTrains) { + super.tick(graph, preTrains); + if (isActivated()) + activated--; + if (!isActivated()) + currentTrain = null; + } + + public void setFilterAndNotify(Level level, ItemStack filter) { + this.filter = filter; + notifyTrains(level); + } + + private void notifyTrains(Level level) { + TrackGraph graph = Create.RAILWAYS.sided(level) + .getGraph(level, edgeLocation.getFirst()); + if (graph == null) + return; + TrackEdge edge = graph.getConnection(edgeLocation.map(graph::locateNode)); + if (edge == null) + return; + SignalPropagator.notifyTrains(graph, edge); + } + + public ItemStack getFilter() { + return filter; + } + + public UUID getCurrentTrain() { + return currentTrain; + } + + public boolean isActivated() { + return activated > 0; + } + + public void keepAlive(Train train) { + activated = 8; + currentTrain = train.id; + } + + @Override + public void read(CompoundTag nbt, boolean migration, DimensionPalette dimensions) { + super.read(nbt, migration, dimensions); + activated = nbt.getInt("Activated"); + filter = ItemStack.of(nbt.getCompound("Filter")); + if (nbt.contains("TrainId")) + currentTrain = nbt.getUUID("TrainId"); + } + + @Override + public void read(FriendlyByteBuf buffer, DimensionPalette dimensions) { + super.read(buffer, dimensions); + } + + @Override + public void write(CompoundTag nbt, DimensionPalette dimensions) { + super.write(nbt, dimensions); + nbt.putInt("Activated", activated); + nbt.put("Filter", filter.serializeNBT()); + if (currentTrain != null) + nbt.putUUID("TrainId", currentTrain); + } + + @Override + public void write(FriendlyByteBuf buffer, DimensionPalette dimensions) { + super.write(buffer, dimensions); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlock.java new file mode 100644 index 000000000..59c5c8932 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlock.java @@ -0,0 +1,67 @@ +package com.simibubi.create.content.logistics.trains.management.edgePoint.observer; + +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.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; + +public class TrackObserverBlock extends Block implements ITE, IWrenchable { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public TrackObserverBlock(Properties p_49795_) { + super(p_49795_); + registerDefaultState(defaultBlockState().setValue(POWERED, false)); + } + + @Override + protected void createBlockStateDefinition(Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(POWERED)); + } + + @Override + public boolean isSignalSource(BlockState state) { + return true; + } + + @Override + public int getSignal(BlockState blockState, BlockGetter blockAccess, BlockPos pos, Direction side) { + return blockState.getValue(POWERED) ? 15 : 0; + } + + @Override + public boolean canConnectRedstone(BlockState state, BlockGetter world, BlockPos pos, Direction side) { + return true; + } + + @Override + public Class getTileEntityClass() { + return TrackObserverTileEntity.class; + } + + @Override + public BlockEntityType getTileEntityType() { + return AllTileEntities.TRACK_OBSERVER.get(); + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (pState.hasBlockEntity() && (!pState.is(pNewState.getBlock()) || !pNewState.hasBlockEntity())) { + TileEntityBehaviour.destroy(pLevel, pPos, FilteringBehaviour.TYPE); + pLevel.removeBlockEntity(pPos); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverRenderer.java new file mode 100644 index 000000000..c9f4655f3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverRenderer.java @@ -0,0 +1,46 @@ +package com.simibubi.create.content.logistics.trains.management.edgePoint.observer; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.logistics.trains.ITrackBlock; +import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour; +import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour.RenderedTrackOverlayType; +import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +public class TrackObserverRenderer extends SmartTileEntityRenderer { + + public TrackObserverRenderer(Context context) { + super(context); + } + + @Override + protected void renderSafe(TrackObserverTileEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffer, + int light, int overlay) { + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + BlockPos pos = te.getBlockPos(); + + TrackTargetingBehaviour target = te.edgePoint; + BlockPos targetPosition = target.getGlobalPosition(); + Level level = te.getLevel(); + BlockState trackState = level.getBlockState(targetPosition); + Block block = trackState.getBlock(); + + if (!(block instanceof ITrackBlock)) + return; + + ms.pushPose(); + ms.translate(-pos.getX(), -pos.getY(), -pos.getZ()); + RenderedTrackOverlayType type = RenderedTrackOverlayType.OBSERVER; + TrackTargetingBehaviour.render(level, targetPosition, target.getTargetDirection(), target.getTargetBezier(), ms, + buffer, light, overlay, type, 1); + ms.popPose(); + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverTileEntity.java new file mode 100644 index 000000000..7b19574f4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverTileEntity.java @@ -0,0 +1,115 @@ +package com.simibubi.create.content.logistics.trains.management.edgePoint.observer; + +import java.util.List; + +import javax.annotation.Nullable; + +import com.jozufozu.flywheel.util.transform.TransformStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.contraptions.components.structureMovement.ITransformableTE; +import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform; +import com.simibubi.create.content.logistics.block.display.DisplayLinkBlock; +import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; +import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public class TrackObserverTileEntity extends SmartTileEntity implements ITransformableTE { + + public TrackTargetingBehaviour edgePoint; + + private FilteringBehaviour filtering; + + public TrackObserverTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(edgePoint = new TrackTargetingBehaviour<>(this, EdgePointType.OBSERVER)); + behaviours.add(filtering = createFilter().withCallback(this::onFilterChanged)); + } + + private void onFilterChanged(ItemStack newFilter) { + if (level.isClientSide()) + return; + TrackObserver observer = getObserver(); + if (observer != null) + observer.setFilterAndNotify(level, newFilter); + } + + @Override + public void tick() { + super.tick(); + + if (level.isClientSide()) + return; + + boolean shouldBePowered = false; + TrackObserver observer = getObserver(); + if (observer != null) + shouldBePowered = observer.isActivated(); + if (isBlockPowered() == shouldBePowered) + return; + + BlockState blockState = getBlockState(); + if (blockState.hasProperty(TrackObserverBlock.POWERED)) + level.setBlock(worldPosition, blockState.setValue(TrackObserverBlock.POWERED, shouldBePowered), 3); + DisplayLinkBlock.notifyGatherers(level, worldPosition); + } + + @Nullable + public TrackObserver getObserver() { + return edgePoint.getEdgePoint(); + } + + public ItemStack getFilter() { + return filtering.getFilter(); + } + + public boolean isBlockPowered() { + return getBlockState().getOptionalValue(TrackObserverBlock.POWERED) + .orElse(false); + } + + @Override + protected AABB createRenderBoundingBox() { + return new AABB(worldPosition, edgePoint.getGlobalPosition()).inflate(2); + } + + @Override + public void transform(StructureTransform transform) { + edgePoint.transform(transform); + } + + public FilteringBehaviour createFilter() { + return new FilteringBehaviour(this, new ValueBoxTransform() { + + @Override + protected void rotate(BlockState state, PoseStack ms) { + TransformStack.cast(ms) + .rotateX(90); + } + + @Override + protected Vec3 getLocalOffset(BlockState state) { + return new Vec3(0.5, 15 / 16d, 0.5); + } + + protected float getScale() { + return super.getScale() * 1.5f; + }; + + }); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBlock.java index 5b7eba161..70b06dfe3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBlock.java @@ -39,11 +39,6 @@ public class SignalBlock extends Block implements ITE, IWrench super(p_53182_); registerDefaultState(defaultBlockState().setValue(TYPE, SignalType.ENTRY_SIGNAL)); } - - @Override - public boolean propagatesSkylightDown(BlockState pState, BlockGetter pLevel, BlockPos pPos) { - return pState.getFluidState().isEmpty(); - } @Override public Class getTileEntityClass() { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java index 3951b6489..d756df6c7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java @@ -536,12 +536,12 @@ public class TrackBlock extends Block return null; return AllTileEntities.TRACK.create(p_153215_, state); } - + @Override public Class getTileEntityClass() { return TrackTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.TRACK.get(); @@ -702,10 +702,12 @@ public class TrackBlock extends Block msr.rotateCentered(Direction.UP, Mth.PI); } - msr.scale(type == RenderedTrackOverlayType.STATION ? 1 + 1 / 512f : 1); - return type == RenderedTrackOverlayType.STATION ? AllBlockPartials.TRACK_STATION_OVERLAY - : type == RenderedTrackOverlayType.SIGNAL ? AllBlockPartials.TRACK_SIGNAL_OVERLAY - : AllBlockPartials.TRACK_SIGNAL_DUAL_OVERLAY; + return switch (type) { + case DUAL_SIGNAL -> AllBlockPartials.TRACK_SIGNAL_DUAL_OVERLAY; + case OBSERVER -> AllBlockPartials.TRACK_OBSERVER_OVERLAY; + case SIGNAL -> AllBlockPartials.TRACK_SIGNAL_OVERLAY; + case STATION -> AllBlockPartials.TRACK_STATION_OVERLAY; + }; } @Override diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index f156a584c..52dc33b28 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -536,6 +536,18 @@ public class StandardRecipeGen extends CreateRecipeProvider { .viaShapeless(b -> b.requires(I.railwayCasing()) .requires(I.electronTube())), + TRAIN_OBSERVER = create(AllBlocks.TRACK_OBSERVER).unlockedBy(I::railwayCasing) + .returns(2) + .viaShapeless(b -> b.requires(I.railwayCasing()) + .requires(ItemTags.WOODEN_PRESSURE_PLATES)), + + TRAIN_OBSERVER_2 = create(AllBlocks.TRACK_OBSERVER).withSuffix("_from_other_plates") + .unlockedBy(I::railwayCasing) + .returns(2) + .viaShapeless(b -> b.requires(I.railwayCasing()) + .requires(Ingredient.of(Items.STONE_PRESSURE_PLATE, Items.POLISHED_BLACKSTONE_PRESSURE_PLATE, + Items.HEAVY_WEIGHTED_PRESSURE_PLATE, Items.LIGHT_WEIGHTED_PRESSURE_PLATE))), + TRAIN_SCHEDULE = create(AllItems.SCHEDULE).unlockedByTag(I::reinforcedSheet) .returns(4) .viaShapeless(b -> b.requires(I.reinforcedSheet()) diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index cf91df87b..d1012ae6c 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -759,6 +759,7 @@ "create.display_source.station_summary.now": "now", "create.display_source.station_summary.minutes": " min", "create.display_source.station_summary.seconds": "%1$ss", + "create.display_source.observed_train_name": "Detected Train Name", "create.display_target.line": "Line %1$s", "create.display_target.page": "Page %1$s", diff --git a/src/main/resources/assets/create/models/block/track_observer/block.json b/src/main/resources/assets/create/models/block/track_observer/block.json new file mode 100644 index 000000000..17334b8cc --- /dev/null +++ b/src/main/resources/assets/create/models/block/track_observer/block.json @@ -0,0 +1,23 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/signal_box_top", + "1": "create:block/observer_box", + "particle": "create:block/observer_box" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track_observer/block_powered.json b/src/main/resources/assets/create/models/block/track_observer/block_powered.json new file mode 100644 index 000000000..fd5e39949 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track_observer/block_powered.json @@ -0,0 +1,23 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/signal_box_top", + "1": "create:block/observer_box_powered", + "particle": "create:block/observer_box_powered" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track_overlay/observer.json b/src/main/resources/assets/create/models/block/track_overlay/observer.json new file mode 100644 index 000000000..96b5484d9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track_overlay/observer.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:block/track_overlay/station", + "textures": { + "1": "create:block/observer_indicator" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/observer_box.png b/src/main/resources/assets/create/textures/block/observer_box.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4b27664ce88d8e2da62d191cae66bde7823b3a GIT binary patch literal 6135 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/observer_box_powered.png b/src/main/resources/assets/create/textures/block/observer_box_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..af205d4b58b8ecd59805cae4b14cbc7c5029c2c2 GIT binary patch literal 6216 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/observer_indicator.png b/src/main/resources/assets/create/textures/block/observer_indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3f0ec8eb85a4548bdfb3bde366719f72e3246e GIT binary patch literal 2954 zcmb`J4{+1w6~LW!>k&f2Mibc9ZPncCE$u4nk1gBM#S6i95+_mYI3_g-gv!$AScxrZ zk`g-^ltNb85=cWS(Di70yI#k_c7^uJe@5>(2Bc8ZG1%Ju;nv-j9*mK8?T+j?V4vha z1V-1~ZN8JG@6&s~@4ffE_w+p-YOX7t{q@-vi={MB?+e5GmyK)IUGTpWo!e@$6b*`A zZz$mPA|X|di%9@qjBno9Sm|r|#<5lQr+n*{)Sq28$NAjI!<28`3&(!?adh96;jeXH ze(}QjjT>HlWAXfN-MjON4OB--$E(lPjh%UW-Fx-Fz43<@`)Et^i>G%^Zkznuw#kJb zA$+?8=0^L@KfS^K=Fw9>Z@bo1k#d{~ZkG=19~=FZ8yr857VSQ-|Lo!Gu8W(7UMntQ zGbc{b{U3bkgVpC&G=Ds-oLG8h(~<2*mJKfrO?6(VUA??~`^vH%r$+91rnKbAAMVzR z?|mR?qqit;DQ@xoXYXq&caLV+*EcUAR$U(LjP6YYgAXo?f0tix50sYd*n-QC@qs;(LsVA+;%xNT`iCq>cK)iqvk?efmf=H_ri1IsoBSvJ(z7;I<= zMk0%Y!7$4PYisKp8$;nR+*r%C{YMh;wm=Uzx8Atp&oZ%aq7#Y~EA>k>i>2fq<0`Ve zu~dz6a_@xWIR?A%)n=38nYs%h~DF| zM%fVJl~sT^Yz`Za`ZHo5X@w93sZxbF6ZX~SAaLZdCUjk4Ff5%;+tPNMtaf1pP16`o zVkC(|2~_KsbS{HR+WlEb4&wtFuZoH;$`WE=xtQFmd#un7(?Ix!_h;Zlj&F=jx~26IPOMq5+!NFhpclcg=Gtxl9r1hj3$=h6pXOpSSnSJ)^va0&2{c5tws73 zfQ5l3_o_Vb_W?=2Kfjog?A4~P)vEzx%Ct2p#4%{5xnf?vF2IHg@#+zFfhf5T=w@BvWVyq8?$M|Hv*H|gw z^H>c78A0YnfiWNP7-c6ME<4J(oG#SiumhA9oDP(ayW%*(lQaL;1_zRD zB82d~-4UbRJWA0Ng*qr_40RJ+9E}l9fp@svE}n4b^@FMi)0|6Ax5wZJkYji8v@1rq zQHQ`o4h|7+7e}CO0nSoXoZ>m!iWu=`YC-{zm9*ixVJOMzaam2lsu3kYPHVaOh?oMc zI%fola8hPXt{!&IqY_YEXyk^{jirM^k7<=p=qC?lI1mtJdiYbW=`HFoQ>+V z53uQ6b{2l!;Rr@Ke_$|1g+m9BVA`wjNWnHVABV@0X9B*ONM-A?;i0lM-=0-l)bdf= zHSzF`SMEOWn~U0}zpp>J`kxD;mdBs^%j*}BFHR)531#8DmX^hVjdPI3J;goa^L{ZH z{qfoM_QAXGhxR;n@XFc)b(Ih8K7Q`yzn1J;&m42?O8cH5mOt`MWX0o;{)j*QkD|W5 zlZ)m%(Sy(K*}U?C<&(Z%*W5D8*vtFpt(lw}YnQ(;QoM5FUB@}&s1)!w`(9i0=$d~6 D4m9Y_ literal 0 HcmV?d00001